Linux: 入侵防御
- TAGS: Linux
IPS
初级安全防护
- IDS/IPS:入侵检测/入侵防护(Intrusion Detection System/Intrusion Prevention System),主机层防护。虽然IPS即可以入侵检测也可以入侵防护,但有的业务场景不需要入侵防护,所有会有IDS
开启 CSP 内容安全策略
主要操作:
- 明确域名下各目录路径资源,查找对应要访问的域名和协议 主要:
- 执行。可能有用多种方式,如 header 中添加、代码中添加
- 验证
- 添加 header方式:可通过浏览器访问验证,页面正常打开且有对应的 header头部说明策略生效
- 代码中添加:添加不在访问范围内资源验证
nginx 配置文件
add_header Report-To '{"group": "csp-reports","max_age":31536000,"endpoints":[{"url":"https://pathstaging.xxx.com/_csp/prod"}]}'; add_header Content-Security-Policy "object-src 'none';script-src 'self' 'unsafe-eval' 'unsafe-inline' https: http: *.xxx.com *.pxxx.com 39.97.xx.xx;report-uri https://pathstaging.xxx.com/_csp/prod;report-to csp-reports;";
语法说明: object-src:插件 script-src:外部脚本 'none':禁止加载任何外部资源,需要加引号 'unsafe-inline':'unsafe-inline'允许使用内联资源,如内联<script>元素,javascript:URL,内联事件处理程序和内联<style>元素。 'unsafe-eval':允许将字符串当作代码执行,比如使用eval、setTimeout、setInterval和Function等函数。
html 文件
范例:index.html
<meta http-equiv="Content-Security-Policy" content="object-src 'none';script-src 'self' 'unsafe-eval' 'unsafe-inline' https: http: *.xxx.com *.pxxx.com 39.97.xx.xx;">
参考:
nginx 中开户 CSP 日志
nginx 中网站开启 CSP
添加对应的 header 头部。report-to 在 CSP3 中取代了 report-uri。
location /path-h5/ { access_log /var/log/nginx/path_h5_access.log main; add_header Report-To '{"group": "csp-reports","max_age":31536000,"endpoints":[{"url":"https://pathstaging.xxx.com/_csp"}]}'; add_header Content-Security-Policy "object-src 'none';script-src 'self' 'unsafe-eval' 'unsafe-inline' https: http: ws: wss: *.xxx.com 39.97.xx.xx;report-uri https://pathstaging.xxx.com/_csp;report-to csp-reports;"; alias /xxx/path/path-h5/staging/; index bonus-account.html; }
nginx 中 CSP 日志配置
1.格式化日志 conf.d/csp.conf
log_format CSP escape=json '{ "date":"$time_local", "IP address":"$remote_addr", "http_x_forwarded_for":"$http_x_forwarded_for", "status":"$status", "http_user_agent":"$http_user_agent", "body_bytes_sent":"$body_bytes_sent", "request":"$request", "request_body": "$request_body"}';
sites-available/default
server { listen 443 ssl http2 default_server; server_name example.org; location = /_csp { access_log /var/log/nginx/csp.log CSP; proxy_pass http://127.0.0.1/_csp_response; } } server { listen 80 default_server; server_name example.org; # More config here location /_csp_response { access_log off; return 204; } }
2.CSP 日志报告说明
cat /var/log/nginx/csp.log | jq -r '.request_body | fromjson' [ { "age": 1, "body": { "blockedURL": "https://pathstaging.xxx.com/path-h5/js/chunk-common.6fb7c2f8.js", "disposition": "enforce", "documentURL": "https://pathstaging.xxx.com/path-h5/lucky-card.html", "effectiveDirective": "script-src-elem", "lineNumber": 1, "originalPolicy": "object-src 'none';script-src 'self' 'strict-dynamic' 'unsafe-eval' 'unsafe-inline' https: http: *.xxx.com 39.97.124.19;report-to csp-reports;", "referrer": "", "sample": "", "sourceFile": "https://pathstaging.xxx.com/path-h5/lucky-card.html", "statusCode": 200 }, "type": "csp-violation", "url": "https://pathstaging.xxx.com/path-h5/lucky-card.html", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" } ]
报告的JSON对象报告包含了以下数据:
- document-uri: 发生违规的文档的URI。
- referrer: 违规发生处的文档引用(地址)。
- blocked-uri:被CSP阻止的资源URI。如果被阻止的URI来自不同的源而非文档 URI,那么被阻止的资源URI会被删减,仅保留协议,主机和端口号。
- violated-directive: 违反的策略名称。
- original-policy: 在 Content-Security-Policy HTTP 头部中指明的原始策略。
开启 HSTS
参考:
优点:
- 比传统的302重定向更加安全,不会被劫持;
- 对访问速度有提示,302 跳转需要一个 RTT消耗,浏览器执行跳转也需要時間。
缺点:
- 使用者首次访问某网站是不受HSTS保护的。這是因为首次访问时,浏览器还未 收到HSTS,所以仍有可能通过明文HTTP來访问。
- HSTS会在一定时间段后失效,需要手动设定快取期。
HSTS Header的语法如下:
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
- max-age是必选参数,是一个以秒为单位的数值,它代表着HSTS Header的过期 时间,通常设置为1年,即31536000秒。
- includeSubDomains是可选参数,如果包含它,则意味着当前域名及其子域名 均开启HSTS保护。
- preload是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时 候才需要使用到它。通过 https://hstspreload.appspot.com/ 提交其域名。
nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;" always;
- always:表示无论哪种请求都将HSTS的头发送给客户端,也包括错误响应。默 认情况404等是不发送HSTS头的。
- 要注意 add_header 这个指令的继承方式,如果一个子配置块中设置了 add_header 指令,那么在上层配置块中的 add_header指令是不会被继承的。 如果你需要在子配置中添加额外的 add_header指令,那么有关HSTS那部分要 复制到子配置中。
ingress
# cat admin-website-ingress.yaml --- apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/proxy-body-size: 50M nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/server-snippet: | location ~* /api/actuator { deny all; } nginx.ingress.kubernetes.io/configuration-snippet: | add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;' always; more_set_headers "xxerver: hide"; name: rummy-admin-website namespace: rummy spec: rules: - host: cmsstaging.xxx.com http: paths: - backend: serviceName: rummy-admin-website servicePort: 80 path: /
验证
$ curl -kIs https://example.com | grep Strict Strict-Transport-Security: max-age=31536000; includeSubDomains
清除浏览器 HSTS 设置
https://www.ssl2buy.com/wiki/how-to-clear-hsts-settings-on-chrome-firefox-and-ie-browsers
删除Chrome中的HSTS设置
- 导航到chrome://net-internals/#hsts
- 确认Chrome记录了域名的HSTS设置,请在页面底部的查询域名部分输入主机名。如www.example.com或example.com
- 在删除域名部分中输入相同的主机名并点击
nginx 安全配置
# 防止嵌入 到frame 中;避免点击劫持*** add_header X-Frame-Options DENY ; #禁止服务器自动解析资源类型 add_header X-Content-Type-Options nosniff ; #防XSS*** add_header X-Xss-Protection 1;