Centos

為什麼 root 創建的文件在 samba 共享目錄中獲得錯誤的權限?

  • July 30, 2020

每當 root 使用者創建目錄或文件時,它都會獲得錯誤的權限。我希望sambashare組中的每個使用者都可以在指定的路徑中讀寫。這是使用者創建目錄時目錄獲得的權限:drwxrws---. 2 sadmin sambashare 4096 Jul 29 02:20 dir1. 這是系統的 root 使用者創建目錄時目錄獲得的權限:drwxr-sr-x. 2 root sambashare 4096 Jul 29 02:19 testdir1。所以我想知道為什麼在 root 採取行動後寫權限會下降以及如何避免它。

follow symlinks = yes
wide links = yes
unix extensions = no
workgroup = WORKGROUP
client min protocol = SMB2_02
client max protocol = SMB3
server string = Samba Server %v
netbios name = samba-server
security = user
map to guest = bad user
dns proxy = no
inherit permissions = yes

[Spi]
path = /srv/servers/spi
force create mode = 0660
force directory mode = 2775
read only = no
valid users = @root @sadmin @sambashare
write list = sadmin

[Www]
path = /var/www
force create mode = 0660
force directory mode = 2770
directory mask = 2770
read only = no
valid users = root sadmin sambashare
write list = sadmin
[root@localhost samba]#

編輯


通過 samba 創建的文件是可以的,但是通過伺服器終端本地創建的文件(不通過 samba 連接)獲得錯誤的權限。

[root@localhost ~]# umask
0022
[sadmin@localhost ~]$ umask
0002

為什麼按原樣設置權限?

當一個 Unix 風格的程序創建一個新文件時,它會為其指定初始權限。指定的這些初始權限通常是0666rw-rw-rw-用於正常文件,0777rwxrwxrwx用於目錄或執行檔。這是編碼到每個程序中的內容,並且不容易更改。

但這些初始權限不會直接應用於新文件。作業系統將首先剔除umask值中設置的任何權限位。您的sadmin使用者umask 0002對應於-------w-,即它只刪除“其他”使用者的寫入位,並允許程序要求文件所有者的所有權限,以及文件所屬的使用者組。這會導致rw-rw-r--對正常文件以及rwxrwxr-x目錄和執行檔的權限。

另一方面,您的root帳戶有umask 0022,對應於----w--w-,因此它將取消除文件實際所有者之外的所有人的寫入權限。這會導致rw-r--r--對正常文件以及rwxr-xr-x目錄和執行檔的權限。這通常是一件好事,因為 root 擁有但其他人可寫的文件可以使一些安全漏洞更容易。此 umask 值將避免意外創建此類文件。

但是為什麼現有文件可能會在 root 編輯它們時發生變化?好吧,這完全取決於您的文本編輯器在做什麼。一些文本編輯器最初會創建一個新的臨時文件(這樣如果您在遠端工作並且編輯時網路連接失去,他們將能夠保存您的更改),當您“保存”時,他們實際上只是刪除了原始文件和將已編輯的臨時副本重命名為原始副本。一些編輯者可能會在此過程中保留原始文件的權限/所有權,但不是全部。一些編輯器可以配置為做你想做的事。

你能為這個做什麼?

您可以使用一個簡單的命令將 root 的 umask 更改為 0002 umask 0002,僅用於那個會話。或者您可以將該命令添加到適當的 shell 啟動腳本中,以使其對 root 使用者具有持久性。但這些都不是真正推薦的,因為這會使您的 root 帳戶更容易受到安全漏洞的攻擊。


如果您的文件系統支持 ACL(並且該支持已由文件系統預設值或掛載選項啟用 - 現代 CentOS 可能預設啟用它),您可以在目錄上設置預設 ACL,這將有效地覆蓋該特定目錄umask的設置*:*

setfacl -m d:u::rwx,d:g::rwx,d:o::rx /srv/servers/spi

生效時創建的任何新子目錄都將自動繼承預設 ACL,就像 setgid 位發生的情況一樣。

如果您的共享已經有子目錄,您可能希望對整個/srv/servers/spi目錄樹中的所有目錄執行此操作:

find /srv/servers/spi -type d -exec setfacl -m d:u::rwx,d:g::rwx,d:o::rx {} \+

作為另一種選擇,如果您遵循最佳管理實踐,則不應以 root 身份登錄,因此您可能使用個人帳戶登錄,然後使用sudoorsu成為 root。

您已經將該目錄的寫入權限授予該sambashare組,因此您可以簡單地將您的個人帳戶添加到該sambashare組,然後您無需成為 root 即可在共享目錄中進行更改 - 為了更好的問責制,理想情況下您應該當您可以使用您的個人帳戶進行更改時,請不要以 root 身份進行更改*。*如果該系統啟用了審計日誌,那麼登錄的審計日誌/var/log/audit將直接顯示 who-did-what-when,這在某些情況下可能非常重要。

通常最好讓使用者組和文件權限反映允許和期望誰修改事物的現實,這樣每個人都可以使用他們的個人使用者帳戶做正常的日常事情,而不是正常使用 root 帳戶一切。

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