🐷

SELinuxについてまとめてみる2(少し実践編)

2023/01/04に公開

はじめに

前回、SELinuxのそもそのも設定の話について、コマンドを確認しながら紹介しました。

https://zenn.dev/motisan/articles/20230104_selinux

SELinuxとはなんぞやという座学からまとめることも考えましたが、自分自身の理解が浅いのと、
実際の設定をコマンドで確認しながらの方が理解しやすいかなと思い、コマンドを主軸において
SELinuxとは何なのか確認していきたいと思います。

なお、本記事を読んだだけでは、SELinuxがどのように動作しているのかまではわかりません。
動作のイメージに関しては、次回以降の記事で書きたいと思います。

また、本来SELinuxはプロセスとファイル(ディレクトリ)に対して有効なものですが、これから書く内容は、ファイル に限定した内容になります。

SELinuxでよく使うコマンド

コマンド 説明
ls -Z ファイル・ディレクトリのSELinuxのコンテキストを確認する
chcon ファイルのSELinuxコンテキストを変更する
restorecon SELinuxが保持するルールに従って、ファイルやディレクトリのコンテキストを再設定する
fixfiles restoreconよりも大規模にコンテキストの再設定を行う際等に利用する

ls -Z

SELinuxをdisabled以外に設定している場合、全てのファイルには必ずSELinuxで利用するセキュリティコンテキストが付与されています。
SELinuxでは、このコンテキストを利用して細かいアクセス制限を行うことになります。

各ファイルやディレクトに付与されたコンテキストは、ls -Zで確認することができます。

$ ls -Z -1  # 結果を見やすくするために、`-1`オプションをつけています。
unconfined_u:object_r:user_home_t:s0 test.sh # test.shファイルのコンテキスト
unconfined_u:object_r:user_home_t:s0 testdir # testdirディレクトリのコンテキスト

コンテキストは、: を区切りとして4つに分けられます。test.shファイルのコンテキストを例として確認します。
 unconfined_u:object_r:user_home_t:s0
上記をより一般的な書き方にすると、以下になります。
 user:role:type:level

コンテキストの要素 説明
user ・SELinuxのユーザー
・Linuxユーザーとは別物です
・一般的にaaa_u と表記される
・1つ以上のロールと紐づく
role ・SELinuxのロール
・一般的にbbb_rと表記される
・1つ以上のタイプと紐づく
type ・SELinuxのタイプ
・一般的にccc_tと表記される
・アクセス許可設定はtypeを指定して定義
level ・Sensitivity Level とカテゴリーの組み合わせ

なお、一般利用(SELINUXTYPEがtargeted)であるなら、type以外は気にする必要はありません。
なので、以降もtype以外については触れません。

chcon

ls -Z で確認したコンテキストの値を変更することができます。

$ chcon -t tmp_t test.sh
$ ls -Z test.sh 
unconfined_u:object_r:tmp_t:s0 test.sh # Typeの値がtmp_tに変わっている

-t(--type):Typeを指定した値に変更します。

他の主要なオプション

-u(--user):userを指定した値に変更します。
-r(--role):roleを指定した値に変更します。
-v(--verbose):詳細を表示します。

補足

セキュリティコンテキストの情報は、cpコマンドをオプションなしで使った場合は引き継がれません。
-aオプションをつけるか、mvコマンドを使用することでコンテキスト情報を引き継ぐことが可能です。
SELinuxを利用する場合、コピー先に応じた適切なセキュリティコンテキストが割り当てられるので、特に mvコマンドを利用する場合は注意が必要です

# 初期設定
$ ls -Z test.sh 
unconfined_u:object_r:tmp_t:s0 test.sh

# コピー、あるいは移動してみる
$ cp test.sh test_cp.sh # オプションなしのcpコマンド
$ cp -a test.sh test_cp-a.sh # -aオプションをつけたcpコマンド
$ mv test.sh test_mv.sh  # mvコマンド

# 結果
$ ls -Z -1
unconfined_u:object_r:user_home_t:s0 test_cp.sh # cpコマンドだけだと、Typeの設定が一番最初の値に戻っている
unconfined_u:object_r:tmp_t:s0 test_cp-a.sh # -aをつけるとコンテキストも引き継いでいる
unconfined_u:object_r:tmp_t:s0 test_mv.sh # mvでもコンテキストを引き継いでいる

restorecon

