Bootstrap

13、Linux加固与Windows加固

文章目录

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,有效的部署网络出/入口策略,控制对内网资
    源的访问能力,来保障资源安全性
  • 部署设备防护(可选)
    部署设备防护的安全加固方式一般由设备厂商完成。

安全加固流程

  1. 回退测试
    运维人员、厂商、第三代维方完成
    系统及数据备份、回退操作验证
  2. 业务测试
    运维人员、厂商、第三方代维配合完成
    利用现网环境或搭建虚拟环境进行业务测试,确认加固是否影响业务
  3. 有效性测试
    由安全加固实施工程师完成
    利用现网环境或搭建虚拟环境进行安全风险测试,确认加固有效性

Linux加固实例

账号管理与认证授权

使用加密的远程管理ssh

目的:使用安全套接字层加密传输信息,避免被侦听敏感信息。
注意:有的应用服务需要连接ssh,默认使用22端口,因此有风险。
实施方法:

  1. 安装ssh软件
    www.openssh.com下载
  2. 修改配置文件
    vi /etc/ssh/sshd_config修改配置文件
  3. 禁止root登录,修改默认端口,开启v2版本
PermitRootLogin     no
Port    20202
Protocol    2
  1. 重启服务
    systemctl restart sshd

为不同的管理员分配不同的帐号

目的:根据不同用途设置不同帐号,提高安全层级。
实施方法:

  1. 创建多用途帐号
useradd username
passwd username
  1. 修改目录权限
chmod 750directory
chown username:groupname directory
  1. 普通帐号使用特定授权命令,修改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变量,降低被利用的可能性。
实施方法:

  1. 删除/锁定多余用户与组
userdel -r username
groupdel groupname
passwd -l username
  1. 修改程序账户的登录shell
    usermod -s /sbin/nologin username

限制超级管理员远程登录

目的:限制具备超级权限的用户远程登录。
实施方法:

  1. 修改远程管理程序ssh的配置文件
vi /etc/ssh/sshd_config
PermitRootLogin no
  1. 重启sshd服务
    systemctl restart sshd
    注意:别在远程设置,否则会断开ssh,得去机房了。

删除root以外UID为0的用户

目的:减少被越权使用的可能性
实施方法:

  1. 检查哪些帐户的UID为0
    awk -F: '($3 == 0) { print $1 }' /etc/passwd
  2. 删除帐户或者编辑passwd与shadow文件
    userdel -r username

不应存在位于高权组的帐户

目的:检查是否有帐户获取过高权限
实施方法:

  1. 检查哪些帐户属于其他组
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天。
实施方法:

  1. 设置密码强度策略(Centos8)
vi /etc/login.defs

