加固

国标

GB/T25058 信息安全技术 信息系统安全等级保护实施指南

GB/T22240 信息安全技术 信息系统安全等级保护定级指南

GB/T22239 信息安全技术 网络安全等级保护基本要求

GB/T25070 信息安全技术 网络安全等级保护安全设计技术要求

GB/T28449 信息安全技术 网络安全等级保护评测过程指南

版本升级

windows有弹框,linux没提示

关闭端口服务

端口能不开就不开,最小安装原则

修改配置项

修改安全配置,参数,可以为网络和 应用提供必要的安全防护

主机和网络ACL策略

iptables,对于流量进行严格的控制,白名单

修改代码
部署设备防护

linux加固方向

账号管理和认证授权
修改目录权限
chmod 750 directory
# 默认目录权限是755 文件权限是644
# 改为750 640或者 700 600
chown username:groupname directory

#更改账户组文件的权限
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
#去除多余的写入操作 全改
chmod -R go-w /etc

visudo

#visudo中  !以后的为不允许使用该命令
username host=/usr/sbin/useradd, !/usr/bin/vim /etc/hosts,!/usr/bin/passwd root

检查高权限文件

.find / -type f \( -perm -00007 \) -a -ctime -1 -exec ls -lg {} \;
ctime -1 :一天内状态改变过的项
mtime:内容修改
atime:被访问
禁止任何人su为root账户
# 修改su的配置为配置文件
/etc/pam.d/su
auth sufficient /lib/security/pam.rootok.so
auth required /lib/security/pam_wheel.so
group=wheel
#如果需要su切换,将用户加入wheel组
gpasswd -a username wheel
去除不需要的账号,修改默认账号shell环境
#删除/锁定多余的用户与组
userdel -r username
groupdel groupname
passwd -l username
#修改程序账户的登录shell
usermod -s /sbin/nologin username
限制超级管理员远程登录
# 修改远程管理程序ssh的配置文件
vi /etc/ssh/sshd_config
permitRootLogin yes

permitRootLogin no
#重启sshd服务
systemctl restart sshd
去掉所有suid和sgid
# 防止提权
#查找具有suid和sgid的对象
find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;
find / -type f \( -perm -04000 -o -perm -02000 \) |xargs -l {} ls -lh {}
chmod ugo-s 对象
删除root以外UID为0的用户
#检查哪些账户的UID为0
awk -F: '($3 == 0) { print $1 }' /etc/passwd

删除账户

userdel -r username

或者编辑passwd与shadow文件

不应存在位于高权组的账户
# 检查哪些账户属于其他组
grep -v ^# /etc/login.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
缩短默认密码生存周期
# 修改文件密码策略文件
vi /etc/login.defs
PASS_MAX_DAYS 90 #最长使用期限90天
PASS_MIN_DAYS 0 #最短使用期限0天
PASS_MIN_LEN 8 #密码最小长度8位
PASS_WARN_AGE 7 #最长期限到期前7天提醒更改密码

设置密码强度策略

目的:规范使用高强度密码,延长被爆破的时间

# 修改pam认证文件
vi /etc/pam.d/system-auth
password requisite, pam_cracklib.so
try_first_pass retry=3 dcredit=-1 1credit=-1
ucredit=-1 ocredit=-1 minclass=3 minlen=8

#centos7以后设置密码复杂度
authconfig --passminlen=8 --update # 密码最短八位
authconfig --enablereqlower --update #包含一个小写
authconfig --enablerequpper --update #包含一个大写
authconfig --enablereqdigit --update #包含一个数字
authconfig --enablereqother --update #包含一个字符

