安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客


本文由 简悦 SimpRead 转码, 原文地址 blog.51cto.com

关注「WeiyiGeek」公众号

本章目录:


0x08 Kubernetes 中 ingress-nginx 安全配置

    1. 配置指定的 Ingress Class
    1. 安全配置之强制跳转 HTTPS
    1. 安全配置之跨域访问 cors
    1. 安全配置之防止 DDOS 请求限流
    1. 安全配置之请求访问白名单 6. 安全配置之请求访问日志记录
    1. 安全配置之 Nginx 指定代理响应标头
    1. 安全配置之 Nginx 禁止访问某一目录
    1. 安全配置之请求访问认证
    1. 安全配置之启用 SSL 握手加密套件
    1. 安全配置之启用 modsecurity waf 模块


0x08 Kubernetes 中 ingress-nginx 安全配置

描述: 在 K8s 集群中部署安装 ingress-nginx 后默认并未根据应用安全需要进行相应的安全配置,本小结将针对于生产环境的中的 ingress-nginx 控制器以及应用常见进行安全安全配置。

1. 配置指定的 Ingress Class
描述: 如果一个 K8S 集群中部署了多个 ingress controller 时,我们可以在创建 ingress 的时候,通过 ingressClassName 指定 ingress class,如下所示:

$ kubectl get ingress -n web www-weiyigeek -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: blog-weiyigeek-top
 annotations:    # ....Kubernetes 注释添加到特定的 Ingress 对象自定义其行为....
    nginx.ingress.kubernetes.io/rewrite-target: /
 labels:
 app: blog
 ref: blog.weiyigeek.top
spec:
 ingressClassName: nginx  # 关键点
 rules:
 - host: weiyigeek.top
 http:
 paths:
 - backend:
 service:
 name: blog
 port:
 number: 8080
 path: /
 pathType: ImplementationSpecific

2. 安全配置之强制跳转 HTTPS
描述: 通过这个 annotation 可以强制 https,如果是 http 请求,会通过 308 redirect 到 https.

示例:

metadata:
  annotations:    # 通过重定向实施服务器端 HTTPS
# 启用了TLS,则控制器会将 (308) 重定向到 HTTPS
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
# 强制重定向到 HTTPS 
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
# 保留 URI 中的尾部斜杠
    redirectnginx.ingress.kubernetes.io/preserve-trailing-slash: "true"

3. 安全配置之跨域访问 cors
描述: 当将 Ingress-Nginx 作为 API 网关,必须进行跨域配置否则会对业务造成影响,例如我们公司的 CDN 业务必须设置跨域方面配置。

示例:

metadata:
  annotations:    # 启用cors跨域 (字面意义)
    nginx.ingress.kubernetes.io/enable-cors: "true"
# 设置控制 CORS 的可接受来源,遵循以下格式 http(s)://origin-site.com[:port]
    nginx.ingress.kubernetes.io/cors-allow-origin:"https://*.weiyigeek.top"
# 设置支持跨域请求的方法 (GET, PUT, POST, DELETE, PATCH, OPTIONS)
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, OPTIONS"
# 设置支持跨域请求的标头 (DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization)
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For, X-App-Weiyigeek"
# 设置支持响应公开那些指定表头 
    nginx.ingress.kubernetes.io/cors-expose-headers: "*, X-CustomResponseHeader"
# 设置在 CORS 操作期间传递凭据 (为了安全设置false除非业务确实需要)
    nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
# 设置控制可以缓存预检请求的时间长度 1728000
    nginx.ingress.kubernetes.io/cors-max-age: 600

4. 安全配置之防止 DDOS 请求限流
描述: 通常针对于文件下载服务器我们需要进行一系列的配置, 我们可以通过 rps 限制每秒请求数,rpm 限制每分钟请求数,connections 限制连接数, 如若超过将返回 503 。

示例:

metadata:
  annotations:    # 每分钟从给定 IP 接受的请求数。突发流量限制设置为此限制乘以突发乘数,默认乘数为 5。(顺序3)
    nginx.ingress.kubernetes.io/limit-rps: "5"
# 每秒从给定 IP 接受的请求数,突发流量限制设置为此限制乘以突发乘数,默认乘数为 5。(顺序2)
    nginx.ingress.kubernetes.io/limit-rpm: "300"
# 允许来自单个 IP 地址的并发连接数,超过此限制时返回 503 错误。(顺序1)
    nginx.ingress.kubernetes.io/limit-connections: "10"
# 突发大小限制速率的乘数。默认突发乘数为 5
    nginx.ingress.kubernetes.io/limit-burst-multiplier:"5"
# 配置白名单不受速率限制。(局部)
    nginx.ingress.kubernetes.io/limit-whitelist: "10.0.0.0/24,172.10.0.1"

5. 安全配置之请求访问白名单

描述: 配置白名单比黑名单更加安全,与最小所需权限一样,主要是用于安全限制,只允许特定的客户端请求,但由于现在网络中 NAT 的广泛应用,但是参数使用的场景比较有限,例如针对于内网采集监控服务调用,即将其访问请求 IP 加入到白名单中,才不受安全策略限制影响。

示例:

metadata:
  annotations:# 通过注释指定允许的客户端 IP 源范围,该值是以逗号分隔的CIDR列表。(全局)
    ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/24,172.10.0.1"

6. 安全配置之请求访问日志记录
描述: 为了等保合规通常需要将各类日志存储 180 天及以上,所以 ingress 也是非常重要,当业务被攻击时我们可以快速溯源追踪,以及其行为分析。

