【SELinux】SELinuxを操作してみた

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

概要

前回、【SELinux】SELinuxが分からないので概要をまとめてみた でSELinuxの概要をまとめてみました。今回は実際に操作してSELinuxの勘所を書いていきたいと思います。

対象OS

試してみたのはCentOS6系でのSELinuxの操作です。CentOSではデフォルトでSELinuxはオンで有効になっています。

SELinuxのステータスの確認

3つのステータス

  • permissive
    • SELinuxを一部有効化している状態。ルール上拒否すべきアクセスも許可する。見かけ上は通常状態のLinuxと同じだが、アクセス拒否した場合はログに出力される
  • enforcing
    • SELinuxを有効化している状態。ルール上拒否すべきアクセスは拒否される。アクセス拒否した場合ログに出力される。
  • disabled
    • SELinuxを無効化している状態 。ログにも出力されない。

ステータス確認コマンド

$ getenforce
Enforcing

SELinuxのステータス変更

enforcing

setenforce 1

permissive

setenforce 0

disabled

/etc/selinux/configの以下にdisabledに書き換える

SELINUX=disabled

SELinux設定ファイル

setenfoceコマンドは一時的な変更。再起動するとデフォルトのSELinuxのステータスに戻ってしまう。/etc/selinux/configでデフォルトのSELinuxのステータスとターゲットポリシーを変更することができる。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=disabled
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

デフォルトポリシー

デフォルトだとtargetedポリシーのようです。これはdhcpd、httpd、namedなど、一部が制限を受け、その他はunconfined_tという全く制限を受けないドメインに設定されるみたいです。より適用範囲の広いstrictポリシーもある。

ターゲットポリシー

ネットワーク上でリッスンするサービスは、ほとんどすべて制限があります。また、passwd アプリケーションなど、Linux root ユーザーとして実行し、ユーザーのためのタスクを実行するプロセスはほとんど、制限があります。

現在のポリシーのルール調査方法

パッケージ

yum install setools-console

ポリシールール概要

  • ルール= アクセスベクタルール
  • ルールが定義されていないすべてのアクセスは「アクセスを許可せず、アクセスが試みられた場合監査ログに記録する」
  • アクセスベクタルールが1つも定義されていない状態ではまったく何も動かない
  • 許す操作だけを記述する。許可のの設定は「どのドメインが、どのタイプの、どのクラスに、どの操作を」
  • 4種類のルール
    • allow ログなし許可ルール。一番基本となるルール
    • auditallow ログあり許可ルール
    • dontaudit ログ出力抑止ルール
    • neverallow ルールのコンパイル時に許さないルール //現在は使われていない??seinfoで取得できない

TE時のアクセス制御で確認しないといけないルールはallowルールとauditallowで良い。

全ルール確認

  • sesearch –allow –auditallow

個別のドメインのルール確認

httpdドメインの許可されているルール確認

sesearch --allow --auditallow -s httpd_t

ルールの表記

種類  ソースタイプ(ドメイン)  ターゲットタイプ  :  クラス  パーミッション;
   allow restorecond_t uucpd_spool_t : fifo_file { getattr relabelfrom relabelto } ;