在文件/etc/security/pwquality.conf
设置强制密码历史
# 修改pam认证文件
/etc/pam.d/system-auth
password sufficient pam_unix.so sha512 shadow
nullok try_first_pass use_authtok remember=5
设置账户锁定策略
# 修改pam认证文件
/etc/pam.d/system-auth
/etc/pam.d/sshd
/etc/pam.d/login
auth required pam_tally2.so deny=6
unlock_time=300 even_deny_root
root_unlock_time=60
#强制解锁账户的命令
pam_tally2 --user zhangsan --reset
修改umask值
#修改启动脚本文件
/etc/profile
/etc/csh.login
/etc/csh.cshrc
/etc/bashrc
#在文件末尾加入umask值 反码
umask 027 # 权限750
限制硬件资源
#修改限制文件  减缓ddos带来的危害  
#加入以下内容
vi /etc/security/limits.conf
soft core 0
hard core 0
hard rss 5000 #限制5m的内存
hard nproc 20 #限制20个进程

在文件末尾加入信息

session required /lib64/security/pam_limit.so

日常收集进程数使用

ps aux | grep httpd | wc -l
启用日志功能,使用日志服务器
#日志接收方
# 修改应用服务器日志配置文件
vi /etc/rsyslog.conf
#开启接收日志功能
$ModLoad imudp
$UDPServerRun 514
$template Remote,"/var/1og/%$YEAR%-%$MONTH%-%$DAY%/%fromhost-ip%.log" #远程日志路径
:formhost-ip,isequal,"127.0.0.1" ?Remote #本地日志不存储远程文件
# 重启服务
systemctl restart rsyslog


#日志发送方
# 确认关键日志审计是否存在
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
#添加两行转发日志信息
*.info;mail.none;authpriv.none;cron.none @192.168.2.1
authpriv.* @192.168.2.1

#重启服务
systemctl restart rsyslog
#设置权限为640
ls -al /var/log/
chmod -R 640 /var/log
设置关键文件底层属性
# 修改关键文件和日志的底层属性,降低篡改风险
chattr +a /var/log/message
chattr +i /var/log/message.*
chattr +i /var/etc/shadow
chattr +i /var/etc/passwd
chattr +i /var/etc/group
# 不只限于上述文件,可用lsattr查看更改结果
对用户使用ls,rm设置别名

目的,让ls随时看清文件属性

让rm需要确认后删除目标实施方法

#修改当前用户的登录启动脚本
vi ~/.bashrc
alias ls="ls -alh"
alias rm="rm-i"
对开放目录设置粘滞键
# 目的,允许小规模开放目录,用户作为暂存目录使用
chmod +t /tmp/
通讯协议
使用加密的远程管理ssh
# 修改配置文件
vi /etc/ssh/sshd_config
PermitRootLogin no
Port 20202
Protocol 2
systemctl restart sshd
设置访问控制列表
# 修改拒绝策略 
vi /etc/hosts.deny
ALL:ALL
# 修改允许策略
vi /etc/hosts.allow
sshd: <来访者IP地址>
不响应ICMP请求
# 修改网络策略布尔值
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
禁止处理无源路由
# 目的: 防止被无源路由抓包  防arp攻击
# 检查是否开启了路由功能
sysctl -n net.ipv4.conf.all.accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# 缓解syn flood攻击  syn洪水
vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
sysctl -p
防御syn flood攻击优化
# 目的: 修改半连接上限,缓解syn flood攻击
# 查询当前半连接上限
sysctl net.ipv4.tcp_max_syn_backlog
# 修改半连接上限
sysctl -w net.ipv4.tcp_max_synn_backlog ="2048"

FTP使用黑白名单限制

# 目的: 防止非法账户访问ftp
# 检查黑名单文件是否包括高危账户
/etc/ftpusers
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
检查账户目录中是否存在高危文件.netrc、.rhosts
# 目的: 防止被使用远程登录漏洞
# 检查账户home目录中是否存在远程主机文件
for DIR in 'cut -d":" -f6 /etc/passwd'; do
if [ -e $DIR/.netrc ]; then
echo "$DIR/.netrc"
fi
done
# 无返回值则表示正常
FTP设置banner信息
# 目的: 防止泄露服务信息
/etc/vsftpd.conf # 是否存在如下内容 有的话删除掉
ftpd_banner="Authorized users only. All activity may be monitored and reported."

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

