Drollery Medieval drollery of a knight on a horse

🏆 欢迎来到本站: https://xuchangwei.com/希望这里有你感兴趣的内容

flowery border with man falling
flowery border with man falling

Linux: 入侵防御

IPS

初级安全防护

  • IDS/IPS:入侵检测/入侵防护(Intrusion Detection System/Intrusion Prevention System),主机层防护。虽然IPS即可以入侵检测也可以入侵防护,但有的业务场景不需要入侵防护,所有会有IDS

开启 CSP 内容安全策略

主要操作:

  1. 明确域名下各目录路径资源,查找对应要访问的域名和协议 主要:
  2. 执行。可能有用多种方式,如 header 中添加、代码中添加
  3. 验证
    • 添加 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 头部中指明的原始策略。

参考: CSP logging with nginx

开启 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

网站评级:https://www.ssllabs.com/

清除浏览器 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;