16、Linux安全加固
Linux安全加固
安全加固思路
账户安全 -> 密码策略 -> 当前开放的服务是否存在高危服务 -> 排查当前的系统中是否存在内核漏洞 -> 排查主机所在信息系统所对应的管理制度是否恰当。
所有修改均需要root账号下,修改前务必先备份,备份命名建议使⽤"⽂件名.日期.bak或⽂件名.bak"
1、账号和口令
①禁用或删除无用账号
#目的:减少系统无用账号,降低安全风险。
操作步骤:
使用命令 userdel <用户名> 删除不必要的账号。
使用命令 passwd -l <用户名> 锁定不必要的账号。
使用命令 passwd -u <用户名> 解锁必要的账号。
②检查特殊账号
#目的:检查是否存在空口令和root权限的账号。确认UID为零的账号只有root账号。
操作步骤:
查看空口令和root权限账号,确认是否存在异常账号:
使用命令 awk -F: '($2=="")' /etc/shadow 查看空口令账号。
使用命令 awk -F: '($3==0)' /etc/passwd 查看UID为零的账号。
加固空口令账号:
使用命令 passwd <用户名> 为空口令账号设定密码。
③添加口令策略
#目的:加强口令的复杂度等,降低被猜解的可能性。
1.使用命令 vim /etc/login.defs 修改密码策略配置文件。
操作步骤:
cp /etc/login.defs /etc/login.defs.bak
PASS_MAX_DAYS 90 #密码最大使用期限 --等保要求密码过期时间不能大于90天
PASS_MIN_DAYS 0 #密码最少使用天数 --多少天后可以更改密码,至少1天
PASS_MIN_LEN 5 #密码最小长度 --至少8位,且必须包含字母,数字和字符中每样至少一个
PASS_WARN_AGE 7 #密码到期前警告天数
以上密码周期修改需要重启系统才能⽣效,但不影响已创建的⽤户。
2.使用chage命令修改用户设置。
//例如,chage -m 0 -M 30 -E 2000-01-01 -W 7 <用户名>表示将此用户的密码最长使用天数设为30,最短使用天数设为0,密码2000年1月1日过期,过期前七天警告用户。
//设置连续输错三次密码,账号锁定五分钟。使用命令vim /etc/pam.d/common-auth修改配置文件,在配置文件中添加 auth required pam_tally.so onerr=fail deny=3 unlock_time=300。
命令解读:
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
vim /etc/pam.d/system-auth
password requisite pam_cracklib.so minlen=8 ucredit=-2 lcredit=-1 dcredit=-4 ocredit=-1 在pam_cracklib.so后⾯配置参数 如果原来就有配置,可以不⽤改
deny:允许输错密码次数
unlock_time:解锁时间,单位秒
account required pam_tally2.so deny=5 unlock_time=300
3.修改密码复杂度设置
Debian/Ubuntu:修改⽂件vim /etc/pam.d/common-password
CentOS/RedHat/Fedora:修改⽂件vim /etc/pam.d/system-auth
password '[tab]' requisite '[tab]' pam_cracklib.so difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1
说明:
# difok=3 允许的新、旧密码相同字符的个数为3
# minlen=8 最小长度为8
# ucredit=-1 限制新密码中最少有1个大写英文字符 负数表示最少,正数表示最多
# lcredit=-1 限制新密码中最少有1个小写英文字符
# dcredit=-1 限制新密码中最少有1个数字字符
# ocredit=-1 限制新密码中最少有1个标点字符
# 注:这个密码强度的设定只对普通用户有限制功能,root用户无论修改root的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功
④限制用户su
#目的:限制能su到root的用户。
操作步骤:
使用命令 vim /etc/pam.d/su修改配置文件,在配置文件中添加行。
例如,只允许test组用户su到root,则添加 auth required pam_wheel.so group=test。
⑤禁止root用户直接登录
#目的:限制root用户直接登录。
操作步骤:
创建普通权限账号并配置密码,防止无法远程登录。
使用命令 vim /etc/ssh/sshd_config修改配置文件将PermitRootLogin的值改成no,并保存,然后使用service sshd restart重启服务。
2、服务、端口
①关闭/禁用不必要的服务
#目的:关闭不必要的服务(如普通服务和xinetd服务),降低风险。
1.操作步骤:
使用命令 systemctl disable <服务名> 设置服务在开机时不自动启动。
说明:对于部分老版本的Linux操作系统(如CentOS 6),可以使用命令chkconfig --level <init级别> <服务名> off设置服务在指定init级别下开机时不自动启动。需要关闭的服务有 cups, telnet, vsftpd, rlogin, rsh, printer, sendmail, ypbind, kshell, lpd, ident, tftp, time, ntalk, bootps, chargen, nfs, daytime, nfslock,echo, discard, klogin chkconfig --list
2.关闭服务
redhat 6.x 版本:service vsftpd stop
redhat 8.x 版本:systemctl stop vsftpd
3.关闭开机启动
chkconfig vsftpd off
②SSH服务安全
#目的:对SSH服务进行安全加固,防止暴力破解成功。
操作步骤:
使用命令 vim /etc/ssh/sshd_config 编辑sshd服务端的配置文件。
1.不允许root账号直接登录系统:设置PermitRootLogin的值为no。//禁止root账户登录
2.修改SSH使用的协议版本:设置Protocol的版本为 2。
3.修改允许密码错误次数(默认6次):设置MaxAuthTries的值为 3。
4.配置文件修改完成后,重启sshd服务生效。
③黑白名单文件
远程登录方式必须使用密文传输,远程登录时不能使用默认管理员账户进行登录(如Linux系统的root,Windows系统的administrator)
SSH[密文-符合];Telnet[明文-不符合]
Liunx白名单文件:/etc/hosts.allow
Liunx黑名单文件:/etc/hosts.deny
相比于Linux的其他配置文件,改黑白名单文件可以即时生效。且白名单的优先级大于黑名单。
黑白名单添加格式:协议:地址
④关闭/禁用不必要的端口
1.需要禁⽤ 21 ftp 23 telnet 80:netstat -an | grep LISTEN
2.查看端⼝使⽤的PID:lsof -i:21
3.关闭对应的服务:service vsftpd stop
4.直接杀死进程:kill -9 pid
5.关闭512、513、514端⼝
systemctl stop rsh.socket # 514
systemctl stop rlogin.socket # 513
systemctl stop rexec.socket # 512
systemctl disable rsh.socket
systemctl disable rlogin.socket
systemctl disable rexec.socket
systemctl disable xinetd
systemctl stop xinetd
6.关闭53端⼝(DNS服务)
systemctl stop named.service
systemctl disable named.service
systemctl stop dnsmasq
systemctl disable dnsmasq
7.关闭25端⼝
systemctl disable postfix
systemctl stop postfix
gateway=`netstat -rn | grep 0.0.0.0 | awk '{ if($1=="0.0.0.0") {print $2} }'`
3、文件系统
①设置umask值
#目的:设置默认的umask值,增强安全性。
操作步骤:
使用命令 vim /etc/profile 修改配置文件,添加行 umask 027, 即新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限。
②设置登录超时
#目的:设置系统登录后,连接超时时间,增强安全性。
操作步骤:
使用命令 vim /etc/profile 修改配置文件,将以 TMOUT= 开头的行注释,设置为TMOUT=180,即超时时间为三分钟。
③三权分立
#目的:等保要求禁用默认账户和超级管理员账户,并设置三权分立账户
root超级管理员-->禁用
创建三权分⽴账户
useradd sysadmin(安全员--负责安全策略--sec)
useradd audadmin(系统管理员--系统配置--sys)
useradd secadmin(审计员--日志审查--audit)
设置密码:密码不得与⽤户名⼀样,需含⼤写字⺟,特殊符号,数字。(设置了密码,该账户才可正常登入)
passwd sysadmin
passwd audadmin
passwd secadmin
4、日志
①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用户除外)。同时,建议使用OSS服务收集存储日志。
③审计功能查询:
service rsyslog status
service auditd status
审计功能如果想要符合等保需求如下:
1.审计记录大于6个月
2.审计日志必须转发到日志服务器进行备份 [通过U盘进行备份也可以]
3.审计记录必须包含重要的参数(时间,用户,事件的成败)
4.审计功能要保证除了审计员以外的账户无法关闭
④查看⽇志记录是否开启,默认情况下系统开启了syslogd和audit服务,可通过以下⽅法查询:
ps -ef syslogd
ps -ef audit
5、内核漏洞
①系统漏洞
查看系统漏洞是否存在,如果有是否有修补,是否定期扫描(不需要人为排查)
工具:nessus漏洞扫描工具对内网主机进行扫描
②杀软
系统中是否存在可以杀毒和防止入侵(入侵检测)的软件
windows----火绒/360/腾讯电脑管家/瑞星
Linux------ClamAV【开源】
6、其他
1、查看内核版本
①[root@localhost ~]# cat /proc/version【CentOS7版本】
Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
②[root@localhost ~]# uname -a【CentOS7版本】
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
2、查看操作系统版本
lsb_release -a
cat /etc/issue
cat /etc/release
3、登录超时设置root下配置
cp /etc/profile /etc/profile.bak
vim /etc/profile
最后⾯添加⼀⾏TMOUT=600
4、⼿动锁定和解锁(passwd为小写参数)
usermod -L ⽤户名 锁定
usermod -U ⽤户名 解锁
5、限源访问
cp /etc/hosts.allow /etc/hosts.allow.bak
cp /etc/hosts.deny /etc/hosts.deny.bak
6、查看主机IP地址 ifconfig 只允许本⽹段访问
vim /etc/hosts.allow
sshd:192.168.1.0/24:allow
vim /etc/hosts.deny
sshd:all
7、等保测评Linux测评命令
①账户策略:
1.cat /etc/shadow查看口令,查看账户
2.cat /etc/ssh/ssh_config permitemptypasswords 注释或者后面加no 不允许空口令远程登录
3.cat /etc/pam.d/system-auth 查看密码复杂度
grep pam_cracklib.so模块查看,centos7之后是pam_pwquality.so模块。限制root用户,添加 enforce_for_root
4.cat /etc/login.defs 查看口令更换周期。修改vi /etc/login.defs设置仅影响创建用户,而不影响现有用户。
或chage -l 用户名 查看口令修改周期。
配置:chage -M 天数 用户名 —修改某用户的最大修改期限
chage -m 最小期限 -w 到期前提醒。
配置与passwd和shadow有冲突时,以passwd和shadow文件为准。
②登录策略:
5.cat /etc/pam.d/system-auth和/etc/pam.d/sshd 查看登录失败策略
在#%PAM-1.0下的前两行是否有auth required pam_tally2.so onerr=fail deny=6 unlock_time=300 even_deny_root root_unlock_time=300
注意:必须是头两行。登录失败配置详解
6.cat /etc/profile 查看登录超时是否自动退出
查看是否有TMOUT=300
注意:必须是TMOUT,不能是timeout,TIMEOUT等。 登录超时策略配置
7.service --status-all | grep sshd 查看是否采用ssh加密方式管理
centos7可用systemctl --type=service | grep sshd命令
8.netstat -an | grep 22 查看ssh服务对应端口是否打开
9.ps -e | grep sshd 查看是否开启ssh服务
10.systemctl is-enabled telnet.socket查看telnet服务是否可用
11.ls -l /etc/passwd,查看文件的权限值
12. id 0查看uid=0的用户有哪些
13. ps -ef | grep java 查看中间件运行用户,非root用户运行
14. cat /etc/ssh/sshd_config 是否允许root远程登录;文件中的permitrootloginno 表示不允许root账户远程登录
15. systemctl status rsyslog.service查看服务是否开启
16. cat /etc/audit/audit.rules对passwd等文件地读写执行产生审计日志。
③配置策略:
17. cat /etc/rsyslog.conf,是否成功指向日志服务器。
18. cat /etc/redhat-release 查看Linux版本
19. uname -a 查看内核版本
20. systemctl list-unit-files命令列出所有可用单元。查看是否有多余组件和应用程序。
21. yum list installed 查看已安装的rpm包
22. netstat -antpl | grep LISTEN 查看有无多余端口
23. cat /etc/hosts.at llow /etc/hosts.deny 是否合理限制访问地址 配置策略