以下操作均使用Xshell演示
具体的风险到底是什么
任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的 VPS 服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
-
【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏
-
【端口】:如果使用默认端口,那么【端口 =
22】 -
【用户名】:如果使用默认用户,那么【用户名 =
root】 -
【密码】:密码不存在默认值,一定是由 VPS 后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:
- 如果你用了 VPS 管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全
- 如果你为了好记、把密码改成了类似
123456这种超弱的密码,破解你的 VPS 服务器可谓不费吹灰之力 - 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说
密码表,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)
-
但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高
root控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意 VPS 的登录记录、进程变化、CPU 占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的 VPS 服务商封禁你的账号、或者收到律师函为止。 -
别忘了,你获得 VPS 时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,一旦这些坏事发生,它们就不可避免的与你产生了关联。
**IP —— 端口—— 用户——密码**
基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险:
- 【端口】:将 SSH 远程登录端口修改为【非 22 端口】
- 【用户名】:建立【非 root】的新用户、并禁用 root 用户 SSH 远程登录
- 【密码】:SSH 启用 ED25519 密钥验证登录、同时禁用密码验证登录
记得按顺序来,别把自己锁在门外了。
端口
Why : 有些VPS服务器端口在服务器创建时候,默认ssh远程登录端口为22,也因此许多恶意脚本都会先尝试该端口来进行登录。
将SSH的远程登录端口修改为【非22端口】
如下图现在的ssh登录端口为22且是已经登录上的状态
服务器端
-
修改sshd配置(记住使用root用户修改)
-
使用vim 命令进入sshd的配置文件
[root@hadoop101 ~]# vim /etc/ssh/sshd_config修改其中Port为你想设置的端口号(具体vim的操作命令网上都有,这里就不再操作),一般建议把它改成一个大于
💡1024小于65535的整数(本文以1211为例)补充: 查看一个端口是否已经被占用
netstat -tlnp | grep 22
-
- 检验配置
[root@hadoop101 ~]# sshd -t
没有任何输出 = 配置合法
有输出就先别往下走,检查下配置的是否正确。
-
让SELinux放行1211端口给sshd
SELinux 阻止 sshd 监听非 22 端口——这是 RHEL / CentOS / Rocky / Alma 的默认安全策略,不是 bug。
#检查SELinux是否启动 [root@hadoop101 ~]# getenforce如果是
Enforcing,继续:# 放行 1211 给 sshd semanage port -a -t ssh_port_t -p tcp 1211如果提示已存在,用:
semanage port -m -t ssh_port_t -p tcp 1211然后:
systemctl restart sshd systemctl status sshd执行成功的话
Active状态为active(running)
此时再看:
```
netstat -tlnp | grep 1211
```
你会看到 sshd 正常 LISTEN。
- 防火墙放行(别假设默认是开的)
#把 TCP 1211 端口 加入服务器的长期对外白名单
firewall-cmd --add-port=1211/tcp --permanent
#让 firewalld 重新加载永久配置
不会断当前连接(比重启 iptables 安全)
firewall-cmd --reload
验证:
#列出当前 zone 中已允许的端口
firewall-cmd --lsit-ports
做完这些你的ssh登录端口就应该已经为你设置的新端口号了,再次登录并修改登录的端口号就可以了。
用户名
大部分主机的初始用户就是
root,root可不只是管理者那么简单,它是整个系统的根基,是系统的主宰,至高无上的神。一旦root用户被攻破,那你的系统就只能任人鱼肉了,所以root用户最好设置为不能通过ssh来登录。
设置非root的用户
#添加一个用户
root@vps:/# adduser jingugu
- 执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到
******的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。
- 我们要做的第二件事,是【安装
sudo功能】(sudo就是在关键时刻,让普通账户临时获得root的神力,战力全开拯救世界)
apt update &&apt install sudo
聪明的你大概已经发现,这一行命令其实是两个命令。前一半 apt update 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 apt install 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的sudo程序】。 && 则是把两个命令连起来执行的意思。
- 我们要做的第三件事,是【把
vpsadmin用户加入sudo名单里,让他有资格借用root的神力】
#进入sudoers文件配置sudo用户
root@vps:/# vim /etc/sudoers
按照下图配置好jingugu的sudo权限
WARNING 要特别说明的是NOPASSWD这个设置,它的意思是vpsadmin用户临时使用root权限时,不用额外输入密码。这与一般的安全建议相反。我之所以如此推荐,是因为很多新人不顾危险坚持使用root账号就是因为用root时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用root用户的风险】大于【使用sudo 时不用输密码的风险】,所以做了以上的建议。
如果你希望遵守传统习惯、每次使用sudo时需要输入密码,那么这一行改成 vpsadmin ALL=(ALL:ALL) ALL 即可。
-
然后,就是最关键的一步——禁用root用户SSH远程登录
**#用vim 打开sshd_config 修改对应配置 root@vps:/# vim /etc/ssh/sshd_config**
然后重启服务,不用我多说了吧`systemctl restart ssh`
Xshell的操作就不多说了,把登录用户换为jingugu就行了
密码
第三步,我们来解决【密码】可能被攻破的风险。
根据文档的意思,黑客可不是很蠢地用穷举法来破解你的密码,他们有从网络或其他地方获取的类似“密码本”的作弊手段。所以只要你不是用的随机生成的超长密码来登录,就很容易中招。
但超长密码的记忆性和可输入性太难了,所以为了解决密码容易被攻破这个问题,我们直接弃用【密码验证】方式,该用更加安全的【密钥验证】。
💡密钥验证
所谓的密钥验证,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到服务器并【进行相关的配置】。每次登录时,SSH会将服务器的【公钥】和用户的【私钥】进行匹配,若验证为正确的【密钥对】,则验证通过,成功登录。(不需要设置用户相关的密码,但需要设置密钥的密码)(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)
💡WARNING
本文以 Ed25519 密钥举例,但它绝非唯一选择。 这是一个与 ECDSA 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门
其他的常见密钥还有:
DSA- 已经从数学层面被证明不安全,所以永远不要用它ECDSA- 密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的 VPS 上有值得 NSA 关注的东西就不要用它RSA-RSA密钥在各种设备、各种SSH客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性
所以,如果你的设备和软件都支持的话,我建议优先选择 Ed25519 密钥。
Xshell中的密钥生成
使用Xftp进行公钥的上传
- 接下来是在终端的配置,先将对应文件移入
.ssh
root@vps:/# cd /home/jingugu/
root@vps:/home/jingugu# mkdir .ssh #创建.ssh目录
root@vps:/home/jingugu# ls
authorized_keys
root@vps:/home/jingugu# mv authorized_keys .ssh/ #将authorized_keys移入.ssh/
- 修改ssh对应目录,文件,用户的权限
**chmod 700 /home/jingugu/.ssh #只有 flandern 能访问 .ssh
chmod 600 /home/jingugu/.ssh/authorized_keys #只有 flandern 能读写自己的授权 key
chown -R jingugu:jingugu /home/flandern/.ssh #这些 key 是 flandern 自己的,不是 root 的,不是系统的
#正确配置的权限
drwx------ jingugu jingugu /home/flandern
drwx------ jingugu jingugu /home/flandern/.ssh
-rw------- jingugu jingugu /home/flandern/.ssh/authorized_keys**
💡
目录和文件的权限有区别
目录:
r —可以列出该目录中的所有文件
w—可以在目录中添加删除文件(目录)
x—可以访问和进入目录中的内容(文件和目录)
文件:
r:读内容w:改内容x:当程序执行
这里要注意,必须将对应的文件和目录修改正确,否则SSHD就很容易禁止连接,所以后面配置完连接不了记得检查权限的配置是否有误(我在这里弄了好久才弄对)
让ssh允许通过密钥来连接
打开sshd_config来将这里的两个配置生效(将#去掉)
最后,别忘了systemctl restart sshd 重启服务,如果你之前的配置严格按照我的步骤进行的话,这时候再用Xshell登录就应该是密钥验证了。
注意
这里最好设置为仅Public Key
到这里为止,你的 服务器 已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障,虽然远称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了!