在日常的服务器运维工作中,我们经常需要给某个用户单独开放某个目录的访问或修改权限,而不是简单地把所有权限一把梭。很多新手管理员面对这个问题时,往往只知道用chmod 777,结果把系统搞得漏洞百出。本文将从实际场景出发,手把手教你如何安全、精准地为Linux用户分配特定目录的权限。

如何给Linux用户分配目录权限

最基础的方法是通过chown命令改变目录的所有者,再配合chmod设置属组权限。假设你要让用户zhangsan能够读写/data/share目录,可以先执行sudo chown zhangsan:zhangsan /data/share,将目录所有者和属组都改为zhangsan,然后用chmod 750设置权限,这样只有zhangsan和root能访问。如果你不想改变目录的现有所有者,也可以把zhangsan加入目录所属的组中,再给组赋予相应权限。这种方法简单可靠,适合小规模环境,但缺点是当用户数量增多时,频繁改属组会导致配置混乱。

linux用户目录权限_linux目录的三种权限含义_linux 给用户某个目录权限

另一种常用方法是利用访问控制列表(ACL),它比传统权限更灵活。执行setfacl -m u:zhangsan:rwx /data/share,就能单独给zhangsan授予rwx权限,而不影响目录原有的所有者和属组。查看ACL规则用getfacl /data/share,你会看到多了一条user:zhangsan:rwx的记录。ACL的优势在于你可以给多个不同用户设置不同权限,比如给zhangsan读写执行,给lisi只读,完全独立管理。不过要提前确认文件系统挂载时开启了acl选项,大多数Linux发行版默认已支持。

用chmod还是setfacl更合适

当用户问“只给一个用户权限”时,很多教程推荐直接改目录的others权限,例如chmod 707,这会让所有其他用户都能访问,极度危险。正确选择工具要看需求规模:如果只是临时给某个用户开放一个目录,且该用户可能成为目录的主要操作者,用chown改所有者最直接。但如果目录本身属于某个服务账号(如www-data),你只是希望额外允许zhangsan进去查看日志,用setfacl就能避免打乱原有权限结构。在实际生产环境中,半数以上的精细化权限需求都适合用ACL来解决。

linux 给用户某个目录权限_linux目录的三种权限含义_linux用户目录权限

从维护角度看,chmod的权限模型只有三组(所有者、属组、其他人),无法满足“给A用户读,给B用户写,C用户禁止访问”这类复杂要求。而setfacl支持给任意数量的用户和组分别设置rwx权限,甚至支持默认继承规则。例如执行setfacl -m d:u:zhangsan:rwx /data/sharelinux 给用户某个目录权限,就能让该目录下新建的子目录和文件自动给zhangsan赋予rwx权限。如果你需要经常调整多个用户对同一目录的权限,果断选择setfacl,省去反复修改属组的麻烦。

怎样让用户只能访问特定目录

给用户开放某个目录的权限后,通常还需要限制该用户只能在这个目录里活动,不能看到或修改系统的其他部分。这就需要结合chroot或容器技术。最经典的做法是创建一个受限的sftp用户,把它的家目录设为需要开放的目录,并在sshd_config中配置ChrootDirectory。例如新建用户wangwu,执行sudo mkdir /sftp/wangwu && sudo chown root:root /sftp/wangwu,然后把目标目录绑定挂载到/sftp/wangwu/data下,最后在sshd_config中添加Match User wangwu和ChrootDirectory /sftp/wangwu。这样wangwu登录后就被囚禁在这个目录里了。

linux目录的三种权限含义_linux用户目录权限_linux 给用户某个目录权限

如果不使用sftp,只是普通shell登录,也可以通过setfacl配合目录权限的“执行”位来实现视觉上的限制。比如你只给了用户对/opt/project的读取权限,没有给/home、/etc等目录的任何权限,那么用户虽然能用cd命令切换但无法列出内容。更彻底的做法是用namespace或docker,但这对于普通场景过于重量级。推荐优先考虑受限的sftp账号,既满足目录权限需求linux系统下载官网,又保障了系统安全。注意chroot环境下需要把/bin/ls等必要命令和库文件也复制进去,否则用户连基本操作都无法进行。

