前言
购买了一台云服务器,原本打算用于学习 Linux,并在过程中部署一些分布式组件。没想到由于操作不当,服务器被攻击并遭入侵。最终只能选择重装系统。所幸服务器上并没有重要数据,但这次事件让我意识到了云服务器安全的重要性。为了提高安全性,我查阅了一些资料并总结了一些加强安全性的措施。 (PS:为了避免记不住一些命令,可以使用宝塔 Linux 的图形化界面来简化操作。)
SSH 认证
大多数云服务器提供 SSH 服务用于远程登录,认证方式通常有密码和密钥两种。强烈建议使用密钥认证,一方面,密钥的长度较长,更难被暴力破解;另一方面,公钥加密的信息只有私钥能解密,可以有效防止服务器发送的数据被窃听。下面总结了常见的配置 SSH 密钥的方式。
在云服务器控制台配置
一般云服务器厂商例如阿里云都提供了生成密钥对的功能,可以参考 阿里云管理密钥的官方文档,讲解得很清楚。
创建密钥直接在控制台创建就行了
在宝塔面板配置
宝塔面板也提供了生成密钥对的功能。
命令行配置
- 本地生成密钥:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" - 将公钥添加到云服务器的
~/.ssh/authorized_keys的文件里,authorized_keys文件不存在就创建
开启防火墙
一般 Linux 服务器都会安装 firewalld 服务,通过设置防火墙规则能够有效地阻断恶意请求。
宝塔 Linux 设置防火墙
防火墙设置的规则主要是端口规则和 IP 规则。端口建议使用一个就开启一个,不用就关掉。IP 只放行本机。同时顺便开启 禁止 ping 和 端口防扫描。
命令行设置防火墙
上面的图形化按钮底层其实就是 firewalld 提供的命令。
设置端口规则:
- 永久开放某个端口(例如 8080 ):
firewall-cmd --zone=public --add-port=8080/tcp --permanent - 永久关闭某个端口:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent - 永久设置的规则需要防火墙重载才能生效:
firewall-cmd --reload - 查看当前开放的端口:
firewall-cmd --zone=public --list-ports - 临时开放端口(不保留配置):
firewall-cmd --zone=public --add-port=8080/tcp - 临时关闭端口(不保留配置):
firewall-cmd --zone=public --remove-port=8080/tcp
设置 IP 规则
- 允许来自某个 IP 地址的访问(永久):
firewall-cmd --zone=public --add-source=192.168.1.100 --permanent - 禁止来自某个 IP 地址的访问(永久):
firewall-cmd --zone=public --remove-source=192.168.1.100 --permanent - 允许某个 IP 地址访问特定端口(永久):
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="8080" protocol="tcp" accept' --permanent - 查看当前允许的 IP 地址:
firewall-cmd --zone=public --list-sources - 允许特定 IP 地址访问特定服务(永久):
firewall-cmd --zone=public --add-service=http --add-source=192.168.1.100 --permanent - 删除某个 IP 地址的规则(永久):
firewall-cmd --zone=public --remove-source=192.168.1.100 --permanent
Firewalld 的命令还有很多很多,可以自行去查阅和学习。
正确使用 docker
笔者因为错误使用 docker 而导致服务器被攻击了好几次,所以记录一下 docker 使用的注意点。
选择正规的镜像源
为了加快镜像下载速度,许多人会配置镜像源。建议选择国内大厂提供的镜像源,而不是小网站的镜像源,这样可以避免下载到含有恶意代码的镜像。
2375 端口
Docker 默认的 2375 端口支持远程连接,但并没有安全认证。如果防火墙未开启,黑客可能通过该端口远程操作 Docker,并通过下载公钥等手段入侵系统。建议关闭 2375 端口,或者开启安全认证来确保安全。
设置容器密码
使用 Docker 一键部署服务时,不要忽视容器的初始密码。容器往往会默认设置初始密码,而若不修改,其他人就可能轻易访问你的容器并进行破坏。
docker 和防火墙的冲突
docker 的端口映射是通过修改 iptables 实现的,如果不加处理很有可能会破坏防火墙的规则,进而导致防火墙不生效,所以可以在 docker 的配置文件添加 "iptables": false 避免防火墙规则被更改。
具体可以看这篇文章:Docker 绕过了 firewalld 的问题