とほほのSELinux入門

トップ > アラカルト > とほほのSELinux入門

目次

SELinuxとは

本書の内容は AlmaLinux 9 で動作を確認しています。

DACとMAC

通常のユーザ(root, ...)、グループ(wheel, ...)、パーミッション(rwx---)でアクセス制御するレベルを 任意アクセス制御 (DAC:Discretionary Access Control) と呼びます。root 権限を乗っ取られてしまうと、すべての操作を実行可能となってしまいます。これに対し、SELinux強制アクセス制御 (MAC:Mandatory Access Control) レベルのアクセス制御を実現します。たとえ httpd 経由で root 権限が乗っ取られたとしても、httpd に与えられた httpd ドメインの範囲の操作しか実行することができず、被害を最小限に抑えることができます。

SELinuxをインストールする

Ubuntu 22.04

$ sudo apt install selinux-utils

AlmaLinux 9

dnf -y install selinux-policy-targeted

SELinuxの有効化・無効化

SELinux の有効化状態を調べるには getenforce コマンドを使用します。

# getenforce

SELinux の有効化状態を一時的に切り替えるには setenforce コマンドを使用します。OS を再起動すると元の状態に戻ります。

# setenforce 0		# 一時的にpermissiveモードに変更
# setenforce 1		# 一時的にenforcingモードに変更

恒常的に変更するには /etc/selinux/config を書き換えて OS を再起動します。/etc/sysconfig/selinux を編集と紹介されてたりしますが、これは /etc/selinux/config へのシンボリックリンクです。sed -i で書き換えるとシンボリックリンクが外れてしまうので注意が必要です。

# vi /etc/selinux/config
SELINUX=enforcing
# reboot

ApacheでSELinuxを試してみる

まず、Apacheをインストールして index.html を取得してみます。

# yum -y install httpd
# echo "Hello" > /var/www/html/index.html
# systemctl start httpd
# curl http://localhost/index.html
Hello					# 正常に取得できた

ここで一度SELinuxの遮断を無効化しておきます。

# setenforce 0		# 遮断を無効化する

次に、/var/www の代わりに /var/www2 で試してみます。

# mkdir -p /var/www2/html
# echo "Hello" > /var/www2/html/index.html
# vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www2/html"
<Directory "/var/www2">
  :
</Directory>
<Directory "/var/www2/html">
  :
</Directory>
# systemctl restart httpd
# curl http://localhost/index.html
Hello					# 正常に取得できた

これも正常に取得できると思います。次に SELinux を有効化して試してみます。

# setenforce 1	                # SELinux を有効化する
# curl http://localhost/index.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>	# 遮断された
   :

今度は 403 エラーになりました。監査ログを見てみると下記の様なログが出力されています。httpd というプロセスが /var/www2/html/index.html という file タイプのリソースに getattr を実行しようとして denied されたということがわかります。

# grep denied /var/log/audit/audit.log | tail -1
type=AVC msg=audit(1708015195.730:177): avc:  denied  { getattr } for
  pid=1955
  comm="httpd"
  path="/var/www2/html/index.html"
  dev="dm-0"
  ino=414893
  scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0
  tclass=file
  permissive=0

ps コマンドに -Z オプションをつけてみると、httpd プロセスに下記の情報が付与されているのがわかります。

# ps -efZ | grep httpd
system_u:system_r:httpd_t:s0  apache  1952  1951  0 01:39 ?  00:00:00 /usr/sbin/httpd -DFOREGROUND

ls コマンドに -Z オプションをつけてみると、/var/www や /var/www2 に下記の情報が付与されていることがわかります。

# ls -ldZ /var/www*
drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0 33 Feb 16 01:38 /var/www
drwxr-xr-x. 3 root root unconfined_u:object_r:var_t:s0           18 Feb 16 01:38 /var/www2

説明は後回しにして、/var/www2 にも /var/www と同じタイプ(*_t)を設定して試してみましょう。