# 目的: 保持时间同步,防止某些服务错误
# 检查主配置文件/etc/ntp.conf是否存在如下内容
server X.X.X.X
# 确保服务被启用
systemctl enable ntpd
systemctl status ntpd
固化常用DNS解析
# 修改hosts文件
vi /etc/hosts
61.59.123.22 www.baidu.com
关闭telnet
# 降低被抓包后获取系统关键信息
# 修改telnet配置文件
vim /etc/xinetd.d/telnet
disable=yes
补丁管理
补丁装载
# 最好去官方找rpm包,安装补丁,下载时一定要进行签名校验
yum update
# 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 enable
# 禁用无用服务
systemctl stop < 服务名>
systemctl disabled <服务名>
建议关闭的服务
rpm -qa | grep -E "^amanda|^chargen|^chargen-udp|^cups|^cups-lpd|^daytime|^daytime-udp|^echo|^echo-udp|^eklogin|^ekrb5-telnet|^finger|^gssftp|^imapl^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/issus
# 清空banner文件
echo > /etc/issus

设置登录超时注销

# 修改信息
vi /etc/profile
HISTFILESIZE=50 # 只能看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.msc
根据用户要求将账号加入功能组
右击账户-> 属性->更改隶属于
右击功能组->属性->成员

清理系统无用账户
#目的: 删除或锁定设备运行,维护等工作无关的账号,提高系统账号安全性
打开本地用户和计算机管理器
打开运行,输入lusrmgr.msc
删除或者锁无关账号(删除操作不可逆)
右击账户->删除
右击账户->属性->账户已禁用
重命名administrator,禁用guest
# 目的: 减少账户被爆破可能性,提高系统访问安全性
打开本地用户和计算机管理器
打开运行,输入lusrmgr.msc
为管理员administrator账户改名
右击administrator->重命名->属性->全名
禁用来宾guest
右击guest ->属性->账户已禁用

#power user 组 权限仅次于administrator
设置密码策略
# 目的: 防止弱口令出现,降低爆破的可能性
打开本地安全策略
打开运行,输入secpol.msc
找到密码策略
账户策略->密码策略
修改默认值
密码必须符合复杂性要求:禁用-> 启用
密码长度最小值: 0->8
密码最短使用期限: 0天
密码最长使用期限:42天->90天
强制密码历史:1->5
用可还原的加密来存储:禁用
配置账户锁定策略
# 目的:有效降低administrator以外的账户被爆破的几率
打开本地安全策略
打开运行,输入secpol.msc
找到账户锁定策略
账户策略->账户锁定策略
账户锁定时间: 未定义->30分钟
账户锁定阈值: 0->6
复位账户锁定计数器: 未定义->30分钟

远程关机权限设置

# 目的:防止远程用户非法关闭系统
打开本地安全策略
打开运行,输入secpol.msc
找到用户权限分配
本地策略->用户权限分配
关闭系统策略中,只保留administrator组
从远程系统强制关机
拒绝本地登录
拒绝从网络访问这台计算器
取得文件或对象的所有权设置
# 目的:防止用户非法绕过NTFS权限,获取文件内容
打开本地安全策略
打开运行,输入secpol.msc
找到用户权限分配
本地策略->用户权限分配
取得文件或对象的所有权策略,只保留administrator组

设置从本地登录此计算机

# 目的:防止用户非法登录主机
打开本地安全策略
打开运行,输入secpol.msc
找到用户权限分配
本地策略->用户权限分配
从本地登陆此计算机策略,加入授权用户
日志配置
# 目的: 通过审核策略,记录系统登录事件,对象访问事件,软件安装事件,安全事件等
打开本地安全策略
打开运行,输入secpol.msc
找到审核策略
本地策略->审核策略
修改审核策略
"审核策略更改" 设置为"成功""失败"都要审核
"审核对象访问" 设置为"成功""失败"都要审核
"审核目录服务器访问" 设置为"成功""失败"都要审核
"审核特权使用" 设置为"成功""失败"都要审核
"审核系统事件" 设置为"成功""失败"都要审核
"审核账户管理" 设置为"成功""失败"都要审核
"审核过程追踪" 设置为"成功""失败"都要审核

