SELinuxコンテキストを確認する方法
SELinuxでは、ファイル・システム、ファイル、ディレクトリ、デバイス、プロセス、ソケット、ユーザなど全てのリソースにSELinuxコンテキストが付与されます。ここではSELinuxによって付与されたSELinuxコンテキストの確認方法について解説します。
結論
- ユーザに付与されたSELinuxコンテキストの確認方法
$ id
$ id -Z
- ファイルに付与されたSELinuxコンテキストの確認方法
$ ls -Z
$ ls -lZ
- プロセスに付与されたSELinuxコンテキストの確認方法
$ ps axZ
$ ps -efZ
SELinuxコンテキストの読み方
SELinuxコンテキストは「:(コロン)」で区切られた複数のフィールドからなるセキュリティラベルです。具体的に以下のようなものをSELinuxコンテキストと呼びます。
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
system_u:object_r:shadow_t:s0
system_u:system_r:httpd:s0
SELinuxコンテキストは第一フィールドから順にユーザ、ロール、タイプ、セキュリティレベルで構成されます。
- ユーザ
- プロセスやファイルなどに付与されるSELinux上のユーザID
- ロール
- ユーザに割り当てる権限の範囲を定義したもの
- ロールが不要なオブジェクト(ファイルやディレクトリなど)にはダミーロール
object_r
が付与される
- タイプ
- SELinuxがアクセス可否を判定する際に使用するセキュリティ属性
- セキュリティラベル
- 組織・役割などで分ける識別子
SELinuxはSELinuxコンテキストを使用し、アクセス制御を行います。基本的なSELinuxの利用では「_t」で終わる「タイプ」だけを意識していれば困ることはありません。
SELinuxは基本的に、May <subject> do <action> to <object>?
の形式の問いに答えます。誰<Subject>が何<Object>に対して何<Action>をした
と表現することもあります。
例えば、「May Apache do read to /etc/shadow?」といった問いです。これをタイプを用いた表現に変換すると次のように表すことができます。「May httpd_t do read to shadow_t ?」。
定義がある場合はアクセスが可能です。定義がないアクセスは全て拒否されます。これは別途解説します。
ユーザに付与されたSELinuxコンテキストの確認方法
ログインの方法によってユーザに付与されるSELinuxコンテキストは変化します。現在ログインしているユーザのSELinuxコンテキストを確認するにはid
コマンドを使用します。
$ id
uid=1000(stack) gid=1000(stack) groups=1000(stack),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
SELinuxコンテキストだけを確認したい場合はZ
オプションを付与します。
$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
ファイルに付与されたSELinuxコンテキストの確認方法
ディレクトリやファイルなどに付与されたSELinuxコンテキストを確認するにはls
コマンドにZ
を付与します。
$ ls -Z /proc/scsi
system_u:object_r:proc_t:s0 device_info system_u:object_r:proc_t:s0 scsi system_u:object_r:proc_t:s0 sg
実際にはZ
オプションだけでは見づらいため、l
オプションなどを付け見易く表示することが多くなります。
$ ls -Z1 /proc/scsi/
system_u:object_r:proc_t:s0 device_info
system_u:object_r:proc_t:s0 scsi
system_u:object_r:proc_t:s0 sg
$ ls -Zl /proc/scsi/
total 0
-r--r--r--. 1 root root system_u:object_r:proc_t:s0 0 Sep 27 13:34 device_info
-r--r--r--. 1 root root system_u:object_r:proc_t:s0 0 Sep 27 13:34 scsi
dr-xr-xr-x. 9 root root system_u:object_r:proc_t:s0 0 Sep 27 13:34 sg
[小話]DACパーミッションの横についた「.(ドット)」
ls -l
の出力にある、r--r--r--.
のドットは一体なんだと思ったことはありませんか?
これは拡張属性「security.selinux」に情報が追加されている時に表示されるドットです。
1つ実験をしてみましょう。まずSELinuxが有効な状態でホームディレクトリ配下に空ファイルを作成し、拡張属性を確認します。
$ touch test
$ ls -lZ
total 0
-rw-rw-r--. 1 stack stack unconfined_u:object_r:user_home_t:s0 0 Sep 27 14:00 test
$ getfattr -n security.selinux test
# file: test
security.selinux="unconfined_u:object_r:user_home_t:s0"
security.selinux
にunconfined_u:object_r:user_home_t:s0
が含まれていることが確認できました。
次にSELinuxを無効化し、同じディレクトリに別の空ファイルを作成し、拡張属性を確認します。
$ touch test2
$ ls -lZ
total 0
-rw-rw-r--. 1 stack stack unconfined_u:object_r:user_home_t:s0 0 Sep 27 14:00 test
-rw-rw-r-- 1 stack stack ? 0 Sep 27 14:03 test2
$ getfattr -n security.selinux test2
test2: security.selinux: No such attribute
SELinuxをDisabledにした状態で作成した、test2
には拡張属性が含まれていないことが確認できます。また、DACパーミッションの後ろに「ドット」も含ませません。
ここでSELinuxが有効な状態で作成したtest
の拡張属性を削除するとどうなるでしょうか。
$ sudo setfattr -x security.selinux test
$ getfattr -n security.selinux test
test: security.selinux: No such attribute
$ ls -lZ
total 0
-rw-rw-r-- 1 stack stack ? 0 Sep 27 14:00 test
-rw-rw-r-- 1 stack stack ? 0 Sep 27 14:03 test2
拡張属性が削除され、DACパーミッションの後ろに「ドット」も消えていることがわかります。
プロセスに付与されたSELinuxコンテキストの確認方法
プロセスに付与されたSELinuxコンテキストを確認するにはps
コマンドにZ
を付与します。
$ ps axZ | head -n 5
LABEL PID TTY STAT TIME COMMAND
system_u:system_r:init_t:s0 1 ? Ss 0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 30
system_u:system_r:kernel_t:s0 2 ? S 0:00 [kthreadd]
system_u:system_r:kernel_t:s0 3 ? I< 0:00 [rcu_gp]
system_u:system_r:kernel_t:s0 4 ? I< 0:00 [rcu_par_gp]
$ ps -efZ | head -n 5
LABEL UID PID PPID C STIME TTY TIME CMD
system_u:system_r:init_t:s0 root 1 0 0 12:38 ? 00:00:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 30
system_u:system_r:kernel_t:s0 root 2 0 0 12:38 ? 00:00:00 [kthreadd]
system_u:system_r:kernel_t:s0 root 3 2 0 12:38 ? 00:00:00 [rcu_gp]
system_u:system_r:kernel_t:s0 root 4 2 0 12:38 ? 00:00:00 [rcu_par_gp]
その他コマンドとSELinux対応
ここで紹介したコマンド以外にもSELinuxの対応したオプションが追加されているコマンドがいくつか存在します。その多くがZ
オプションを採用しています。気になるコマンドがあればmanを参照し「SELinux」の文字を検索してみてください。
一例を上げて終わりにしたいと思います。
$ sudo lsof -Z | head -n 5
COMMAND PID TID TASKCMD SECURITY-CONTEXT USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 system_u:system_r:init_t:s0 root cwd DIR 8,3 224 128 /
systemd 1 system_u:system_r:init_t:s0 root rtd DIR 8,3 224 128 /
systemd 1 system_u:system_r:init_t:s0 root txt REG 8,3 1730640 3597 /usr/lib/systemd/systemd
systemd 1 system_u:system_r:init_t:s0 root mem REG 8,3 563667 528390 /etc/selinux/targeted/contexts/files/file_contexts.bin
$ sudo netstat -ltnpZ
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Security Context
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 710/sshd: /usr/sbin system_u:system_r:sshd_t:s0-s0:c0.c1023
tcp6 0 0 :::22 :::* LISTEN 710/sshd: /usr/sbin system_u:system_r:sshd_t:s0-s0:c0.c1023
tcp6 0 0 :::9090 :::* LISTEN 1/systemd system_u:system_r:init_t:s0
$ sudo ss -npZ | head -n 5
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 30326 * 0 users:(("(sd-pam",pid=827,proc_ctx=system_u:system_r:init_t:s0,fd=9))
u_str ESTAB 0 0 /var/lib/sss/pipes/private/sbus-monitor 26254 * 26253 users:(("sssd",pid=649,proc_ctx=system_u:system_r:sssd_t:s0,fd=15))
u_str ESTAB 0 0 * 30283 * 30285 users:(("(sd-pam",pid=827,proc_ctx=system_u:system_r:init_t:s0,fd=2),("(sd-pam",pid=827,proc_ctx=system_u:system_r:init_t:s0,fd=1),("systemd",pid=825,proc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023,fd=2),("systemd",pid=825,proc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023,fd=1))
u_str ESTAB 0 0 /var/lib/sss/pipes/private/sbus-dp_implicit_files.658 26268 * 26267 users:(("sssd_be",pid=658,proc_ctx=system_u:system_r:sssd_t:s0,fd=17))
おわりに
よいSELinuxライフを!
Discussion