示例:

metadata:
  annotations:    # 启用访问日志,默认情况处于启用状态.但在某些情况下可能需要为给定入口禁用访问日志设置为False即可。
    nginx.ingress.kubernetes.io/enable-access-log: "true"
# 启用重写日志,默认情况处于未启用状态,如启用重写日志在通知级别发送到error_log文件。
    nginx.ingress.kubernetes.io/enable-rewrite-log: "true"

7. 安全配置之 Nginx 指定代理响应标头
描述: 在使用 ingress-nginx 场景中免不了配置使用代理或响应表头,例如常见的​​​X-Frame-Options​​规定了允许那些站点嵌入配置目标 iframe 站点。

示例:

metadata:
  annotations:    # 用于插入 server 块中的代码段
    nginx.ingress.kubernetes.io/server-snippet: |
# 隐藏nginx版本
      server_tokens off;
# Frame 安全控制 添加 X-Frame-Options 头
      add_header X-Frame-Options SAMEORIGIN;
# MIME 模拟探测 、XXS-Protection、Spider Robots 爬取策略限制
      more_set_headers 'x-content-type-options: nosniff
' 'x-xss-protection: 1; mode=block' 'X-Robots-Tag: none;';

# 用于插入 location 块代码段
    nginx.ingress.kubernetes.io/configuration-snippet: |
# 自定义访问后端服务时所带头
      proxy_set_header My-Custom-Header $http_my_custom_header;
# 将 X-FORWARDED-FOR 字段获取到外部IP带入后端服务
      proxy_set_header X-FORWARDED-FOR $http_X_FORWARDED_FOR;

8. 安全配置之 Nginx 禁止访问某一目录
描述: 在使用 ingress-nginx 场景中,如何禁止客户端访问 ingress 站点某一目录下的所有资源,我们可以配置 server-snippet 注释,例如。

示例:

metadata:
  annotations:    # 用于插入 server 块中的代码段,禁止访问 站点的 /itwork/ 目录下资源
    nginx.ingress.kubernetes.io/server-snippet: |
      location /itwork/ { deny all;return 403;}

9. 安全配置之请求访问认证

描述: 针对于某些未有认证的 API 接口应用,可以通过在 Ingress 规则中添加额外的注释来添加身份验证。

metadata:
  annotations:    # 认证类型 [basic|digest]
    nginx.ingress.kubernetes.io/auth-type: 
# 包含用户/密码定义的密码的名称,使用configMap存储htpasswd生成热认证
# $ htpasswd -c auth weiyigee
# $ kubectl create secret generic basic-auth --from-file=auth
    nginx.ingress.kubernetes.io/auth-secret: basic-auth    # 认证密钥有两种形式:
# auth-secret 默认,密钥中的 htpasswd 文件位于密钥中auth
# auth-map 密钥是用户名,值是散列密码
    nginx.ingress.kubernetes.io/auth-secret-type:auth-file    # 设置认证提示
    nginx.ingress.kubernetes.io/auth-realm: "身份认证"

10. 安全配置之启用 SSL 握手加密套件
描述: 通常为了应用安全我们会为其添加证书,但是一些已知脆弱性的 SSL 加密方式会影响到应用信息安全,例如 RC4 与 MD5 等

示例:

# 方式1.ConfigMap$ kubectl edit cm -n ingress-nginx ingress-nginx-controller
apiVersion: v1
data:  # 指定可以用的加密套件 
  ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4"
# ssl 协议
  ssl-protocols: "TLSv1.1 TLSv1.2 TLSv1.3"
# ssl 会话复用
  ssl_session_cache: "shared:SSL:10m;"
  ssl-session-timeout: "10m"# 方式2.Annotations metadata:
  annotations:    # 配置指定在使用 SSLv3 和 TLS 协议时,服务器密码应优先于客户端密码。
    nginx.ingress.kubernetes.io/ssl-prefer-server-ciphers: "true"
# 指定加密套件
    nginx.ingress.kubernetes.io/ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;"

11. 安全配置之启用 modsecurity waf 模块
描述: ModSecurity (http://modsecurity.org/) 是一个开源的 Web Application 防火墙, 可以为一组特定的入口位置启用它。必须首先通过在 ConfigMap 中启用 ModSecurity 来启用 ModSecurity 模块。

请注意,这将为所有路径启用 ModSecurity,并且必须手动禁用每个路径。

# 方式1.ConfigMap$ kubectl edit cm -n ingress-nginx ingress-nginx-controller
apiVersion: v1
data:  # 启用 modsecurity waf模块拦截常规Web攻击
  enable-modsecurity: "true"# 方式2.Annotations metadata:
  annotations:    # 启用 modsecurity
    nginx.ingress.kubernetes.io/enable-modsecurity: "true"
# 设置以下注释来启用 OWASP 核心规则集
    nginx.ingress.kubernetes.io/enable-owasp-core-rules: "true"
# 设置以下内容从nginx传递事务ID
    nginx.ingress.kubernetes.io/modsecurity-transaction-id: "$request_id"
# 通过代码段添加自己的一组 modsecurity 规则:
    nginx.ingress.kubernetes.io/modsecurity-snippet: |
      Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf

      SecRuleEngine On
      SecDebugLog /tmp/modsec_debug.log

OWASP 核心规则集 :https://www.modsecurity.org/CRS/Documentation/
建议的配置参考 :https://github.com/SpiderLabs/ModSecurity/blob/v3/master/modsecurity.conf-recommended


幻翼 2023年9月21日 11:41 收藏文档