# 在具体的文件->属性->设置访问
日志记录策略设置
#目的 
进入事件查看器
打开运行->eventvwr.msc
在日志属性中设置日志大小不小于1024KB,设置当达到最大日志尺寸时,按需要改写事件
IP协议安全
启用TCP/IP筛选
# 过滤掉不必要的端口,提高网络安全性
运维人员列出业务所需端口
打开本地连接
控制面板->网络连接->本地连接
找到高级TCP/IP设置
右击本地连接->internet协议属性->高级TCP/IP设置
在选项的属性中启用网络连接的tcp/IP筛选,是开放业务协议端口
开启系统防火墙
# 目的:多角度封堵业务以外的端口连接
运维人员列出业务所需端口
打开本地连接中的防火墙
控制面板->网络连接->本地连接
在高级选项中设置启用windows防火墙
设置例外
只允许业务端口接入网络
设置空闲超时锁定系统
# 目的: 防止由疏忽导致的系统被非法使用
进入控制面板->显示->屏幕保护程序
启用屏幕保护程序,设置等待时间为5分钟,启用在恢复时使用密码保护功能
设置网络服务挂起时间
# 目的:防止远程登录时由于疏忽导致的系统被非法使用
打开本地安全策略
打开运行,输入secpol.msc
打开安全选项
本地策略—>安全选项
"microsoft网络服务器"设置"在挂起会话之前所需空闲时间"为5分钟
关闭默认共享
# 目的: windows默认共享分区,关闭后提高信息安全性
# win+r mmc 可以查看
打开注册表编辑器,编辑和新建键值
打开运行->regedit.msc
展开lsa目录
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
调整Restrictanonymous键值为1
建两个DWORD值分别命名为AutoShareWks和AutoShareServer

设置共享文件夹权限
# 目的: 只允许授权账户访问共享文件夹
进入系统工具
控制面板->管理工具->计算机管理
进入系统工具->共享文件夹
查看每个文件夹的共享权限并按需求更改
在共享权限中删除everyone动态组
漏洞管理
安全系统补丁
# 目的:修复系统漏洞,安装最新的service pack补丁集
部署wsus服务器
从microsoft update下载补丁
在测试机上安装补丁后测试业务运行情况
使用wsus服务器内网分发补丁
安装和更新杀毒软件
# 目的: 提高系统防御力,保护关键信息不被破坏
在服务器上安装最新版企业防病毒软件的服务端
使用C/S架构部署企业版防病毒软件
制定统一安全查杀规则
windows的服务
关闭无用服务
# 目的:关闭不必要的服务,提高系统性能和安全性
打开服务管理器
打开运行->services.msc
关闭禁用服务
右击无关服务->属性->启动类型(禁用)->运行状态->停止
系统必须服务见附表
关闭无用自启动项
# 目的: 减少开机自启动服务和软件,提高性能和安全性
打开微软控制台
打开运行->msconnfig
在启动选项卡中去掉多余的启动项的"√"
关闭windows自动播放功能
# 目的:防止从移动存储设备感染自运行病毒
打开组策略编辑器
打开运行->gpedit.msc
找到策略所在
计算机配置->管理模板->系统->设置
关闭自动播放->已启用

应急

特征:文件名 找到直接删,

时间:从文件时间入手,去匹配业务日志里面的时间段

流量:态势感知

如果是免杀,按照创建时间找,如果改时间,对比哈希值

或者快照,直接回档

日志
# linux 
# messages文件记录了操作系统的所有日志消息,内核,进程,服务
/var/log/messages
# syslog日志文件是另一个记录系统日志的文件,组件和服务的消息,smtp、pop、imap
/var/log/syslog
# auth.log日志记录用户认证、授权访问控制的信息
/var/log/auth.log
# kern.log日志记录所有与系统内核相关的事件和消息,内核故障,驱动程序错误,内核崩溃
/var/log/kern.log
# daemon.log日志记录所有与系统demon相关的事件和消息
/var/log/daemon.log
# boot.log日志记录Linux启动过程中的所有日志消息
/var/log/boot.log
# cron日志记录与定时或循环任务相关的所有消息
/var/log/cron
# dmesg记录了通过系统启动信息输出到终端上,包括设备驱动加载、内存信息、设备探测等
/var/log/dmesg
# maillog用于记录与邮件系统及其相关组件相关的所有消息 pop/imap
/var/log/maillog

