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 root@x.x.x.x:/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

相关内容