Linux 精细化文件权限

在开发服务器上,每次都有一个奇怪的问题困扰者我——为什么每次使用 docker 都需要 sudo,明明已经设置了用户组

去扒了下 /etc/group 文件后才发现,由于服务器存在权限控制,会自动重写 /etc/passwd/etc/group

某种意义上,这样确实安全了,但是引入了新的问题——某些时候确实需要特定的权限。比如使用 VSCode 的 Remote Container,就要求必须在连接到服务器后,能够直接执行 docker 命令(这里是没法设置 sudo + 密码的)。

既然不能把用户加入到用户组内,可以考虑让文件允许用户组执行。如果给 /var/run/docker.sock/ 777 权限,显然也不太好。在这种权限要求严格的场景下,777 等于是挖坑给自己。
实际上我们需要的是允许特定的用户、特定的权限组访问该文件。

在传统的 Linux 权限的基础上,实际上还有更详细的权限管理配置 ACL(Access Control List)。用户不仅能设置一个文件的所有者、所有组以及权限,还可以细化到其他用户是否可以拥有特殊权限、其他组是否可以拥有特殊权限。

getfacl 可以查看文件的详细权限设置

getfacl /var/run/docker.sock

# file: var/run/docker.sock
# owner: root
# group: docker
user::rw-
group::rw-
mask::rw-
other::---

如果我们希望把用户 user1 赋予额外的读写权限,可以使用 sudo setfacl -m u:user1:6 docker.sock
对应用户组 group1 则是 sudo setfacl -m g:group1:6 docker.sock

这样,即使用户文件和用户组文件无法修改,仍然可以确保特定的用户具有特定文件的权限