每当 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
答案1
为什么要这样设置权限?
当Unix风格的程序创建一个新文件时,它会为其指定初始权限。指定的这些初始权限通常是0666
或rw-rw-rw-
用于常规文件,和0777
或rwxrwxrwx
用于目录或可执行文件。这是直接编码到每个程序中的内容,并且不容易更改。
但这些初始权限不会直接应用于新文件。操作系统将首先删除该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 可能默认启用它),您可以设置默认访问控制列表在目录上,这将有效地覆盖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 身份登录,因此您可能会使用个人帐户登录,然后使用sudo
或su
成为 root。
您已经向该sambashare
组授予对此目录的写入权限,因此您可以简单地将您的个人帐户添加到该sambashare
组,然后您不需要成为 root 即可在共享目录中进行更改 - 为了更好的问责制,您最好不应该当您可以使用个人帐户进行更改时,请以 root 身份进行更改。如果该系统启用了审核日志记录,那么审核日志/var/log/audit
将直接显示谁、何时、做了什么,这在某些情况下非常重要。
通常最好使用户组和文件权限反映允许和期望修改内容的实际情况,以便每个人都可以使用其个人用户帐户执行正常的日常操作,而不是常规地使用 root 帐户对于一切。