PASS_MAX_DAYS 90 最长使用期限
PASS_MIN_DAYS 0 最短使用期限
PASS_MIN_LEN 8 密码最小长度
PASS_WARN_AGE 7 最长期限到期前7天提醒更改密码
  1. 设置密码强度策略(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 # 包含一个字符

设置强制密码历史

目的:防止被社工字典破解
实施方法:

  1. 修改pam认证文件
    vi /etc/pam.d/system-auth
  2. 添加/修改内容
    password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
    remember=5 不能和之前的5个密码相同

设置帐户锁定策略

目的:防止被连续试探密码,降低爆破可能性
实施方法:

  1. 修改pam认证文件
/etc/pam.d/system-auth
/etc/pam.d/sshd
/etc/pam.d/1ogin
  1. 添加/修改内容
    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秒

设置关键目录的权限

目的:在设备权限配置能力内,根据用户的企业需要,配置其所需的最小权限,以减少被非法访问的可能性。
实施方法:

  1. 更改帐户组文件的权限设置
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
  1. 去除多余的写入操作,例如:
    chmod -R go-w /etc

修改umask值

目的:修改创建文件或目录时的默认权限,防止属于该组的其他用户级别组的用户修改该用户的文件。
实施方法:

  1. 修改启动脚本文件
/etc/profile
/etc/csh.login
/etc/csh.cshrc
/etc/bashrc
  1. 在文件末尾加入umask值
    umask 027
    umask是反码,使用777-反码 027实际权限为:777-027 = 750
    文件777 目录666 目录没有执行权限

限制硬件资源

目的:限制用户对系统资源的使用,避免DDOS等攻击。
实施方法:

  1. 修改限制文件
    vi /etc/security/limits.conf
  2. 加入下列内容
* 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需要确认后删除目标实施方法。
设别名这项不是强制的。
实施方法:

  1. 修改当前用户的登录启动脚本
    vi ~/.bashrc
  2. 追加别名命令
alias ls="ls -alh"
alias rm="rm -i"

禁止任何人su为root帐户

目的:避免任何人使用su切换到root,减少提权风险。
实施方法:

  1. 修改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

目的:防止被利用提权
实施方法:

  1. 查找具有SUID和SGID的对象
    find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;
    chmod ugo-s filename

对开放目录设置粘滞位

目的:允许小规模开放目录,用户作为暂存目录使用。
实施方法:

  1. 为/tmp目录添加粘滞位
    chmod +t /tmp/

启用日志记录功能,使用日志服务器

目的:增加审计记录,分布保存日志
实施方法:(Centos8)

  1. 修改应用服务器日志配置文件
    vim /etc/rsyslog.conf
  2. 添加两行转发日志信息
    在这里插入图片描述
    @udp @@tcp
  3. 重启服务
    systemctl restart reyslog
  4. 设置日志服务器的配置文件
    在这里插入图片描述
$template Remote,"/var/log/%$YEAR%-%$MONTH%-%$DAY%/%fromhost-ip%.log"
:fromhost-ip, !isequal,"127.0.0.1" ?Remote
  1. 重启服务
    systemctl restart reyslog

实施方法:(Centos7)
第四步不一样:
在这里插入图片描述

重要日志权限不应该高于640

目的:防止日志泄露敏感信息
实施方法:

ls -la /var/log/
chmod -R 640 /var/log

设置关键文件底层属性

目的:增强关键文件的底层属性,降低篡改风险。
实施方法:

  1. 修改关键文件和日志的底层属性
chattr +a /var/log/messages
chattr +i /var/log/messages.\*
chattr +i /etc/shadow
chattr +i /etc/passwd
chattr +i /etc/group
  1. 不只限于上述文件,可用lsattr查看更改结果

通信协议

关闭非加密远程管理Telnet

目的:降低被抓包后获取系统关键信息
实施方法:

  1. 修改Telnet配置文件
    vi /etc/xinetd.d/telnet
  2. 确认/修改内容为
    disable=yes

设置访问控制列表

目的:设置访问控制白名单,减少被入侵的风险。
注意:设置白名单,一般都是给面向内网的机器设置的。
实施方法:

  1. 修改拒绝策略
    vi /etc/hosts.deny
  2. 加入信息
    ALL:ALL
  3. 修改允许策略
    vi /etc/hosts.allow
  4. 加入信息
    sshd:来访者IP地址

固话常用DNS解析

目的:降低被DNS劫持的可能性。把常用的网站ip和域名绑定住,避免去查DNS。
实施方法:

  1. 修改hosts文件
    vi /etc/hosts
  2. 加入解析信息
    127.0.0.1 www.baidu.com

打开syncookie

目的:缓解syn flood攻击
实施方法:

  1. 修改系统控制文件
vi /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1
  1. 配置生效
    sysctl -p

不响应ICMP请求

目的:不对ICMP请求作出响应,避免泄露信息
实施方法:

  1. 修改网络策略布尔值
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

禁止处理无源路由

目的:防止被无源数据包利用,防止arp抓包。
实施方法:

  1. 检查是否开启了路由功能
    sysctl -n net.ipv4.conf.al1.accept_source_route
  2. 关闭
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

防御syn flood攻击优化

目的:修改半连接上限,缓解syn flood攻击。
实施方法:

  1. 查询当前半连接上限
    sysct1 net.ipv4.tcp_max_syn_backlog
  2. 修改半连接上限
    sysctl -w net.ipv4.tcp_max_syn_backlog="2048"

FTP使用黑白名单限制

目的:防止非法账户访问ftp
实施方法:

  1. 检查黑名单文件是否包含高危账户
    root daemon bin sys adm lp uucp nuucp listen nobody noaccess nobody4
  2. 使用白名单文件(/etc/user_list)
userlist_deny=NO 
userlist_enable=YES

FTP设置上传文件后的默认权限

目的:防止被上传执行脚本
实施方法:

  1. 检查主配置文件/etc/vsftpd.conf是否存在如下内容
write_enable=YES 
local_umask=022 
anon_umask=022

FTP设置banner信息

目的:防止泄露服务信息
实施方法:

  1. 检查主配置文件/etc/vsftpd.conf是否存在如下内容
    ftpd_banner="Authorized users only. All activity maybe monitored and reported."

配置可信任的NTP服务器,并确保服务开启

目的:保持时间同步,防止某些服务错误
说明:NTP/NTF 时间服务器
实施方法:

  1. 检查主配置文件/etc/ntp.conf是否存在如下内容
    server X.X.X.X
  2. 确保服务被启用
systemctl enable ntpd
systemctl status ntpd

检查账户目录中是否存在高危文件.netrc、.rhosts

目的:防止被使用远程登录漏洞
实施方法:

  1. 检查帐户家目录中是否存在远程主机文件
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

无返回值则表示正常

补丁

补丁安装

目的:可以使系统版本为最新并解决安全问题
注意:补丁安装以后卸载很麻烦,而且安装了补丁以后,配置文件可能就会变了。一般企业都有一台补丁服务器,补丁在这台服务器上更新以后经过测试,没问题了再分发给其他服务器。
实施方法:

  1. 使用yum更新(少用)
    yum update
  2. 使用rpm安装
    访问http://www.redhat.com/corp/support/errata下载补丁
    rpm -Fvh rpm包
  3. 所有补丁需要在测试环境测试不影响业务服务后才可更新,下载补丁时,一定对文件进行签名核实。

服务进程与启动

关闭NFS服务

目的:防止被外挂文件系统,导致入侵
实施方法:

  1. 检查是否存在敏感进程
    ps aux \ grep -E "lockd|nfsd|statd|mountd"
  2. 检查关闭NFS相关服务服务
    .systemctl list-unit-files | grep nfs
    systemctl disable nfs-client.target

关闭无用服务

目的:关闭无用服务,提高系统性能,减低漏洞风险。
实施方法:

  1. 检查有哪些自启动服务,并记录列表
    systemctl list-unit-files | grep enabled
  2. 禁用无用服务
    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与自动注销

隐藏系统提示信息

目的:避免通过系统提示信息获取系统状态。
实施方法:

  1. 查看登录banner信息
    cat /etc/issue
  2. 清空banner文件
    echo > /etc/issue

设置登录超时注销

目的:防止疏忽导致命令行被他人使用。
实施方法:
1.修改/etc/profile
vi /etc/profile
2. 在HISTFILESIZE下面加入
TMOUT=180
3. 生效
source /etc/profile

减少history历史数量

目的:降低之前操作被窃取的风险
实施方法:

  1. 修改/etc/profile
    vi /etc/profile
  2. 修改信息
    HISTFILESIZE=50
  3. 生效
    source /etc/profile

跳过开机grup菜单

目的:防止在grup菜单对引导过程进行修改,可以防止进入安全模式,修改用户名密码等。
实施方法:

  1. 修改grup配置文件
    vi /boot/grup2/grup.cfg
  2. 修改等时
    set timeout=0

关闭ctrl+alt+del重启功能

目的:防止误操作重启服务器
实施方法:

  1. 修改配置文件
    vi /usr/lib/systemd /system/ctrl-alt-del.target
  2. 注释所有内容

Windows加固实例

帐号管理与认证授权

按用户类型分配账号

目的:根据系统要求,设定不同账户和组,管理员、数据库sa、审计用户、来宾用户等
lusrmgr.src

设置密码策略、配置账户锁定策略、远程关机策略

secpol.msc

windows日志

事件查看器

Windows默认共享

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
restrictanonymous设置为1可关闭默认共享

安全系统补丁

WSUS服务器

;