过去一周左右,我一直在解决一个问题,而且我正在用尽想法。
我在我的Centos 7 VPS上为git服务器添加了一个新用户,并且(在几篇文章的build议下)将用户的主目录放在/var而不是/home 。
然后,我尝试使用SSHlogin到该用户,并正常工作。 但是 ,公钥validation无法正常工作。 在debugging过程中,我最终使git用户和主要用户以各种方式相同 – 他们都是sudoers,他们有相同的.ssh目录,具有相同的authorized_keys文件,甚至把git用户移到了/home ,但无济于事。
为了进一步testing,我创build了两个新用户: test1和test2 。 test1的主目录在/home ,而test2的主目录在/var 。 果然,pubkey auth为test1而不是test2 。 我不认为这是一个权限问题,因为/var具有与/home相同的权限,并且用户目录都具有正确的权限。 另外,我感到非常困惑,原来的git用户甚至在把它移到/home之后也不接受pubkey auth。
如果我在详细模式下运行ssh,我可以看到在发送密钥后发生劫持:
debug1: Offering RSA public key: /home/user/.ssh/foo.key debug2: we sent a publickey packet, wait for reply debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
连接到主用户或test1 ,它的行为是不同的:
debug1: Offering RSA public key: /home/user/.ssh/foo.key debug2: we sent a publickey packet, wait for reply debug1: Server accepts key: pkalg ssh-rsa blen 279
我发现的唯一线索:当试图以不存在的用户身份login时,我得到了与第一个相同的响应(等待回复,然后跳过pubkey身份validation)。 那么,机器是否让外部世界变得不可见? 为什么会这样做?
我通常可以通过这些东西来工作,但是我觉得这一次我很困难。 谢谢你的帮助!
这是SELinux的问题。 如果你没有这个安全级别,移动文件系统的东西可以正常工作,但SELinux默认根据path为每个文件设置标签。
当你移动一些特殊目的的目录时,确保它们有正确的标签。 在这种情况下, chcon有--reference选项,在这种情况下效果很好:
chcon --reference /home/user/.ssh/ -R /var/user/.ssh/
更好的方法是编写一个自定义的策略并将其加载到内核中,但这不在这个答案的范围之内。