CentOS 5 から Scientific Linux 6 で環境再構築するタイミングでSELinuxを有効にして運用しているので、SELinux運用において必要なコマンドをまとめておく。SELinux管理について体系的に学びたい場合は 日経Linux: 第一人者がやさしく教える新SELinux入門 が良いだろう。
セキュリティ・コンテキストの読み方
<ユーザー名>:<ロール>:<ドメイン or タイプ>:<MLS>
識別子 | 意味 |
---|---|
ユーザー名 | プロセスまたはファイルを作成したSELinuxユーザー名。あまり気にしなくてよい |
ロール | Strictポリシーで使用する。Targetedポリシーでは使わないので無視してよい |
ドメイン or タイプ | プロセスの場合はドメインと呼び、ファイルなどのリソースの場合はタイプと呼ぶ。重要な識別子 |
MLS | MLSポリシーで使用するレベルやカテゴリー。Targetedポリシーでは使わないので無視してよい |
SELinuxは「○○ドメインは△△タイプを□□できる」(例: smbd_tドメインはsamba_share_tタイプをreadできる)といった定義がされたポリシー・ファイルによってアクセス制御を行う。つまり(Targetedポリシーの)SELinux管理とは、このドメインとタイプを管理することが中心となる。
Targetedポリシーの場合、unconfined_tとinitrc_tドメインはすべてのリソースへのすべてのアクセスが許可されている。ログイン・ユーザーの起動したプロセスはすべてunconfined_tドメインで起動されるので、ログインして使用する限りはSELinuxにアクセス拒否されることはない。
プロセスのセキュリティ・コンテキストの確認方法
1 2 |
[root@oscar ~]# ps auxZ | grep smbd | head -1 system_u:system_r:smbd_t:s0 root 1645 0.0 0.1 211984 2568 ? Ss Jan01 0:06 smbd -D |
リソースのセキュリティ・コンテキストの確認方法
1 2 |
[root@oscar ~]# ls -dZ /var/pub drwxrwxrwx. root root unconfined_u:object_r:samba_share_t:s0 /var/pub |
動作モードの確認方法
1 2 |
[root@oscar ~]# getenforce Enforcing |
モード | 意味 |
---|---|
Enforcing | SELinuxが有効で、ポリシー違反のアクセスは拒否される。本番モード |
Permissive | SELinuxが有効だが、ポリシー違反のアクセスはログに記録されるだけでアクセスは拒否されない。テスト・モード |
Disabled | SELinuxが無効 |
動作モードの変更方法
1 |
setenfoce 0 |
引数 | 意味 |
---|---|
0 | Permissiveモードに一時的に変更。SELinuxが原因で想定どおり動作しない場合は、このモードに変えてテストしてみるとよい |
1 | Enforceモードに一時的に変更。Permissiveモードから元に戻す場合に使用 |
SELinuxの有効無効を変更する、またはEnforcingモードとPermissiveモードを永続的に変更する場合は /etc/selinx/config を変更してOSを再起動する。disabled
からenforcing
に一気に変更してしまうとセキュリティ・コンテキストが誤っていた場合にOSが起動しないなどの問題が起きるので、permissive
で一度起動し、以下のrestorecon
してからenforcing
にするのが安全だろう。
SELinuxでアクセス拒否されたかどうかの確認方法
auditパッケージがインストールされており、auditd
が起動していれば /var/log/audit/audit.log にtype=AVC
として記録される。以下はsmbd_tドメインのsmbdプロセスがinitrc_tmp_tタイプの /tmp/zabbix_restart.log をappendしようとしたが拒否されたログだ。
1 2 |
[root@oscar ~]# grep type=AVC /var/log/audit/audit.log* | head -1 /var/log/audit/audit.log.1:type=AVC msg=audit(1327050451.239:26832): avc: denied { append } for pid=11406 comm="smbd" path="/tmp/zabbix_restart.log" dev=dm-9 ino=22 scontext=system_u:system_r:smbd_t:s0 tcontext=system_u:object_r:initrc_tmp_t:s0 tclass=file |
audit.logは日時が読みにくいので、ausearch
を使うのもよい
1 2 3 4 5 |
[root@oscar ~]# ausearch -m avc ---- time->Fri Jan 20 18:07:31 2012 type=SYSCALL msg=audit(1327050451.239:26832): arch=c000003e syscall=59 success=yes exit=0 a0=1e6f170 a1=1e72e70 a2=1e73610 a3=18 items=0 ppid=11405 pid=11406 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="smbd" exe="/usr/sbin/smbd" subj=system_u:system_r:smbd_t:s0 key=(null) type=AVC msg=audit(1327050451.239:26832): avc: denied { append } for pid=11406 comm="smbd" path="/tmp/zabbix_restart.log" dev=dm-9 ino=22 scontext=system_u:system_r:smbd_t:s0 tcontext=system_u:object_r:initrc_tmp_t:s0 tclass=file |
setroubleshoot-serverパッケージがインストールされていれば /var/log/message にもアクセス拒否が記録される。
1 2 |
[root@oscar ~]# grep setroubleshoot /var/log/messages* | grep SELinux | head -1 /var/log/messages:Jan 01 05:20:47 oscar setroubleshoot: SELinux is preventing the spamd daemon from reading users' home directories. For complete SELinux messages. run sealert -l 301adeba-8de8-4b94-aaa4-be18f4a4ecad |
ログに記されたsealert
を実行すると、どのようにすればアクセス拒否を解除できるのかのアドバイスがもらえる。ただ、このアドバイスで拒否が解除できるのは五分五分って感じかな。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
[root@oscar ~]# sealert -l 301adeba-8de8-4b94-aaa4-be18f4a4ecad 要約: SELinux is preventing the spamd daemon from reading users' home directories. 詳細説明: [SELinux は許容モードになっています。このアクセスは拒否されませんでした。] SELinux has denied the spamd daemon access to users' home directories. Someone is attempting to access your home directories via your spamd daemon. If you only setup spamd to share non-home directories, this probably signals an intrusion attempt. アクセス許可: If you want spamd to share home directories you need to turn on the spamd_enable_home_dirs boolean: "setsebool -P spamd_enable_home_dirs=1" Fix コマンド: setsebool -P spamd_enable_home_dirs=1 追加情報: ソースコンテキスト system_u:system_r:spamd_t:s0 ターゲットコンテキスト unconfined_u:object_r:admin_home_t:s0 ターゲットオブジェクト /root/.razor/server.c302.cloudmark.com.conf [ file ] ソース spamd ソースパス /usr/bin/perl ポート <不明> ホスト oscar.rewse.jp ソース RPM パッケージ perl-5.10.1-119.el6_1.1 ターゲット RPM パッケージ ポリシー RPM selinux-policy-3.7.19-126.el6_2.4 Selinux 有効化 True ポリシータイプ targeted 強制モード Permissive プラグイン名 spamd_enable_home_dirs ホスト名 oscar.rewse.jp プラットフォーム Linux oscar.rewse.jp 2.6.32-220.2.1.el6.x86_64 #1 SMP Thu Dec 22 11:15:52 CST 2011 x86_64 x86_64 通知カウント 1 最初の画面 Tue Jan 01 05:20:28 2012 最後の画面 Tue Jan 01 05:20:28 2012 ローカル ID 301adeba-8de8-4b94-aaa4-be18f4a4ecad 行番号 生の監査メッセージ node=oscar.rewse.jp type=AVC msg=audit(1327350028.189:3734): avc: denied { write } for pid=13429 comm="spamd" name="server.c302.cloudmark.com.conf" dev=dm-0 ino=5571 scontext=system_u:system_r:spamd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file node=oscar.rewse.jp type=SYSCALL msg=audit(1327350028.189:3734): arch=c000003e syscall=2 success=yes exit=9 a0=4ae3c30 a1=241 a2=1b6 a3=3a6371dba0 items=0 ppid=13427 pid=13429 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=244 comm="spamd" exe="/usr/bin/perl" subj=system_u:system_r:spamd_t:s0 key=(null) |
/var/lib/setroubleshoot/email_alert_recipients にメールアドレスを記述しておくと、setroubleshootがアクセス拒否を見つけ次第、sealeartの結果をメールしてくれるので「SELinuxが原因で動作しない」という状況にすぐに気づくことができる。
1 |
example@gmail.com |
/etc/setroubleshoot/setroubleshoot.cfg のfrom_address
に記述されたメールアドレスからメールが届くが、私の環境ではドメイン部分がホスト名で補完されると送信拒否されてしまうので、以下のように変更している。
84 85 86 |
# from_address: The From: email header # from_address = SELinux_Troubleshoot from_address = SELinux_Troubleshoot@rewse.jp |
セキュリティ・コンテキストを初期化する
リソースに正しいセキュリティ・コンテキストがついていないためにアクセス拒否されている場合、restorecon
でデフォルトのセキュリティ・コンテキストに初期化できる。
1 2 |
[root@oscar ~]# restorecon filename [root@oscar ~]# restorecon -R / |
セキュリティ・コンテキストはリソースが生成されたタイミングで /etc/selinux/targeted/contexts/files/file_contexts に記述されたパスに従ってデフォルト値が設定される。つまり、cp
では新たなコンテキストが設定されるが、mv
ではコンテキストは更新されない。圧縮ファイルを/tmpに展開して、そこからmv
したときは必ずrestorecon
で初期化しよう。
条件付きポリシーを変更する
デフォルトでは厳しいポリシーになっていてアクセス拒否されてしまうが、用途に合わせてポリシーを緩める必要がある場合に簡単に変更できるのが条件付きポリシーだ。どのような条件付きポリシーが用意されているかはgetsebool
で分かる。
1 2 3 4 5 6 7 |
[root@oscar ~]# getsebool -a abrt_anon_write --> off abrt_handle_event --> off allow_console_login --> on allow_cvs_read_shadow --> off allow_daemons_dump_core --> on ...... |
条件付きポリシーはsetsebool
で変更する。
1 |
[root@oscar ~]# setsebool -P samba_enable_home_dirs 1 |
条件付きポリシーは手軽ではあるが、onにすればするほどSELinuxの防御は弱くなるので、onにするべきかどうかは慎重に判断しよう。
セキュリティ・コンテキストを一時的に変更する
一部のリソースのセキュリティ・コンテキストを手動で変更する場合はchcon
を使用する。
1 |
[root@oscar ~]# chcon system_u:object_r:samba_share_t:s0 /var/pub |
セキュリティ・コンテキストを永続的に変更する
chcon
で変更したセキュリティ・コンテキストはrestorecon
してしまうと再びデフォルトに戻ってしまうので、semanage
でfile_contextsに新たなルールを追加しておくのが良いだろう。追加するパスは正規表現で記述する。
1 2 |
[root@oscar ~]# semanage fcontext -a -t samba_share_t "/var/pub(/.*)?" [root@oscar ~]# restorecon -R /var/pub |
file_contextsは直接開いても良いが、semanage
からは以下のように一覧できる。
1 2 3 4 5 6 7 |
[root@oscar ~]# semanage fcontext -l SELinux fcontext タイプ コンテキスト / directory system_u:object_r:root_t:s0 /.* all files system_u:object_r:default_t:s0 /[^/]+ regular file system_u:object_r:etc_runtime_t:s0 ...... |
追加したルールを削除する場合は以下のように行う。
1 2 |
[root@oscar ~]# semanage fcontext -d -t samba_share_t "/var/pub(/.*)?" [root@oscar ~]# restorecon -R /var/pub |
新しいポリシーを追加する
「○○ドメインは△△タイプを□□できる」というポリシーを新たに追加する必要がある場合は、audit.logからテキスト形式のTEファイルを作成し、TEファイルからバイナリ形式のPPファイルというモジュール・パッケージを作成し、PPファイルをポリシー・ファイルに追加するという手順になる。
/var/log/audit/audit.log をそのまま使うと今までアクセス拒否されたすべてがごちゃ混ぜになってしまうので、抽出してから使用するのが良いだろう。
1 |
[root@oscar ~]# grep type=AVC /varlog/audit/audit.log | grep amavis > /tmp/audit.log |
抽出されたaudit.logからaudit2allow
を使ってTEファイルを作成する。
1 2 3 4 5 |
[root@oscar ~]# audit2allow -M amavislocal -i /tmp/audit.log ******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i amavislocal.pp |
作成されたTEファイルを見てみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
module amavislocal 1.0; require { type amavis_t; type initrc_t; type lib_t; type var_run_t; class unix_dgram_socket sendto; class file execute_no_trans; class sock_file write; } #============= amavis_t ============== allow amavis_t initrc_t:unix_dgram_socket sendto; allow amavis_t lib_t:file execute_no_trans; allow amavis_t var_run_t:sock_file write; |
PPファイルはaudit2allow
が自動生成してくれるが、手動でTEファイルを編集した場合などは /usr/share/selinux/devel ディレクトリにTEファイルを移動してmake
する必要がある。
1 2 3 4 5 6 7 8 |
[root@oscar ~]# cd /usr/share/selinux/devel [root@oscar devel mv /tmp/amavislocal.te . [root@oscar devel]# make /usr/bin/checkmodule: loading policy configuration from tmp/amavislocal.tmp /usr/bin/checkmodule: policy configuration loaded /usr/bin/checkmodule: writing binary representation (version 10) to tmp/amavislocal.mod Creating targeted amavislocal.pp policy package ...... |
作成したPPファイルをインストールする。
1 |
[root@oscar devel]# semodule -i amavislocal.pp |
現在のモジュール一覧を以下のように取得できる。
1 |
[root@oscar ~]# semodule -l |
インストールされたモジュールを削除する場合は以下のように行う。
1 |
[root@oscar ~]# semodule -r amavislocal |
2 thoughts on “Scientific Linux 6 でのSELinux管理コマンドまとめ”