LinuCレベル3 303試験の例題と解説
327.2 強制アクセス制御
■トピックの概要
このトピックの内容は以下の通りです。
<327.2 強制アクセス制御>
重要度 4
<説明>
Linuxの強制アクセス制御に精通していることが求められる。特にSELinuxを完全に理解していること。また、Linuxの他の強制アクセス制御についても知っていること。これには、それらのシステムの主な機能は含むが、設定と使用については含まない。
<主要な知識範囲>
・TE, RBAC, MAC および DACの概念の理解。
・SELinuxを設定、管理、および使用。
・AppArmor とSmackの知識。
<重要なファイル、用語、ユーティリティ>
getenforce, setenforce, selinuxenabled
getsebool, setsebol, togglesebool
fixfiles, restorecon, setfiles
newrole, runcon
semanage
sestatus, seinfo
apol
seaudit, seaudit-report, audit2why, audit2allow
/etc/selinux/*
■例題
下記の[問題]の解決手順として、不適切なものを選択してください。
[問題]
SELinuxが有効な環境で、Apache HTTP Server(以下httpd)に、リッスンポート7080を追加した。
httpdを再起動したところ、7080ポートでのリッスンができず、起動に失敗した。
1、audit.logを確認し、AVC拒否のログを確認し、SELinuxで拒否されているかを確認する
2、「semanage port -l」で、httpdの標準的なポート(80, 443等)のSELinuxポートタイプ情報を確認する
3、「semanage port -a -t SELinuxポートタイプ -p tcp 7080」を実行し、7080ポートとタイプの紐付けを行う
4、7080ポートのリッスンを許可するポリシーモジュールをインストールする
※この例題は実際の試験問題とは異なります。
解答と解説
答えは「4、7080ポートのリッスンを許可するポリシーモジュールをインストールする」です。
作られています。ただ例題のようなデフォルトとは異なる設定を行う場合に、SELinuxのルールの調整が
必要になります。
この例題の場合は、httpdのSELinuxドメイン「httpd_t」が、7080ポートのをリッスンする許可がないため、
起動に失敗しています。
この状況を解決するためには、以下の手順で調査と対策を行います。
まず状況を確かめるために、audit.logを確認し、AVC拒否のログを確認します。
おそらくログには以下のような内容が記載されています。
avc: denied { name_bind } for pid=20956 comm="httpd" src=7080 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
これはhttpdプロセスのドメイン「httpd_t」から「port_t」への「name_bind」が拒否されたというログになります。ここから、7080ポートのSELinuxポートタイプは、デフォルトでは「port_t」になっており、「httpd_t」ドメインからはリッスンが許可されていないということが読み取れます。
次にSELinuxのポートタイプの確認を行います。
「semanage port -l」を実行すると、下記のようにSELinuxポートタイプとプロトコル、ポート番号の紐付けルールが確認できます。
# semanage port -l | grep http
http_cache_port_t tcp 3128, 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
ルールを確認すると、httpd標準のリッスンポート80のSELinuxポートタイプは、「http_port_t」となっています。
このことから、SELinuxの標準ルールとして、「httpd_t」ドメインが「http_port_t」をリッスンする許可が設定されていることが推測できます。つまり7080ポートに、SELinuxポートタイプ「http_port_t」を紐付けることで、許可がされるということになります。この動作の確証を得たい場合は、「sesearch -A -s httpd_t -t http_port_t」で、許可ルールを調べることができます。
状況と対策が明確になったところで、以下のコマンドで「http_port_t」と7080ポートを紐付けを行います。
# semanage port -a -t http_port_t -p tcp 7080
これでhttpdが起動できる状態になります。
なお、不適切な選択肢として挙げられている「4. 7080ポートのリッスンを許可するポリシーモジュールをインストールする」の方法でも、許可をすることは可能です。ただ新たな許可ルールを作るため、意図しない範囲まで許可をしたり、管理が複雑になるため、適切な方法とは言えません。
SELinuxのルールは複雑になりがちなので、どのようなルール設定が最もシンプルで管理しやすいかを、よく検討しましょう。
■例題作成者 株式会社デージーネット ソリューション開発部 森 彰吾 氏