前言
我的云服务器不算完全野生,大厂产品和路边摊都有。大厂官方的服务器偶尔会遇到别人一些恶意登录的尝试,小厂的产品因为没有额外防护所以概率更大、风险更高。我这台阿里云的服务器,之前都没遇到过异地登录,但今天想更新服务器上的东西,意外发现原来大厂这种有安全防护的服务器也有被爆破的风险:
给大伙儿看看我另一台野生云服务器的情况,不到5分钟时间里有200+次的登录失败提示:
幸好我这些产品的密码都是10位无规律字符起步的(虽然不好记,但胜在相对安全),不然这种强度下还真有可能被强行爆破。
发现问题了自然要解决问题,于是我尝试求助了deepseek,得到了这些方法加固:
SSH密钥认证 + 非默认端口 + 关闭无用端口 + Fail2Ban + 系统更新,此外还有不用root登录、IP白名单、双因素认证这些,不过由于服务器上的东西不是很重要,最坏结果可能就重置系统这样子,所以后续几个我没采用,root平时用的多些(权限高),ip白名单(我有时会用手机的工具登录,IP不固定),双因素认证(太麻烦了,除学技术外,获得实际收益的付出和回报不对等)。
以上这些方法都不是绝对的,要结合自身产品考虑,比如你就一个博客,数据库还不在这台机器上,那随便做一下其实就可以了;如果你服务器上有很多重要数据,承受不了被攻击的成本,那可以考虑加上其它更安全的安防产品,比如云防火墙、IP白名单、双因素认证、端口仅在用时开放这些东西,通通安排上。
方法大概就上面几种,根据操作难易程度排序,细节且听我细细道来:
(观前提醒,不要看到命令就直接 复制 粘贴 然后执行,你先看完一个大点,再回头复制命令并定制化修改,不然万一哪里配错了登不上就寄寄了)
1.系统更新
使用update
命令更新:
sudo yum update -y
这点很好理解,旧的技术往往有已被爆出的安全隐患,新的技术虽然也存在0day漏洞,但相应攻击者的成本会高的多,真0day起手都是以万美元为单位的,为你服务器上的点点数据,可能优先打你吗?不优先打你那系统的安全服务就会在不久后修复,也打不了你了。
PS.这个命令应该会执行挺久的,和你设备的网络、硬件配置都有一定的关系,像我就执行了十多分钟,所以不要急,可以一边等执行完成一边看后面的内容。
2.使用RSA密钥代替传统账号登录
首先你要先在本地生成一个RSA密钥,这里我以Windows为例。第一步切换到对应目录,然后唤起powershell
,目录没有要求,但我习惯保存在User/.ssh
下,然后新建了一个文件夹example
用来存相应的密钥文件。
快速唤起powershell
可以直接在地址栏中输入后回车,你想用cmd
这也同样适用。
然后执行命令:
ssh-keygen -t rsa -b 4096
其中-t rsa
是指使用RSA
加密协议,-b 4096
是指密钥长度,一般有2048
、4096
、8192
这些常见的取值,密钥越长相对就越安全,但相应的的性能开销也越大,大伙自行抉择。
那回车完后你会遇到第一轮输入选择:
这里的意思是问你文件保存到哪,叫什么名,默认是保存到Users/<用户>/.ssh
下,文件名称叫id_rsa
,如果你原来有id_rsa
文件会直接覆盖,所以建议改个名字。只写名字就是保存到当前的目录下,比如我这里就是Users/<用户>/.ssh/example
下名字叫id_rsa_example
。这里名字建议不要用中文,路径也不要有中文、空格这些东西。
回车后你会遇到第二轮输入选择:
这里是叫你输入私钥密码,直接回车表示没有额外密码,这个还是看你自己,正常讲私钥不会泄露,但我为了保险还是设置了一串16+位的高强度密码,这样就算私钥泄露也能撑一段时间,可以利用这段时间更新密钥。
这里输入是不显示的,所以想好了再输入,但删除是正常工作的,不是Linux里那种删除算字符^Z
这点好评。但还是建议你找个地方记录一下,然后对照着输(后续还要重复输入密码)。至于这份私钥密码明文你可以随身带个U盘,用BitLocker加密,平时和钥匙挂一起,这个U盘不要存文件,平时也不要到处插。嫌麻烦可以找专业的安全存储商,此类服务一般有专人经营,但可能是付费服务。
回车以后再次输入密码:
看到这样的提示就表示行了:
然后在对应的目录就会出现这样两个文件,其中.pub
结尾的是公钥文件,一会儿要放服务器上,没有后缀名的文件是私钥文件,需要妥善保存。
密钥生成好后,将.pub
结尾的公钥文件复制到云服务器的/root/.ssh
下(没有目录就新建一个),并改名为authorized_keys
,一定要叫这个名字才能识别,没有后缀名,原来的.pub
直接删了就行。我这里从新建文件夹开始
cd /root
sudo mkdir .ssh
cd /root/.ssh/
然后把文件复制到这里,那我用的是final shell
这个软件,可以直接把文件拖进来。总之把公钥里的内容复制到云端就好,实在不行你可以用ctrl+c
复制,然后用sudo vim authorized_keys
编辑这个文件,然后ctrl+v
粘贴也可以,公钥内容没变就好。
执行命令:
sudo mv authorized_keys mrs_authorized_keys.backup
sudo mv aliyun_ecs_rsa.pub authorized_keys
这里我使用了mv
命令来改名字,改的名字随意(建议添加内容而不是修改或删除),比如我是加了个mrs_
的前缀这算是我个人的命名习惯,后缀也不一定叫backup
,你开心就好,最后要还原的时能想起来原来叫啥就行。
再来看下修改后的结果:
最后修改位于/etc/ssh/sshd_config
的文件。
sudo vim /etc/ssh/sshd_config
然后添加以下内容:
PasswordAuthentication no # 关闭密码登录(强制仅允许密钥登录)
PubkeyAuthentication yes # 启用公钥认证
ChallengeResponseAuthentication no # 禁用挑战-应答认证(通常与密码登录相关)
此时就算配置完成了,接着重启SSH服务就能尝试连接了。
sudo systemctl restart sshd
我这里以final shell和cmd两种连接方式举例:
如果是cmd之类的命令行登录,可以使用命令ssh -i
进行登录
ssh -i "C:\Users\Marisa\.ssh\aliyun\aliyun_ecs_rsa" -p 22 root@127.0.0.1
这里面私钥地址C:\Users\Marisa\.ssh\aliyun\aliyun_ecs_rsa
要改成你自己的;-p 22
表示使用22端口,后续要换端口所以这里显式指定;root
是你登录的账号,如果你不用root
那就要改;127.0.0.1
是你服务器的IP地址,换成你自己的。最后输入密码以后就成功登录了:
3.更换默认SSH端口
我们都知道现在那些黑客工具,大部分扫描的其实都是固定的端口,对于我们这种小服务器,攻击者不太可能对你定制化攻击手段(除非有人故意想搞你)。所以基本改个端口就扫不到你了。
你需要修改位于/etc/ssh/sshd_config
的文件。
sudo vim /etc/ssh/sshd_config
然后添加以下内容:
Port 1145 # 修改默认端口
PasswordAuthentication no # 禁用密码登录,强制密钥认证
# PermitRootLogin no # 禁止root登录
# AllowUsers your_user@允许的IP段 # 可选IP白名单(需登录方有静态IP)
这里根据你自己的情况来,比如我更爱用root
账号,那就没有禁用root
登录,还有关于换端口,换之前记得先开放防火墙(万一后面忘了一刷你就登不上了,只能找客服或者重置),开放端口的命令,以firewall-cmd
为例:
sudo firewall-cmd --zone=public --add-port=1145/tcp --permanent
有些大厂的可能没有用系统防火墙而是云安全组,比如阿里云,此时你就得去对应的安全组里添加规则。我这里没有删掉原来22端口的规则,为的是方便以后使用时可以随时启用,其实删掉规则后就默认禁用该端口了。
然后是禁用账号密码登录,这点建议你先配置完RSA密钥登录并保证能登上(上面第二点)以后再回来禁用密码登录,不然密钥登录不上,密码又禁止登录,最后还得找服务商帮忙。
最后重启ssh服务:
sudo systemctl restart sshd
此时就修改掉默认端口了,退出登录后就得使用新端口登录。
4.关闭无用端口
端口暴露的越多就越容易被攻击,现在黑客们都用自动化脚本全网扫端口,常扫的有22
、80
、3306
、3389
、6379
这些比较常见的服务或者中间件的默认端口,然后用直接密码爆破或者别的破坏方式。所以这些服务的端口没事干就别对外暴露,或者改成别的以后再对外暴露,但对应的服务都要使用强密码。像是我另一台小厂的服务器,就只暴露了80
、443
和更改后的ssh端口,前两者是因为服务器主要就是对外提供网站服务的,后者则是我需要连接服务器上传数据。其它端口都被我ban掉了。这里以firewall-cmd举例:
# 安装(如需要)
sudo yum install firewalld -y
# 启动并设置开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 验证
sudo firewall-cmd --state
如此这般防火墙就开上了,接着就开启相关端口就行了
# --permanent表示规则永久有效,临时规则请自行修改
sudo firewall-cmd --zone=public --add-port=端口/协议 --permanent
每一轮操作结束后记得重新加载防火墙规则
# 重新加载防火墙规则
sudo firewall-cmd --reload
# 查看当前开放端口
sudo firewall-cmd --list-port
5.使用Fail2Ban封禁违规IP
使用Fail2Ban封禁违规IP很简单,跟着命令敲就行了:
# 安装Fail2Ban
sudo yum install epel-release -y
sudo yum install fail2ban -y
# 配置SSH防护
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 `/etc/fail2ban/jail.local`,修改:
[sshd]
enabled = true
port = 1145 # 与SSH端口一致
maxretry = 3 # 失败3次后封禁
bantime = 1h # 封禁1小时
接着启动服务:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
齐活儿了,至于其它一些更高级的安全防护,等以后有机会了再说,目前这个安全防护对我而言已经够用了。