1. 引言
网络安全是一个非常重要的课题,而服务器是网络安全中最关键的环节,尤其现如今,随着比特币等一系列网络货币的流行,诞生了大量的挖矿木马,很多黑客尝试着攻击网络上的众多服务器,并偷偷地把木马送进已经拿下的城堡里,不仅如此,很多挖矿木马通过起一个常见进程的名字、仅在空闲时间工作等方式隐藏自己,让你在不知不觉中替黑客赚钱。 来自美国的一家企业网络安全公司Palo Alto Networks就发布了一份关于使用“挖矿木马”挖掘加密货币的报告显示,2017年6月至今,用来挖矿的恶意软件数量开始出现大幅增长,他们中 629,126个 “挖矿木马”中的84%被用来生产 Monero 币,而门罗币中至少有5%是使用“挖矿木马”开采出来的。 这骇人听闻的数据背后,是互联网网络安全的重大缺失,那么,如何让你的服务器不被攻陷甚至能够远离攻击呢?本文我们就来告诉你详细的配置方案。
2. 服务器基础安全配置
2.1. 开启地址空间布局随机化
开启地址空间布局随机化可以将进程的内存空间地址随机化来增大入侵者预测目的地址难度,从而降低进程被成功入侵的风险。 在 /etc/sysctl.conf 或 /etc/sysctl.d/* 文件中增加以下参数:
kernel.randomize_va_space = 2
然后,执行命令:
sysctl -w kernel.randomize_va_space=2
2.2. 配置文件权限设置
配置文件的权限是很重要的,不能被轻易修改,否则十分危险。
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow chmod 0644 /etc/group chmod 0644 /etc/passwd chmod 0400 /etc/shadow chmod 0400 /etc/gshadow chown root:root /etc/hosts.allow chown root:root /etc/hosts.deny chmod 644 /etc/hosts.deny chmod 644 /etc/hosts.allow
以及部分文件始终不应被修改:
chattr i /etc/passwd chattr i /etc/shadow chattr i /etc/group chattr i /etc/gshadow
3. 登录安全配置
3.1. 确保 root 是唯一 UID 为 0 的账户
linux 系统中,非系统账号的 UID 都是大于 500 的,而 UID 为 0 的用户拥有最高的系统权限,我们可以通过 -u 参数来指定用户的 UID,虽然这通常没什么意义,除非你把某个用户的 UID 指定为 0,显然,这是极不安全的。 所以确保 root 是唯一 UID 为 0 的账户是非常重要的。 执行命令:
cat /etc/passwd | awk -F: ’(3 == 0) { print 1 }’ | grep -v ’^root
如果命令执行后,返回的结果不为空,那么要将 /etc/passwd 中相应的用户 UID 提升到 500 以上。
3.2. SSH 相关配置
ssh 命令通常是登录服务器的唯一方式,所以 ssh 的配置也就显得十分重要。
3.2.1. SSH LogLevel 配置
ssh 的 LogLevel 默认为 INFO,会记录所有的登录和注销活动,如果被设置为 ERROR、FATAL 或者 QUIET,你将无法查看到谁登录到了系统中,这是十分危险的。 所以务必要查看 /etc/ssh/sshd_config 文件,确认其中配置了:
LogLevel INFO
3.2.2. 最大密码尝试次数
很多服务器都是被暴力攻击密码攻破的,此时设置最大密码尝试次数,就可以让暴力攻击的频率大幅降低从而降低被暴力攻击的风险。 具体方法是在 /etc/ssh/sshd_config 文件中,配置 MaxAuthTries,推荐值为 4:
MaxAuthTries 4
3.2.3. 禁止空密码用户登录
有些用户的密码为空,这部分用户是潜在的系统漏洞,拒绝这部分用户通过 ssh 登录显得十分必要: 具体方法是在 /etc/ssh/sshd_config 文件中配置:
PermitEmptyPasswords no
3.2.4. 设置 SSH 空闲超时退出时间
长期保持的 SSH 会话是另一个安全隐患,尤其是在网吧等公共电脑上进行过 ssh 操作又忘记关闭的情况下。 在 /etc/ssh/sshd_config 中配置:
ClientAliveInterval 600 # 超时时间 10 分钟 ClientAliveCountMax 2 # 最大活跃客户端 2 个
3.3. 用户密码相关配置
3.3.1. 设置密码失效时间
设置密码失效时间,强制定期修改密码,可以有效减少密码被泄漏和猜测风险。 在 /etc/login.defs 中将 PASS_MAX_DAYS 参数设置为 60-180之间,如:
PASS_MAX_DAYS 90
同时执行下面的命令为 root 用户指定该配置:
chage —maxdays 90 root
3.3.2. 密码复杂度检查
密码复杂度过低是被暴力破解的根源,安装 cracklib 可以检测和限制密码强度。 Ubuntu 上执行:
apt install libpam-cracklib
Fedora 上执行:
dnf install cracklib
RHEL/CentOS 系统上执行:
sudo yum install cracklib
安装完成后,编辑 /etc/pam.d/common-password 配置文件,在 password requisite pam_cracklib.so 开头的这一行配置 minclass(至少包含小写字母、大写字母、数字、特殊字符等4类字符中的3类或4类)设置为 3 或 4,即在行末尾加上参数 minclass=3。 在 password [success=1 default=ignore] pam_unix.so 开头的这一行增加配置 minlen(密码最小长度)设置为9-32 位,建议为 9,即在行末尾加上参数 minlen=9。
3.3.3. 拒绝密码重用
强制用户不重用最近使用的密码,可以有效降低密码猜测攻击风险。 具体方法是,编辑 /etc/pam.d/common-password,在 password [success=1 default=ignore] pam_unix.so 开头的这一行增加配置 remember 设置为 5-24 之间,建议为 5,即在行末尾加上参数 remember=5。
3.3.4. 更改密码提示时间
/etc/login.defs 中 PASS_WARN_AGE 配置项声明了在密码到期前多少天内提示用户重新设置密码。 结合上述配置,并修改 /etc/login.defs 让用户尽早收到提示更新密码,可以有效提升系统安全性。
PASS_WARN_AGE 7
同时,也需要让 root 用户该项设置生效,执行下面的命令:
chage —warndays 7 root
4. 网络防火墙配置
4.1. iptables 配置防火墙策略
这部分之前已经有详细的总结,可以参看: netfilter/iptables 原理 iptables 的使用实战
4.2. 修改 ssh 服务的 sshd 端口
ssh 默认会监听在 22 端口,因此针对 22 端口的攻击也最为常见。 具体方法是编辑 /etc/ssh/sshd_config 配置文件,修改 Port 参数,然后执行 service sshd restart 重启 sshd 服务。
5. 其他建议
5.1. 通用建议
其他通用性的建议也需要严格执行:
- redis、mysql、mongodb、zookeeper 等组件尽量均不要使用 root 用户启动,而是添加相应的独立用户启动
- 所有组件均不要使用默认端口,以降低其本身具有漏洞被攻击的可能
- 各组件一定要设置独立的高级别密码
5.2. redis 禁用危险指令
reids 规避危险指令