こんにちは。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)
が挙げられています。以下、それぞれを詳しく見ていきます。
-
-
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リリースノートに詳細が載っています。
-
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でデフォルト値が変わったブール値
ポリシの詳細な違い
ポリシの詳細に関しては、第二回で記載します。
]]>