66739


現在、SELinuxの勉強をしているのですが、どうしても腑に落ちないことがあるので教えて下さい。

CentOS7を使いhttpdのDocumentRootを変更し、SELiunxをEnforcingにしてブラウザよりWEBサーバにアクセスすると403エラーとなりアクセスできなくなります。  
SELinuxを Permissive に変更するか、アクセス対象となるファイル(例えば:
index.html)のラベルを"httpd_sys_content_t"に変更するとアクセスできるようになります。

さて、これはよく知られた動作であります。  
しかしながら、よく確認すると不可解な点があります。

確認のため、関連する情報を確認しました。

対象となる index.html のラベルをみると次のとおりです。

[code]

    $ ls -Z  /home/www/html
    -rw-rw-r--. www www unconfined_u:object_r:user_home_t:s0 /home/www/html/index.html
    
[/code]

httpd のラベルは次のとおりです。

[code]

    $ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0      7287 ?        00:00:00 httpd
    
[/code]

SELinuxのポリシーを確認しますと、次のようになっていました。

[code]

    $ sesearch --allow --source httpd_t --perm read --target user_home_t --class file
    Found 1 semantic av rules:
       allow httpd_t user_home_type : file { ioctl read getattr lock open } ; 
    
[/code]

SELinuxのポリシーをみると、"httpd_t" は "user_home_type"
ラベルを持ったオブジェクトにアクセスできる、と設定されているように見えます。

監査ログを確認してみると、つぎのようになっていました。

[code]

    # ausearch -m avc
    type=AVC msg=audit(1589269188.714:569): avc:  denied  { read } for  pid=7289 comm="httpd" 
    name="index.html" dev="dm-0" ino=50334142 scontext=system_u:system_r:httpd_t:s0 tcontext =
    unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
    
[/code]

監査ログを読み解くと、「ラベル"httpd_t"をもつプロセス"httpd"が、ラベル"user_home_t"をもつファイル"index.html"を"{read}"しようとしたところを"deny"した」ということのように思えます。実際にサーバは403エラーを返します。

この動作は、先述したポリシーにてallowされているように見受けられるのですが、実際にはdenyされています。

なぜポリシーにてallowされている動作がdenyされているのでしょうか。

教えていただきますと幸いです。


CC BY-SA 4.0
2020-05-18T03:51:38.503
66738
2020-05-18T11:03:30.957
2020-05-18T11:03:30.957
3060
38053
question
centos selinux
SELinuxのポリシーでallowされているファイルへのアクセスがdenyとなるのは何故ですか


sesearch に **-C** オプションを付けてみてください。

[code]

    # sesearch -C --allow --source httpd_t --perm read --target user_home_t --class file
    Found 1 semantic av rules:
    DT allow httpd_t user_home_type : file { ioctl read getattr lock open } ; [ httpd_read_user_content ]
    
[/code]

このルールは `httpd_read_user_content` というブール値に紐付いていて、先頭の **D** は無効になっていることを示します。

`setsebool` コマンドで有効にします。  
永続化するなら **-P** オプションを付けます。

[code]

    # setsebool httpd_read_user_content on
    # setsebool -P httpd_read_user_content on
    
[/code]


CC BY-SA 4.0
2020-05-18T04:50:38.387
66739
2020-05-18T04:50:38.387
4603
66738
answer