# chcon -R -t httpd_sys_content_t /var/www2
# ls -ldZ /var/www*
drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0     33 Feb 16 01:38 /var/www
drwxr-xr-x. 3 root root unconfined_u:object_r:httpd_sys_content_t:s0 18 Feb 16 01:38 /var/www2
# curl http://localhost/index.html
Hello

今度は正常に取得できました。ただし、これは一時的な設定で、恒常的に設定するには後で説明する手順が必要です。

SELinuxポリシー

上記で、httpd プロセスは httpd_t という属性を持っていることが確認できました。また、/var/www は httpd_sys_content_t という属性を持っていることが確認できました。httpd_t 属性を持つプロセスは、httpd_sys_content_t 属性を持つディレクトリやファイルにはアクセスできるけど、/etc/passwd など httpd_sys_content_t 属性を持たないファイルにはアクセスできない。というのが SELinux の重要な機能のひとつです。

これにより、たとえ、httpd の脆弱性を攻撃されて、httpde 経由で root 権限を乗っ取られたとしても、httpd_t ドメインに許可されているファイル群 (httpd_sys_content_t 属性のファイル等) にしかアクセスすることができず、/etc/passwd などのファイルにはアクセスできないことになります。「乗っ取られても大丈夫」これが SELinux の強みです。

SELinux でアクセスを制限するには下記を行えばよいことになります。

_t や _u などは下記の意味を持ちます。

これらを利用して、SELinux は下記のような制御を行います。

コンテキスト

ps や ls コマンドに -Z オプションをつけて表示される下記の様な情報を コンテキスト または ラベル と呼びます。プロセス のコンテキストを ソースコンテキスト、ファイルやソケットなどの リソース のコンテキストを ターゲットコンテキスト と呼びます。

# ps -efZ | grep httpd
system_u:system_r:httpd_t:s0  apache  1952  1951  0 01:39 ?  00:00:00 /usr/sbin/httpd -DFOREGROUND
# ls -ldZ /var/www
drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0 33 Feb 16 01:38 /var/www

コンテキストは下記から構成されます。カテゴリは省略できます。

selinux_user(*_u):role(*_r):domain/type(*_t):level(s*):category(c*)

ファイルのラベリング

ファイルのコンテキストを一時的に変更するには chcon コマンドを用います。-R はディレクトリ配下すべてのファイルを対象とします。

# chcon -t httpd_sys_content_t -R /var/www2

ただし chcon で変更したコンテキストはパッケージアップデートなどのタイミングで変更前の状態に戻ってしまうことがあります。コンテキストを永続化するには semanage コマンドを使用します。semanage コマンドがインストールされていない場合は下記の様にインストールしてください。

# yum -y install policycoreutils-python		# CentOS 7
# dnf -y install policycoreutils-python-utils	# CentOS 8 / AlmaLinux 9

まずは、/var/www にどのようなコンテキストが割り当てられているか確認します。

# semanage fcontext -l | grep /var/www		# ファイルコンテキストに対するルール一覧
/var/www(/.*)?  all files  system_u:object_r:httpd_sys_content_t:s0

/var/www と同様に /var/www2 にもラベリングルールを定義します。

# semanage fcontext -a -t httpd_sys_content_t "/var/www2(/.*)?"

追加定義したラベリングルールは下記のファイルに格納されます。

# cat /etc/selinux/targeted/contexts/files/file_contexts.local

上記のラベリングルールに従い、restorecon コマンドでファイルやディレクトリのコンテキストを一括再設定(リストア)します。

# restorecon -R -v /var/www2

chcon で後戻りできない変更を行ってしまい、restorecon も動かせない状況に陥った時のリカバリ策として、/.autorelabel という名前のファイルを作成しておくと、OS 再起動時に全ファイルのコンテキストをラベリングルールに従ってリストアしてくれます。

# touch /.autorelabel

Access Vectorルール

