Linux加固概述
网络安全法:颁布时间2016年11月7日,实施时间2017年6月1日
等保2.0:2019年12月1号开始实施。
- GB/T 25058:信息安全技术信息系统安全等级保护实施指南
- GB/T 22240:信息安全技术信息系统安全等级保护定级指南
- GB/T 22239:信息安全技术网络安全等级保护基本要求
- GB/T 25070:信息安全技术网络安全等级保护安全设计技术要求
- GB/T 28449:信息安全技术网络安全等级保护评测过程指南
安全加固方向
- 版本升级
对于系统和应用在使用过程中暴露的安全缺陷,系统或应用厂商会及时发
布解决问题的升级补丁包。升级系统或应用版本,可有效解决旧版本存在
的安全风险。 - 关闭端口服务
在不影响业务系统正常运行情况下,停止或禁用承载业务无关的服务和服
务端口,可有效避免无关服务造成的安全风险。 - 修改配置项
操作系统、安全设备、数据库、中间件、第三方应用和业务系统可更改的
配置中与安全相关的设置参数等信息,通过修改安全配置,可以为网络和
应用提供必要的安全保护。 - 修改代码(可选)
修改代码一般由系统开发商完成,安全加固支持方仅提供加固建议及加固
有效性验证。 - 主机和网络ACL策略
主机和网络ACL策略是一类临时安全加固方法。ACL通常应用在系统的流
量控制上,可通过实施ACL,有效的部署网络出/入口策略,控制对内网资
源的访问能力,来保障资源安全性 - 部署设备防护(可选)
部署设备防护的安全加固方式一般由设备厂商完成。
安全加固流程
- 回退测试
运维人员、厂商、第三代维方完成
系统及数据备份、回退操作验证 - 业务测试
运维人员、厂商、第三方代维配合完成
利用现网环境或搭建虚拟环境进行业务测试,确认加固是否影响业务 - 有效性测试
由安全加固实施工程师完成
利用现网环境或搭建虚拟环境进行安全风险测试,确认加固有效性
Linux加固实例
账号管理与认证授权
使用加密的远程管理ssh
目的:使用安全套接字层加密传输信息,避免被侦听敏感信息。
注意:有的应用服务需要连接ssh,默认使用22端口,因此有风险。
实施方法:
- 安装ssh软件
www.openssh.com下载 - 修改配置文件
vi /etc/ssh/sshd_config
修改配置文件 - 禁止root登录,修改默认端口,开启v2版本
PermitRootLogin no
Port 20202
Protocol 2
- 重启服务
systemctl restart sshd
为不同的管理员分配不同的帐号
目的:根据不同用途设置不同帐号,提高安全层级。
实施方法:
- 创建多用途帐号
useradd username
passwd username
- 修改目录权限
chmod 750directory
chown username:groupname directory
- 普通帐号使用特定授权命令,修改sudo的提权应用
visudo
命令可以配置哪些帐号可以使用sudo做什么事。该命令用于编辑/etc/sudoers。
例如:
zhangwei ALL=/usr/sbin/useradd,! /usr/sbin/useradd root,/usr/bin/passwd,! /usr/bin/passwd root
允许zhangwei使用useradd,但是不允许useradd root。允许zhangwei使用passwd,但是不允许passwd root。
检查高权限文件
检查过高的权限或者在不应该的时间段创建或修改的文件。
find / -type f \( -perm -00007 \) -a -ctime -1 | xargs -I {} ls -lh {}
-ctime -1:-1表示一天以内,-2是两天以内,0是今天。
-00007:最后三位是权限
xargs -I {}:把前面命令找出的放入这个集合,ls -lh {} 输出这个集合
- ctime:属性变更
- mtime:内容修改
- atime:被访问
去除不需要的帐号、修改默认帐号shell环境
目的:删除系统不需要的默认账号、更改危险账号的默认shel变量,降低被利用的可能性。
实施方法:
- 删除/锁定多余用户与组
userdel -r username
groupdel groupname
passwd -l username
- 修改程序账户的登录shell
usermod -s /sbin/nologin username
限制超级管理员远程登录
目的:限制具备超级权限的用户远程登录。
实施方法:
- 修改远程管理程序ssh的配置文件
vi /etc/ssh/sshd_config
PermitRootLogin no
- 重启sshd服务
systemctl restart sshd
注意:别在远程设置,否则会断开ssh,得去机房了。
删除root以外UID为0的用户
目的:减少被越权使用的可能性
实施方法:
- 检查哪些帐户的UID为0
awk -F: '($3 == 0) { print $1 }' /etc/passwd
- 删除帐户或者编辑passwd与shadow文件
userdel -r username
不应存在位于高权组的帐户
目的:检查是否有帐户获取过高权限
实施方法:
- 检查哪些帐户属于其他组
grep -v ^# /etc/1ogin.defs | grep "^GID MIN" | awk '{print $2}'
awk -F: '$3>500{print $1}' /etc/passwd \ xargs -I {} grep {} /etc/group
grep -v "/sbin/nologin" /etc/passwd | awk -F: '{print $1}' | xargs -I {} grep {} /etc/group
缩短默认密码生存周期
目的:对于采用静态密码认证的设备,账户密码的生存周期不长于90天。
实施方法:
- 设置密码强度策略(Centos8)
vi /etc/login.defs
PASS_MAX_DAYS 90 最长使用期限
PASS_MIN_DAYS 0 最短使用期限
PASS_MIN_LEN 8 密码最小长度
PASS_WARN_AGE 7 最长期限到期前7天提醒更改密码
- 设置密码强度策略(Centos7)
vi /etc/pam.d/system-auth
password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minclass=3 minlen=8
lcredit 小写字符-1 至少1
ucredit 大写字符
ocredit 其他字符
minclass =3 从这些规则里面至少满足三个条件
minlen 最短长度8位
设置密码复杂性(Centos7以后)
vi /etc/security/pwquality.conf
authconfig --passminlen=8 --update # 密码最短8位
authconfig --enablereqlower --update # 包含一个小写
authconfig --enablerequpper --update # 包含一个大写
authconfig --enablereqdigit --update # 包含一个数字
authconfig --enablereqother --update # 包含一个字符
设置强制密码历史
目的:防止被社工字典破解
实施方法:
- 修改pam认证文件
vi /etc/pam.d/system-auth
- 添加/修改内容
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
remember=5 不能和之前的5个密码相同
设置帐户锁定策略
目的:防止被连续试探密码,降低爆破可能性
实施方法:
- 修改pam认证文件
/etc/pam.d/system-auth
/etc/pam.d/sshd
/etc/pam.d/1ogin
- 添加/修改内容
auth required pam_tally2.so deny=6 unlock_time=300 even_deny_root root_unlock_time=60
deny=6 密码错误最多六次
unlock_time=300 锁300秒
root_unlock_time=60 锁root帐号60秒
设置关键目录的权限
目的:在设备权限配置能力内,根据用户的企业需要,配置其所需的最小权限,以减少被非法访问的可能性。
实施方法:
- 更改帐户组文件的权限设置
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
- 去除多余的写入操作,例如:
chmod -R go-w /etc
修改umask值
目的:修改创建文件或目录时的默认权限,防止属于该组的其他用户级别组的用户修改该用户的文件。
实施方法:
- 修改启动脚本文件
/etc/profile
/etc/csh.login
/etc/csh.cshrc
/etc/bashrc
- 在文件末尾加入umask值
umask 027
umask是反码,使用777-反码 027实际权限为:777-027 = 750
文件777 目录666 目录没有执行权限
限制硬件资源
目的:限制用户对系统资源的使用,避免DDOS等攻击。
实施方法:
- 修改限制文件
vi /etc/security/limits.conf
- 加入下列内容
* soft core 0
* hard core 0
* hard rss 5000
* hard nproc 20
*所有登录到系统的帐户
hard 硬限制
core表示内存中启动的进程
nproc进程数
rss除了root以为其他用户最多给多少内存 5000 是 5M(兆)
3. 修改pam的本地登录文件
vi /etc/pam.d/login
4. 在文件末尾加入信息
session required /lib64/security/pam_limits.so
5. 日常收集进程数使用
ps aux | grep httpd | wc -l
对用户使用ls、rm设置别名
目的:让ls随时看清文件属性,让rm需要确认后删除目标实施方法。
设别名这项不是强制的。
实施方法:
- 修改当前用户的登录启动脚本
vi ~/.bashrc
- 追加别名命令
alias ls="ls -alh"
alias rm="rm -i"
禁止任何人su为root帐户
目的:避免任何人使用su切换到root,减少提权风险。
实施方法:
- 修改su的配置文件
vi /etc/pam.d/su
auth sufficient /lib/security/pam_rootok.so
auth required /lib/security/pam_wheel.so group=wheel
group=wheel:意思是用户是这个组的可以切换。
2. 如果需要su切换,将用户加入wheel组
gpasswd -a username wheel
去掉所有SUID和SGID
目的:防止被利用提权
实施方法:
- 查找具有SUID和SGID的对象
find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;
chmod ugo-s filename
对开放目录设置粘滞位
目的:允许小规模开放目录,用户作为暂存目录使用。
实施方法:
- 为/tmp目录添加粘滞位
chmod +t /tmp/
启用日志记录功能,使用日志服务器
目的:增加审计记录,分布保存日志
实施方法:(Centos8)
- 修改应用服务器日志配置文件
vim /etc/rsyslog.conf
- 添加两行转发日志信息
@udp @@tcp - 重启服务
systemctl restart reyslog
- 设置日志服务器的配置文件
$template Remote,"/var/log/%$YEAR%-%$MONTH%-%$DAY%/%fromhost-ip%.log"
:fromhost-ip, !isequal,"127.0.0.1" ?Remote
- 重启服务
systemctl restart reyslog
实施方法:(Centos7)
第四步不一样:
重要日志权限不应该高于640
目的:防止日志泄露敏感信息
实施方法:
ls -la /var/log/
chmod -R 640 /var/log
设置关键文件底层属性
目的:增强关键文件的底层属性,降低篡改风险。
实施方法:
- 修改关键文件和日志的底层属性
chattr +a /var/log/messages
chattr +i /var/log/messages.\*
chattr +i /etc/shadow
chattr +i /etc/passwd
chattr +i /etc/group
- 不只限于上述文件,可用lsattr查看更改结果
通信协议
关闭非加密远程管理Telnet
目的:降低被抓包后获取系统关键信息
实施方法:
- 修改Telnet配置文件
vi /etc/xinetd.d/telnet
- 确认/修改内容为
disable=yes
设置访问控制列表
目的:设置访问控制白名单,减少被入侵的风险。
注意:设置白名单,一般都是给面向内网的机器设置的。
实施方法:
- 修改拒绝策略
vi /etc/hosts.deny
- 加入信息
ALL:ALL
- 修改允许策略
vi /etc/hosts.allow
- 加入信息
sshd:来访者IP地址
固话常用DNS解析
目的:降低被DNS劫持的可能性。把常用的网站ip和域名绑定住,避免去查DNS。
实施方法:
- 修改hosts文件
vi /etc/hosts
- 加入解析信息
127.0.0.1 www.baidu.com
打开syncookie
目的:缓解syn flood攻击
实施方法:
- 修改系统控制文件
vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
- 配置生效
sysctl -p
不响应ICMP请求
目的:不对ICMP请求作出响应,避免泄露信息
实施方法:
- 修改网络策略布尔值
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
禁止处理无源路由
目的:防止被无源数据包利用,防止arp抓包。
实施方法:
- 检查是否开启了路由功能
sysctl -n net.ipv4.conf.al1.accept_source_route
- 关闭
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
防御syn flood攻击优化
目的:修改半连接上限,缓解syn flood攻击。
实施方法:
- 查询当前半连接上限
sysct1 net.ipv4.tcp_max_syn_backlog
- 修改半连接上限
sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
FTP使用黑白名单限制
目的:防止非法账户访问ftp
实施方法:
- 检查黑名单文件是否包含高危账户
root daemon bin sys adm lp uucp nuucp listen nobody noaccess nobody4
- 使用白名单文件(/etc/user_list)
userlist_deny=NO
userlist_enable=YES
FTP设置上传文件后的默认权限
目的:防止被上传执行脚本
实施方法:
- 检查主配置文件/etc/vsftpd.conf是否存在如下内容
write_enable=YES
local_umask=022
anon_umask=022
FTP设置banner信息
目的:防止泄露服务信息
实施方法:
- 检查主配置文件/etc/vsftpd.conf是否存在如下内容
ftpd_banner="Authorized users only. All activity maybe monitored and reported."
配置可信任的NTP服务器,并确保服务开启
目的:保持时间同步,防止某些服务错误
说明:NTP/NTF 时间服务器
实施方法:
- 检查主配置文件/etc/ntp.conf是否存在如下内容
server X.X.X.X
- 确保服务被启用
systemctl enable ntpd
systemctl status ntpd
检查账户目录中是否存在高危文件.netrc、.rhosts
目的:防止被使用远程登录漏洞
实施方法:
- 检查帐户家目录中是否存在远程主机文件
for DIR in `cut -d":" -f6 /etc/passwd`; do
if [[-e $DIR/.netrc]]; then
echo "$DIR/,netrc"
fi
if [[-e $DIR/.rhosts]]; then
echo "$DIR/,netrc"
fi
done
无返回值则表示正常
补丁
补丁安装
目的:可以使系统版本为最新并解决安全问题
注意:补丁安装以后卸载很麻烦,而且安装了补丁以后,配置文件可能就会变了。一般企业都有一台补丁服务器,补丁在这台服务器上更新以后经过测试,没问题了再分发给其他服务器。
实施方法:
- 使用yum更新(少用)
yum update
- 使用rpm安装
访问http://www.redhat.com/corp/support/errata下载补丁
rpm -Fvh rpm包
- 所有补丁需要在测试环境测试不影响业务服务后才可更新,下载补丁时,一定对文件进行签名核实。
服务进程与启动
关闭NFS服务
目的:防止被外挂文件系统,导致入侵
实施方法:
- 检查是否存在敏感进程
ps aux \ grep -E "lockd|nfsd|statd|mountd"
- 检查关闭NFS相关服务服务
.systemctl list-unit-files | grep nfs
systemctl disable nfs-client.target
关闭无用服务
目的:关闭无用服务,提高系统性能,减低漏洞风险。
实施方法:
- 检查有哪些自启动服务,并记录列表
systemctl list-unit-files | grep enabled
- 禁用无用服务
systemctl stop 服务名
systemctl disabled 服务名
建议关闭的服务
目的:如无需要,建议关闭或者卸载功能
服务列表:
rpm -qa l grep -E "^amanda|^chargen|^chargen-udp|^cups|^cups-lpd|^daytime|^daytime-udp|^echo|^echo-udp|^eklogin|^ekrb5-telnet|^finger|^gssftp|^imap|^imaps|^ipop2|^ipop3|^klogin|^krb5-telnet|^kshell|^ktalk|^ntalk|^rexec|^rlogin|^rsh|^rsync|^talk|^tcpmux-server|^telnet|^tftp|^time-dgram|^time-stream|^uucp"
banner与自动注销
隐藏系统提示信息
目的:避免通过系统提示信息获取系统状态。
实施方法:
- 查看登录banner信息
cat /etc/issue
- 清空banner文件
echo > /etc/issue
设置登录超时注销
目的:防止疏忽导致命令行被他人使用。
实施方法:
1.修改/etc/profile
vi /etc/profile
2. 在HISTFILESIZE下面加入
TMOUT=180
3. 生效
source /etc/profile
减少history历史数量
目的:降低之前操作被窃取的风险
实施方法:
- 修改/etc/profile
vi /etc/profile
- 修改信息
HISTFILESIZE=50
- 生效
source /etc/profile
跳过开机grup菜单
目的:防止在grup菜单对引导过程进行修改,可以防止进入安全模式,修改用户名密码等。
实施方法:
- 修改grup配置文件
vi /boot/grup2/grup.cfg
- 修改等时
set timeout=0
关闭ctrl+alt+del重启功能
目的:防止误操作重启服务器
实施方法:
- 修改配置文件
vi /usr/lib/systemd /system/ctrl-alt-del.target
- 注释所有内容
Windows加固实例
帐号管理与认证授权
按用户类型分配账号
目的:根据系统要求,设定不同账户和组,管理员、数据库sa、审计用户、来宾用户等
lusrmgr.src
设置密码策略、配置账户锁定策略、远程关机策略
secpol.msc
windows日志
事件查看器
Windows默认共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
restrictanonymous设置为1可关闭默认共享
安全系统补丁
WSUS服务器