目录权限继承怎么设置

很多管理员发现,给目录设置了权限,但用户在里面新建的子目录或文件却无法自动继承同样的权限。这是因为Linux默认不继承,需要用粘滞位或ACL的默认规则。如果使用传统chmod,可以给目录设置setgid位,执行chmod g+s /data/share,这样所有在该目录下新建的文件和子目录都会继承该目录的属组。然后再配合属组的rwx权限,就能实现继承效果。但这种方法只能继承组,不能精确到单个用户。

ACL的默认规则更加优雅。执行setfacl -m d:u:zhangsan:rwx /data/share,再执行setfacl -m d:g:team:rx /data/share,之后凡是该目录下新建的任何条目,都会自动给zhangsan赋予rwx权限,给team组赋予rx权限。注意默认规则只对新创建的对象生效,已经存在的子目录和文件需要用setfacl -R递归应用一遍。你可以通过getfacl /data/share查看带default的行来确认。在生产环境中,建议在创建共享目录之初就把默认ACL规则设置好,避免后续返工和权限不一致的问题。

如何撤销用户的目录权限

当某个用户不再需要访问特定目录时,必须及时撤销权限,以防止数据泄露或误操作。如果是通过chown把目录给了该用户,那么需要重新chown给其他用户或root。如果是通过修改属组的方式,可以用gpasswd -d zhangsan groupname将用户从组中移除,然后检查目录的属组权限是否允许组访问。切记:仅仅移除用户组的成员资格还不够,如果目录的others权限是r-x,那么用户仍然能访问,要确保others权限为0(即chmod o-rwx)。

对于使用ACL设置的权限,撤销很简单:setfacl -x u:zhangsan /data/share。这条命令会删除针对zhangsan的单独ACL条目linux 给用户某个目录权限,恢复为默认权限。你还可以用setfacl -b /data/share一次性清除所有扩展ACL,但这样会把所有用户的自定义权限都清掉,要小心操作。检查权限是否已撤销,可以用getfacl确认列表中不再有该用户,同时用su -- zhangsan切换身份实际测试一下。建议在撤销后立即验证,避免因为继承规则或者父目录的ACL导致用户仍然有权限。

给目录权限需要注意什么安全事项

linux 给用户某个目录权限_linux目录的三种权限含义_linux用户目录权限

永远不要为了省事给目录设置777权限linux vi命令,这就等于把门拆掉让所有人都能进去。许多数据泄露和webshell上传事件都是因为某个目录被设成了777。正确的做法是遵循最小权限原则:用户需要读就只给r(4),需要写就只给w(2),需要执行就只给x(1)。对于Web服务器上的上传目录,除了给写入权限,还要记得禁用脚本执行,可以在nginx或apache中配置php_flag engine off。另外,注意检查目录的父目录权限,如果父目录权限过松,用户可以通过重命名或移动方式来绕过限制。

另一个易忽视的点是粘滞位(sticky bit)。对于多个用户共同使用的共享目录,执行chmod +t /data/share后,用户只能删除自己创建的文件,不能动别人的文件,这就避免了“互相伤害”。同时,定期审计权限变更记录很重要,可以用auditd监控目标目录的权限修改操作。最后建议将给用户分配目录权限的所有操作都通过配置管理工具(如Ansible)记录并版本化,不要手动在线上随意执行命令,否则事后很难追溯是谁在什么时候改了哪里。

你在工作中是否遇到过因为目录权限设置不当导致的安全事故?或者你有哪些更巧妙的权限管理技巧?欢迎在评论区分享你的经验,点赞和收藏本文,让更多Linux管理员避开那些坑。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复