来源: DevOpSec公众号 作者: DevOpSec
背景
业务安全,业务上线运行要分配主机、网络、域名等资源,这些资源安全性决定了其背后业务线的基本安全性。
为了满足等保要求,安全合规。
业务能不能安全运行,间接影响产品稳定性。
运维交付安全基线检查时业务运行安全的安全底座,下面我们来看看从主机、代理、逻辑、db、网络等层面如何做交付前基线检查。
检查方向
主机层面
主机层面的安全是相对来说基础的,业务程序在主机上运行,如果主机安全做不好,业务程序安全性何从谈起,我们从以下几点来聊聊主键安全怎么做,主要是一些配置。
1. ssh安全设置
a. sshd timeout配置 设置闲置会话超时时间,防止有人利用已经登录的ssh 客户端做坏事。
# 探活周期和探活最大次数,此处为150min
grep -i ClientAlive /etc/ssh/sshd_config
ClientAliveInterval 30
ClientAliveCountMax 5
b. sshd 连接缓慢,优化sshd链接速度
grep -iE "GSSAPIAuthentication|UseDNS" /etc/ssh/sshd_config
GSSAPIAuthentication no
UseDNS no
c. sshd禁止转发,防止有人把线上服务通过ssh代理出去
grep -iE "AllowAgentForwarding|AllowTcpForwarding|GatewayPorts|X11Forwarding" /etc/ssh/sshd_config
AllowAgentForwarding no
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
d. 登录保护 登录失败限制,比如失败3次锁定5分钟
# 默认的锁定时间,如果,指定,需要加 unlock_time=300
# grep "password requisite" /etc/pam.d/system-auth
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
e. 密码长度限制(至少8位包含大小写、特殊字符、数字)
# lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1, < 0 复杂密码最少出现次数, >0最多出现次数
# grep "password requisite" /etc/pam.d/system-auth
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
f. 22号端口或者修改sshd端口,只允许跳板机连接
连接线上服务器都通过跳板机连接,服务器22号端口只允许跳板机ip来连接
ssh先关的配置基本上说完了,注意:机器不要有外网ip,机器不要有外网ip,机器不要有外网ip,重要事情说三遍。怎么去外网ip请见之前写的文章 解决运维痛点服务器去外网ip
2. 审计日志
主机的日志审计包括:操作日志、登录日志/var/log/secure
、系统运行日志/var/log/message
,跳板机(比如:jumpserver
)有操作日志记录,这些日志要保留180天以上。
或者通过如下方式记录操作日志
1. /etc/bashrc 配置
....
#Variable for login user
source /tmp/$(who am i |awk '{print $2}' |sed 's#/#_#g') &>/dev/null
#Variable for commands recording
export PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}";RETRN_VAL=$?;logger -p local6.debug "$(who am i |awk "{print \$1\" \"\$2\" \"\$3\" \"\$4\" \"\$5}") [$USER] [`whoami`] [$$] [`pwd`] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
2. /etc/rsyslog.conf 配置
...
#记录远程一份
local6.* @xxx.xxx.xxx.xxx:514
#记录本地一份
local6.* /var/opt/opt.txt
注意:本地一份远程一份,防止被黑日志被清理。
3. HIDS部署
HIDS
入侵检测系统,用于安全检查、安全策略执行、可见性和合规性监控。
如果是云厂商可以使用云厂商的HIDS产品,比如阿里云安骑士
、腾讯云的云镜
,还有开源的
OSSEC
4. 主机监控
主机监控检查各种agent
端有没有启动,常规的主机基础监控、网络流量监控等。
5. 其他
a. 外联其他服务端口限制
限制外联端口,方便ACL时做网络流量控制
sysctl net.ipv4.ip_local_port_range # 结果应该是 40000 65000
b. 注:k8s node 是否开启 net.ipv4.ip_forward,非k8s node禁止开启
c. DNS 配置是否正确 检查主机dns配置文件是否是期望的
cat /etc/resolv.conf
options timeout:2
nameserver your-dns-ip1
nameserver your-dns-ip2
nameserver your-dns-ip3
代理层
1. nginx
nginx是流量的出入口,也是接近用户较近的一层,这一层的安全也至关重要,最好独立VPC
部署,针对nginx的交付检查如下:
a. 是否独立VPC VPC的策略是否最小化访问后端服务
b. 日志记录request header和response body,方便定位问题
执行:cat /apps/nginx/conf/nginx.conf|grep your_log_fromat|grep -E 'resp_body|request_body'
确认:log_fromat your_log_fromat 包含:$request_body 和 $resp_body
c. nginx 启动用户非root
执行:cat /apps/nginx/conf/nginx.conf | grep user
返回:user www;
执行:cat /etc/passwd | grep www
返回:www:x:1000:1000::/home/www:/sbin/nologin
d. 进程监听地址不要绑定 0.0.0.0
执行:
pid=$(ps aux | grep nginx | grep master | awk '{print $2}') && netstat -ntpl | grep $pid
返回:非0.0.0.0监听
e. 最小化编译nginx,configure -V 每个模块为什么需要,要搞清楚
f. 是否隐藏nginx 标识和版本
执行:cat /apps/nginx/conf/nginx.conf | grep server_token
返回:server_tokens off;
g. nginx是否配置waf设置,如果你有waf这里交付检查要加上
f. 全站https配置,禁用TLS 1.0 和 1.1
执行如下命令检查是否禁用
nmap --script ssl-enum-ciphers -p 443 your.domain.com
h. ngnx访问日志保留180天以上
日志是否保留180天(日志要能体现remote addr 、访问资源、认证的用户信息如果有)
更多nginx安全相关的配置,请见之前的文章 史上最全nginx 安装升级安全配置
2. 增加域名,检查域名的漏洞报告
增加域名这里,必须是https访问,禁用TLS 1.0 和 1.1 ,域名要上线需要给出域名的漏洞扫描报告方可上线。 开源web漏洞扫描工具有:WASP Zap
、OpenVAS
,Nikto
等。
逻辑层
1. 增加进程
进程检查方面注意:
a. 进程非root用户启动
b. 进程的管理配置不能对外暴露,比如tomcat的管理url
c. 进程通过nessus
扫描后,方可上线
db层
1. mysql
Mysql 交付检查项: a. 是否设置密码
mysql -hlocalhost -uroot -p
显示ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO),则表示root设置了密码
b. 是否有空口令
在mysql内执行:
select user,host,password from mysql.user;
如果password列有空值,则表示有空口令
c. 密码长度限制(至少8位包含大小写、特殊字符、数字)
d. 是否非root启动,且此用户的shell为 /sbin/nologin
ps aux|grep mysql
cat /etc/passwd | grep xxx #xxx为启动mysql的用户
e. 进程非绑定0.0.0.0
netstat -nulpt|grep 3306|grep -v '0.0.0.0' 执行是否有值
f. 是否禁止外网ip
ping www.baidu.com #检查是否ping 通
g. 是否有设置备份
查看离线库是否有备份脚本
检查是否有备份定时任务 crontab -l |grep backup_mysql
h. 监控相关检查
mysql exporter 是否安装
慢查询日志是否到远端,比如filebeat进程是否启动
主动同步告警、连接数过高告警
i. 是否有慢查询kill应急脚本
检查kill慢查询脚本或者工具pt-kill是否存在
注:可以设置max_execution_time
和 max_allowed_packet
来保护mysql的稳定性。
如果有其他db相关的安全检查可以参考mysql的检查项
网络层
边界安全
1. 防火墙的检查
a. 默认拒绝所有
b. 只允许知道的端口出去
c. 对外部开放端口需要经过审批通过后方可增加策略
d. 所有规则要有明确清晰的备注
2. 网关
网关是服务器出网的出口
a. 网关出口配置白名单模式,只允许知道的流量出去
b. 所有规则要有明确清晰的备注
3. VPC/ACL
a. 一条业务线一个VPC,特殊场景可以增加VPC
b. VPC
和其他VPC
不能打通
c. ACL
出入默认拒绝所有协议
d. ACL
精细化控制出入协议
e. VPC
只和必要的基础设施VPC
打通,只放心部分流量或者单向放行,比如监控、日志搜集、salt-master等
f. 所有规则要有明确清晰的备注
总结
上述运维交付安全检查点,可以集成到机器初始化,模块初始化和CICD中完成。然后让自动化来帮我们做二次的检查,给出检查报告。
安全无小事,所以在业务上线前,我们要把好关,把安全问题消灭在事故前。