SELinuxについてまとめてみる2(少し実践編)
はじめに
前回、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