SELinuxについて

6124 ワード

SELinuxと強制アクセス制御システム
SELinux全称Security Enhanced Linux(セキュリティ強化Linux)は、MAC(Mandatory Access Control、強制アクセス制御システム)の実装であり、あるプロセスがどのリソース(ファイル、ネットワークポートなど)にアクセスできるかを明確に示すことを目的としている.
強制アクセス制御システムの用途は、0-Day攻撃(未公開の脆弱性を利用した攻撃行為)を防ぐシステムの能力を強化することにある.そのため、ネットワークファイアウォールやACLの代替品ではなく、用途でも繰り返しません.
たとえば、システム上のApacheには、リモート・ユーザーがシステム上の機密ファイル(例えば/etc/passwd)にアクセスできるようにする脆弱性が発見され、セキュリティ・ホールを修復するApache更新パッチはまだ解放されていない.このときSELinuxは,この脆弱性を補う緩和策として機能する./etc/passwdはApacheのアクセスラベルを持たないため、/etc/passwdに対するApacheのアクセスはSELinuxによってブロックされます.
SELinuxは、他の強制的なアクセス制御システムに比べて、次のようなメリットがあります.
・制御ポリシーは、プログラムが見えないのではなく、照会可能である.
●サービスを再起動または停止することなく、ポリシーを熱的に変更できます.
・プロセス初期化、継承、およびプログラム実行の3つの態様からポリシーによって制御することができる.
・制御範囲は、ファイルシステム、ディレクトリ、ファイル、ファイル起動記述子、ポート、メッセージインタフェース、およびネットワークインタフェースをカバーする.
SELinuxの理解と構成
1.現在のSELinux運転状態を取得する

getenforce

結果を返すには、Enforcing、Permissive、Disabledの3つがあります.DisabledはSELinuxを表し、Permissiveはセキュリティ警告のみを記録し、不審な行為を阻止しないことを表し、Enforcingは警告を記録し、不審な行為を阻止することを表す.
現在一般的なリリースでは、RHELとFedoraはデフォルトでEnforcingに設定されており、残りのopenSUSEなどはPermissiveに設定されています.
2.SELinux運転状態の変更

setenforce [ Enforcing | Permissive | 1 | 0 ]

このコマンドはすぐにSELinuxの運転状態を変更し、EnforcingとPermissiveの間を切り替え、結果的にシャットダウンに保つことができます.典型的な用途は、SELinuxがサービスまたはプログラムを実行できないかどうかを確認することです.setenforce 0以降もサービスやプログラムが実行できない場合は、SELinuxによるものではないことは間違いありません.
システムSELinux実行環境を永続的に変更する場合は、プロファイル/etc/sysconfig/selinuxを変更することで実現できます.注意DisabledからPermissiveまたはEnforcingモードに切り替えると、コンピュータを再起動し、ファイルシステム全体にセキュリティラベルを再作成する必要があります(touch/.autorelabel&&reboot).
3.SELinux実行ポリシー
プロファイル/etc/sysconfig/selinuxには、変数SELINUXTYPEの値を変更することによって実装されるSELinux実行ポリシーの情報も含まれています.targetedは、事前に作成されたいくつかのネットワークサービスとアクセス要求に対してのみSELinux保護を使用し、strictはすべてのネットワークサービスとアクセス要求がSELinuxを通過することを意味します.
RHELとFedoraのデフォルト設定はtargetedで、ほとんどの一般的なネットワークサービスに対するSELinuxポリシー構成が含まれており、デフォルトでインストールされており、変更することなく直接使用できます.
SELinuxポリシーを自分で編集したい場合は、コマンドラインのポリシーエディタseeditおよびEclipseの編集プラグインeclipse-slideも用意されています.
4.coreutilsツールのSELinuxモード
一般的なcoreutilsに属するツール、例えばps、lsなどは、Zオプションを追加することでSELinuxに関する情報を知ることができます.
のように

ps auxZ | grep lldpad
system_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -d

のように

ls -Z /usr/lib/xulrunner-2/libmozjs.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.so