ET allow named_t init_t : process sigchld ; [ init_systemd //boolean名]
  • ET や DT から始まる行は boolean によって有効化/無効化できるルール。booleanは後述。
    • ET:有効 DT:無効
  • タイプ、ドメインのところで_tで終わっていないのはアトリビュート

アトリビュート

ET allow httpd_t @ttr0558 : file { ioctl read write create getattr setattr lockappend unlink link rename execute }; [ httpd_enable_cgi httpd_unified && httpd_builtin_scripting && ]

@ttr0558がアトリビュート。アトリビュートは複数のタイプを一つにまとめたもの。

seinfo -a<アトリビュート名> -x で

ただし、sesearch –allow –auditallow –dontaudit | grep “@” でもでてこないので、現在は使われていない???

SELinuxのブール値

  • デフォルト設定の「targeted」ポリシーなどのあらかじめ提供されているポリシーでは、一般的によく利用されるアプリケーションが一般的に使用するリソースに対して、SELinux によるアクセス制御の設定を容易に切り替え可能なようにブール値が用意されている
  • アクセスベクタルールをいくつかまとめて管理者が有効化、あるいは無効化できるようにしたもの。
  • ルールをまとめたグループを作ってon/offで切り替えが簡単にできる

ブール値の一覧表示

root@localhost:~
$ semanage boolean -l
SELinux boolean                状態  初期値 説明

ftp_home_dir                   (オフ   ,   オフ)  Allow ftp to read and write files in the user home directories  //これ一つが複数のallow行に対応している
smartmon_3ware                 (オフ   ,   オフ)  Enable additional permissions needed to support devices on 3ware controllers.
xdm_sysadm_login               (オフ   ,   オフ)  Allow xdm logins as sysadm
xen_use_nfs                    (オフ   ,   オフ)  Allow xen to manage nfs files
mozilla_read_content           (オフ   ,   オフ)  Control mozilla content access

ブール値の適用

一時的

setsebool httpd_can_network_connect_db on

永続的

setsebool -P <SELinuxブール値名> 0or1 //-Pで永続化

ブール名に対応した複数のallowを見る

まとめられているのが分かる

$ sesearch --allow -b ftp_home_dir
Found 22 semantic av rules:
   allow ftpd_t autofs_t : dir { getattr search open } ; 
   allow ftpd_t cifs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t cifs_t : dir { ioctl read write getattr lock add_name remove_name search open } ; 
   allow ftpd_t cifs_t : lnk_file { read getattr } ; 
   allow ftpd_t ftpd_t : capability { dac_override dac_read_search } ; 
   allow ftpd_t nfs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t nfs_t : dir { ioctl read write getattr lock add_name remove_name search open } ; 
   allow ftpd_t nfs_t : lnk_file { read getattr } ; 
   allow ftpd_t tmp_t : dir { getattr search open } ; 
   allow ftpd_t user_tmp_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t user_tmp_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; 
   allow ftpd_t user_home_t : file { ioctl read getattr lock open } ; 
   allow ftpd_t user_home_t : dir { ioctl read getattr lock search open } ; 
   allow ftpd_t user_home_type : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t user_home_type : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; 
   allow ftpd_t user_home_type : lnk_file { ioctl read write create getattr setattr lock append unlink link rename } ; 
   allow ftpd_t user_home_type : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t user_home_type : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t httpd_sys_content_t : dir { getattr search open } ; 
   allow ftpd_t home_root_t : dir { ioctl read getattr lock search open } ; 
   allow ftpd_t home_root_t : lnk_file { read getattr } ; 
   allow ftpd_t user_home_dir_t : dir { ioctl read write getattr lock add_name remove_name search open } ; 

SELinuxの運用

【SELinux】SELinuxが分からないので概要をまとめてみた で書いたようにSELinuxを運用する中でTE機能のアクセス制御関連でトラブルが起きます。プロセスからリソースに対してのアクセス制御です。TE機能のアクセス制御関連のトラブルシューティングをまとめてみました。

確認 -SELinuxが原因かどうか見極める-

SELinuxが有効時にプログラムが動かなかった時(主にアクセス制御)はSELinuxが原因の場合があります。TE機能が働いているからです。その場合SELinuxが原因かどうか見極める必要があります。簡単に確認する方法はSELinuxをoffにした時にプログラムが正常に実行できればSELinuxが原因です。あとはログを見て対応するだけです。

ログ

/var/log/audit/audit.logに出力されます。

ログ見方

httpd_t から unreserved_port_t に対して name_connect という操作をしようとしたら拒否された(denied)

type=AVC msg=audit(1461488763.342:856):
avc:  denied  { name_connect }
for  pid=6104 comm="httpd" dest=13070
scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:unreserved_port_t:s0
tclass=tcp_socket
  • denied { }
    • { }内の操作が拒否された
  • comm
    • プロセスのコマンド名
  • pathなどいろいろ
    • アクセスされたリソース
  • scontext
    • プロセスのSELinuxコンテキスト
  • tcontext
    • アクセスされたリソースのSELinuxコンテキスト
  • tclass
    • アクセスされたリソースのクラス クラスはリソースの種類のこと

SELinux起因のアクセスエラーへの対応

こちらを参考
SELinuxのせいで動かない撲滅ガイド

問題解決まとめ

  • アクセス拒否されているファイルと同じような役割のファイルのセキュリティコンテキストを適用する
    • chcon –reference=参照ファイル file
    • chcon セキュリティコンテキスト file
  • setroubleshootを使用 上記リンクを参考
  • setroubleshoot使用しない方法
    • 監査ログにはプロセスのドメイン、リソースのタイプ、リソースのクラス、アクセス拒否された操作が記録されている。sesearch –allow –auditallow -s <ドメイン> -t <タイプ> -c <クラス> -p <操作>を実行することにより、対応するSELinuxブール値があるかどうかを知ることができる。対応するSELinuxブール値が見つかればそれを使って解決する
%d人のブロガーが「いいね」をつけました。