基线检查与安全加固
入侵排查
Windows
-
检查服务器是否配置弱口令
-
查看端口开放情况:netstat -ano
-a 显示所有连接和侦听接口 -n 艺术字形式显示地址和端口号 -o 显示每个连接关联的进程ID
-
查看administrators用户组中是否存在可以成员:net localgroup Administrators
-
Windows系统日志位置:C:\windows\system32\winevt\logs
-
使用工具分析系统日志:fullwventlogview
-
查看启动项、计划任务、服务
任务计划程序:taskschd.msc 服务:services.msc
Linux
-
查看当前用户,登录信息
who 查看当前登录用户(tty本地登陆 pts远程登录) w 查看系统信息,想知道某一时刻用户的行为 uptime 查看登陆多久、多少用户,负载 last 查看用户登录历史信息以及系统启动和关机记录
-
查看系统中用户信息,分析是否存在可以用户
cat /etc/passwd root:x:0:0:root:/root:/bin/bash account:password:UID:GID:GECOS:directory:shell 用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell 注意:无密码只允许本机登陆,远程不允许登陆 cat /etc/shadow root:$5$dmXzyC0syw8uamm1$NAJ/PsT0gQyM4RRpDPu1VuNZ2SDUHB27z/0kDQ1fFJ6::0:99999:7::: 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
-
查看用户执行的历史命令:对应用户的home目录下存在.bash_history,里面记录了该用户执行过的命令,默认保存1000条
-
查看端口开放情况:netstat -antlp
-t 显示TCP连接 -l 显示监听状态的连接 -p 显示进程标识符和程序名称
-
查看异常进程
top 查看占用资源异常的进程 ps -aux 查看进程的详细信息 -a:显示当前终端的所有进程。 -u:显示进程的用户信息。 -x:显示没有控制终端的进程
-
检查启动项和计划任务
/etc/rc.d/rc.local 文件用于存储系统启动时需要执行的脚本 cat /etc/rc.d/rc.local crontab查看定时任务 crontab -l 用户查看当前用户的定时任务,-u选项可以指定用户 # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 以下这些目录包含按小时、天、周和月运行的脚本 ls /etc/cron.hourly/ ls /etc/cron.daily/ ls /etc/cron.weekly/ ls /etc/cron.monthly/
-
Linux日志:/var/log
安全日志,包含登录成功和失败的登录尝试、用户切换等 /var/log/auth.log # Debian/Ubuntu /var/log/secure # Red Hat/CentOS 系统事件和消息,包括启动、关闭、硬件事件、软件错误等 /var/log/syslog # Debian /var/log/messages # CentOS 系统启动和关机日志 /var/log/boot.log 邮件日志 /var/log/mail.log # Debian /var/log/maillog # CentOS 中间件日志 /var/log/apache2/* /var/log/httpd/* /var/log/nginx/*
基线检查
基线检查通常涉及对系统配置、软件版本、安全策略等方面的全面检查,以发现潜在的安全漏洞和配置问题
Linux
账号管理和授权
- 检查特殊账号,是否存在空密码的账户和 root 权限账户
- 禁用或删除无用账号
- 添加口令策略:
/etc/login.defs
修改配置文件,设置过期时间、连续认证失败次数 - 禁止 root 远程登录,限制root用户直接登录。
- 检查 su 权限。
vi /etc/pam.d/su
添加auth required pam_wheel.so group=test
服务
-
关闭不必要的服务
-
SSH 服务安全
- 不允许 root 账号直接登录系统,
PermitRootLogin=no
- 修改 SSH 使用的协议版本为 2
- 修改允许密码错误次数(默认 6 次),
MaxAuthTries=3
- 不允许 root 账号直接登录系统,
文件系统
- 设置 umask 值
vi /etc/profile
添加行umask 027
- 设置登录超时
vi /etc/profile
修改配置文件,将以TMOUT=
开头的行注释,设置为TMOUT=180
日志
- 启用 syslogd 日志,配置日志目录权限,或者设置日志服务器
- 记录所有用户的登录和操作日志,通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查
IP 协议安全要求
- 远程登录取消 telnet 采用 ssh
- 设置 /etc/hosts.allow 和 deny
- 禁止 ICMP 重定向
- 禁止源路由转发
- 防 ssh 破解,iptables (对已经建立的所有链接都放行,限制每分钟连接 ssh 的次数)+ denyhost (添加 ip 拒绝访问)
Windows
身份鉴别
- 更改缺省账户
- 检查Guest用户是否禁用
- 密码复杂性要求
- 密码长度最小不能小于8位
访问控制
- 共享账户检查
- 远程关机授权
- 本地关机
- 授权帐户登陆
安全审计
- 用户登录日志记录
- 系统日志完备性检查
- 登录超时管理
资源控制
- 登录超时管理
- 远程登录超时配置
剩余信息保护
- 不显示上次的用户名
- 关机前清除虚拟内存页面
- 不启用可还原的加密来存储密码
中间件部署规范
nginx
-
隐藏版本号
http { server_tokens off; }
-
开启HTTPS
ssl on
:开启httpsssl_certificate
:配置nginx ssl证书的路径ssl_certificate_key
:配置nginx ssl证书key的路径ssl_protocols
:指定客户端建立连接时使用的ssl协议版本ssl_ciphers
:指定客户端连接时所使用的加密算法server { listen 443; server_name <xxx>; ssl on; ssl_certificate <pem路径>; ssl_certificate_key <key路径>; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD% }
-
限制请求方法,禁止PUT/DELETE等,只允许GET/POST,其他方式返回405
if ($request_method !~ ^(GET|POST)$ ){ return 405; }
-
使用referer图片防盗链
locations /images/ { valid_referers none blocked <domain_name> <domain_name>; if ($invalid_referer){ return 403; } } valid_referers:验证referer none:允许referer为空 blocked:允许不带协议的请求
-
添加Header头防止XSS攻击
add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff";
X-Frame-Options
:标识是否允许浏览器加载frame等属性。- DENY:禁止任何网页被嵌入
- SAMEORIGIN:只允许本网站的嵌套
- ALLOW-FROM:允许指定地址的嵌套
X-XSS-Protection
:启用XSS过滤。mode=block标识若检查到XSS攻击则停止渲染页面X-Content-Type-Options
:用来指定浏览器对未指定或错误指定Content-Type资源真正类型的猜测行为- nosniff:标识不允许任何猜测
- 在通常的请求相应中,浏览器会根据Content-Type来分辨响应的类型,如果响应类型未指定或错误指定时,浏览器会启用
MIME-sniffing
来猜测资源的响应类型
Apache
-
文件系统根目录禁止覆盖,即禁止使用.htaccess配置文件规则覆盖主配置文件规则
# /etc/httpd/conf/httpd.conf <Directory /> ... AllowOverride None ... </Directory>
-
禁止访问文件系统根目录
<Directory /> ... Require all denied ... </Directory>
-
文件权限:Apache目录上的权限应该为755
-
隐藏版本号
ServerSignature off
-
只允许GET/POST方法
<LimitExcept GET POST> Require all denied </LimitExcept>
-
禁止列表显示文件
<Directory /var/www/html> Options -Indexes # 禁用目录列表 </Directory> # -Indexes 表示禁用自动索引,+Indexes 表示启用
-
确保Apache用户具有无效的shell
# 检查当前apache用户的shell grep -E '^www-data|^apache' /etc/passwd # 修改apache用户的shell # Debian/Ubuntu(用户通常是 www-data) sudo usermod -s /usr/sbin/nologin www-data # RHEL/CentOS(用户通常是 apache) sudo usermod -s /usr/sbin/nologin apache
常用无效shell选项
Shell 路径 说明 /usr/sbin/nologin
显示 "This account is currently not available." /bin/false
直接退出,无提示 /sbin/nologin
类似 nologin
,但某些系统可能没有
安全设备
IDS
-
功能:监控网络或主机流量,检测异常行为(如攻击、恶意软件)并报警,但不主动阻断
-
分类
- 网络入侵检测系统(NIDS): 监测整个网络上的流量,检测与已知攻击模式相匹配的活动。
- 主机入侵检测系统(HIDS): 安装在单个主机上,监测该主机上的活动,以检测是否有异常或潜在的入侵。
- 基于协议的入侵检测系统: 关注网络协议的使用,检测是否存在协议级别的异常活动。
- 基于应用协议的入侵检测系统: 专注于检测与特定应用程序协议相关的入侵行为。
- 混合入侵检测系统: 结合了多种入侵检测技术,以提高检测的准确性和全面性。
-
部署位置
- 旁路部署(核心交换机或防火墙旁,不影响网络性能)
- 关键网段(如财务部、服务器群)
- 广域网中枢(检测骨干网络攻击)
IPS
-
功能:IPS在IDS基础上增加主动阻断能力,可实时拦截攻击(如DDoS、漏洞利用)
-
部署位置
- 串联部署(防火墙后,在线阻断恶意流量)
- 主机层面(HIPS,保护关键服务器)
- 网络关键路径(如数据中心入口)
态势感知
-
功能:通过大数据分析全网流量、日志和威胁情报,提供可视化安全态势,辅助决策
-
部署位置
- 核心交换机或数据中心(全面采集流量)
- 云端或SOC中心(集中管理多分支安全数据)
防火墙
-
功能:防火墙是网络安全的基础设备,主要用于控制网络流量的进出,基于预定义的规则(如IP地址、端口、协议)允许或拒绝数据包传输,保护内部网络免受外部攻击
-
部署位置
- 网络边界(如企业内网与互联网之间)
- DMZ区域(用于保护对外服务的服务器,如Web、FTP服务器)
- 内部子网之间(如财务部与研发部网络隔离)
- 云端环境(云防火墙保护云资源)
-
下一代防火墙:NGFW在传统防火墙基础上增加了应用层(L7)检测、入侵防御(IPS)、用户身份识别、SSL解密等高级功能,能识别并控制具体应用(如区分微信和HTTP流量)
堡垒机
-
功能:集中管理运维访问权限,审计操作(如SSH、RDP),防止内部越权或外部入侵
-
部署位置
- 内网核心节点(如数据中心入口)
- 高可用(HA)模式(主备部署避免单点故障)
- 云环境(保护云服务器运维通道)
Webshell
处理方法
-
排查可能存在的webshell文件
find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\('
-
日志检测:使用 webshell 一般不会在系统日志中留下记录,但是会在网站的 web 日志中留下 webshell 页面的访问数据和数据提交记录
-
及时隔离主机
-
定位事件范围,查看文件 webshell 文件的创建时间,对 webshell 取证样本
-
通过创建时间结合日志分析可疑行为,以及启动用户的其他进程确定漏洞
-
清除 webshell 及残留文件,修复漏洞
-
攻击者通过webshell获得命令执行权限后,可能还设置了定时任务、启动项、ssh连接的公钥文件。所以还需要对这些问题进行排查
流量特征
-
中国菜刀:默认采用base64编码,其默认参数是Z0
-
蚁剑
- Antsword源代码参照中国菜刀,所以许多特征相似,但是Antsword可以进行更多加密,编码混淆处理,默认明文传输。
- 它最大的特征是存在
ini_set("display_erros","0")
字符串特征,该代码可以抑制PHP错误显示。 - 默认情况下,User-Agent为antsword,但是可以通过修改
/modules/request.js
文件进行自定义。 - 部分编码模式下,参数名可能以
0x
开头(如0x加密数据
),这也是蚁剑流量的一个潜在特征
-
冰蝎
-
冰蝎采用加密方式进行通信,加密密钥由攻击者自定义,隐蔽性高,难以检测
-
会话中发送的请求头和响应头是固定的
-
Content-type固定,但是作为特征检测可能会高误报: Application/x-www-form-urlencoded
-
冰蝎生成的php服务端webshell中存在固定代码
$post=Decrypt(file_get_contents("php://input"));
-
常见端口漏洞
数据库类(弱口令)
- 1433:MSSQL
- 1521:Oracle
- 3306:Mysql
- 5432:PostgreSQL
特殊服务类(未授权)
- 443:ssl 心脏滴血
- 873:Rsync 未授权
- 5984:CouchDB http://xxx:5984/_utils/
- 6379:Redis 未授权
- 7001、7002:Weblogic 默认弱口令
- 8088:Hadoop Yarn 资源管理系统 REST API 存在未授权
- 8161:Apache ActiveMQ 未授权、弱口令,put 文件上传,move 文件移动
- 9200、9300:elasticsearch 命令执行
- 11211:Memcache 未授权,telnet ip 就可以获得服务器敏感信息
- 27017、27018:Mongodb 未授权
- 50000:SAP 命令执行
- 50070、50030 Hadoop 未授权访问
常用端口类(弱口令)
- 21:FTP 弱口令,匿名 anonymous/空登录,以及 ms12-073
- 25:SMTP 简单邮件传输服务器端口
- 23:Telnet 的端口,Telnet 是一种可以远程登录并管理远程机器的服务
- 22:ssh 端口,PcAnywhere 建立 TCP 和这一端口的连接可能是为了寻找 ssh,这一服务有许多弱点
- 53:dns 端口
- 139:属于 TCP 协议,是为 NetBIOS Session Service 提供的,主要提供 Windows 文件和打印机共享以及 Unix 中的 Samba 服务
- 445:网络共享 smb 服务,尝试利用 ms08067,ms17010 等以及 IPC$ 攻击手段
- 2601、2604:zebra 路由,默认密码 zebra
日志分析
-
定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
-
定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
-
爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print"$1\n";}'|uniq -c|sort -nr
-
登录成功的IP有哪些
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more 登录成功的日期、用户名、IP: grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
加固方法
暴力破解
- 增加验证码验证
- 修改密码设置规则,提高用户密码强度
- 限制登录尝试次数
- 定期检查弱口令
- 增加MFA二次验证
SQL注入
-
对用户输入的特殊字符进行转义和过滤
-
使用SQL预编译技术,该方法将SQL语句模板和数据分离,使用占位符代替实际值,要执行的SQL语句结构在预编译时已经固定,后续的参数无法改变原语句结构
-
禁止SQL上传读取文件
-- 查看当前文件权限 SHOW VARIABLES LIKE 'secure_file_priv'; -- 配置my.cnf/my.ini [mysqld] secure_file_priv = "" -- 完全禁止文件操作 # 或指定特定目录 secure_file_priv = '/var/lib/mysql-files/'
-
移除数据库某用户的文件操作权限
-- 移除plugin_dir中的危险插件 -- 禁用SELECT INTO OUTFILE REVOKE FILE ON *.* FROM 'app_user'@'%';
XSS攻击
-
输入验证,过滤敏感字符和标签
-
输出编码,对输出到前端的特殊字符进行HTML编码
-
HTTP安全头
# 如果检测到XSS攻击,浏览器会阻止页面加载 X-XSS-Protection: 1; mode=block # 防止浏览器将非JS文件当作JS执行 X-Content-Type-Options: nosniff # HttpOnly 和 Secure Cookie # HttpOnly:防止JS读取Cookie(防止XSS窃取会话) # Secure:仅HTTPS传输Cookie # SameSite=Strict:防止CSRF攻击 Set-Cookie: sessionId=123; HttpOnly; Secure; SameSite=Strict
CSRF
- 验证码,对关键业务增加MFA二次验证
- 在页面添加CSRF Token,只有用户在真正的网页上正确位置点击发送的请求才会带上CSRF Token,验证后即失效,每次刷新不同
- 验证HTTP Rrferer,看Referer是否来自可信域名
- 手机短信提醒
SSRF
- 校验目的地址,拒绝访问内网地址及回环地址
- 设置服务器可访问地址的白名单
- DMZ区域部署,应将所有可能处理用户提供URL的服务部署在DMZ(非军事区),与内部网络进行物理或逻辑隔离。DMZ中的服务器只允许出站连接到互联网,禁止主动向内网发起连接。同时,内网服务应配置防火墙规则,仅接受来自特定可信源的入站连接
- 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https设置URL白名单或者限制内网IP
参考
安全基线检查及部分中间件部署规范 - linuxsec - 博客园
IDS(入侵检测系统)、IPS(入侵防御系统)和防火墙到底有啥区别?_入侵检测是ips还是ids-CSDN博客
常见安全设备总结(IDS、IPS、上网行为管理、网闸、漏扫、日志审计、数据库审计、堡垒机等)_ids设备有哪些-CSDN博客