如何从整个文件系统上设置的扩展权限恢复对 RHEL 系统的远程访问?

如何从整个文件系统上设置的扩展权限恢复对 RHEL 系统的远程访问?

问题原因

我打算使用以下命令为隐藏文件(如“.hgignore”)添加组写入权限:

# 密码
/选择
# sudo chmod -R g+w .*

问题在于“..”匹配了此模式,现在整个 RHEL 文件系统都设置了 g+w。直接的问题如下:

  • /etc/sudoers 需要设置为 440,而不是 460,所以现在用户无法使用 sudo。
  • 一些与上述类似的机制不允许 ssh 访问。(远程 ssh 客户端收到消息“ssh_exchange_identification:远程主机关闭连接”错误)

问题

为了重新获得远程登录的能力,需要指导具有服务器物理访问权限的人员如何修复系统。

现在的问题是:为了恢复功能,哪些重要的文件和目录需要恢复其ssh权限sudo

关于“因重复而关闭”的说明

问题为什么“chmod -R 777 /”具有破坏性?详细解释了递归扩展权限会产生什么影响。这个问题旨在回答如何通过 ssh 重新获得远程访问,以便进行更广泛的恢复和修复。

答案1

对于属于软件包的文件,您可以通过以下方式找出问题所在:

rpm --verify “软件包名称”

其中 packagename 是一个单独的包,或者您可以循环遍历“rpm -qa”的输出

然后你应该能够使用 rpm 来修复它们,例如

rpm --setperm “软件包名称”

答案2

ssh 的问题不仅仅局限于 /etc 下,还与您尝试连接的用户的 .ssh 文件夹权限不正确有关。通常,用户的 .ssh 文件夹应该是 700,私钥应该是 600,其他所有内容都可以是 644。

/etc/ssh 文件夹应该是 755,/etc/ssh 下的私钥应该是 600,其他所有内容应该是 644。

如何从 /etc 中的错误权限中恢复服务器?

可能最简单的方法之一就是从备份中恢复。您确实备份了,并且测试了恢复过程,对吧?:)

如果您没有可用于恢复的备份,您可能需要在虚拟机中设置一个相同的干净系统,然后通过比较两者根据您的服务器修复主机上的权限。

答案3

如果您有一台已知良好的服务器,则在良好的服务器上运行以下命令可能会帮助您恢复它。(假设具有递归通配符能力(zsh),可以改用 find 和 -exec / xargs):

for i in /etc/**/*; do
    perm=$(stat "$i" -c "%a")
    ssh root@badServerHostName "chmod $perm $i"
done

可能需要添加几个子目录来排除其他目录...如果 Rsync 可以做到的话会更好仅有的权限,但我不认为它可以。

答案4

如果您有备份并且有 LVM 和足够的空间,您可以执行以下操作:

1. 将备份恢复到新的临时 lv(将其挂载在 /oldperm 下)
2. 执行类似以下伪代码的操作:

foreach oldfile in /oldperm/* {  
  newf = strip "/oldperm" from oldfile  
  chmod --reference=oldfile newf  
}

如果遇到空间问题,您可以先部分恢复,例如先恢复 /etc 下的所有内容。此技巧依赖于 chmod 的标志 --reference,该标志将另一个文件作为模板,并使参数在权限方面匹配。

这样,您只会恢复旧的权限而不会更改文件的内容。

相关内容