You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何限制拥有本地sudo权限的用户访问NFS文件服务器的受限资源?

阻止sudo用户通过NFS违规访问服务器受限资源的解决方案

咱们来拆解一下怎么锁定你的NFS配置,让像客户端B这样有sudo权限的用户没法偷偷访问服务器上的受限资源,同时保证管理员A和普通用户C的正常访问。下面是针对你这个场景的分步方案:

1. 核心:配置NFS的权限映射规则(root squash + 精细化导出)

NFS默认基于UID/GID做权限映射,客户端的root用户(UID 0)默认会被映射到服务器的nobody用户,但如果之前开了no_root_squash就会直接对应服务器root——这是最大的风险点。我们需要针对不同客户端做差异化配置:

编辑NFS服务器(srv)的/etc/exports文件(修改后执行exportfs -rv生效):

# 给管理员客户端A:允许root直接映射,保证能访问root受限文件
/root-restricted-files  clientA.example.com(rw,no_subtree_check,no_root_squash)

# 给客户端B和C:强制所有用户映射到匿名用户,彻底阻断权限绕过
/root-restricted-files  clientB.example.com(rw,no_subtree_check,all_squash,anonuid=65534,anongid=65534)
/root-restricted-files  clientC.example.com(rw,no_subtree_check,all_squash,anonuid=65534,anongid=65534)

# 普通文件目录:对B和C仅启用root squash,保留自身UID/GID的访问权限
/common-files  clientB.example.com(rw,no_subtree_check,root_squash)
/common-files  clientC.example.com(rw,no_subtree_check,root_squash)

参数解释:

  • no_root_squash:仅开放给A,允许A的本地root直接对应服务器root,满足管理员的访问需求
  • all_squash:把B和C的所有用户(包括sudo切换的用户)都映射到指定的匿名用户(UID 65534,通常是nobody),这样即使B切换到其他用户,也没法访问服务器上非匿名用户的资源
  • root_squash:默认规则,把客户端root映射到匿名用户,防止普通用户通过sudo提权后访问服务器root资源

2. 限制客户端B的sudo权限,杜绝用户切换

即使NFS做了映射限制,如果B能通过sudo切换到和服务器某用户UID相同的账号,还是可能绕过权限。所以要精细化限制B的sudo权限:

在客户端B上用visudo编辑/etc/sudoers(必须用visudo,避免语法错误导致sudo失效):

# 方案1:禁止B切换到其他用户,仅允许执行指定的开发/运维命令
b_user ALL=(ALL) !SU, !SUDO, !SU -, !SUDO -i, /usr/bin/apt, /usr/bin/git, /usr/local/bin/your-dev-tools

# 方案2(更严格):仅允许B以自身身份执行sudo命令,完全禁止用户切换
b_user ALL=(b_user) ALL

这样B就没法通过sudo su rootsudo -i切换到root,也不能切换到其他用户,从根源上切断了通过UID映射绕过权限的可能。

3. 服务器端文件权限加固,筑牢最后防线

对服务器上的root受限文件/目录,要设置最严格的权限,确保除了root之外没人能访问:

# 递归设置root受限目录的权限:仅root可读、写、遍历
chmod -R 700 /root-restricted-files
chown -R root:root /root-restricted-files

对于普通文件目录,要确保B只能访问自身所属组的资源:

# 假设B的用户组是dev_group,设置普通目录的组权限为750(仅组内用户可读)
chmod -R 750 /common-files
chown -R root:dev_group /common-files

# 确认B属于dev_group组
usermod -aG dev_group b_user

4. 可选:启用NFSv4的ID映射(更安全的权限匹配)

如果使用NFSv4,可以开启ID映射服务(rpcidmapd),用用户名/组名代替UID/GID做映射,避免客户端和服务器UID不一致导致的权限冲突:

在服务器和所有客户端编辑/etc/idmapd.conf

[General]
Domain = your-local-domain.com

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

然后重启ID映射服务:

systemctl restart rpcidmapd

这样客户端的用户会被映射到服务器上同名的用户,进一步降低权限绕过的风险。


内容的提问来源于stack exchange,提问作者MountainX

火山引擎 最新活动