[Linux] 檔案的 SELinux user 的代表意義
最近因為一些 bug,開始在看 SELinux 的東西。
說實在的,SELinux 真的是很複雜且不容易理解的東西,
而文件看了又很想睡… (其實只是我自己的問題 Orz)
像今天在試驗一個檔案的 SELinux context,
究竟它在 ls -Z 裡列出來的 SELinux user,
是代表建立檔案的人呢?還是目前擁有它的人呢?
從我目前看到的文件裡,似乎沒有特別提到這件事;
而 SELinux policy 似乎也比較著重在 SELinux type 上面,比較沒在管 SELinux user…
來看一下 CentOS 8 上面的 SELinux user 吧~
執行 semanage login -l
可以看到目前有的帳號、與其 SELinux user 對應。
通常沒特別設定的話,
一般的帳號 (包含 root) 都會對應到 unconfined_u 這個 SELinux user:
root@localhost ~ # 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 *
執行下面的指令,建立一個新的使用者 testuser,
並將其 SELinux user 設定成 user_u:
adduser testuser semanage login -a -s user_u testuser
再執行一次 semanage login -l
確認一下,
testuser 帳號的確是對應到 user_u 這個 SELinux user:
root@localhost ~ # semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * testuser user_u s0 * root unconfined_u s0-s0:c0.c1023 *
登出 root,再以 testuser 帳號登入,
執行 id -Z
,可以看到目前帳號的 SELinux context,的確是 user_u 沒錯:
testuser@localhost ~ $ id -Z user_u:user_r:user_t:s0
使用 testuser 在 /tmp 下建立一個空檔案 ccc,
可以看到這個檔案的 SELinux user 是 user_u,與 testuser 相同:
testuser@localhost ~ $ ll -Z /tmp -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:00 aaa -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:02 bbb -rw-rw-r--. 1 testuser testuser user_u:object_r:user_tmp_t:s0 0 Mar 8 14:03 ccc
那麼這裡的 user_u,是因為檔案是 testuser 建立的,
還是因為檔案目前屬於 testuser 呢?
來實驗一下,用 root 帳號將 /tmp/ccc 的 owner 改成 root,
再執行一次 id -Z
,發現 SELinux user 的部分還是 user_u,
因此它看起來比較像是代表「建立檔案的 SELinux user」:
root@localhost ~ # ll -Z /tmp/ -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:00 aaa -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:02 bbb -rw-rw-r--. 1 root root user_u:object_r:user_tmp_t:s0 0 Mar 8 14:03 ccc
如果用 root 帳號,將 /tmp/ccc 複製成 /tmp/ddd 的話,
/tmp/ddd 的 SELinux user 就會變成和 root 相同的 unconfined_u:
root@localhost ~ # ll -Z /tmp/ -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:00 aaa -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:02 bbb -rw-rw-r--. 1 root root user_u:object_r:user_tmp_t:s0 0 Mar 8 14:03 ccc -rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:05 ddd
相對的,如果是用 testuser 帳號,將 /tmp/ccc 複製成 /tmp/eee 的話,
/tmp/eee 的 SELinux user 就會變成和 testuser 相同的 user_u:
testuser@localhost ~ $ ll -Z /tmp -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:00 aaa -rw-rw-r--. 1 testuser testuser unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:02 bbb -rw-rw-r--. 1 root root user_u:object_r:user_tmp_t:s0 0 Mar 8 14:03 ccc -rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0 0 Mar 8 14:05 ddd -rw-rw-r--. 1 testuser testuser user_u:object_r:user_tmp_t:s0 0 Mar 8 14:06 eee
總之,檔案的 SELinux user,
看起來代表的就是建檔的帳號的 SELinux user 囉~
參考資料:6.3. Confining Existing Linux Users: semanage login Red Hat Enterprise Linux 6