前言

我的云服务器不算完全野生,大厂产品和路边摊都有。大厂官方的服务器偶尔会遇到别人一些恶意登录的尝试,小厂的产品因为没有额外防护所以概率更大、风险更高。我这台阿里云的服务器,之前都没遇到过异地登录,但今天想更新服务器上的东西,意外发现原来大厂这种有安全防护的服务器也有被爆破的风险:

给大伙儿看看我另一台野生云服务器的情况,不到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是指密钥长度,一般有204840968192这些常见的取值,密钥越长相对就越安全,但相应的的性能开销也越大,大伙自行抉择。

那回车完后你会遇到第一轮输入选择:

这里的意思是问你文件保存到哪,叫什么名,默认是保存到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.关闭无用端口

端口暴露的越多就越容易被攻击,现在黑客们都用自动化脚本全网扫端口,常扫的有2280330633896379这些比较常见的服务或者中间件的默认端口,然后用直接密码爆破或者别的破坏方式。所以这些服务的端口没事干就别对外暴露,或者改成别的以后再对外暴露,但对应的服务都要使用强密码。像是我另一台小厂的服务器,就只暴露了80443和更改后的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

齐活儿了,至于其它一些更高级的安全防护,等以后有机会了再说,目前这个安全防护对我而言已经够用了。

弹幕,最重要的是火力DA☆ZE!