唠唠闲话
一开始接触服务器,我只是把它当博客的托管网站,源文件用 GitHub 备份,所以网站被黑了也没啥关系。但随着使用深入,网站逐渐加入我的日常工作流中,而且有了使用更多服务的需求。在这种情况下,服务器安全是一个非常需要重视的问题了。
当然,还有一个动机。实验室服务器由我和几位同学负责日常管理,前段时间还出现过被挖矿的行为。与云服务器不同的是,实验室服务器缺少企业提供的保护,容易成为被攻击对象。所以,在安全意识层面,有必要进行一次“升级”。
本篇主要参考 Bensz 的 Linux 基础 个人 VPS 安全,非常适合新手入门。
网络安全是一个相对的概念,你要做到的不是绝对安全,而是比大多数人安全。 这样攻击者就不会去啃你这个硬骨头,而去找一些软柿子(那些没有安全防护的VPS)捏了。
安全措施
接下来是具体实践的部分,出于安全考虑,在修改核心配置时,建议 先备份原始文件。修改配置和重启服务后,先在新的终端尝试连接服务器,确认无误后,再退出当前的连接。如果错误修改了配置,当前连接状态通常不会掉,发现新终端连不上还能及时改回来。
mkdir backup
sudocp /etc/ssh/sshd_config ./backup
此外,这些策略更多是防止网络攻击,而不影响机房对服务器的连接。比如禁用 Root 密码登录后,仍可以正常使用云服务器的“远程登录”。同理,机房登录服务器也不受这些策略影响。
禁用 root 密码登录
一般情况下,主机是允许 root 用户远程登陆的。而 root 用户的名字一般就是 root。所以,如果攻击者知道你 VPS 的 ip 地址(ping 你的域名获得)、用户名(默认有一个 root 可用)和 ssh 端口号(默认 22 ),那么保护你电脑的就只有你的用户密码了。
root 用户拥有服务器的最高权限,一旦被攻陷,服务器就完全任人宰割了。所以第一步,在首次配置好 ssh 密钥后,我们将 root 的登录功能禁掉。
如下,用编辑
ssh
配置文件
sudovim /etc/ssh/sshd_config
输入
/Permi
回车检索,找到
PermitRootLogin
,将其注释掉
#LoginGraceTime 2m
PermitRootLogin yes# PermitRootLogin prohibit-password
然后重启 sshd 服务
sudo systemctl restart sshd
顺带一提,重启 ssh 服务有八条命令可用,暂时不清楚区别
sudo systemctl restart/reload sshd/ssh
sudoservice ssh/sshd restart/reload
禁用普通用户密码登录
除了禁用 root 用户,也可以设置所有用户不能密码登录,这一来攻击者就不可能用暴力穷举的方式登录任何账号了。
同前边操作,先
vim /etc/ssh/sshd_config
检索并修改参数为
PasswordAuthentication no
,然后重启 ssh 服务。
当然,禁用所有用户密码登录的措施可能太严厉了,也可以检索
Match User
,对某一用户单独修改。
这段代码通常在文件最后:
# Example of overriding settings on a per-user basis#Match User anoncvs# X11Forwarding no# AllowTcpForwarding no# PermitTTY no# ForceCommand cvs server
修改如下,并重启服务。
# Example of overriding settings on a per-user basis
Match User username
PasswordAuthentication no
创建用户名时,应避免使用常见名词,比如
test
之类。攻击者通常会对 IP 进行批量无差别攻击,由于对个体信息缺少了解,它们只能用常见词表来尝试用户名。比如上次实验室被挖矿就是前管理员创了个名为
tmp
的用户,且设置了弱口令密码。
更改默认 ssh 端口
默认的 ssh 端口号是 22。SSH 的端口一般建议把它改成一个大于 1024 小于 65535 的整数。举个例子,比如改为 1234。
同前边操作,用 vim 检索
/etc/ssh/sshd_config
的
Port
参数,更改如下
Port 1234#AddressFamily any#ListenAddress 0.0.0.0
修改后重启 ssh 服务生效。
密码复杂度策略
除了禁用登录,也可以采用相对温和的策略来防止穷举:通过修改 PAM(Pluggable Authentication Modules)来设置用户密码的强度、长度和重试间隔。
设置密码强度
这部分参考了 How to enable and enforce secure password policies on Ubuntu。
安全起见,先备份原始文件
mkdir-p backup
sudocp /etc/pam.d/common-password ./backup/
安装相关依赖
sudoaptinstall libpam-pwquality -y
这是原始文件
/etc/pam.d/common-password
的部分内容
# here's the fallback if no module succeeds
password requisite pam_deny.so
将
requisite
所在行修改为
password requisite pam_pwquality.so retry=3minlen=8difok=3
requisite
常用参数的解释:
retry=N
:限制用户在输入错误密码后可以再次尝试的次数。minlen=N
:指定密码的最小长度。difok=N
:指定密码中必须包含的不同字符数。ucredit=-N
:指定密码中必须包含的大写字母数。lcredit=-N
:指定密码中必须包含的小写字母数。dcredit=-N
:指定密码中必须包含的数字数。ocredit=-N
:指定密码中必须包含的特殊字符数。
注意这些参数中的
-N
表示至少需要包含
N
个字符,而省略符号
-
则表示必须刚好包含
N
个字符。
对于新用户,上述设置将立即生效。对于现有用户,他们的密码策略将在下一次更改密码时应用
设置重试间隔
我们要用到一个
pam_fallock
的模块。
auth required pam_faillock.so preauth silent audit deny=3unlock_time=1200
auth [default=die] pam_faillock.so authfail audit deny=3unlock_time=600
这部分设置后没效果,不确定是否和模块版本有关,但这个感觉挺重要,后续再排查下问题。
开启防火墙
前边主要是针对
ssh
登录的保护策略,除此之外,可以用防火墙工具
ufw
(Uncomplicated Firewall) 保护其他端口。
个人服务器建议开启防火墙,这样能可以加一层保护,对当前开放的端口有更好的把控。实验室服务器使用场景复杂,方便起见,考虑可以不启用。
先查看是否安装了防火墙
which ufw # /usr/sbin/ufw
如果没有,直接安装一个
sudoapt-getinstall ufw
防火墙常用命令
sudo ufw status # 查看当前状态 | inactive 代表关闭sudo ufw enable# 开启防火墙sudo ufw disable # 关闭防火墙sudo ufw allow 22# 允许访问 22 端口sudo ufw allow from 127.0.0.1 to any port 22# 允许 127.0.0.1 访问 22 端口sudo ufw status numbered # 显示序号,作为 delete 操作的索引sudo ufw delete <数字># 删除第几个规则# 删除规则更建议的方式,用 delete + 规则sudo ufw delete allow 22# 删除规则 allow 22sudo ufw delete allow 22/tcp # 删除规则 allow 22/tcpsudo ufw default deny incoming # 禁止所有进站的流量sudo ufw default allow outgoing # 允许所有出站的流量
如果前边更改了
ssh
端口为
1234
,则这里执行
sudo ufw allow 1234/tcp comment "this is for ssh"sudo ufw delete 22
禁用 Ping
除了加强服务器自身的安全防护,还可以用禁 ping 的方式避免服务器被穷举搜索到。
StackExchange 上给了很多种方案:How to Disable Ping Response (ICMP echo) in Linux all the time?
这里采用 Iptables 方法来弄,执行
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
在服务器上 ping 自己,ping 域名或 IP,会发现已经 ping 不通了。
iptables 还有其他规则和用法,后边有空再补充更新。
Fail2ban 防扫描和暴力破解
和前边设置登录重试间隔一样,这部分我的实践也没有成功,可能 PAM 版本问题?后续再尝试
Fail2ban 是防止后台暴力扫描的流行保护软件之一,安装方法
sudoapt update &&sudoaptinstall fail2ban -y
查看防护状态
sudo fail2ban-client status
返回内容如下
Status
|- Number of jail: 1
`- Jail list: sshd
编辑
/etc/fail2ban/jail.conf
文件,检索
/sshd modes
来配置
ssh
的监控策略
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:# normal (default), ddos, extra or aggressive (combines all).# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.#mode = normal
enabled =true
port =ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime =600
我在云服务器执行这一步设置后,似乎未生效,尽管能看到用户尝试多少次,但并不会终止用户的尝试,很奇怪。。。
小结
本篇针对服务器安全采用了几种策略:禁用密码登录(root/所有用户/特定用户);开启防火墙;更改 ssh 端口;增强密码复杂度;禁 ping 以及使用 Fail2Ban 工具。
这些可以让 VPS 更安全,但不是绝对的,后续接触到其他重要的安全策略,再来进行补充。
版权归原作者 致宏Rex 所有, 如有侵权,请联系我们删除。