CentOS 7
Sponsored Link

SELinux : audit2allowを利用する2016/04/05

 
audit2allow を利用すると AVC 拒否のログを分析し SELinux ポリシーに対してアクセス許可するルールを生成することができます。これにより容易にポリシーのカスタマイズが可能です。
ただし、SETroubleShoot 等を利用して自身でログを確認し、解決方法を判断して、restorecon コマンド や chcon コマンドにより必要最小限の許可を与える方法と比べると、audit2allow によって生成される許可ルールは粗い場合があり、必要以上の許可を与えてしまうこともあるため、利用する際は注意が必要です。
なお、audit2allow コマンドがない場合は「yum install policycoreutils-python」としてインストール可能です。
[1] ログを読み込み、拒否された理由を表示します。
ログファイルを指定しない場合のデフォルトは /var/log/audit/audit.log を読み込みます。
ログファイルを指定する場合は「-a」の代わりに「-i ログファイル」と指定します。
# audit.log から AVC 拒否を全て読み取って理由を表示

[root@dlp ~]#
audit2allow -w -a

type=AVC msg=audit(1460007772.762:55): avc:  denied  { getattr } for  pid=1029 comm="httpd" path="/var/www/html/index.html" 
    dev="dm-0" ino=101186198 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

.....
.....

type=AVC msg=audit(1460007828.479:64): avc:  denied  { getattr } for  pid=1056 comm="httpd" path="/var/www/html/index.html" 
    dev="dm-0" ino=101186198 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

# 例えば ausearch と併用して特定のログに絞っての表示も可

[root@dlp ~]#
ausearch -m AVC --start 04/05/2016 19:52:00 --end 04/05/2016 19:52:59 | audit2allow -w

type=AVC msg=audit(1460009034.012:76): avc:  denied  { getattr } for  pid=1054 comm="httpd" path="/var/www/html/index.html" 
    dev="dm-0" ino=101186198 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file

        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

type=AVC msg=audit(1460009034.013:77): avc:  denied  { getattr } for  pid=1054 comm="httpd" path="/var/www/html/index.html" 
    dev="dm-0" ino=101186198 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file

        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

# -a オプションで必要なアクセス権を表示

[root@dlp ~]#
ausearch -m AVC --start 04/05/2016 19:52:00 --end 04/05/2016 19:52:59 | audit2allow -a


#============= httpd_t ==============
allow httpd_t admin_home_t:file getattr;
[2] 許可ルールを生成するには以下のように設定します。
# 例として「test_rule」というモジュールを生成

[root@dlp ~]#
ausearch -m AVC --start 04/05/2016 19:52:00 --end 04/05/2016 19:52:59 | audit2allow -a -M test_rule

******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i test_rule.pp

# 表示された通りにコマンド実行してモジュールインストール

[root@dlp ~]#
semodule -i test_rule.pp
# モジュールが読み込まれているか確認

[root@dlp ~]#
semodule -l | grep test_rule

test_rule 1.0
[3] 以上でアクセス可能になる場合もあります。また、そうでない場合もあります。
上記例の場合は、以下のように未だアクセス不可です。
[root@dlp ~]#
curl http://localhost/index.html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.html
on this server.</p>
</body></html>
  理由は httpd_t ドメインが admin_home_t タイプのファイルにアクセスして結果を返すには getattr のみでは足りないためです。 このような場合は、再度 audit2allow でルールを生成します。
[root@dlp ~]#
ausearch -m AVC | grep -E 'http|index.html' | audit2allow -a


#============= httpd_t ==============
allow httpd_t admin_home_t:file read;

#!!!! This avc is allowed in the current policy
allow httpd_t admin_home_t:file getattr;
# read も必要だった

[root@dlp ~]#
ausearch -m AVC | grep -E 'http|index.html' | audit2allow -a -M test_rule

[root@dlp ~]#
semodule -i test_rule.pp

[root@dlp ~]#
curl http://localhost/index.html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
.....
# 未だアクセス不可

[root@dlp ~]#
ausearch -m AVC | grep -E 'http|index.html' | audit2allow -a


#============= httpd_t ==============
allow httpd_t admin_home_t:file open;

#!!!! This avc is allowed in the current policy
allow httpd_t admin_home_t:file { read getattr };
# open も必要だった

[root@dlp ~]#
ausearch -m AVC | grep -E 'http|index.html' | audit2allow -a -M test_rule

[root@dlp ~]#
semodule -i test_rule.pp

[root@dlp ~]#
curl http://localhost/index.html

Test Page    
# アクセスできた
関連コンテンツ