熟悉ssh的同学应该都知道.ssh目录。该目录用于存放一些ssh配置,公钥,以及一些ssh客户端的公钥认证文件。~/.ssh是一个非常重要的目录,也是一个安全风险点。如果该目录的安全设置处理不当,将导致严重的安全问题,使主机很容易被黑客攻击。据虫虫所知,一些木马和自动挖矿脚本就是借助这些目录信息自动传播的。本文将介绍~/.ssh/的安全性。.ssh目录介绍目录~/.ssh/用于存放SSH客户端和服务端的一些配置文件,这些文件包括:authorized_keys,SSH服务端默认的公钥认证文件,服务端可以通过该文件使用该用户认证用户证书。SSH证书认证是指客户端生成一个证书(私钥和公钥对),并将公钥复制到文件中,每行一个证书。复制公钥时,可以使用ssh-copy-id命令,也可以直接手动配置authorized_keys文件。id_*,包括id_rsa、id_dsa、id_ed25519、id_ecdsa等都是用户下保存的证书私钥。当用户通过SSH证书认证后,会自动搜索这些私钥进行认证。id_*.pub上述私钥对应的公钥,后缀为.pub。known_hosts保存了主机连接的远程服务器及其对应的主机公钥(用于对主机进行认证),如果公钥相同则再次连接远程服务器,则直接连接认证。如果没有,或者远程服务器已经改变,会提示:需要输入yes确认。config文件用于配置本地ssh连接的一些项目,比如配置主机别名,可以解决同一个主机或者多个主机使用多个证书的问题,可以用config配置,比如下面配置:Hostgithub.comHostNamegithub.comUsergitIdentityFile~/.ssh/git/github_id_rsaHostgitee.comHostNamegitee.comUsergitIdentityFile~/.ssh/git/gitee_id_rsaHostchongchong.comHostName112.34.6.71Port2222UserchongchongIdentityFile~/.ssh/id_ecdsaForwardX11yesCompressionyesHostTCPCeepAliveyes前两台主机配置了不同的证书yunshnon-defaults配置为github端口,非默认当前用户,并启用一些ssh配置项。上一篇关于sshconfig配置的《Linux SSH实用技巧几则》文章虫虫已经介绍过了,大家可以参考一下。.ssh目录的安全问题主要的安全隐患是由于对.ssh目录的安全意识不够或管理疏忽,导致目录的权限设置出现问题。或者在web目录或git公共存储库中公开该目录。例如,某些Web服务器中的www用户可以直接访问该目录。由于直接将用户目录设置为web根目录,而.ssh目录是用户目录的子目录,可以直接访问。现在,绝大多数管理员和开发人员都知道使用密码登录服务是不安全的,所以他们会使用证书来登录。如果。ssh目录泄露的意思是:可以直接获取私钥,比如/.ssh/id_rsa;可以直接知道authorized_keys、known_hosts和config的内容。证书泄露id_*文件是个人文件中最重要的一层。该文件不允许泄露给第三方。根据不同的证书类型,私钥文件名可能是id_dsa(DSA证书不安全,请避免使用)、id_rsa(RSA证书,请保证大于2048位)、id_ecdsa和id_ed25519,一般来说,私钥文件会有PRIVATEKEY的注释行,例如:为了避免证书泄露,维护安全,建议给私钥设置证书密码:如下key没有密码,ssh-keygen-y-fid_ecdsa可以直接显示公钥ecdsa-sha2-nistp256AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBmGXiNwudm3JaGNVERkl013/9OQVR0tfgvcmapONuecVl4EXNE4w0VyZA1ZD2s3hj02x/Y294IwfhExiaDhTyY=如果设置密码保护,则会提示输入密码:Enterpassphrase:ecdsa-sha2-nistp256AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBmGXiNwudm3JaGNVERkl013/9OQVR0tfgvcmapONuecVl4EXNE4w0VyZA1ZD2s3hj02x/Y294IwfhExiaDhTyY=authorized_keysEveniftheprivatekeyisleaked,if没有其他信息,黑客就不知道私钥在哪里用于连接。这也是管理git的密钥主机、通用主机、证书独立使用的原因。防止私钥泄露带来的问题。但黑客可以通过.ssh目录下的其他文件获取更多信息,从而准确使用窃取的私钥。有一个我前面提到的文件authorized_keys,用于配置所有可以连接到主机用户的证书公钥。文件中每行有一个公钥。公钥以ssh-rsa、ssh-dss、ssh-ed25519、ssh-ecdsa开头,分别代表不同的证书类型。如果黑客获得了这些密钥,就可以通过比对证书来验证对应的私钥,然后利用私钥最终对主机进行攻击。如果攻击者得逞,他将拥有完全的SSH访问权限并能够运行任何命令。Known_hosts泄露如果~/.ssh/known_hosts泄露,则比较危险,因为这个文件记录了主机私钥可以连接的远程主机列表。根据这个文件中的主机名或者IP地址,可以直接作为私钥尝试登录。很多木马传播方式都是利用文件的自动解析获取IP或者主机自动尝试登录以上是某挖矿木马自动传播脚本的一部分,从known_hosts获取传播目标:cat/root/.ssh/known_hosts|grep-v,|awk'{print$1}'>/tmp/.hcat/root/.ssh/known_hosts|grep,|awk-F,'{print$1}'>>/tmp/.hcat/root/.ssh/known_hosts|grep,|awk-F,'{print$1}'>>/tmp/.h为了避免这种攻击,可以将ssh配置(/etc/ssh/ssh_config)的HashKnownHosts设置为yes,相关信息会被hash。则该文件条目就会被加密,结果如下:|1|wlPQdgFoYgYsqG6ae20lYopRLPI=|p61txQKmb+Hn49dsD+v0CNuEKd4=ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAzhZmG33G/3FG3vm0eDdyX1u++i0ceakIkJNgDxVVy6MpodRrpwqXXQj8/OGTIwb4YpRXGuL3236IkGugI9GUgFd00UNjMSMt3pqob4hKsEzADl7YfZeV1X7X0b617nze0otdO7TwDMlQ/5KWUwdUoxg50VfpieTzcOpUN/G4J159iKZ41iSF7o4vI+fYisX8y5rJ1BRbt1HO0Gi7w9HZ8tN0B0glM6JKyoE8TjvbZAeD9PWIWp9JpG1KTY4yXTV1B1CyvtxjRqTMm8mcb+gSGGvv6mSlWCNxJnlXhp91F2GtmgzKsE3FjcMUfkn3c0+P0bKaR8L3GtbyaXJmtDX4xQ==其中第二部分wlPQdgFoYgYsqG6ae20lYopRLPI=Encrypthostname.第三部分p61txQKmb+Hn49dsD+v0CNuEKd4=是加密后的IP地址。加密方式是HMAC-SHA1,我们知道IP地址是有限制的:四段,每段1-255(2^32)可以分组枚举,所以可以通过暴力破解来计算和比较hash。有兴趣的同学可以试试。config泄漏SSH客户端配置文件通常包含主机名、别名、用户名、ssh端口、证书位置等信息。如果文件被暴露,可以为攻击者提供更多的信息,其危害类似于known_hosts。安全措施为避免.ssh目录带来的安全问题,首先要设置目录和文件的权限。例如.ssh目录应该设置为700,所有私钥文件和配置文件都应该设置为600。其次,避免将.ssh目录暴露给web目录。使用代理转发或ProxyJump。在Web服务器的配置中添加特殊规则以阻止对/.ssh/目录的访问。最后,避免将.ssh配置文件、证书文件暴露给git公共存储库(github)等。
