Selinux

如何編輯文件並保留其訪問控制列表/SELinux 安全上下文?

  • March 22, 2015

我在 CentOS 6.2 上,並且有一個文件,其中備用訪問方法字元顯示為一個點。

ls -l myfile
-rwxr-x---. 1 me mygroup   172 Aug 13 10:03 myfile
         ^ 
         This dot.

從使用info coreutils ’ls invocation’為 ls 顯示的幫助

Following the file mode bits is a single character that specifies
whether an alternate access method such as an access control list
applies to the file.  When the character following the file mode
bits is a space, there is no alternate access method.  When it is
a printing character, then there is such a method.

GNU `ls' uses a `.' character to indicate a file with an SELinux
security context, but no other alternate access method.

A file with any other combination of alternate access methods is
marked with a `+' character.

所以這個文件有一些分配給它的SELinux 安全上下文。使用getfaclgetfattr這些命令顯示:

getfacl myfile
# file: myfile
# owner: me
# group: mygroup
user::rwx
group::r-x
other::---

getfattr -m - myfile
# file: myfile
security.selinux

getfattr -n security.selinux myfile
# file: myfile
security.selinux="unconfined_u:object_r:usr_t:s0"

我已經備份了原始文件:

cp --preserve=all myfile myfile.ORIG

然後編輯了原文:

vi myfile
:wq

這吹走了它所擁有的任何背景:

ls -l myfile
-rwxr-x---  1 me mygroup   172 Aug 13 10:06 myfile
         ^ 
         The dot is gone.

getfattr -n security.selinux myfile
myfile: security.selinux: No such attribute

getfacl myfile
# file: myfile
# owner: me
# group: mygroup
user::rwx
group::r-x
other::---

編輯此文件並保留其擴展屬性和備用訪問方法設置的推薦過程是什麼?

保存文件時,編輯者可以遵循兩種策略之一。

  • 創建一個新文件,然後移動它以替換舊文件。主要優點是始終有一個有效文件:舊版本被新版本原子替換。缺點是創建了一個新文件,因此編輯器必須盡其所能手動複製舊文件的所有權和權限。這種方法也會破壞硬連結。
  • 寫入現有文件。這保留了硬連結和權限。此外,這不需要任何額外的磁碟空間,但強烈建議先進行備份,這使得這一點沒有實際意義。這樣做的主要缺點是,如果程序在保存文件時嘗試讀取文件,它將看到一個被截斷的文件;如果保存被中斷(例如由於電源故障),部分文件將保留。

編輯者通常偏愛第一種方法,如果他們檢測到無法複製現有文件的權限或現有文件具有硬連結,則退回到第二種方法。

大多數編輯者可能沒有意識到額外 SELinux 屬性的存在,因此應用了第一種方法。使用最新版本的 GNU coreutils (≥ 8.6),您可以使用cp --preserve=context --attributes-only將文件的 SELinux 上下文複製到另一個文件上,而無需更改目標文件的內容。

或者,指示您的編輯就地編輯文件。使用 Vim,將 backupcopy選項設置為yes,如果這不是您系統上的預設設置。使用 Emacs,將backup-by-copying變數設置為t.

引用自:https://unix.stackexchange.com/questions/45407