RHEL8でのSELinuxの違い(Part 1)

こんにちは。OSSセキュリティ技術の会の面 和毅です。

5月にRed Hat Enterprise Linux 8(以下RHEL8)がリリースされました。五年ぶりのメジャーバージョンアップということで、かなりの変更点が有ります。

ここからは、特にSELinuxに注目して、RHEL8での変更点をまとめていきたいとおもいます。

SELinuxの変更点(Red Hat発表)

2019年5月にアメリカで開催されたRed Hat Summit 2019では、「TOP 10 SECURITY CHANGES IN RED HAT ENTERPRISE」として、RHEL8でのセキュリティ部分の変更点が紹介されました。

この中でSELinuxに関しての変更点としては

    • systemdでのNoNewPrivileges (nnp_nosuid_transition)
    • 他のプロセスからのlimit値の変更を防御する制御(getrlimit)


が挙げられています。以下、それぞれを詳しく見ていきます。

    1. nnp_nosuid_transition

      Linux Kernel 3.5から「No New Privileges Flag(no_new_privs)」というフラグが導入されました。このフラグをプロセスにセットした場合には、子プロセスに対して新たに特権を追加することが出来なくなるため(setuid/setgidも出来ない)、何らかの脆弱性が出て攻撃者から『setuid/setgid/fcapが使われているバイナリを踏み台にして権限昇格をしよう』と意図されたとしても、不要な特権を追加できないので安全、というものになります。

      Systemdでは、Systemd v239からこの「NoNewPrivileges」の機能が追加されています。Systemdでは、(booleanの)設定値として”NoNewPrivileges=”が実装されています。こちらは、/etc/systemd/system.confファイルで設定されており、”NoNewPrivileges=true”にするとサービスプロセスとその子プロセスはexecve()を通じて新たに特権を得ることが出来なくなります(setuid, setgid, file capability等で特権/権限の追加が出来なくなります)。これによりシステムのセキュリティは挙がりますが、今までのUnix/Linuxシステムで当然とされてきた権限の追加が許されなくなるため、プログラムがきちんと動作するかは実際に検証してみる必要があります。デフォルトでは”NoNewPrivileges=False”に設定されていますので、今までのUnix/Linuxでの動作と変わりません。

      今回SELinuxがsystemd No New Privilegesをサポートすることで、NoNewPrivileges (NNP)が設定されている状態でSELinuxのドメイン遷移が可能になっています。

      詳しくは今後取り上げる予定ですが、8.0リリースノートに詳細が載っています。

    2. getrlimit

      SELinuxのアクセス制御で使用するオブジェクトクラスのprocessに、新たにgetrlimitが追加されました。

      
      policy/flask/access_vectors)
      class process
      {
              fork
              transition
              sigchld # commonly granted from child to parent
              sigkill # cannot be caught or ignored
              sigstop # cannot be caught or ignored
              signull # for kill(pid, 0)
              signal  # all other signals
              ptrace
              getsched
              setsched
              getsession
              getpgid
              setpgid
              getcap
              setcap
              share
              getattr
              setexec
              setfscreate
              noatsecure
              siginh
              setrlimit
              rlimitinh
              dyntransition
              setcurrent
              execmem
              execstack
              execheap
              setkeycreate
              setsockcreate
              getrlimit         <-----追加
      }
      

      これにより、setrlimitと組み合わせることでプロセスが他のプロセスのリソース制限を読み込み、変更するかどうかをSELinuxのポリシで制御することが出来ます。


ブール値の差

RHEL8とRHEL7.6でのブール値の差を表にまとめています。

図1. RHEL8とRHEL7.6でのブール値の差

ディストリビューション ブール値で調整可能な数
RHEL 8 326
RHEL 7.6 315

RHEL8で新たに追加されたブール値を表にまとめています。

図2. RHEL8で追加されたブール値

ブール値 概要 デフォルト
colord_use_nfs Colord: 色に対する管理/インストール/生成を簡単に行うためのシステムサービスに関するものです。colordがNFSファイルシステムにアクセスできるようにします。 OFF
container_manage_cgroup サンドボックスのコンテナにcgroupを管理させるもの。 OFF
mysql_connect_http mysqldがhttpポートに接続できるようにします。 OFF
pdns_can_network_connect_db PowerDNSがネットワーク上の(MySQLやMariaDB等の)データベースと接続できるようにします。 OFF
ssh_use_tcpd sshdがtcpラッパーを使えるようにします。 OFF
sslh_can_bind_any_port sslh(クライアントの通信プロトコル毎に対応するアプリケーションに転送してくれるマルチプレクサ。これを用いてPort443でSSH/HTTPS等を待ち受けられる)が任意のポート番号を使用できるようにします。 OFF
sslh_can_connect_any_port sslh(クライアントの通信プロトコル毎に対応するアプリケーションに転送してくれるマルチプレクサ。これを用いてPort443でSSH/HTTPS等を待ち受けられる)が任意のポート番号に接続できるようにします。 OFF
tor_can_onion_services TorがOnion Serviceを実行できるようにします。 OFF
use_virtualbox 新しいカーネルを起動する際にvboxモジュールを作成できるようにします。 OFF
virt_sandbox_share_apache_content サンドボックスコンテナがApacheコンテンツを共有できるようにします。 OFF
virt_use_pcscd 仮想ゲストがスマートカードを使用できるようにします。 OFF

RHEL7.6からRHEL8になって、デフォルト値が変わったブール値を表にまとめています。

図3. RHEL8とRHEL7.6でデフォルト値が変わったブール値

ブール値 概要 デフォルト(RHEL8) デフォルト(RHEL7.6)
domain_can_mmap_files RHEL 7で導入されたパラメータで、mmap()使用時にSELinuxによるアクセス制御を掛けることが出来ます。このブール値が有効になっていると、全てのドメインが全てのファイルのmmap()と、文字デバイスまたはブロックデバイスを使用できます。domain_can_mmap_files が無効になっている場合は、mmap()を使用するドメイン一覧が制限されます。 OFF ON
httpd_graceful_shutdown HTTPDがPort80に対して「Graceful Shutdown(正常な/きちんとしたシャットダウン。ぶつっと切るシャットダウンではないやつ)」が出来るようにします。 OFF ON
mozilla_plugin_can_network_connect MozillaのプラグインのドメインがTCPを用いてネットワーク通信を行えるようにします。 ON OFF
named_write_master_zones ゾーンファイル更新のためゾーン転送とダイナミックDNS を許可します。 ON OFF
virt_use_nfs virtがNFSファイルを管理できるようにします。 ON OFF

ポリシの詳細な違い

ポリシの詳細に関しては、第二回で記載します。

]]>