背景1. 业务安全,业务上线运行要分配主机、网络、域名等资源,这些资源安全性决定了其背后业务线的基本安全性。 2. 为了满足等保要求,安全合规。 3. 业务能不能安全运行,间接影响产品稳定性。
运维交付安全基线检查时业务运行安全的安全底座,下面我们来看看从主机、代理、逻辑、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. nginxnginx是流量的出入口,也是接近用户较近的一层,这一层的安全也至关重要,最好独立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. mysqlMysql 交付检查项: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/ACLa. 一条业务线一个VPC,特殊场景可以增加VPC b. VPC 和其他VPC 不能打通 c. ACL 出入默认拒绝所有协议 d. ACL 精细化控制出入协议 e. VPC 只和必要的基础设施VPC 打通,只放心部分流量或者单向放行,比如监控、日志搜集、salt-master等 f. 所有规则要有明确清晰的备注 总结上述运维交付安全检查点,可以集成到机器初始化,模块初始化和CICD中完成。然后让自动化来帮我们做二次的检查,给出检查报告。 安全无小事,所以在业务上线前,我们要把好关,把安全问题消灭在事故前。
|