chconを使ってセキュリティコンテキストを変更することはほとんどありませんが、補足で記載したように、mvコマンドを使って、コンテキストが意図せず変更された場合、それを修正してあげる必要があります。
SELinuxは、File Cintext(fcontext) と呼ばれる、
 ファイルパスとセキュリティコンテキストの紐付け定義
を保持しているので、それを利用して正しいコンテキストに戻すことができます。

例えば、/home/ユーザー/ディレクトリにファイルやディレクトリが作成された場合に、デフォルトでどのようなコンテキストが付与されるのかを確認してみます。

$ sudo semanage fcontext -l | grep /home/ |head
/home/(.*/)?\.snapshots(/.*)?                      all files          system_u:object_r:snapperd_data_t:s0 
/home/[^/]+                                        directory          unconfined_u:object_r:user_home_dir_t:s0 
/home/[^/]+                                        symbolic link      unconfined_u:object_r:user_home_dir_t:s0 
/home/[^/]+/((www)|(web)|(public_html))(/.*)?/\.htaccess regular file       unconfined_u:object_r:httpd_user_htaccess_t:s0 
/home/[^/]+/((www)|(web)|(public_html))(/.*)?/logs(/.*)? all files          unconfined_u:object_r:httpd_user_ra_content_t:s0 
/home/[^/]+/((www)|(web)|(public_html))(/.+)?      all files          unconfined_u:object_r:httpd_user_content_t:s0 
/home/[^/]+/((www)|(web)|(public_html))/cgi-bin(/.+)? all files          unconfined_u:object_r:httpd_user_script_exec_t:s0 
/home/[^/]+/.*/plugins/nppdf\.so.*                 regular file       unconfined_u:object_r:textrel_shlib_t:s0 
/home/[^/]+/.+                                     all files          unconfined_u:object_r:user_home_t:s0  # ユーザーディレクトリ配下に作成されたファイルに付与されるコンテキスト
/home/[^/]+/.maildir(/.*)?                         all files          unconfined_u:object_r:mail_home_rw_t:s0 

上記から、ユーザーディレクトリに作成されたファイルには、unconfined_u:object_r:user_home_t:s0が付与されることがわかります。

chconコマンドの説明の時に、test.shファイルのコンテキストを手動で変更してしまったので、restoreconを利用して正しいコンテキストに修正します。

$ ls -Z test.sh 
unconfined_u:object_r:tmp_t:s0 test.sh

# コンテキストの修正
$ restorecon -v test.sh 
Relabeled /home/XXX/test.sh from unconfined_u:object_r:tmp_t:s0 to unconfined_u:object_r:user_home_t:s0

$ ls -Z test.sh 
unconfined_u:object_r:user_home_t:s0 test.sh

コンテキストがFile Contextの紐付けに沿って修正されていることがわかります。

-v:詳細を出力するオプションです。これをつけないと標準出力が出てこないので、何がどう修正されたかわかりません。
-n:実際に変更せず、どのように修正されるかを教えてくれます。ただし、結果を知りたい場合は-vも併用する必要があります。

fixfiles

fixfilesコマンドは、restoreconコマンドを大規模に行いたい時に有用です。
例えば、以下のオプションを見てみます。