查找 nginx 访问日志

sudo cat /var/log/nginx/access.log

从日志中查找404错误

sudo awk '$9 == 404 || $7 == 404 {print}' /var/log/nginx/access.log

查找大量出现404错误的IP地址

sudo awk '$9 == 404 || $7 == 404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

防火墙阻止192.168.1.100访问

sudo iptables -I INPUT -s 192.168.1.100 -j DROP

查看ssh登录错误日志

sudo cat /var/log/auth.log

查找错误登录IP地址

sudo cat /var/log/auth.log | grep 'Failed password' | awk ' {print $(NF-3)}' | sort | uniq -c | sort -rn

使用 ufw 屏蔽攻击者的 IP 192.168.1.100

sudo ufw insert 1 deny from 192.168.1.100 to any

查看ssh登录成功日志

sudo cat /var/log/auth.log | grep sshd

出现在日志中的用户都是经过ssh登录的,还可以用grep过滤出失败的登录日志

sudo cat /var/log/auth.log | grep sshd | grep 'Failed password'

查看系统日志,筛选ssh登录记录

sudo cat /var/log/syslog | grep sshd

获取登录者的IP地址,以下命令会显示所有失败的登录尝试并指出攻击者的IP地址

sudo cat /var/log/auth.log | grep 'sshd.*Failed password' | awk '{print $11}' | sort | uniq -c | sort -n

使用netstat 验证获取到的ip是否是攻击者ip

sudo netstat -anp | grep <IP address>
后门排查

内存马排查

查找所有java进程

ps aux | grep java

查看每个java进程的所有者

ps -ef | grep java

查看java进程参数

jps -mlv

查看java进程使用的所有类和包

jmap -histo <PID>
webshell查杀

检查网站目录文件,找所有的.php和.sh文件,并且查找eval函数的使用情况

find /var/www/public -type f \( -iname "*.php" -or -iname "*.sh" \) -exec grep -iRl "eval" {} \;

查找后门

sudo apt-get install chkrootkit rkhunter
sudo chkrootkit
sudo rkhunter --check

查找异常文件,最近被修改过的文件

sudo find / -type f -mtime -7 2>/dev/null

查找web服务根目录下比较大的文件和目录

sudo du -ah /var/www/ | grep G

找出对用户可写的文件和目录

sudo find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -ls

找出可执行文件设置了setuid和setgid权限的文件

sudo find / -perm /6000 -type f -exec ls -la {} 2>/dev/null \;

监控网络连接

sudo netstat -tnpa | grep ESTABLISHED

看日志文件,wenshell可能被隐藏到日志中

sudo cat /var/log/auth.log | grep -i sshd
环境变量

检查当前环境变量

echo $PATH

检查系统环境变量,在/etc/environment中

sudo cat /etc/environment

检查shell配置文件,确保每个文件没有添加可疑目录或者路径

/.bash_profile、/etc/bash.bashrc、/etc/environment

检查LD_PRELOAD变量

echo $LD_PRELOAD
排查系统异常账户

查看所有系统账户

cat /etc/passwd

查看root账户信息

sudo cat /etc/passwd | grep 'root'

检查sudo访问权限

sudo cat /etc/sudoers

查看系统特权账户,linux有一些默认特权用户,wheel、adm、root等,

sudo cat /etc/group | grep -E "root|adm|lp|wheel"

检查ssh登录日志

sudo cat /var/log/auth.log | grep ' sshd'

检查登录历史

last
检查计划任务
sudo ls -alR /etc/cron.*
sudo ls -alR /var/spool/cron/crontabs