基于 centos7 安全加固
背景
去年买了台云主机玩玩,一开始以为网络安全这个领域对我来说还太远了,黑客根本不可能攻击我的主机,但是没过多久我的主机就被黑客无情攻击了,直到收到一条云主机服务商发的短信告诉我主机被植入了挖矿程序,一脸懵逼的我以为杀掉这个挖矿进程,然后再删掉这个挖矿程序文件就可以了,结果现实打脸的比较快,不到5分钟,挖矿程序再次启动,cpu 继续打满 100%,被删掉的挖矿程序文件再次出现在同样的目录,之后也排查过 crontab 定时任务,也没发现什么问题,最终通过请教大神,把挖矿文件内容清空,然后通过 chattr +i 命令给这个文件加锁,之后这个挖矿程序就再也没有启动了。我以为这个问题解决了,但事实上之后 nginx 总是会莫名其妙的被杀掉,这时候让我对 Linux 系统安全引起了重视和兴趣,我决定把 Linux 系统安全加入到我的学习计划中,通过总结和请教,写下了这篇 linux 安全加固方案。
分析
上面说到我的主机被攻击,通过事后分析,我也总结了几点原因:
1.端口开放比较随意,redis、zookeeper、tomcat都是使用默认的端口,而且入方向规则是所有地址均可访问。
2.开放了 root 远程登录的权限。
3.使用 sshd V1 版本的协议(推荐使用 V2 版本,因为 V1 有bug)。
其实我的主机问题包括但不限于以上问题,列出来的是比较低级的问题。
方案
1.创建用于登录的用户 admin
因为接下来我们要将 root 远程登录权限给卸掉,但有时又需要使用 root 权限,这时候就应该用一个低权限普通账户登录,然后再 su root 来使用,所以先创建一个 admin 的普通用户,并将其添加至 wheel 组。
[root@kilobytech ~]$ useradd admin -g wheel
[root@kilobytech ~]$ passwd admin 回车下一步
输入密码******回车确认
再次输入密码******回车确认
2.限制 su 命令使用的条件
[root@kilobytech ~]$ vim /etc/pam.d/su
添加下面两行,其中 auth 后面是两个 tab 键,sufficient 和 required 后面是一个 tab 键
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
限定非 wheel 组内用户不得使用 su 命令
[root@kilobytech ~]$ vim /etc/login.defs
在文件末尾添加 SU_WHEEL_ONLY yes 保存文件,这一步是为了配置只允许特定的 wheel 组内用户 su 到 root。
SU_WHEEL_ONLY yes
3.配置 sshd 服务安全加固
[root@kilobytech ~]$ vim /etc/ssh/sshd_config
修改以下配置项
# 禁止 root 远程登陆,若需要使用 root 权限,必须使用低权限普通账户登录主机后 su 切换到 root
PermitRootLogin no
# ssh 修改默认的登陆端口 22,记得需要在安全组规则里配置修改后端口入方向权限,并删除原 22 端口的规则
Port 7722
# 禁止空密码登录
PermitEmptyPasswords no
# 允许三次尝试
MaxAuthTries 3
# 在20秒内不能完成登录,则断开连接
LoginGraceTime 20
# 600秒后无动作就自动断开连接
ClientAliveInterval 600
# 闲置会话最多3个
ClientAliveCountMax 3
# 确保SSH LogLevel设置为INFO,记录登录和注销活动
LogLevel INFO
# SSHD强制使用V2安全协议
Protocol 2
# 重启 ssh 服务
[root@kilobytech ~]$ systemctl restart sshd.service
4.调整和关闭非必须的服务
# 关闭 postfix 服务。如无必要,禁止该服务。
[root@kilobytech ~]$ systemctl disable postfix
# 服务器禁 ping
[root@kilobytech ~]$ vim /etc/sysctl.conf
在最后一行追加 net.ipv4.icmp_echo_ignore_all = 1
# 执行命令 (配置文件才能生效):sysctl -p
[root@kilobytech ~]$ sysctl -p
5.将进程的内存空间地址随机化
# 增大入侵者预测目的地址难度,从而降低进程被成功入侵的风险
[root@kilobytech ~]$ sysctl -w kernel.randomize_va_space=2
6.修改历史命令保留数目为 5
[root@kilobytech ~]$ sed -i 's/^HISTSIZE=1000/HISTSIZE=5/' /etc/profile
# 当然也可以追加一个好看的日志输出格式变量
[root@kilobytech ~]$ export HISTTIMEFORMAT="%F %T"
[root@kilobytech ~]$ source /etc/profile
7.安装检测工具 chkrootkit 和 rkhunter
chkrootkit 安装&使用
[root@kilobytech ~]$ yum install -y gcc
[root@kilobytech ~]$ yum install -y gcc-c++
[root@kilobytech ~]$ yum install -y make
[root@kilobytech ~]$ yum install -y glibc-static
[root@kilobytech ~]$ mkdir /usr/local/etc/chrootkit
[root@kilobytech ~]$ cd /usr/local/etc/chrootkit/
[root@kilobytech ~]$ wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
[root@kilobytech ~]$ tar zxvf chkrootkit.tar.gz
[root@kilobytech ~]$ cd chkrootkit-0.53/
[root@kilobytech ~]$ make sense #编译
[root@kilobytech ~]$ ./chkrootkit #检测命令,若出现INFECTED那就要小心了(./chkrootkit | grep INFECTED)
chkrootkit 在检查 rootkit 的过程中使用了部分系统命令,因此,如果服务器被黑客入侵,那么依赖的系统命令可能也已经被入侵者替换,此时 chkrootkit 的检测结果将变得完全不可信。为了避免 chkrootkit 的这个问题,可以在服务器对外开放前,事先将 chkrootkit 使用的系统命令进行备份,在需要的时候使用备份的原始系统命令让 chkrootkit 对 rootkit 进行检测。这个过程可以通过下面的操作实现:
[root@kilobytech ~]$ mkdir /usr/share/.commands
[root@kilobytech ~]$ cp `which --skip-alias awk cut echo find egrep id head ls netstat ps strings sed uname` /usr/share/.commands
# 使用备份过的命令来检测
[root@kilobytech ~]$ /usr/local/etc/chrootkit/chkrootkit-0.53/chkrootkit -p /usr/share/.commands/ | grep INFECTED
[root@kilobytech ~]$ cd /usr/share/
# 打压缩包备份命令更稳妥
[root@kilobytech ~]$ tar zcvf commands.tar.gz .commands
rkhunter 安装&使用
# 官网下载 https://sourceforge.net/projects/rkhunter/files/
[root@kilobytech ~]$ mkdir /usr/local/etc/rkhunter/
# 把文件下载到 /usr/local/etc/rkhunter/
# 解压
[root@kilobytech ~]$ tar xfz rkhunter-1.4.6.tar.gz
# 安装
[root@kilobytech ~]$ cd /usr/local/etc/rkhunter/rkhunter-1.4.6
[root@kilobytech ~]$ ./installer.sh --layout default --install
# 开始检测
[root@kilobytech ~]$ rkhunter -c
# 检测结果绿色的代表安全,红色的需要引起注意
最后,对所有重要文件进行锁定,不解锁的情况下 root 都无法删除修改
[root@kilobytech ~]$ chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab /etc/pam.d/su /etc/sudoers /etc/login.defs /etc/ssh/sshd_config /usr/share/commands.tar.gz