【ざっくりと理解する】SELinuxとは?

  • このエントリーをはてなブックマークに追加
  • Pocket

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

sestatus

とすると確認出来る

SELinuxの有効化と無効化

# setenforce 0

状態をpermissiveモードへ変更

# setenforce 1

状態をenforcingモードへ変更

setenforceでの変更はリアルタイムで一時的なものである、再起動すると初期化されてしまう。恒久的に設定を有効化、もしくは無効化したい場合

# vi /etc/selinux/config

を設定する「SELINUX=」の部分を編集する

  • enforcingを恒久設定 SELINUX=enforcing
  • permissiveを恒久設定 SELINUX=permissive
  • disabledを恒久設定 SELINUX=disabled

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

# vi index.html

# systemctl restart httpd

しかし結果はテストページが表示されてしまうと思う。

この状態で

# setenforce 0

として再度ブラウザをリロードしてみよう。正常にindex.htmlの内容が表示されるはずだ。SELinuxによって動作が制限されていたことがわかる。ではログを参照してみよう

# tail -n0 -f /var/log/audit/audit.log

にログが残るのでtailコマンドで表示、ブラウザをリロードすると以下のような内容が表示されるはずだ。

selinux-httpd

「denied」と記述されているあたり、アクセスが拒否されたことがわかる。ではどうすればアクセスを許可できるのか?実際にやってみよう

chconを使用する。SELinuxのラベルつまり、パーミッション情報を変更する。

# chcon -R -t httpd_sys_content_t /www-httpd

これで正常に作成したindex.htmlが表示されるはずだ。

試しに

# ls -Zd /www-httpd

としてみよう。以下のようになっているはずだ。なお「-Z」はSELinuxの情報を表示するオプションとなっている。

ls-dZ

しかしこの設定は一時的なもので恒久的ではない、なので設定ファイルを生成し適応する。

# semanage fcontext -a -t httpd_sys_content_t "/www-httpd(/.*)?"

# cat /etc/selinux/targeted/contexts/files/file_contexts.local

context

とすると設定が記述されているのが確認出来る

# 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の使い方がなんとなくイメージしていただければ幸いだ。

 

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメント

  1. hirotak より:

    すみません。
    setools-consoel

    setools-console
    のtypoですよね?

    1. リナックスアカデミー より:

      おっしゃる通りです。ありがとうございます。修正いたしました。

コメントを残す

*