SELinuxとはセキュリティ関連のLinuxカーネル制御機能だ。Linuxディストリビューションではなく、強制アクセス制御機能を加えるモジュールの名前だ。
このページではSELinuxについて簡単にご説明していこう。
目次
SELinuxとは?
ディストリビューションではない
SELinuxと聞くとディストリビューションの一つだと思うかもしれないが、そうではなく、カーネルの制御機能のひとつだ。
Security-Enhanced-Linuxの略称になる。
アクセス制御に使う
SELinuxを利用すると細かいアクセス制御が可能になる。例えば、サービス毎に最小限の権限を与え管理することなどが可能になる。
root権限ですら制限をかけることも可能となっており、redhat系のディストリビューションであるCentOSやFedoraの場合はデフォルトで導入されているシステムだ。
使わないケースも多い
SELinuxを意図的に無効化しているサーバも多い。
実際のところSELinuxをなしにしても問題なくサーバとして機能するという部分と、SELinuxの難解さという面があいまってそうなっているのだろう。余計な挙動が起こって、むしろ管理しにくいというケースがある。
もう一つ注意点がある。
SELinuxは事後防衛的な手段だ。もしサーバに侵入されたとしても、被害を最小限に抑えるための仕組みとなっている。そのため侵入事態を防衛できるものではないことを念頭においておきたい。
今回はザックリとだが、SELinuxに実際に触れてみようと思う。
サーバの状態を確認
SELinuxの状態の確認は
# getenforce
とすると確認出来る。CentOS7ではデフォルトで「Enforcing」となっており、機能が有効になっている。ステータスは
- enforcing SELinux有効でありアクセス制御が有効となる
- permissive アクセス制御は無効だが警告メッセージを表示する
- disabled SELinux無効
より詳しい情報は
# sestatus
とすると確認出来る
SELinuxの有効化と無効化
# setenforce 0
状態をpermissiveモードへ変更
# setenforce 1
状態をenforcingモードへ変更
setenforceでの変更はリアルタイムで一時的なものである、再起動すると初期化されてしまう。恒久的に設定を有効化、もしくは無効化したい場合
# vi /etc/selinux/config
を設定する「SELINUX=」の部分を編集する
- enforcingを恒久設定 SELINUX=enforcing
- permissiveを恒久設定 SELINUX=permissive
- disabledを恒久設定 SELINUX=disabled
注)なお、/etc/selinux/config
の変更後に再起動しないと反映されないようだ。
SELinuxとhttpdで実験してみる
まずは
一応setools-consoleをインストールしておこう。
# yum install setools-console
そして
# setenforce 1
としてSELinuxを有効化しよう。「setenforce 0」とするとpermissiveモードで動作し言わばSELinuxのデバッグモードとなる。
動作時に警告はだすが、アクセス権限は通常のLinuxと同じ状態になる。この状態で警告メッセージを一通り確認した上で適切な、権限分担設定を行うようにしよう。
SELinuxを意図しない状態で設定してしまうと、ログインすらできなくなる場合があるので注意しよう。一応CentOS7ではSELinuxが有効な状態でログインやXの稼動などが可能になるように設定されているので、現状のままログなどを観察してみよう。
デフォルトの状態でhttpdを稼動させてテストページを表示してみよう
# systemctl start httpd
とするとテストページが表示されるはずだ。では次に自分で作成したindex.htmlを表示させてみよう。
/var/www/html/index.html
に配置すれば正常に表示できるはずだ。次にhttpd.confを適切に設定して自分で公開ディレクトリを作成、今回は/www-httpdを作成、コンテンツindex.htmlを作成、ブラウザをリロードしてみよう。
# mkdir /www-httpd
# vi /etc/httpd/conf/httpd.conf
1 2 3 4 5 6 7 8 |
#ドキュメントルートを変更する DocumentRoot “/www-httpd” #ドキュメントルートの付近にあるDirectoryディレクティブを変更する。 <Directory “/www-httpd”> AllowOverride None Require all granted <Directory “/www-httpd”> |
# vi index.html
1 2 3 4 5 |
<html> <body> Hello (www-httpd) </body> </html> |
# systemctl restart httpd
しかし結果はテストページが表示されてしまうと思う。
この状態で
# setenforce 0
として再度ブラウザをリロードしてみよう。正常にindex.htmlの内容が表示されるはずだ。SELinuxによって動作が制限されていたことがわかる。ではログを参照してみよう
# tail -n0 -f /var/log/audit/audit.log
にログが残るのでtailコマンドで表示、ブラウザをリロードすると以下のような内容が表示されるはずだ。
「denied」と記述されているあたり、アクセスが拒否されたことがわかる。ではどうすればアクセスを許可できるのか?実際にやってみよう
chconを使用する。SELinuxのラベルつまり、パーミッション情報を変更する。
# chcon -R -t httpd_sys_content_t /www-httpd
これで正常に作成したindex.htmlが表示されるはずだ。
試しに
# ls -Zd /www-httpd
としてみよう。以下のようになっているはずだ。なお「-Z」はSELinuxの情報を表示するオプションとなっている。
しかしこの設定は一時的なもので恒久的ではない、なので設定ファイルを生成し適応する。
# semanage fcontext -a -t httpd_sys_content_t "/www-httpd(/.*)?"
# cat /etc/selinux/targeted/contexts/files/file_contexts.local
とすると設定が記述されているのが確認出来る
# restorecon -R -v /www-httpd
restoreconを実行すると「/etc/selinux/targeted/contexts/files/file_contexts.local」を参照して「/www-httpd」に「httpd_sys_content_t "/www-httpd(/.*)?"」を適応するようになっている。
再度ブラウザでhttpdにアクセスしてみよう。index.htmlの中身が表示されるはずだ。
最後にログを確認しよう
# tail -n0 -f /var/log/audit/audit.log
今度はリロードしてもアクセス拒否のログは残らないはずだ。
上の例を再度まとめ
上の例では、SELinuxによって細かいパーミッション管理をしている。
最初はchconでパーミッションを手動設定した。しかしそのままだとrestoreconで標準設定にもどってしまうので、設定ファイルを生成しこれらの設定は「/etc/selinux/targeted/」にしまわれている。
今回「semanage fcontext」で「file_contexts.local」を生成、独自の設定ファイルを作成してrestoreconで読み込みをかけたことになる。
まとめ
このページではSELinuxについて簡単にご説明をしてきた。SELinuxの使い方がなんとなくイメージしていただければ幸いだ。
すみません。
setools-consoel
は
setools-console
のtypoですよね?
おっしゃる通りです。ありがとうございます。修正いたしました。
良記事ありがとうございます。
一点相談なのですが、
/etc/selinux/config
の変更後に再起動しないと反映されない旨は記載しておいた方が良いかと思います。(当記事を見て
/etc/selinux/config
を変更したのですが、再起動せずに作業を進めており、作業の最後の方で反映されてない事に気付き再起動...という事案が発生したため)ご指摘ありがとうございます。こちら記事に反映させていただきます。