• 安全运维-如何在Kubernetes中使用注释对ingress-nginx及后端应用进行安全加固配置实践...


    关注「WeiyiGeek」公众号

    设为「特别关注」每天带你玩转网络安全运维、应用开发、物联网IOT学习!

    79a3bcd441e90ad4052cb243a4938846.jpeg


    本章目录:


    0x08 Kubernetes中ingress-nginx安全配置

    • 1.配置指定的 Ingress Class

    • 2.安全配置之强制跳转HTTPS

    • 3.安全配置之跨域访问cors

    • 4.安全配置之防止DDOS请求限流

    • 5.安全配置之请求访问白名单6.安全配置之请求访问日志记录

    • 7.安全配置之Nginx指定代理响应标头

    • 8.安全配置之Nginx禁止访问某一目录

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

    • 10.安全配置之启用SSL握手加密套件

    • 11.安全配置之启用 modsecurity waf模块


    原文地址: https://blog.weiyigeek.top/2020/5-28-588.html

    首发地址:安全运维-如何在Kubernetes中使用注释对ingress-nginx及后端应用进行安全加固配置实践


    0x08 Kubernetes中ingress-nginx安全配置

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

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

    1. $ kubectl get ingress -n web www-weiyigeek -o yaml
    2. apiVersion: networking.k8s.io/v1
    3. kind: Ingress
    4. metadata:
    5. name: blog-weiyigeek-top
    6. annotations: # ....Kubernetes 注释添加到特定的 Ingress 对象自定义其行为....
    7. nginx.ingress.kubernetes.io/rewrite-target: /
    8. labels:
    9. app: blog
    10. ref: blog.weiyigeek.top
    11. spec:
    12. ingressClassName: nginx # 关键点
    13. rules:
    14. - host: weiyigeek.top
    15. http:
    16. paths:
    17. - backend:
    18. service:
    19. name: blog
    20. port:
    21. number: 8080
    22. path: /
    23. pathType: ImplementationSpecific

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

    示例:

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

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

    示例:

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

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

    示例:

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

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

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

    示例:

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

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

    示例:

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

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

    示例:

    1. metadata:
    2. annotations: # 用于插入 server 块中的代码段
    3. nginx.ingress.kubernetes.io/server-snippet: |
    4. # 隐藏nginx版本
    5. server_tokens off;
    6. # Frame 安全控制 添加 X-Frame-Options 头
    7. add_header X-Frame-Options SAMEORIGIN;
    8. # MIME 模拟探测 、XXS-Protection、Spider Robots 爬取策略限制
    9. more_set_headers 'x-content-type-options: nosniff
    10. ' 'x-xss-protection: 1; mode=block' 'X-Robots-Tag: none;';
    11. # 用于插入 location 块代码段
    12. nginx.ingress.kubernetes.io/configuration-snippet: |
    13. # 自定义访问后端服务时所带头
    14. proxy_set_header My-Custom-Header $http_my_custom_header;
    15. # 将 X-FORWARDED-FOR 字段获取到外部IP带入后端服务
    16. proxy_set_header X-FORWARDED-FOR $http_X_FORWARDED_FOR;

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

    示例:

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

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

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

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

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

    示例:

    1. # 方式1.ConfigMap$ kubectl edit cm -n ingress-nginx ingress-nginx-controller
    2. apiVersion: v1
    3. data: # 指定可以用的加密套件
    4. 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"
    5. # ssl 协议
    6. ssl-protocols: "TLSv1.1 TLSv1.2 TLSv1.3"
    7. # ssl 会话复用
    8. ssl_session_cache: "shared:SSL:10m;"
    9. ssl-session-timeout: "10m"# 方式2.Annotations metadata:
    10. annotations: # 配置指定在使用 SSLv3 和 TLS 协议时,服务器密码应优先于客户端密码。
    11. nginx.ingress.kubernetes.io/ssl-prefer-server-ciphers: "true"
    12. # 指定加密套件
    13. 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. # 方式1.ConfigMap$ kubectl edit cm -n ingress-nginx ingress-nginx-controller
    2. apiVersion: v1
    3. data: # 启用 modsecurity waf模块拦截常规Web攻击
    4. enable-modsecurity: "true"# 方式2.Annotations metadata:
    5. annotations: # 启用 modsecurity
    6. nginx.ingress.kubernetes.io/enable-modsecurity: "true"
    7. # 设置以下注释来启用 OWASP 核心规则集
    8. nginx.ingress.kubernetes.io/enable-owasp-core-rules: "true"
    9. # 设置以下内容从nginx传递事务ID
    10. nginx.ingress.kubernetes.io/modsecurity-transaction-id: "$request_id"
    11. # 通过代码段添加自己的一组 modsecurity 规则:
    12. nginx.ingress.kubernetes.io/modsecurity-snippet: |
    13. Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
    14. SecRuleEngine On
    15. SecDebugLog /tmp/modsec_debug.log

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

    本文至此完毕,更多技术文章,尽情期待下一章节!


    原文地址: https://blog.weiyigeek.top/2020/5-28-588.html


    197e8a88ba6f23a6633c902f2431d1f3.png 往期相关文章fb472a056091b50d3f6f5afcaf3309ba.png

    如何在 Kubernetes 中进行 ingress-nginx 配置优化以及HTTP请求速率限制

    如何配置Kubernetes仪表板dashboard支持http方式并使用ingress-nginx代理访问实践

    Kubernetes中Ingress-nginx如何获取真实客户端IP?防止X-Forwarded-For伪造


    企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳实践指南

    运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现

    工作效率-十五分钟让你快速入门学习Markdown语法到精通排版实践(备忘录)

    运维实践-使用WebP Server Go无缝转换图片为Google的webp格式让你网站访问加载速度飞起来


    企业运维实践-如何在K8S集群环境Gitlab+Jenkins+Jmeter+Grafana技术中实现自动化分布压力测试数据展示

    如何使用Grafana+Loki+Promtail日志聚合系统针对Kubernetes集群中Pods应用日志采集搜索展示

    还不会部署高可用的kubernetes集群?企业DevOps实践之使用kubeadm方式安装高可用k8s集群v1.23.7

    4a458d8ff9b71dbbf6301065f17bfd73.png


    欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】或者个人公众号【WeiyiGeek】联系我。

    更多文章来源于【WeiyiGeek Blog 个人博客 - 为了能到远方,脚下的每一步都不能少 】

    个人主页: 【 https://weiyigeek.top】

    博客地址: 【 https://blog.weiyigeek.top 】

     

    专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。

    • echo  "【点个赞】,动动你那粗壮的拇指或者芊芊玉手,亲!"

    • printf("%s", "【投个币】,万水千山总是情,投个硬币行不行,亲!")

    • fmt.Printf("【收个藏】,阅后即焚不吃灰,亲!")  

    • console.info("【转个发】,让更多的志同道合的朋友一起学习交流,亲!")

    • System.out.println("【关个注】,后续浏览查看不迷路哟,亲!")

    • cout << "【留个言】,文章写得好不好、有没有错误,一定要留言哟,亲! " << endl;

    ed37ebf7685ecc13b78dcac3db2e22dc.gif

    更多网络安全、系统运维、应用开发、物联网实战、全栈文章,尽在【个人博客 - https://blog.weiyigeek.top】站点,谢谢支持!

        帅哥、美女、大佬们点个【赞+在看】吧! 👇

    ↓👇↓ 点击【"阅读原文"】,即可获取更多知识!

  • 相关阅读:
    深入了解HarmonyOS(鸿蒙操作系统)
    django表单的使用说明
    Docker Desktop 可以直接启用Kubernetes 1.25 了
    云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
    前端拿到url地址拼接的参数
    Oracle/PLSQL: Remainder Function
    QT 实现 TCP 客户端服务器代码
    Springboot+vue4S店车辆管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
    AI 腾讯云人脸核身之独立H5接入
    Mobx 数据通信
  • 原文地址:https://blog.csdn.net/u013072756/article/details/126357749