本書の内容は AlmaLinux 9 で動作を確認しています。
通常のユーザ(root, ...)、グループ(wheel, ...)、パーミッション(rwx---)でアクセス制御するレベルを 任意アクセス制御 (DAC:Discretionary Access Control) と呼びます。root 権限を乗っ取られてしまうと、すべての操作を実行可能となってしまいます。これに対し、SELinux は 強制アクセス制御 (MAC:Mandatory Access Control) レベルのアクセス制御を実現します。たとえ httpd 経由で root 権限が乗っ取られたとしても、httpd に与えられた httpd ドメインの範囲の操作しか実行することができず、被害を最小限に抑えることができます。
Ubuntu 22.04
$ sudo apt install selinux-utils
AlmaLinux 9
dnf -y install selinux-policy-targeted
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をインストールして 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
今度は正常に取得できました。ただし、これは一時的な設定で、恒常的に設定するには後で説明する手順が必要です。
上記で、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ルール は 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 の機能を簡単に利用するために、一部のルールは 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) では、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 -Z や semanage 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__
ユーザやリソースに カテゴリ (c*) の概念を設定し、カテゴリ毎のアクセス権を制御します。部署別にアクセス範囲を制御したい場合に利用できますが、現在では Docker や OpenShift などのコンテナの権限管理に使用されているケースが大半のようです。詳細は下記などを参照してください。
MCS に加えて センシビティ (感度) (s*) の概念を加え、レベルに応じたアクセス件を制御します。課長、部長といった役職クラス別にアクセス権を制御したい場合に利用します。軍事関連など、最重要機密を扱うプロジェクトでの利用例があります。利用する際は /etc/selinux/config で SELINUXTYPE=mls を設定します。詳細は下記などを参照してください。
dontaudit ルールはサイレント拒否とも呼ばれ、監査ログ(audit.log)にもロギングされないため、何故か動かない原因を探る際にルールで拒否されていても気づかないことがあります。semodule -DB コマンドでサイレント拒否を無効化することにより確認が楽になります。
# seinfo # サイレント拒否が何個あるか確認する(Dontaudit項目) # sesearch --dontaudit # サイレント拒否の一覧を表示する # semodule -DB # サイレント拒否を無効化する(ロギングするようになる) # semodule -B # サイレント拒否を有効化する(再度ロギングしなくなる)
では、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 コマンドでコマンドマニュアルを参照してください。
SELinux の有効化・無効化状態を表示・設定します。
# getenforce # SELinuxの有効化・無効化状態を表示する # setenforce 0 # SELinuxを一時的にPermissiveモードにする # setenforce 1 # SELinuxを一時的にEnforcingモードにする
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
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 ...
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
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;
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ブール値(とその値)の一覧を表示
AVルールの一覧から上限にマッチするものを検索します。
# yum -y install setools-console # sesearch --allow --source httpd_t --target httpd_sys_content_t --class file
ファイルやディレクトリのコンテキストを一時的に変更します。-R オプションは再帰的に変更します。一時的変更なので、パッケージの追加・更新、restorecon や /.autorelabel により元に戻ることがあります。
# chcon [-R] [-u user] [-r rule] [-t type] [-l level] file...
指定したコンテキストに合致するファイルやディレクトリを検索します。
# yum -y install setools-console # findcon [-u user] [-r role] [-t type] [-m level] dir...
ルールに従ってファイルやディレクトリのコンテキストを再設定(リストア)します。-R は再帰的、-v は変更状況を表示、-n は変更せずにチェックのみ行います。
# yum -y install policycoreutils # restorecon [-R] [-v] [-n] file...
指定したコンテキストでコマンドを起動します。
# runcon [-u user] [-r rule] [-t domain] [-l level] command arg...
SELinuxブール値を表示・設定します。
# yum -y install libselinux-utils # getsebool -a # setsebool -P bool on|off
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 # ファイルラベリングルールを削除