Access VectorルールAVルール とも呼ばれます。「どのドメインが、どのタイプに対して、どのクラスの場合に、どんなパーミッションを、どうするか」を定義します。ルールが存在しない場合や、(たとえallowが設定されていても)強制拒絶されている場合は拒絶されます。Access Vectorルールがキャッシュされたものを AVC(Access Vector Cache)と呼びます。

SELinux 関連の情報を表示するには seinfo コマンドを使用します。下記を実行すると file クラスは file 共通パーミッションセットを継承し、加えて entrypoint と execute_no_trans パーミッションをサポートしていることがわかります。

# yum -y install setools-console
# seinfo -c file -x
Classes: 1
   class file
inherits file
{
    entrypoint
    execute_no_trans
}

下記を実行すると file 共通パーミッションセットは、execure, getattr, read, write などのパーミッションをサポートしていることがわかります。

# seinfo --common file -x
Commons: 1
   common file
{
    execute
    getattr
    read
    write
      :

Access Vectorルールの一覧を表示するには sesearch コマンドを使用します。下記では httpd_t ドメインから httpd_sys_content_t ターゲットに対する許可ルールを検索しています。

# yum -y install setools-console
# sesearch --allow --source httpd_t --target httpd_sys_content_t --class file
  :
allow httpd_t httpd_content_type:file { getattr ioctl lock map open read };
  :

上記で _type とあるのはアトリビュート(タイプのリスト)で、下記により、httpd_content_type には httpd_sys_content_t が含まれていることがわかります。

# seinfo --attribute httpd_content_type -x
  :
  httpd_sys_content_t
  :

以上のことから、httpd_t ドメインのプロセスから、httpd_sys_content_t タイプのリソースに対して、getattr, ioctl, lock, map, open read を実行する権限が許可されていることが分かります。

ドメイン遷移

ドメイン遷移 は、「どのドメインのプロセスが、どのタイプのファイルを実行すると、どのドメインとしてプロセス起動するか」を定義します。まず、httpd を起動する systemd プロセスのドメインを調べます。

# ps -efZ | grep systemd
system_u:system_r:init_t:s0  root  1  0  0 Feb16 ?  00:00:38 /usr/lib/systemd/systemd ...

また、httpd ファイルのタイプを調べます。

# ls -lZ /sbin/httpd
-rwxr-xr-x. 1 root root system_u:object_r:httpd_exec_t:s0 585720 Sep 27 20:33 /sbin/httpd

次に、sesearch コマンドで init_t ドメインのプロセスが httpd_exec_t タイプのファイルを実行した時に割り当てるドメインを調べます。下記から、init_t ドメインのプロセス systemd が httpd_exec_t タイプのファイルを実行した場合、そのプロセスに httpd_t ドメインを割り当てることがわかります。

# sesearch --type_trans --source init_t --target httpd_exec_t
type_transition init_t httpd_exec_t:process httpd_t;

/sbin/httpd を systemctl からではなく直接起動してしまうと、init_t ドメインからの起動ではなくなるため、httpd_t ではなく、危険な unconfined_t ドメインで起動してしまいますので注意してください。

# systemctl stop httpd
# /sbin/httpd -DFORGROUND
# ps -efZ | grep httpd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 9978 1  0 00:26 ? 00:00:00 /usr/sbin/httpd -DFORGROUND

ポートのラベリング

httpd が使用する TCP/UDPポートは、http_port_tタイプ(違いがよくわからないけど http_cache_port_t でもOK)である必要があります。登録済ポート以外を使用する場合は semanage port -a|-m コマンドでルールを追加します。

# semanage port -l | grep http			# ポートに関するルールを表示
http_cache_port_t   tcp    8080, 8118, 8123, 10001-10010
http_port_t         tcp    80, 81, 443, 488, 8008, 8009, 8443, 9000
# semanage port -a -t http_port_t -p tcp 8888	# http_port_tに8888を追加
# semanage port -m -t http_port_t -p tcp 5000	# 他サービスで定義済みの場合は-mで追加
# semanage port -d -t http_port_t -p tcp 8888	# http_port_tから8888を削除

アトリビュート

稀に *_t ではなく *_type という名前が使用されます。これは アトリビュート と呼ばれるドメイン/タイプのグループです。

# sesearch --allow | grep httpd_script_type | head
   allow httpd_script_type fonts_cache_t : lnk_file { read getattr } ;
   allow httpd_script_type nscd_var_run_t : file map ;
   allow httpd_script_type public_content_t : dir { ioctl read getattr lock search open } ;
   allow httpd_script_type fonts_cache_t : dir { ioctl read getattr lock search open } ;

アトリビュートの中に具体的にはどんなドメイン/タイプが含まれているかは seinfo コマンドで確認できます。

# seinfo --attribute=httpd_script_type -x
   httpd_script_type
      httpd_sys_script_t
      httpd_user_script_t
      apcupsd_cgi_script_t

SELinuxブール値

SELinux の機能を簡単に利用するために、一部のルールは on/off の切り替えだけで制御できるようになっています。getsebool コマンドは SELinuxブール値の一覧を表示します。

# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off

setsebool コマンドは SELinuxブール値を変更します。

# setsebool -P httpd_builtin_scripting off

search -b コマンドは SELinuxブール値が実際にはどんなルールの組み合わせから構成されているかを表示します。

# sesearch --allow -b httpd_builtin_scripting --class file
allow httpd_t apcupsd_cgi_ra_content_t:file append; [ httpd_builtin_scripting ]:True
allow httpd_t apcupsd_cgi_ra_content_t:file create; [ httpd_builtin_scripting ]:True
    :

httpd に関するブール値には下記などがあります。

# semanage boolean -l | grep httpd_
httpd_anon_write              httpdからの匿名書き込みを許可
httpd_builtin_scripting       組み込みスクリプト(一般的に PHP)の使用を許可
httpd_can_connect_ftp         FTPクライアントとして動作することを許可
httpd_can_connect_ldap        LDAPへの接続を許可
httpd_can_network_connect     スクリプトやモジュールからのネットワーク接続を許可
httpd_can_network_connect_db  DBへの接続を許可
httpd_can_network_memcache    memcachedへの接続を許可
httpd_can_network_relay       リレーとして動作することを許可
httpd_can_sendmail            メールの送信を許可
httpd_dbus_sssd               D-Bus 経由の sssd 通信を許可
httpd_enable_cgi              CGIを許可
httpd_enable_ftp_server       FTPサーバーとして動作することを許可
httpd_enable_homedirs         ホームディレクトリーへのアクセスを許可
httpd_execmem                 スクリプトやモジュールからのexecmem/execstack実行を許可
httpd_read_user_content       ユーザーコンテンツを読み取ることを許可
httpd_ssi_exec                SSIを許可
httpd_sys_script_anon_write   スクリプトからの匿名書き込みを許可
httpd_use_cifs                CIFSへのアクセスを許可
httpd_use_nfs                 NFSへのアクセスを許可
httpd_verify_dns              NSレコードのクエリーを許可
     :

RBAC(Role Based Access Control)

RBAC (Role Based Access Control) では、root ユーザや wheel グループよりも細かなロール管理を行います。まず、自分のロールを表示するには id -Z を使用します。*_r がロールです。unconfined_r は特に制限がかけられていない強いロールです。

# id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

ログイン時のユーザのロールを調べるには semanage login コマンドを使用します。下記のルールにより、root や一般ユーザ(__default__)の SELinuxユーザーは unconfined_u になることがわかります。

# semanage login -l
Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *

SELinuxユーザーの一覧は seinfo -u コマンドで表示できます。

# seinfo -u
   unconfined_u	... 特に制限無し
   system_u	... システムで利用。ユーザには割り当てない
   sysadm_u	... システム管理者
   staff_u	... スタッフ管理者
   user_u	... 一般ユーザ。su/sudo禁止
   guest_u	... ゲスト。自作コマンドの起動不可。ネットワークアクセス不可

ロールの一覧は seinfo -r コマンドで表示できます。

# seinfo -r
   unconfined_r	... 特に制限なし
   system_r	... システム管理者ロール(ユーザには割り当てない)
   sysadm_r	... システム管理者ロール
   secadm_r	... SELinux管理者ロール
   webadm_r	... Web管理者ロール
   auditadm_r	... 監査管理者ロール
   dbadm_r	... DB管理者ロール
   logadm_r	... ログ管理者ロール
   staff_r	... スタッフロール
   user_r	... 一般ユーザロール
   guest_r	... ゲストロール

ロールとドメイン/タイプの関係は seinfo -rrole -x コマンドで表示できます。

# seinfo -rwebadm_r -x
Roles: 1
   role webadm_r types webadm_t;

SELinuxユーザーが保持できるロールの一覧は semanage user -l コマンドで表示できます。

# semanage user -l
   :
unconfined_u    user       s0         s0-s0:c0.c1023           system_r unconfined_r

ログインユーザに対応する SELinuxユーザーを設定するには useradd -Zsemanage login -a コマンドを使用します。SELinux ユーザは新たにログインした時に割り当てられます。su - でユーザを変更した時には割り当てられません。

# useradd -Z guest_u suzuki			# 新規ユーザに割り当てる
# semanage login -a -s guest_u yamada		# 既存ユーザに割り当てる

高度なセキュリティを求めるシステムでは、root や一般ユーザ(__default__)の SELinuxユーザーを unconfined_u から user_u に降格させ、代わりに、システム管理者、SELinux管理者、Web管理者などのロールとユーザを個別に作成したりするようです。一般ユーザ(__default__)の SELinuxユーザーを user_u に降格させるには下記のコマンドを実行します。

# /usr/sbin/semanage login -m -S targeted -s user_u -r s0 __default__

MCS(Multi Category Security)

ユーザやリソースに カテゴリ (c*) の概念を設定し、カテゴリ毎のアクセス権を制御します。部署別にアクセス範囲を制御したい場合に利用できますが、現在では Docker や OpenShift などのコンテナの権限管理に使用されているケースが大半のようです。詳細は下記などを参照してください。

MLS(Multi Level Security)

MCS に加えて センシビティ (感度) (s*) の概念を加え、レベルに応じたアクセス件を制御します。課長、部長といった役職クラス別にアクセス権を制御したい場合に利用します。軍事関連など、最重要機密を扱うプロジェクトでの利用例があります。利用する際は /etc/selinux/configSELINUXTYPE=mls を設定します。詳細は下記などを参照してください。

サイレント拒否

dontaudit ルールはサイレント拒否とも呼ばれ、監査ログ(audit.log)にもロギングされないため、何故か動かない原因を探る際にルールで拒否されていても気づかないことがあります。semodule -DB コマンドでサイレント拒否を無効化することにより確認が楽になります。

# seinfo		# サイレント拒否が何個あるか確認する(Dontaudit項目)
# sesearch --dontaudit	# サイレント拒否の一覧を表示する
# semodule -DB		# サイレント拒否を無効化する(ロギングするようになる)
# semodule -B		# サイレント拒否を有効化する(再度ロギングしなくなる)

ApacheでCGIを動かしてみる

では、Apache で CGI を動作させる練習をしてみましょう。別のターミナルで audit.log を監視しておきます。

# tail -f /var/log/audit/audit.log | grep denied
# mkdir /var/www2/cgi-bin				# CGIディレクトリを用意
# cat > /var/www2/cgi-bin/test.cgi <<EOF		# CGIコマンドを用意
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
echo "Hello CGI"
EOF
# chmod 755 /var/www2/cgi-bin/test.cgi
# vi /etc/httpd/conf/httpd.conf				# httpd.confを修正
  ScriptAlias /cgi-bin/ "/var/www2/cgi-bin/"
<Directory "/var/www2/cgi-bin">
   :
</Directory>
# systemctl restart httpd				# httpdを再起動
# curl http://localhost/cgi-bin/test.cgi
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>		# 500エラー

500エラーになりましたが、audit.log には何も出力されません。試しにサイレント拒否を無効化してみます。

# semodule -DB
# curl http://localhost/cgi-bin/test.cgi
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>		# 500エラー

今度は audit.log に下記が記録されます。

type=AVC msg=audit(1611466427.143:141):
  avc:  denied  { execute } for  pid=1213 comm="httpd"
  name="test.cgi" dev="dm-0" ino=143894
  scontext=system_u:system_r:httpd_t:s0
  tcontext=unconfined_u:object_r:httpd_sys_content_t:s0
  tclass=file permissive=0

上記のログを audit2allow に食わせてみます。

# grep denied /var/log/audit/audit.log | grep test.cgi | tail -1 | audit2allow
#============= httpd_t ==============
#!!!! This avc can be allowed using the boolean 'httpd_unified'
allow httpd_t httpd_sys_content_t:file execute;

上記から、httpd_t ドメインが httpd_sys_content_t タイプに対する execute パーミッションを与えるか、ブーリアン値の httpd_unfied を on にすればよいことが分かりますが、少し危険です。もう少し調べてみます。

# sesearch --allow --source httpd_t --class file | grep execute
     :
   allow httpd_t httpd_sys_script_exec_t:file { execute execute_no_trans }; [ httpd_enable_cgi ]:True
     :

httpd_t ドメインは、httpd_sys_script_exec_t タイプに対してであれば execute パーミッションを持っていることが分かりました。確かに、/var/www/cgi-bin にも httpd_sys_script_exec_t が設定されています。

# ls -ldZ /var/www/cgi-bin
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_script_exec_t:s0 6 Sep 27 20:31 /var/www/cgi-bin

/var/www2/cgi-bin も httpd_sys_script_exec_t タイプにして試してみます。

# chcon -R -t httpd_sys_script_exec_t /var/www2/cgi-bin
# curl http://localhost/cgi-bin/test.cgi
Hello CGI

うまく動いたのでこのルールを永続化しておきます。また、サイレント拒否も元に戻しておきます。

# semanage fcontext -a -t httpd_sys_script_exec_t "/var/www2/cgi-bin(/.*)?"
# restorecon -R -v /var/www2/cgi-bin
# semodule -B

その他の解決

Docker の -v で永続ボリュームをコンテナに割り当てたけどコンテナから書き込みができない場合:

# chcon -R -t container_file_t /var/mnt
# docker run -d -it --name centos7 -v /var/mnt:/var/mnt centos:7

関連コマンド

SELinux に関連するコマンドを下記に示します。見つからない場合は「yum provides コマンド名」でどのパッケージに含まれているか調べて yum/dnf でインストールしてください。下記では、主な使用例、主なオプションのみを記載しています。詳細は man コマンドでコマンドマニュアルを参照してください。

getenforce/setenforceコマンド

SELinux の有効化・無効化状態を表示・設定します。

# getenforce		# SELinuxの有効化・無効化状態を表示する
# setenforce 0		# SELinuxを一時的にPermissiveモードにする
# setenforce 1		# SELinuxを一時的にEnforcingモードにする
sestatusコマンド

SELinux に関するステータス情報を表示します。

# yum -y install policycoreutils
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
ausearchコマンド

audit.log の内容を検索表示します。

# ausearch -m avc -sv no --start yesterday
time->Sat Jan 23 01:19:01 2021
type=SYSCALL msg=audit(1611332341.719:407): arch=c000003e syscall=49 success=no ...
type=AVC msg=audit(1611332341.719:407): avc: denied { name_bind } for pid=2983 comm="httpd" src=5000 ...
audit2whyコマンド

audit.log から拒否の原因を提示します。可能であれば対処法も示します。

# yum -y install policycoreutils-python
# grep denied /var/log/audit/audit.log | tail -10 | audit2why
type=AVC msg=audit(1611332212.337:398): avc: denied  { name_bind } for pid=2931 comm="httpd" src=8888 ...
        Was caused by:
        The boolean nis_enabled was set incorrectly.
        Description:
        Allow system to run with NIS
        Allow access by executing:
        # setsebool -P nis_enabled 1
audit2allowコマンド

audit.log から拒否を回避すべき allow ルールを提示します。ただし、提示されたルールを鵜呑みに許可してしまうことは危険です。

# yum -y install policycoreutils-python
# grep denied /var/log/audit/audit.log | tail -10 | audit2allow
#============= httpd_t ==============
#!!!! WARNING: 'var_t' is a base type.
allow httpd_t var_t:file getattr;
seinfoコマンド

SELinux に関する様々な情報を表示します。

# yum -y install setools-console
# seinfo                  # 基本情報を表示
# seinfo -c               # クラス(file等)の一覧を表示
# seinfo -c [class] -x    # クラス(file等)とパーミッション(read等)の一覧を表示
# seinfo -u               # SELinuxユーザーの一覧を表示
# seinfo -r [user] -x     # SELinuxユーザーとロールの一覧を表示
# seinfo -r               # ロールの一覧を表示
# seinfo -r [role] -x     # ロールとドメイン/タイプ一覧を表示
# seinfo -t               # ドメイン/タイプの一覧を表示
# seinfo -t [type] -x     # ドメイン/タイプとアトリビュートの一覧を表示
# seinfo -a               # アトリビュートの一覧を表示
# seinfo -a [attr] -x     # アトリビュートとタイプの一覧を表示
# seinfo -b [-x]          # SELinuxブール値(とその値)の一覧を表示
sesearchコマンド

AVルールの一覧から上限にマッチするものを検索します。

# yum -y install setools-console
# sesearch --allow --source httpd_t --target httpd_sys_content_t --class file
chconコマンド

ファイルやディレクトリのコンテキストを一時的に変更します。-R オプションは再帰的に変更します。一時的変更なので、パッケージの追加・更新、restorecon/.autorelabel により元に戻ることがあります。

# chcon [-R] [-u user] [-r rule] [-t type] [-l level] file...
findconコマンド

指定したコンテキストに合致するファイルやディレクトリを検索します。

# yum -y install setools-console
# findcon [-u user] [-r role] [-t type] [-m level] dir...
restoreconコマンド

ルールに従ってファイルやディレクトリのコンテキストを再設定(リストア)します。-R は再帰的、-v は変更状況を表示、-n は変更せずにチェックのみ行います。

# yum -y install policycoreutils
# restorecon [-R] [-v] [-n] file...
runconコマンド

指定したコンテキストでコマンドを起動します。

# runcon [-u user] [-r rule] [-t domain] [-l level] command arg...
getsebool/setseboolコマンド

SELinuxブール値を表示・設定します。

# yum -y install libselinux-utils
# getsebool -a
# setsebool -P bool on|off
semanageコマンド

SELinuxポリシーに関する追加・一覧・変更・削除などの管理を行います。

# yum -y install policycoreutils-python
# semanage user -l				# SELinuxユーザーの一覧を表示
# semanage user -a -R role user			# SELinuxユーザーを追加
# semanage user -m -R role user			# SELinuxユーザーを変更
# semanage user -d user				# SELinuxユーザーを削除
# semanage port -l				# ポートの一覧を表示
# semanage port -a -t type -p proto port	# タイプに新規ポート番号を追加
# semanage port -m -t type -p proto port	# タイプに既存ポート番号を追加
# semanage port -d -t type -p proto port	# タイプからポートを削除
# semanage fcontext -l				# ファイルラベリングルールの一覧を表示
# semanage fcontext -a -t type path		# ファイルラベリングルールを追加
# semanage fcontext -d -t type path		# ファイルラベリングルールを削除
その他コマンド

Copyright (C) 2021-2024 杜甫々
初版:2021年1月24日 最終更新:2024年2月18日
http://www.tohoho-web.com/ex/selinux.html