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 -ddate+%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' 
Logo

更多推荐