オプション 説明 restoreconとの対応
check コンテキストを再設定せず、確認するだけ restorecon -nv
restore ファイルシステム全体のコンテキストを再設定 restorecon -Rp /
relabel restoreとほぼ同じ。
ただし、実行前に/tmp配下を削除
rm -rf /tmp/*; restorecon -Rp /

実際にチェックしてみます。

$ sudo fixfiles check
Warning: Skipping the following R/O filesystems:
/sys/fs/cgroup
Checking / /boot /dev /dev/hugepages /dev/mqueue /dev/pts /dev/shm /run /run/user/1000 /sys /sys/fs/cgroup/blkio /sys/fs/cgroup/cpu,cpuacct /sys/fs/cgroup/cpuset /sys/fs/cgroup/devices /sys/fs/cgroup/freezer /sys/fs/cgroup/hugetlb /sys/fs/cgroup/memory /sys/fs/cgroup/misc /sys/fs/cgroup/net_cls,net_prio /sys/fs/cgroup/perf_event /sys/fs/cgroup/pids /sys/fs/cgroup/rdma /sys/fs/cgroup/systemd /sys/fs/cgroup/unified /sys/fs/pstore /sys/kernel/debug /sys/kernel/debug/tracing /sys/kernel/tracing
Would relabel /home/XXX/test_cp-a.sh from unconfined_u:object_r:tmp_t:s0 to unconfined_u:object_r:user_home_t:s0
Would relabel /home/XXX/.ssh from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:ssh_home_t:s0
Warning no default label for /dev/mqueue
Warning no default label for /sys/fs/cgroup/blkio
Warning no default label for /sys/fs/cgroup/cpu,cpuacct
Warning no default label for /sys/fs/cgroup/cpuset
Warning no default label for /sys/fs/cgroup/devices
Warning no default label for /sys/fs/cgroup/freezer
Warning no default label for /sys/fs/cgroup/hugetlb
Warning no default label for /sys/fs/cgroup/memory
Warning no default label for /sys/fs/cgroup/misc
Warning no default label for /sys/fs/cgroup/net_cls,net_prio
Warning no default label for /sys/fs/cgroup/perf_event
Warning no default label for /sys/fs/cgroup/pids
Warning no default label for /sys/fs/cgroup/rdma
Warning no default label for /sys/fs/cgroup/systemd
Warning no default label for /sys/fs/cgroup/unified
Warning no default label for /sys/kernel/debug/tracing

色々と出力されましたが、確認すべきは、Would relabel...から始まる2行です。
この2行に記載されたファイルは、今までの検証でわざとコンテキストを変更していたファイルです。

では、fixfilesコマンドを利用して、コンテキストを修正してみます。

$ sudo fixfiles restore

# 再度checkオプションで確認してみます。
$ sudo fixfiles check
Warning: Skipping the following R/O filesystems:
/sys/fs/cgroup
Checking / /boot /dev /dev/hugepages /dev/mqueue /dev/pts /dev/shm /run /run/user/1000 /sys /sys/fs/cgroup/blkio /sys/fs/cgroup/cpu,cpuacct /sys/fs/cgroup/cpuset /sys/fs/cgroup/devices /sys/fs/cgroup/freezer /sys/fs/cgroup/hugetlb /sys/fs/cgroup/memory /sys/fs/cgroup/misc /sys/fs/cgroup/net_cls,net_prio /sys/fs/cgroup/perf_event /sys/fs/cgroup/pids /sys/fs/cgroup/rdma /sys/fs/cgroup/systemd /sys/fs/cgroup/unified /sys/fs/pstore /sys/kernel/debug /sys/kernel/debug/tracing /sys/kernel/tracing
Warning no default label for /dev/mqueue
Warning no default label for /sys/fs/cgroup/blkio
Warning no default label for /sys/fs/cgroup/cpu,cpuacct
Warning no default label for /sys/fs/cgroup/cpuset
Warning no default label for /sys/fs/cgroup/devices
Warning no default label for /sys/fs/cgroup/freezer
Warning no default label for /sys/fs/cgroup/hugetlb
Warning no default label for /sys/fs/cgroup/memory
Warning no default label for /sys/fs/cgroup/misc
Warning no default label for /sys/fs/cgroup/net_cls,net_prio
Warning no default label for /sys/fs/cgroup/perf_event
Warning no default label for /sys/fs/cgroup/pids
Warning no default label for /sys/fs/cgroup/rdma
Warning no default label for /sys/fs/cgroup/systemd
Warning no default label for /sys/fs/cgroup/unified
Warning no default label for /sys/kernel/debug/tracing

手動でコンテキストを変更していた2ファイルが表示されなくなりました。
ls -Zコマンドでも確認してみます。

$ ls -Z -1 test_cp-a.sh .ssh 
unconfined_u:object_r:ssh_home_t:s0 .ssh
unconfined_u:object_r:user_home_t:s0 test_cp-a.sh

修正されていることが確認できました。

fixfilesのもう一つの用途について

fixfilesコマンドで onboot オプションを利用すると、OS再起動時に自動でfixfiles restoreコマンドを実行する設定が可能です。

$ sudo fixfiles onboot
System will relabel on next boot

上記コマンドは、以下と同じ意味です。

$ touch /.autorelabel

なお、OS再起動後に/.autorelabelファイルは削除されるため、再度OS再起動してもfixfilesコマンドは実行されません。

SELinuxを無効(disabled)から有効(enforcing or permisive)に変更した際は、fixfiles onbootを使用してコンテキストの再設定をすることが推奨されているようです。

おわりに

今回は、SELinuxの要といえるセキュリティコンテキストの見方や設定変更の仕方に関するコマンドを紹介しました。
次回以降は、実例を使いながらSELinuxによるアクセス制限がどのようにされるのか確認していきたいと思います。

Discussion