0、前言
前几天 @SCH 的服务器被SSH爆破了,短短几天错误日志多了9万条,他这才意识到,SSH密码登录非常不安全。
无论用服务器作何种用途,SSH一定是“梦开始的地方”,但是随着长期使用,SSH极有可能成为服务器被入侵的突破口。
众所周知,SSH登录首先需要有目标服务器的IP和端口,然后需要提供登录信息,即账号和密码,或账号和密钥。
很多人只注意到密码登录不安全,却忽略了SSH默认账号的问题。同样,很多人只知道修改SSH端口,却不知道如何让SSH端口根本就不被扫描到。
因此,本文将从以上提到的四个方面,谈谈SSH安全的最佳实践。
1、隐藏源站IP
看到这个标题,你也许会一头雾水,域名要解析到IP才可以生效,怎样不暴露IP呢?
事实上,只需要让域名解析到源服务器以外的IP,而该中转服务器再把流量传回源服务器,这样就可以实现,这就是许多人使用的CDN。
如果有备案,可以直接接入云厂商的全球CDN,如果没有的话,可以参考
服务器安全(二)内外网防御
https://blog.tsinbei.com/archives/140/
用反向代理的方法,自制一个只有单IP的CDN。
然而,这种方法有一个缺陷,暴露外网端口的服务器,IP无法隐藏,而且也需要使用SSH连接,岂不是又容易暴露SSH端口?
因此,可以使用跳板机。
2、跳板机
顾名思义,跳板机就是一台中转服务器,SSH连接先经过它,再传输到源服务器。是不是又有点像前面提到的反向代理了?
首先,需要在源服务器防火墙设置,只允许跳板机访问源服务器的SSH端口:
在云服务器安全组设置也是同理。
然后,在跳板机设置端口转发:
这里的自定义端口,要保证足够安全,例如不能用22,如果是五位数端口最好。
之后,将只能通过跳板机IP:自定义端口
访问源服务器SSH。跳板机可以是之前的源站服务器,这样IP将不会暴露,如此一来,倘若对网站进行端口扫描,只能扫描到80
、443
端口了。
宝塔面板也可以使用此方法。不过在进行端口转发时,需要注意不能和已有端口冲突,要不然原有端口就连不上了。
3、更改端口
我强烈建议在第一时间修改默认的SSH端口。而且端口位数越大,被扫描到的概率越小。其他的都是些老生常谈的了,这里不再赘述。
4、更换用户
大部分Linux发行版默认用户是root
,Ubuntu是ubuntu
,在Azure购买的服务器是azure
,你是否认为不使用root
就万无一失?大错特错,以上列举的用户名都是被扫描的重灾区,应该尽可能避免使用。
这里以root
为例:
默认为yes
,即不限制;
最佳建议是直接改下成no
,即禁止登录;
如果非要使用root
登录,务必改成without-password
,即只能密钥登录;
如果有软件(如rsyncd)需要通过SSH连接,可以改成forced-commands-only
,也就是只允许这些软件连接SSH并执行操作,使用SSH客户端连接将会被直接拒绝。
我的建议是,使用自定义账号,例如自己的名字的拼音,然后养成权限隔离的习惯,必要时再加sudo
,这样可以杜绝90%的误操作。
如果一定要使用root
操作,何不登录自己的账号之后,再执行sudo -i
呢。
5、密码
密码其实也是老生常谈,但是也有一些问题需要强调。
密码的原则是短口令优于无意义长密码,口令就是一些具有实际意义的字符或单词,例如This-is-my-password!
,而无意义的长密码一般就是随机字符串,例如m7Hnl0Hwb5McKxiem1dLxjlw1
,看起来后者更安全,因为更复杂,然后它复杂到我们无法用脑袋记住,必须记在一个东西上,万一这个东西泄露了,这个“安全”的密码也就不再安全。
因此,建议大家取一个好用的密码,要对自己而言有意义,这样才好记;要复杂,这样才安全。例如“张三”,可以叫做:
My-teacher-is-Bilibili@Luo-Xiang~
服务器安全(三)SSH防御
评论