とほほのSELinux入門

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

目次

SELinuxとは

DACとMAC

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

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

今度は 403 エラーになりました。監査ログを見てみると下記の様なログが出力されています。

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

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

# ps -efZ | grep httpd
system_u:system_r:httpd_t:s0  apache 2544 2543 0 00:46 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND

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

# ls -ldZ /var/www*
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0           /var/www2

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

# chcon -R -t httpd_sys_content_t /var/www2
# ls -ldZ /var/www*
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0     /var/www
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www2
# curl http://localhost/index.html
Hello

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

SELinuxポリシー

SELinuxポリシーは主に下記のルールから構成されます。

コンテキスト

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

# ps -efZ | grep httpd
system_u:system_r:httpd_t:s0    root      2543     1  0 00:46 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
# ls -ldZ /var/www
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www

コンテキストは下記の形式をしています。*_uSELinuxユーザーー*_rロール*_t はプロセスの場合は ドメイン、リソースの場合は タイプ と呼びます。最後に s* や c* などの レベル(レンジ) が並びます。

selinux_user(*_u) : selinux_role(*_r) : domain/type(*_t) : level(s*,c*)

ファイルのラベリング

ファイルのラベリング は例えば「どのパス名にマッチするファイルに対しては、どのコンテキスト(ラベル)を割り当てるか」を定義します。semanage コマンドでその一覧を見ることができます。

# yum -y install policycoreutils-python		# CentOS 7
# dnf -y install policycoreutils-python-utils	# CentOS 8
# semanage fcontext -l | grep /var/www		# ファイルコンテキストに対するルール一覧
/var/www(/.*)?  all files  system_u:object_r:httpd_sys_content_t:s0

コンテキストを一時的に変更するには chcon コマンドを使用しますが、パッケージをアップデートしたりすると変更前のコンテキストに戻ってしまうことがあります。

# chcon -R -t httpd_sys_content_t /var/www2

コンテキストを永続的に設定するには、まず、ラベリングルールを定義します。

# semanage fcontext -a -t httpd_sys_content_t "/var/www2(/.*)?"
# grep httpd_sys_content_t /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)と呼びます。

クラスとパーミッションの一覧を表示するには seinfo コマンドを使用します。

# yum -y install setools-console
# seinfo -c -x
file
   read
   write
   execute
     :
dir
   read
   write
     :

Access Vectorルールの一覧を表示するには sesarch コマンドを使用します。CentOS 7 の時点で10万を超えるルールが定義されています。下記の file の行により、「httpd_t ドメインのプロセスが、httpd_sys_content_t タイプで、file クラスのリソースに対して、read 等のパーミッションが、allow されている」ことが分かります。

# yum -y install setools-console
# sesearch --allow | grep httpd_t | grep httpd_sys_content_t
   allow httpd_t httpd_sys_content_t : lnk_file { read getattr } ;
   allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search open } ;
   allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock map open } ;
   allow httpd_t httpd_sys_content_t : dir { ioctl read write getattr lock add_name remove_name search open } ;

上記で出てきた監査ログを見ても、「httpd_t ドメインのプロセス(ソース)が、var_t タイプで、file クラスのリソース(ターゲット)に対して、getattr パーミッションが、denied」されていることが分かります。

# tail /var/log/audit/audit.log
type=AVC msg=audit(1610898951.138:247): avc:  denied  { getattr } for
  pid=2544 comm="httpd" path="/var/www2/html/index.html" dev="dm-0" ino=157772
  scontext=system_u:system_r:httpd_t:s0
  tcontext=unconfined_u:object_r:var_t:s0
  tclass=file

ドメイン遷移

ドメイン遷移 は、「どのドメインのプロセスが、どのタイプのファイルを実行すると、どのドメインとしてプロセス起動するか」を定義します。sesearch コマンドでルールの一覧を表示することができます。下記のルールは、init_t ドメインのプロセスが、httpd_exec_t タイプのファイルを起動すると、httpd_t ドメインを割り当てることを意味しています。

# sesearch --type | grep httpd_exec_t
   type_transition init_t httpd_exec_t : process httpd_t;

systemd プロセス、/usr/sbin/httpd ファイル、httpd プロセスのドメイン・タイプを確認すると、上記のルールに合致していることが分かります。

# ps -efZ | grep systemd
system_u:system_r:init_t:s0 root 1  0  0 00:39 ? 00:00:04 /usr/lib/systemd/systemd ...
# ls -lZ /usr/sbin/httpd
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
# ps -efZ | grep httpd
system_u:system_r:httpd_t:s0 root 2543  1  0 00:46 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND

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

# /usr/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 5000	# 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ブール値が実際にはどんなルールの組み合わせから構成されているかを表示します。最初の1文字目は E(現在有効)、D(現在無効)、2文字目は T(onの時に有効)、F(offの時に有効) を意味します。

# sesearch -b httpd_builtin_scripting -AC
ET allow httpd_t dirsrvadmin_ra_content_t : lnk_file { read getattr } ; [ httpd_builtin_scripting ]
ET allow httpd_t httpd_user_ra_content_t : lnk_file { read getattr } ; [ httpd_builtin_scripting ]
    :

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

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

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       *
system_u             system_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
   webadm_r
      Dominated Roles:
         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 | grep httpd_t | grep execute
   allow httpd_t httpd_sys_script_exec_t : file { ioctl read getattr map execute execute_no_trans open } ;
     :

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. root root system_u:object_r:httpd_sys_script_exec_t:s0 /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ブール値(とその値)の一覧を表示
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 杜甫々
初版:2021年1月24日 最終更新:2021年1月24日
http://www.tohoho-web.com/ex/selinux.html