浅谈Linux主机加固
前言
Linux系统被应用于大部分企业的服务器上,因此在等保测评中主机加固也是必须要完成的一项环节。Linux的主机加固主要分为:账号安全、认证授权、协议安全、审计安全。简而言之,就是4A(统一安全管理平台解决方案),这里使用CentOS虚拟机进行演示。
账户安全
口令生存周期
cat /etc/login.defs
此处对密码的长度、时间、过期警告进行修改,如果修改设置有最小长度也要修改(PASS_MIN_LEN 8 #密码最小长度)
PASS_MAX_DAYS 90 #密码最长过期天数
PASS_MIN_DAYS 10 #密码最小过期天数
PASS_WARN_AGE 7 #密码过期警告天数
口令复杂度(很重要)
- /etc/login.defs:只控制了账号密码的有效期和最小长度。修改完/etc/login.defs文件后,会立即生效,但是它只对修改后创建的用户生效。
- pam_cracklib.so:该模块实现了账户密码的复杂度控制。早期用的是pam_cracklib.so模块,后来改成用pam_pwquality.so了,该模块完全兼容旧的pam_cracklib.so模块。该模块对应的配置文件路径在/etc/pam.d/目录下。
可执行【man pam_cracklib】命令,查看pam_cracklib的相关控制参数说明:
minlen=N #新密码最小长度
difok=3 #允许的新、旧密码存在相同字符的个数,默认为5。
dcredit=-3 #新密码中至少包含3个数字
lcredit=-3 #新密码中至少包含3个小写字母
ucredit=-1 #新密码中至少包含1个大写字母
ocredit=-1 #新密码中至少包含1个其他符合
通常会在下面4个文件中配置策略:
/etc/pam.d/system-auth:全局限制,会对所有登录方式做限制
/etc/pam.d/login:只对本地终端用户登录做限制
/etc/pam.d/remote:只对远程telnet做限制
/etc/pam.d/sshd:只对ssh登录做限制
根据不同的登录方式修改相应的文件即可,控制参数都是一样的
#找到包含pam_pwquality.so模块的行,将原有行注释并修改为如下的新配置(要放在文件的第二行,也就是在#%PAM-1.0下面的一行,否则可能会不起作用)
修改为:
password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minlen=8
(至少包含一个数字、一个小写字母、一个大写字母、一个特殊字符、且密码长度>=8)
版本信息
cat /proc/version
限制XX用户登陆
vim /etc/hosts.deny
检查是否有其他UID=0的用户
awk -F “:” '($3==0) {print $1} ' /etc/passwd
这里主要是用过查询passwd文件中第三列的值进行查看,如果存在UID=0的其他用户,将其删除或更改其权限
删除用户:userdel user
修改用户UID:usermod -u 2005 user
登陆超时限制
cp -p /etc/profile /etc/profile_bak(通过复制进行备份)
vim /etc/profile
这里有两种方法进行规则的添加
- 在
文件的最后增加/etc/profile
TMOUT=300
export TMOUT
- 通过命令添加
echo 'export TMOUT=300'>>/etc/profile
echo 'readonly TMOUT' >>/etc/profile
以上两种方法完成后都需要使用一下命令来使配置文件生效
source /etc/profile
检查是否使用PAM认证模块禁止wheel组之外的用户su为root
vim /etc/pam.d/su
新增
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
备注:auth与sufficient之间由两个tab建隔开,sufficient与动态库路径之间使用一个tab建隔开
禁用无用账户
cat /etc/passwd #查看口令文件,确认不必要的账号
passwd -l user # 锁定不必要的账号
账户锁定
vim /etc/pam.d/system-auth
在文件中修改或者添加
使用pam_tally.so模块限制登录失败锁定时间
auth required pam_tally.so onerr=fail deny=3 unlock_time=7200
AUTH选项
deny=n 失败登录次数超过n次后拒绝访问
lock_time=n 失败登录后锁定的时间(秒数)
unlock_time=n 超出失败登录次数限制后,解锁的时间
no_lock_time 不在日志文件/var/log/faillog 中记录.fail_locktime字段
magic_root root用户(uid=0)调用该模块时,计数器不会递增
even_deny_root root用户失败登录次数超过deny=n次后拒绝访问
root_unlock_time=n 与even_deny_root相对应的选项,如果配置该选项,则root用户在登录失败次数超出限制后被锁定指定时间
锁定账户举例
passwd -l bin
passwd -l sys
passwd -l adm
检查系统弱口令
这里的john是kail系统中的暴力破解工具
john /etc/shadow --single
john /etc/shadow --wordlist=pass.dic
若检查出弱口令使用以下命令来修改密码
passwd 用户
协议安全
openssh升级(按需进行升级)
yum update openssh
定时任务(防止病毒感染)
定时任务检查:
crontab -l
一次性任务检查:
at -l
我的本地环境未开启定时任务和一次性任务所以显示为空
限制ssh登陆(看是否需要)
Protocol 2 修改ssh使用的协议版本
限制su为root用户
vim /etc/pam.d/su
在头部添加 auth required /lib/security/pam_wheel.so group=wheel
禁止root用户登陆ftp
cat /etc/pam.d/vsftpd
Auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
其中file=/etc/vsftpd/ftpusers即为当前系统上的ftpusers文件.
echo “root” >> /etc/vsftpd/ftpusersv
root商户登陆ftp后可以下载一些系统内的敏感文件
防止flood攻击
vim /etc/sysctl.conf
增加net.ipv4.tcp_syncookies = 1
然后sysctl -p
禁用ping
echo 0 > /proc/sys/net/ipv4/icmp_echo_igore_all
检查异常进程
#检查cpu占用前10
ps aux | sort -k3nr | head -n 10
#检查内存占用前10
ps -aux | sort -k4nr|head -10
例如挖矿木马会占用大量CPU资源
杀死进程
kill 12345
强制杀死进程
kill -KILL 123456
发送SIGHUP信号,可以使用一下信号
kill -HUP pid
彻底杀死进程
kill -9 123456
关闭无效的服务及端口
比如邮箱
service postfix status
chkconfig --del postfix
chkconfig postfix off
比如cpus
service cups status
chkconfig --del cups
chkconfig cups off
一些端口存在的威胁详见:http://danielw.top/index.php/daniel/226/
设置防火墙策略
iptables(Centos6)
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用
- 基础命令
启动: service iptables start
关闭: service iptables stop
查看状态: iptables -V
重启 : service iptables restart
查看防火墙设置
主要分为5种规则类型数据包:
进行路由选择前处理数据包(PREROUTING);
处理流入的数据包(INPUT);
处理流出的数据包(OUTPUT);
处理转发的数据包(FORWARD);
进行路由选择后处理数据包(POSTROUTING)
使用命令查看防火墙设置
iptables -L
使用命令清除防火墙
iptables -F
- 设置防火墙策略
使用iptables命令进行添加删减
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
或者直接在路径/etc/sysconfig下,对文件iptables编辑。
配置完成记得重启防火墙命令
firewalled(Centos7)
- 基础命令
启动: systemctl start firewalld
重启: systemctl restart firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
前台可视化界面-防火墙设置也可以设置
开启SELinux服务(Centos7)
SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
简单概述下基本的三种安全访问控制类型
MAC(强制访问控制类型)
DAC(自主访问控制类型) --通常就是ACL策略居多
RABC(基于角色访问控制类型)
安全性MAC>RABC>DAC
- SELinux 有三种工作模式,分别是
- enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中,并且自动拦截
- permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中,只告警不拦截。一般为调试用。
- disabled:关闭 SELinux。不拦截不告警。
配置文件路径:/etc/selinux,通过查看config,了解目前运行状态
- 查看命令
cat config
或者使用命令进行查询
[root@localhost selinux]# getenforce
Enforcing
- 临时修改命令(不用重启机器):
[root@localhost selinux]# setenforce 0 --0设为宽容莫斯
[root@localhost selinux]# getenforce
Permissive
[root@localhost selinux]# setenforce 1 --1设为强制模式
[root@localhost selinux]# getenforce
Enforcing
[root@localhost selinux]#
设置历史记录数量
cp /etc/profile /etc/profile_xu_bak(备份)
sed -i s/'HISTSIZE=1000'/'HISTSIZE=5000'/g /etc/profile(修改)
cat /etc/profile |grep HISTSIZE|grep -v export(检查)
认证权限
配置用户最小权限
chmod 644 /etc/passwd
chmod 400 /etc/shadow
chmod 644 /etc/group
文件与目录缺省权限控制
cp /etc/profile /etc/profile.bak(备份)
vim /etc/profile
umask 027
umask是表示反码的意思,而022是代表你在建文件时候,系统自动用777去跟022相减得到750,你的文件就是750的权限,显示出来就是rxwr-x---(所有者全部权限,属组读写,其它人无)
使修改后的文件生效
source /etc/profile
日志审计
syslogd日志
启用日志功能,并配置日志记录。
操作步骤
Linux系统默认启用以下类型日志:
- 系统日志(默认)/var/log/messages
- cron日志(默认)/var/log/cron
- 安全日志(默认)/var/log/secure
注意:部分系统可能使用syslog-ng日志,配置文件为:/etc/syslog-ng/syslog-ng.conf
根据需求配置详细日志
记录所有用户的登录和操作日志
通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查。
操作步骤
-
运行
[root@xxx /]# vim /etc/profile
打开配置文件。 -
在配置文件中输入以下内容:
history USER=
whoami
USER_IP=who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'
if [ "$USER_IP" = "" ]; then USER_IP=hostname
fi if [ ! -d /var/log/history ]; then mkdir /var/log/history chmod 777 /var/log/history fi if [ ! -d /var/log/history/${LOGNAME} ]; then mkdir /var/log/history/${LOGNAME} chmod 300 /var/log/history/${LOGNAME} fi export HISTSIZE=4096 DT=date +"%Y%m%d_%H:%M:%S"
export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT" chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null -
运行
[root@xxx /]# source /etc/profile
加载配置生效。注意: /var/log/history 是记录日志的存放位置,可以自定义
通过上述步骤,可以在 /var/log/history 目录下以每个用户为名新建一个文件夹,每次用户退出后都会产生以用户名、登录IP、时间的日志文件,包含此用户本次的所有操作(root用户除外)
Linux中日志管理有两种服务(syslogd、rsyslogd),不同版本采用不同服务,详细内容将有独立文档进行介绍
Comments NOTHING