添加ssh密钥验证
最近发现个人VPS的ssh日志中总是有很多不明IP的连接请求,天天爆破ssh也是够勤奋的。
为了防止某天VPS真被爆了先给ssh加个密钥认证,首先执行
1 | ssh-keygen -t rsa |
将生成好的密钥对妥善保存(在生成中可选将私钥用口令加密)。
将公钥(id_rsa.pub)上传到VPS上,并将其内容添加到对应登录账户的~/.ssh/authorized_keys文件中,注意.ssh目录的权限最好是700(我的是755好像也行),authorized_keys的权限必须是600或644。这里权限问题坑比较多,属主貌似没多大问题(我的登录账户不是root,但文件和目录的属主都是root)。
修改/etc/ssh/sshd_config文件,分别修改如下三项:
1 | RSAAuthentication yes |
一般不用root登的话也设置一下
1 | PermitRootLogin no |
重启sshd服务
本地用Xshell添加刚才生成的私钥就可以连接VPS了(如果设置了加密口令则需要输入口令解密私钥)。
此时最基本的设置密钥登录就完成了,接下来我们修改open-ssh的代码来实现输出验证错误时的密码。
修改ssh源码
首先切换到一个临时目录执行apt-get source ssh,执行完后直接有一个openssh-6.6p1/ 目录和几个压缩包(我的VPS装的是DigitalOcean官方提供的Ubuntu镜像),进入源码目录后首先写个patch:
用ssh工程内的logit来写SYSLOG。写完patch后先
1 | patch --dry-run <sshlog.patch |
看是否有错误,没有错误的话就可以直接patch了。
到这里建议先备份一下/etc/ssh文件夹,再建个VPS的快照以防悲剧。。。
在源码目录执行配置
1 | ./configure --prefix=/usr --sysconfdir=/etc/ssh --without-zlib-version-check --with-md5-passwords --mandir=/usr/share/man |
如果出错就安装缺少的软件包,下面是我安装时缺少的软件包:
1 | apt-get install zlib1g zlib1g.dev openssl libssl-dev |
(以上是ubuntu非主流命名的包名。。)
其中安libssl-dev的时候加了个 –fix-missing参数才没有出错。
configure顺利完成后执行make和make install,之后重启sshd服务(digitalocean的ubuntu下直接重启ssh)。
重启后先别急着退出,在当前会话下对比备份的ssh配置和新生成的ssh配置的不同,根据需要更改一下(这里最好不要改新生成的密钥,改了以后可能就要恢复快照了。。。),然后新开几个会话看是否能成功连上VPS。
更改账户认证策略
以上完成后还要再修改一些配置,先在shadow里把root禁了(密码前加个!号),之后重新修改sshd_config配置,主要注意以下几个:
1 | PermitRootLogin no |
注意下面这行实际上是针对所有其他账户的,
我的VPS上就2个账户,一个root不允许登录并且把shadow废了,
另一个常用账户在sudoers里,sudoers组登录策略另行配置
1 | PasswordAuthentication yes |
在文件的最后(貌似Match有要求)添加如下内容:
1 | Match Group sudo #这里可能组名会不一样,wheel、sudoer什么的视情况而定 |
经过如上配置后只要用户名在sudoer里VPS是不允许密码登录的。
此时如果恰巧有人在爆破你的VPS你可以通过
1 | tail -F /var/log/auth.log | grep sshlog |
看到,有些主机的日志可能在/var/log/secure内,具体情况参照syslog.conf或rsyslog.conf的配置。
感受到了世界深深的恶意。。。
可以写个脚本或程序来定期提取这些密码记录,送上门的字典不要白不要。