SSH安全小记
这里的SSH安全主要对应个人VPS,没有前端硬件防火墙的小型运营服务器,或者是企业小规模服务器。总结性文章,都是可以再网络上可以搜索到。
1)禁止root登陆
vi /etc/ssh/sshd_config
PermitRootLogin yes
改成
PermitRootLogin no
重启ssh服务
使用普通用户登陆,然后使用sudo的方式进入root。
PS:在FreeBSD系统默认关闭root登陆
2)禁止root登陆之后,还要禁止使用password登陆,只能使用ssh key认证方式登陆
vim /etc/ssh/sshd_config
PasswordAuthentication yes
改成
PasswordAuthentication no
这样默认会使用key登陆,不会允许输入密码
3)使用ssh key认证方式,老生常谈了!
a.在本地生成一个RSA的公共KEY
# ssh-keygen -t rsa
b.将生成的id_rsa.pub拷贝到远程机器上,且命名为authorized_keys
scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
c.远程服务上修正权限
chmod 600 ~/.ssh/authorized_keys
4)用pkill踢掉ssh用户
如果发现已经被入侵了,但是服务器此时不宜做重启ssh,或者重启server的操作,使用以下方式踢掉其他用户
[root@localhost tmp]# w
03:40:28 up 71 days, 51 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.0.1 00:03 0.00s 0.09s 0.01s w
[root@localhost tmp]# pkill -kill -t pts/1
5)使用TCP-wrapped(host.allow & host.deny)控制登陆权限
[root@localhost ~]# ldd /usr/sbin/sshd | grep wrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x0000002a9566c000)
[root@localhost ~]#
使用ldd检测是否可以用tcp-wrap, 即该服务可以使用/etc/hosts.allow和/etc/hosts.deny,如果输出没有libwrap则不可使用
编辑/etc/host.allow,host.deny
.
允许sys.com域访问
cat host.allow
sshd: .sys.com
cat host.deny
ALL:ALL
允许sysv.com和192.168.1.x可以访问,但是不允许主机名是stu1,stu2的机器访问
cat host.allow
sshd: .sys.com,192.168.1.,EXCEPT stu1,stu2
还有很多其他方式,具体使用查man。
一些补充:
a)常有人说修改ssh默认22端口可以保证一定的安全性。
几乎无用。使用端口扫描工具nmap,改神马端口都可以找到!并且随意改成其他端口之后,可能会和其他应用的端口冲突。
b)用密码比用key安全,设置复杂无规则密码就可以避免暴力破解
属于拍脑袋的想法
ssh key 认证机制比密码要安全, 密码会让别人看到,并且在网络中传输会有风险。
而key相当于你的家门钥匙,谁会把自己的钥匙给别人呢?如果还不放心,也可以设置一个passphrase,这样,别人拿到ssh密钥也没有用。
在windows里用putty连接也是可以用key的。使用puttygen.exe转换下,具体google,文章一大把。
c)iptables和密钥认证谁更好。
使用iptable指定只允许固定IP可以实现访问控制。缺点是如果iptables崩溃或者忘记启动了,则没有防范效果了。
而且对于iptables来说,规则越少,效率越好。
不过可以使用脚本方式结合iptables限制尝试多次登录的IP,这样可以防止穷举,或者在ssh的config里配置密码错几次之后一段时间内禁止登录。
netstat -an | grep -v LISTEN | awk ‘{print $5}’ |grep -v 127.0.0.1|grep -v 本机ip|sed "s/::ffff://g"|awk ‘BEGIN { FS=":" } { Num[$1]++ } END { for(i in Num) if(Num[i]>8) { print i} }’ |grep ‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}’| xargs -i[] iptables -I INPUT -s [] -j DROP