风险到底是什么
正如我们所知,任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
IP 地址:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏
端口:如果使用默认端口,那么【端口 = 22】
用户名:如果使用默认用户,那么【用户名 = root】
密码:密码不存在默认值,一定是服务器管理后台随机生成的密码或者你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。
一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 root 控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事。另外,服务器上如果有什么隐私信息的配置文件的话,那后果就更难顶了
开始防护工作
本文以 Ubuntu20.04 为例子,Debian 的操作也是类似的,CentOS 系统会不太一样,请自行参考搜索相关内容。
注意,任何涉及到安装的操作之前,先更新一下我们安装包的索引,可以的话,顺便更新一下软件。这本身也是安全的一部分,新的软件意味着更少的漏洞。
apt update apt upgrade
1. 更改 SSH 端口
第一步,我们先来解决【端口 = 22】的问题。(注意:有些 VPS 服务商,默认的端口已经是非 22 端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)
打开 SSH 远程登录程序设置文件: nano /etc/ssh/sshd_config
使用 ctrl+w 进入搜索模式,然后输入 Port 22 并回车 删除 22 并改成 9876(随意,只要符合端口号要求即可) ctrl + o + 回车 保存文件并退出 重启 ssh 服务,使变更生效. sudo service sshd restart
现在新的端口已经生效,下次登录时就要用 9876 了: ssh root@你的服务器IP -p 9876
2. 使用复杂的密码
输入 passwd
就会出现修改密码的提示,注意为了安全的考量,Linux下输入密码是没有显示的
密码强烈推荐用一些工具比如 1Password 生成复杂的密码
3. 新建普通用户
接下来,我们来解决【用户名 = root】的问题。
首先你要理解, Linux 系统中的root,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦root账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:
新增一个用户并设定登录密码,名字你可以随便起,我这里以 vpsadmin 为例:
adduser vpsadmin
执行命令后,根据提示操作即可,设置一个用户密码。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。
安装sudo功能:sudo 就是在关键时刻,让普通账户临时获得 root 的权利。
apt update && apt install sudo
把新增的用户加入 sudo 名单里,
visudo
在
User Privilege Specification
下加入一行vpsadmin ALL=(ALL:ALL) ALL
,如果不希望每次 sudo 的时候都需要输入密码,那可以改成:vpsadmin ALL=(ALL) NOPASSWD: ALL
,不过当然从安全角度不建议
4. 禁止 root 登陆
打开SSH远程登录程序设置文件: nano /etc/ssh/sshd_config
,找到PermitRootLogin Yes
这一项,然后把它后面的设定值改为 no 即可。sudo service sshd restart
重启 ssh 服务,让变更生效。下次通过远程登录,root 用户已无法连接,用户名就要换成 vpsadmin 了: ssh vpsadmin@你的服务器IP -p 9876
5. 启用 RSA 密钥验证登录并禁止密码登陆
接下来,我们来解决【密码】可能被撞破的问题。
超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。
说的通俗点就是服务器上存着公钥,我们自己的电脑存在私钥,每次我们在自己电脑上申请远程连接服务器的时候,就会进入密钥验证,只有验证通过了我们才能成功远程连接。
本文以 RSA 密钥举例,是因为 RSA 密钥在各种设备、各种 SSH 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。
那我们现在就来配置【密钥验证】吧!
1、本地机器:如果你本地的机器使用的是 Linux 或者是 macOS 系统,可以使用如下命令通过 keygen 生成密钥对:
# ssh-keygen -t rsa -b 4096 -C "<CLIENT-NAME>" ssh-keygen -t rsa -b 4096 -C "myvps"
2、服务器:创建一个 .ssh
的文件夹
cd ~ mkdir .ssh
3、本地机器执行下面命令,将本地生成的公钥文件 id_rsa.pub
拷贝到服务器上
scp -P 9876 ~/.ssh/id_rsa.pub 用户名@IP地址:/home/用户名/.ssh/authorized_keys
4、修改 authorized_keys 文件权限为 600 (仅所有者可读可写)
chmod 600 ~/.ssh/authorized_keys
5、编辑ssh配置文件, 搜索 PasswordAuthentication,把yes改成no
sudo nano /etc/ssh/sshd_config
现在全世界只有这台配置了私钥的机器能连上服务器。如果想要让其他机器也能够连接上服务器,只需要按照上述同样的方法把其他机器上生成的公钥也复制到服务器上即可。
6. 启用 UFW 防火墙
Ubuntu默认自己已经是自带ufw防火墙了,只是没有启动而已
1、设置ufw使用默认值
sudo ufw default deny incoming sudo ufw default allow outgoing
2、允许SSH连接 sudo ufw allow 9876/tcp comment 'SSH'
3、允许http连接 sudo ufw allow http
4、允许https连接 sudo ufw allow https
5、启动ufw防火墙 sudo ufw enable
6、查看ufw防火墙状态 sudo ufw status
7、删除一条规则 sudo ufw delete 5
8、重载配置 sudo ufw reload
7. 禁止 Ping
Ping命令被广泛用于 DDoS 攻击中,攻击者可以利用大量的主机发送ping请求,将服务器的带宽消耗殆尽,从而使服务器无法正常工作。通过禁止ping,可以阻止这种类型的攻击,保护服务器免受 DoS 攻击的影响
sudo nano /etc/ufw/before.rules
搜索:echo-request,把 ACCEPT 改成 DROP
以上,暂且这么多,后续有想到的再补充~
还没有评论,来说两句吧...