このようにZオプションは、ほとんどのcoreutilsツールに適用できます.
Apache SELinux構成例
1.Apacheがデフォルト以外のディレクトリにあるWebサイトファイルにアクセスできるようにする
まず、semanage fcontext-l|grep'/var/www'でデフォルト/var/wwwディレクトリのSELinuxコンテキストがわかります.

/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0

Apacheはhttpdsyscontentを含むアクセスのみ可能であることがわかります.tラベルのファイル.
Apacheが/srv/wwwをWebサイトのファイルディレクトリとして使用する場合は、このディレクトリの下のファイルにhttpdsyscontent_を追加する必要があります.tラベルは、2ステップに分けて実現されます.
まず/srv/wwwというディレクトリの下のファイルにデフォルトのラベルタイプを追加します:semanage fcontext-a-t httpd_sys_content_t '/srv/www(/.*)?' その後、既存のファイル:restorecon-Rv/srv/wwwを新しいラベルタイプでマークすると、Apacheはこのディレクトリの下のファイルを使用してウェブサイトを構築することができます.
ここでrestoreconはSELinux管理でよく見られ、ファイルのデフォルトラベルを復元する役割を果たします.たとえば、ユーザーホームの下のファイルラベルがuserhometであるため、ユーザーホームの下のファイルをApache Webサイトの下にコピーすると、Apacheはデフォルトでアクセスできません.この時点でrestoreconがApacheによってアクセス可能なhttpdsyscontent_に復元する必要があります.tタイプ:

restorecon reset /srv/www/foo.com/html/file.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0

2.Apacheに非標準ポートをリスニングさせる
デフォルトではApacheは80と443の2つのポートしかリスニングしません.888ポートを直接指定すると、service httpd restartでエラーが発生します.

Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:888
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:888
no listening sockets available, shutting down
Unable to open logs

このとき、デスクトップ環境でSELinuxトラブルシューティングツールが飛び出してエラーを報告しているはずです.端末の下では、/var/log/messagesログを表示し、sealert-lに番号を付けて表示するか、sealert-bを直接使用して参照できます.いずれにしても、内容は以下のようになります.

SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 888.
***** Plugin bind_ports (92.2 confidence) suggests *************************
If you want to allow /usr/sbin/httpd to bind to network port 888
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 888
`where PORT_TYPE is one of the following: ntop_port_t, http_cache_port_t, http_port_t.`
***** Plugin catchall_boolean (7.83 confidence) suggests *******************
If you want to allow system to run with NIS
Then you must tell SELinux about this by enabling the 'allow_ypbind' boolean.
Do
setsebool -P allow_ypbind 1
***** Plugin catchall (1.41 confidence) suggests ***************************
If you believe that httpd should be allowed name_bind access on the port 888 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

SELinuxは3つの状況に応じてそれぞれ対応する解決法を与えていることがわかる.ここで、最初のケースは私たちが望んでいるもので、その提案に従って入力します.

semanage port -a -t http_port_t -p tcp 888

その後、Apacheサービスを再起動すれば問題ありません.
ここではsemanageというSELinux管理構成ツールも見られます.最初のオプションは、変更するタイプを表し、目的の操作に従います.詳細はManマニュアルを参照
3.Apacheアクセスを許可プライベートサイトの作成
ユーザが~/public_でhtml/ファイルを配置して独自の個人サイトを作成する場合は、Apacheポリシーで操作を許可する必要があります.次の操作を行います.

setsebool httpd_enable_homedirs 1

setseboolは、ブール値によって制御されるSELinuxポリシーを切り替えるために使用され、現在のブール値ポリシーの状態はgetseboolによって知ることができる.
デフォルトではsetseboolの設定は次の再起動まで保持されます.永続的に有効にするには、次のようなPパラメータを追加する必要があります.

setsebool -P httpd_enable_homedirs 1

まとめ
この短いチュートリアルを通じて、SELinuxに対する誤解や恐怖を解消することを望んでいます.個人的にはiptables戦略より複雑ではないと思います.サーバが0-day攻撃に効果的に対抗することを望む場合は、SELinuxは考慮に値する緩和策かもしれません.