Linux安全加固
Linux安全加固文章目录Linux安全加固账号和口令sudo安全环境变量sysctl认证授权SSH服务安全SSH加固安全登陆安全验证登录后PAM配置at和crontab文件文件权限标准审计auditrsyslogjournald应用本文规定了LINUX操作系统主机应当遵循的操作系统安全性设置标准,本文档旨在指导系统管理人员或安全检查人员进行LINUX 操作系统的安全合规性检查和配置。账号和口令1
Linux安全加固
文章目录
本文规定了LINUX操作系统主机应当遵循的操作系统安全性设置标准,本文档旨在指导系统管理人员或安全检查人员进行LINUX 操作系统的安全合规性检查和配置。
账号和口令
1.应用账户禁止拥有登录系统权限
2.设置锁定在指定时间内不活跃的用户
验证命令:useradd -D | grep INACTIVE
加固命令:useradd -D -f 30
3.设置已有用户锁定规则
验证命令:
cat /etc/shadow | awk -F":" '{if(($2!="*") && ($2!="!!") && ($2!="!*") && ($7>30 || $7=="")) print $1}' | sort // 检查哪些用户未设置锁定规则
加固命令:chage --inactive 30 用户名称
4.设置已有用户的修改口令的最小时间间隔
验证命令:
egrep ^[^:]+:[^\!*] /etc/shadow 2>/dev/null | awk -F: '(($4 < 1)&&($2!~/^[*!]/)) { print $1 }' | sort
加固命令:chage --mindays 7 用户名称
5.设置已有用户口令的过期时间
验证命令:
egrep ^[^:]+:[^\!*] /etc/shadow 2>/dev/null | awk -F: '(($5 < 0 || $5 > 365)&&($2!~/^[*!]/)) { print $1 }' | sort
加固命令:chage -d
date+%G-%m-%d--maxdays 90 用户名称
sudo安全
加固操作:vi /etc/sudoers
1.设置sudo日志
Defaults logfile=/var/log/sudo.log //如果不存在sudo.log文件需要创建,并修改权限为400
2.设置sudo认证超时时间
Defaults passwd_timeout = 1 //参数值从SUDO_PASSWD_TIMEOUT获取
3.启用targetpw
Defaults targetpw //允许sudo询问root密码
4.在/etc/sudoers中,禁止出现高危风险命令
测试方法
1、打开产品环境所有主机上的/etc/sudoers文件,检查其中是否存在su、sudo、chmod、chown、chgrp、useradd、userdel、groupadd、groupdel、kill、shutdown、init、reboot、halt、poweroff、passwd、mkfs、ifconfig、ethtool、route、sh、bash、ksh、csh、crontab、sysctl、find、logrotate、vi、more、less、man、dc、ed、date、ip、 zip、 awk、tar、cat、view、head、tail、grep、egrep、fgrep、stty、/etc/init.d/、/usr/sbin/rc、rm、sed、dos2unix、scp、cp、mv、gzip、unzip、gunzip、killall、pkill、chkconfig、mount、rpm、unmount、fdisk、python、modprobe、insmod等高危命令; 2、检查/etc/sudoers中是否配置实际影响为高危的命令,例如vi /etc/passwd,或者是否存在使用脚本实现类似功能的高危命令。
验收标准
1、/etc/sudoers文件不存在测试方法中提到的高危命令,对于一些业务上需要的高风险命令使用sudo时必须限制其命令参数,即在配置/etc/sudoers时必须将命令参数(如需要操作的具体文件名、路径、用户名)带上; 2、/etc/sudoers文件中不存在实际影响为高危的命令,不存在使用脚本实现类似功能的高危命令。
环境变量
加固操作:vi /etc/profile ,修改配置后需要运行source /etc/profile
使配置生效
1.终端自动注销(会话超时)
export TMOUT=900 //增加或修改
2.配置关闭上下键查询操作
export HISTSIZE=0
sysctl
加固操作:vi /etc/sysctl
1.启用启用TCP_SYNCookie
net.ipv4.tcp_syncookies=1
使配置生效
/sbin/sysctl -w net.ipv4.tcp_syncookies=1
/sbin/sysctl -w net.ipv4.route.flush=1
2.启用源路由验证
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
使配置生效
/sbin/sysctl -w net.ipv4.conf.all.rp_filter=1
/sbin/sysctl -w net.ipv4.conf.default.rp_filter=1
/sbin/sysctl -w net.ipv4.route.flush=1
3.设置忽略无用的错误消息数据包
net.ipv4.icmp_ignore_bogus_error_responses=1
使配置生效
/sbin/sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
/sbin/sysctl -w net.ipv4.route.flush=1
4.设置禁止从默认网关接受ICMP重定向包
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
使配置生效
/sbin/sysctl -w net.ipv4.conf.all.secure_redirects=0
/sbin/sysctl -w net.ipv4.conf.default.secure_redirects=0
/sbin/sysctl -w net.ipv4.route.flush=1
5.设置记录可疑数据包
net.ipv4.conf.all.log_martians=1
net.ipv4.conf.default.log_martians=1
使配置生效
/sbin/sysctl -w net.ipv4.conf.all.log_martians=1
/sbin/sysctl -w net.ipv4.conf.default.log_martians=1
/sbin/sysctl -w net.ipv4.route.flush=1
6.设置忽略广播请求
net.ipv4.icmp_echo_ignore_broadcasts=1
使配置生效
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
/sbin/sysctl -w net.ipv4.route.flush=1
7.设置禁止转发ICMP重定向包
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
使配置生效
sysctl -w net.ipv4.conf.default.send_redirects=0
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.route.flush=1
8.设置禁止接收源路由数据包
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
使配置生效
/sbin/sysctl -w net.ipv4.conf.all.accept_source_route=0
/sbin/sysctl -w net.ipv4.conf.default.accept_source_route=0
/sbin/sysctl -w net.ipv4.route.flush=1
9.设置禁止接收ICMP重定向包
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
使配置生效
/sbin/sysctl -w net.ipv4.conf.all.accept_redirects=0
/sbin/sysctl -w net.ipv4.conf.default.accept_redirects=0
/sbin/sysctl -w net.ipv4.route.flush=1
10.设置禁止IPv6接收重定向包
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
使配置生效
/sbin/sysctl -w net.ipv6.conf.all.accept_redirects=0
/sbin/sysctl -w net.ipv6.conf.default.accept_redirects=0
/sbin/sysctl -w net.ipv6.route.flush=1
11.设置禁止IPv6接收路由广播
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.accept_ra=0
使配置生效
/sbin/sysctl -w net.ipv6.conf.all.accept_ra=0
/sbin/sysctl -w net.ipv6.conf.default.accept_ra=0
/sbin/sysctl -w net.ipv6.route.flush=1
12.设置开启缓冲溢出保护
kernel.randomize_va_space = 2
使配置生效
/sbin/sysctl -w kernel.randomize_va_space=2
13.设置禁用IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
使配置生效
/sbin/sysctl -w net.ipv6.conf.all.disable_ipv6=1
/sbin/sysctl -w net.ipv6.conf.default.disable_ipv6=1
/sbin/sysctl -w net.ipv6.route.flush=1
认证授权
SSH服务安全
SSH加固
加固操作:vi /etc/ssh/sshd_config,修改配置文件后需要重启ssh服务生效service sshd restart
1.配置SSH版本协议为v2
Protocol 2
2.配置SSH监听地址
ListenAddress 加固机器IP
3.配置SSH日志
SyslogFacility AUTH
LogLevel VERBOSE //日志记录级别,默认为info
4.配置SSH加密算法
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
5.禁止用户通过SSH设置环境变量
PermitUserEnvironment no
1.ssh允许登录时加载/.ssh/environment和/.ssh/authorized_keys中设定的环境变量。
2.设置为yes可能导致用户使用环境变量LD_PRELOAD劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果。
安全登陆
6.配置SSH最大认证时长
LoginGraceTime 60
7.root用户禁止远程登录
检验命令:sshd -T |egrep 'protocol|permitrootlogin|permitemptypasswords|ciphers'
PermitRootLogin no #禁止了root从ssh登录
加固前需要确保有非root账户可以远程登录
8.禁用空口令登录
PermitEmptyPasswords no
9.配置SSH最大并行认证连接数
MaxStartups 10:5:20 //并行认证即ssh连接成功但未输入密码,默认10个,建议5个
10.配置SSH最大打开会话数
MaxSessions 10
11.配置防暴力破解
MaxAuthTries 3 //最大登录尝试次数为3
安全验证
12.配置禁用基于主机的认证方式
HostbasedAuthentication no
基于主机的验证是指已信任客户机上的任何用户都可以使用SSH连接。
13.配置忽略用户已知主机
规则描述:设置ssh在进行RhostsRSAAuthentication安全验证时忽略用户的“/$HOME/.ssh/known_hosts”文件
IgnoreUserKnownHosts yes
为避免DNS Hijack(域名劫持)攻击,SSH会将公钥记录在/$HOME/.ssh/known_hosts文件中,核对相同主机的公钥是否相同
14.配置验证时禁止使用"rhosts"和"shosts"文件
规则描述:禁止登录验证过的信任主机
IgnoreRhosts yes
.rhosts文件和.shosts文件用于记录可以访问远程计算机的计算机名及关联的登录名
登录后
15.配置SSH登录告警
检查命令:grep "^Banner" /etc/ssh/sshd_config
Banner /etc/issue.net //默认issue文件为本地登录告警文件,issue.net为远程登录告警文件,none代表禁用这个特性
16.禁止告警标志中包含系统相关信息
加固操作:编辑/etc/motd、/etc/issue、/etc/issue.net文件,将文件里包含\m, \r, \s 或\v的内容删除掉
for FILE in /etc/motd /etc/issue /etc/issue.net ; do
sed -i 's/\\v//g' $FILE
sed -i 's/\\r//g' $FILE
sed -i 's/\\m//g' $FILE
sed -i 's/\\s//g' $FILE
done
17.配置SSH空闲超时退出
ClientAliveInterval 300 //客户端300秒内没有响应就判断为超时
ClientAliveCountMax 0 //允许超时的次数
PAM配置
1.配置口令安全策略
Vi /etc/login.defs
PASS_MAX_DAYS 90 #新建用户的密码最长使用天数不大于90(等保要求)
PASS_MIN_DAYS 10 #新建用户的密码最短使用天数为10
PASS_MIN_LEN 8 #密码最短长度为8
PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数为7(等保要求提前30天告知)
chage -M 30 账户
– 修改已存在账户的密码有效期为30
chage -d 0 账户
– 强制账户下次登录修改密码
2.用户口令复杂度策略管理
Vi /etc/pam.d/system-auth和password-auth
password requisite pamcracklib.so将其修改为password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-1 Icredit=-1 ucredit=-1 ocredit=-1 minlen=8 //至少包含一个数字、一个小写字母、一个大写字母、一个特殊字符、且密码长度>=8
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
auth required pam_faillock.so preauth audit deny=5 even_deny_root unlock_time=900
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=5 even_deny_root unlock_time=900
auth sufficient pam_faillock.so authsucc audit deny=5 even_deny_root unlock_time=900
3.禁止存在空口令账户
检验命令:cat /etc/shadow | awk -F: '($2 == "")'
4.禁止除root外UID为0的用户
检验命令:cat/etc/passwd | awk -F: '($3 == 0 ){ print $1 }'
3.限制用户su到root
Vi /etc/pam./su
添加下面两行
auth sufficient pam_rootok.so
auth required pam_wheel.so group=admin //只允许admin组中用户su到root
4.配置用户su时重置PATH环境变量
vi /etc/login.defs 增加
ALWAYS_SET_PATH=yes
5.设置用户登录失败N次锁定
Vi /etc/pam.d/sshd
auth required pam_tally2.so deny=3 unlock_time=120 even _deny_root root_unlock_time=60
at和crontab
1.只允许root用户使用at
-
删除at.deny文件:
rm -f /etc/at.deny
-
新建at.allow文件并修改权限和属组
touch /etc/at.allow
chmod 700 /etc/at.allow
chown root:root /etc/at.allow
-
设置内容:
echo "root" > /etc/at.allow
2.只允许root用户使用crontab
-
删除cron.deny文件:rm -f /etc/cron.deny
-
新建cron.allow文件并修改权限和属组:
touch /etc/cron.allow
chmod 700 /etc/cron.allow
chown root:root /etc/cron.allow
-
设置内容:echo “root” > /etc/cron.allow
3.统一修改计划任务目录的权限为700、属主/属组为root
chown root:root (/etc/cron.d | /etc/cron.monthly | /etc/weekly | /etc/cron.daily | /etc/cron.hourly | /etc/crontab)
chmod 700 (/etc/cron.d | /etc/cron.monthly | /etc/weekly | /etc/cron.daily | /etc/cron.hourly | /etc/crontab)
文件
1.设置umask>=027
检查命令: umask
修改shell umask值(临时) [root@agan~]# umask 027
修改shell umask值(永久)
编辑/etc/profile、/etc/bashrc、/etc/login.defs、/etc/csh.cshrc、/etc/csh.login、/etc/profile.d/history.sh文件,在文件末尾添加:umask 027(027为UMASK参数配置的值,其中/etc/login.defs需要设置为UMASK 027)
2.配置重要目录或文件权限
chmod 600 /etc/xinetd.conf
chmod 644 /etc/group
chmod 400 /etc/shadow
chmod 644 /etc/services
chmod 600 /etc/security
chmod 644 /etc/passwd
chmod 750 /etc/rc6.d
chmod 750 /tmp
chmod 750 /etc/rc0.d/
chmod 750 /etc/rc1.d/
chmod 750 /etc/rc2.d/
chmod 750 /etc/ -----设置影响gnome桌面自启动,系统重启时无法自启动gnome桌面。故使用gnome图形化的系统不设置该项。
chmod 750 /etc/rc4.d
chmod 750 /etc/rc5.d/
chmod 750 /etc/rc3.d
chmod 750 /etc/rc.d/init.d/
如果/etc/grub.conf文件存在,且非链接文件,则执行chmod 600 /etc/grub.conf;
如果/boot/grub/grub.conf文件存在,则执行chmod 600 /boot/grub/grub.conf;
如果/etc/lilo.conf文件存在,则执行chmod 600 /etc/lilo.conf。
检查语句:
stat -c %a /etc/passwd
3.修改扫描出的证书私钥文件权限为600
/etc/pki/ca-trast/extracted/openssl/ca-bundle.trust.crt
/etc/pki/ca-truct/extracted/pem/email-ca-bundle.pem
/etc/pki/ca-truct/extracted/pem/objsign-ca-bundle.pem
/etc/pki/ca-truct/extracted/pem/tls-ca-bundle.pem
/usr/lib/python2.7/site-packages/pip-7.1.2-py2.7.egg/pip/_vendor/requests/cacert.pem
/usr/lib/python2.7/site-packages/requests/cacert.pem
usr/local/hostguard/conf/user.key
4.配置引导程序配置文件的权限和属主
对于X86架构执行:
chmod og-rwx /boot/grub2/grub.cfg
(如果命令不生效,就用chmod 700 /boot/grub2/grub.cfg
)
chown root:root /boot/grub2/grub.cfg
对于ARM架构执行:
chmod og-rwx /boot/efi/EFI/euleros/grub.cfg
chown root:root /boot/efi/EFI/euleros/grub.cfg
5.全量检查敏感文件权限
全量验证命令:
find / -perm -004 -regex '.*\.conf\|.*\.cnf\|.*\.cfg\|.*\.config\|.*\.xml\|.*\.properties\|.*\.yaml\|.*\.yml\|.*\.json\|.*\.sql\|.*\.ini\|.*\.key\|.*\.pem\|.*\.crt\|.*\.cacert\|.*\.log' -type f|xargs ls -l
6.禁止存在无属主文件
全量校验命令: find / -nouser
7.删除空链接
检验命令:df -l | awk '{if (NR!=1) print $6}' | xargs -I '{}' find -L '{}' -xdev -type l 2>/dev/null
/run/udev目录下的文件是系统启动时产生的文件,非持久化文件,每次系统启动都会有不同的空链接文件产生,不需要删除;
其他目录下的文件使用下面的命令删除;
8.配置日志文件权限
检验命令:
find -L /var/log -type d -perm /077 -exec chmod go-rwx {} \; 2>/dev/null
find -L /var/log -type f -perm /177 -exec chmod u-x,go-rwx {} \; 2>/dev/null
加固操作:
-
编辑/etc/logrotate.conf文件设置create参数值为0600
-
编辑/etc/logrotate.d目录下所有文件设置create参数值为0600
chmod 700 /etc/logrotate.d
chmod 600 /etc/logrotate.d/*
文件权限标准
检查系统涉及到的目录和文件是否按“如下”列中的要求分配最小的权限:
系统涉及到的目录和文件(包括运行过程中产生的临时目录和临时文件)只能分配最小的权限。
实施指导:
以 Unix Linux系统为例,文件权限建议如下(系统可以参考,再做相应的权限设置):
用户主目录750(rwxr-x---)
程序文件(含脚本文件、库文件等)550(r-x-x--)
程序文件目录550(r-xr-x---)
配置文件640(rw-r-----)
配置文件目录750(rwxr-x---)
日志文件(记录完毕或者已经归档)440(r--r-----)
日志文件(正在记录)640(rw-r-----)
日志文件目录750(rwxr-x---)
Debug文件640(rw-r-----)
Debug文件目录750(rwxr-x---)
临时文件目录750(rwxr-x---)
维护升级文件目录770(rwxrwx--)
业务数据文件640(rw-r-----)
业务数据文件目录750(rwxr-x---)
密钥组件、私钥、证书、密文文件目录700(rwx------)
密钥组件、私钥、证书、加密密文600(rw-------)
加解密接口、加解密脚本500(r-x-----)
审计audit
加固操作:vi /etc/audit/rules.d/cis.rules,修改审计规则后需要执行augenrules –load
加载策略;
1.配置审计系统登录、登出事件
-w /var/log/lastlog -p wa -k logins
-w /var/run/faillock/ -p wa -k logins
-w /var/log/faillog -p wa -k logins
-w /var/log/tallylog -p wa -k logins
-w /var/log/wtmp -p wa -k logins
-w /var/log/btmp -p wa -k logins
2.配置审计自主访问控制权限修改事件
-a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod
rsyslog
1.检查rsyslog远程日志接收状态(仅在日志主机上进行)
-
编辑/etc/rsyslog.d/remote.conf文件,取消以下两行注释:
$ModLoad imtcp $InputTCPServerRun 514 //(514可能为其他值)
2.配置日志文件默认权限为0600
加固操作:vi /etc/rsyslog.conf
$FileCreateMode 0600
journald
加固操作:vi /etc/systemd/journald.conf
2.配置journald将日志发送到rsyslog
ForwardToSyslog=yes
3.配置压缩大型日志文件
Compress=yes
4.配置将日志文件写入永久磁盘
Storage=persistent
应用
1.非必要禁止使用root用户
基线要求: 运行软件程序的帐号不是操作系统最高权限的帐号,不是超级管理员权限组成员,不具备超级管理员权限组的默认权限,且是一个分配最小权限(只分配了必须的权限)的操作系统帐号。
后台输入命令:ps -ef|grep root
说明
1)基于业务需要必须使用root账户运行的管理面进程(如运维管理进程),应最小化使用root权限,可以选择如:进程拆分、Capability等技术进行最小化限制
2)因第三方系统限制(如: VxWorks、 VMware ESXi)产品进程和服务只能使用Root运行,可例外
影响: 使用root等特权账号运行程序时,如果程序遭到入侵攻击,攻击者可以利用该程序的高级运行权限来对整个系统造成危害。产品所有对外提供服务、能够被远程访问的进程(如web服务、数据库、 ftpserver)禁止使用“root”、“administrator”、“supervisor”等特权账号或高级别权限账号运行.
2.禁止全网监听
验证命令:
netstat -apn|awk '{if($5~/0.0.0.0|:::/) print $0}'|/tmp/scan_99169/script/cmd/egrep -v '::1:|127.0.0.1'
服务端产品绑定0.0.0.0 IP地址不能造成本机上的隔离机制被破坏,否则应禁止对0.0.0.0 IP地址的绑定(客户端不作要求),不同平面应绑定独立的ip地址。由于绑定0.0.0.0就相当于绑定本机所有IP,即造成全网监听,如果本机上存在管理面、控制面、用户面划分,则会破坏系统原有的隔离原则(如三面隔离)。
3.清除系统残留工具
后台输入命令:
find / -name 'tcpdump' -o -name 'gdb' -o -name 'strace' -o -name 'readelf' -o -name 'cpp' -o -name 'gcc' -o -name 'netcat' -o -name 'nc' -o -name 'nmap' -o -name 'ethereal' -o -name 'objdump' -o -name 'aplay' -o -name 'arecord' -o -name 'vnstat' -o -name 'vnStatsvg' -o -name 'nload' -o -name 'atop' -o -name 'iftop'
个系统造成危害。产品所有对外提供服务、能够被远程访问的进程(如web服务、数据库、 ftpserver)禁止使用“root”、“administrator”、“supervisor”等特权账号或高级别权限账号运行.
2.禁止全网监听
验证命令:
netstat -apn|awk '{if($5~/0.0.0.0|:::/) print $0}'|/tmp/scan_99169/script/cmd/egrep -v '::1:|127.0.0.1'
服务端产品绑定0.0.0.0 IP地址不能造成本机上的隔离机制被破坏,否则应禁止对0.0.0.0 IP地址的绑定(客户端不作要求),不同平面应绑定独立的ip地址。由于绑定0.0.0.0就相当于绑定本机所有IP,即造成全网监听,如果本机上存在管理面、控制面、用户面划分,则会破坏系统原有的隔离原则(如三面隔离)。
3.清除系统残留工具
后台输入命令:
find / -name 'tcpdump' -o -name 'gdb' -o -name 'strace' -o -name 'readelf' -o -name 'cpp' -o -name 'gcc' -o -name 'netcat' -o -name 'nc' -o -name 'nmap' -o -name 'ethereal' -o -name 'objdump' -o -name 'aplay' -o -name 'arecord' -o -name 'vnstat' -o -name 'vnStatsvg' -o -name 'nload' -o -name 'atop' -o -name 'iftop'
更多推荐
所有评论(0)