SELinuxコンテキストを確認する方法

公開:2020/09/27
更新:2020/09/27
11 min読了の目安(約7100字TECH技術記事

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コンテキストを使用し、アクセス制御を行います。基本的な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.selinuxunconfined_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ライフを!