K8s Ingress个性化拦截配置
本文描述如何通过修改K8s的Ingressyaml配置文件对服务请求进行一些简单的过滤(访问路径、携带参数等)
0 前情提要
响应国家护网行动,项目需要进行网络安全加固。在渗透测试对 k8s部署的gitlab 扫描中出现了几个问题:
- js.map 文件暴露
- SQL盲注问题
- 部分系统文件暴露问题
需要在不升级gitlab的情况下,对这部分问题进行紧急修复(项目ldap插件适配问题)。这个时候可以通过修改ingress的yaml配置,对问题进行一定程度的解决。
原始ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gitlab-ingress
namespace: gitlab
spec:
rules:
- host: gitlab.xxx.com.cn
http:
paths:
- backend:
serviceName: gitlab
servicePort: 80
path: /
tls:
- hosts:
- gitlab.xxx.com.cn
secretName: xxx.com.cn
1 路径、文件访问拦截
1.1 问题描述
用于解决文件或路径暴露问题。
- 漏洞类型:信息泄露问题
- 漏洞描述:在页面响应中发现系统路径,该路径会泄露程序安装的绝对位置,泄露系统业务目录结构。
1.2 Ingress配置
方法一:通过添加backend,将域名下的目标路径定位到不存在服务的或者新自定义的错误提示后端服务中。
- 方法一 ingress示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gitlab-ingress
namespace: gitlab
spec:
rules:
- host: gitlab.xxx.com.cn
http:
paths:
- backend:
serviceName: gitlab
servicePort: 80
path: /
- backend:
serviceName: gitlab-deny
servicePort: 80
path: /demo/spring-boot-demo/commit/
- backend:
serviceName: gitlab-deny
servicePort: 80
path: /explore/projects/
- backend:
serviceName: gitlab-deny
servicePort: 80
path: /help/
tls:
- hosts:
- gitlab.xxx.com.cn
secretName: xxx.com.cn
注意:在rules.http.paths 下方追加了要拦截的路径到新的backend中。这些要拦截的路径指向的backend均不存在(gitlab-deny)。此方法为K8s官方文档推荐。
方法二:通过 nginx.ingress.kubernetes.io/configuration-snippet 参数,将nginx配置注入服务ingress的Nginx对应的server配置中
- 方法二 ingress示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
location ~* \.(map)$ {
deny all;
}
name: gitlab-ingress
namespace: gitlab
spec:
rules:
- host: gitlab.xxx.com.cn
http:
paths:
- backend:
serviceName: gitlab
servicePort: 80
path: /
tls:
- hosts:
- gitlab.xxx.com.cn
secretName: xxx.com.cn
注意:在 metadata.annotations 下追加了 nginx.ingress.kubernetes.io/configuration-snippet 参数,在参数里添加通常nginx写在server下的过滤配置即可。要注意左侧的空格问题,否则会报错。
方法一和方法二可以混用,配置相同的拦截情况下,会优先判定方法二的配置
2 SQL注入拦截
2.1 问题描述
用于解决SQL盲注问题。由于无法修改后端代码,通过Ingress配置进行请求过滤
- 漏洞类型:SQL注入
- 漏洞描述:SQL 注入攻击指的是通过构建特殊的输入作为参数传入网站应用程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操作,其主要原因是网站应用程序没有细致地过滤用户输入的数据,致使恶意用户可以构造非法数据侵入系统。具体来说,它是利用现有应用程序,将恶意的 SQL 语句注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入恶意 SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。
攻击者利用 SQL 注入漏洞,可以访问或者修改数据,用来从数据库中获取,敏感信息,或者利用潜在的特征执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统的最高权限,利用数据库漏洞进行攻击。
2.2 Ingress配置
在不修改服务本身的情况下,和上一个问题的方法二一样,通过 nginx.ingress.kubernetes.io/configuration-snippet 参数,将nginx配置注入服务ingress的Nginx对应的server配置中
- ingress示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($query_string ~* ('\$|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[\<|%3c]script[\>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm\(|innerhtml|innertext)(.*)$) { return 555; }
if ($uri ~* (/~).*) { return 501; }
if ($uri ~* (\\x.)) { return 501; }
if ($query_string ~* "[;'<>].*") { return 509; }
if ($request_uri ~ " ") { return 509; }
if ($request_uri ~ (\/\.+)) { return 509; } #慎加,gitlab仓库中的隐藏文件如.gitlan.ci会无法访问
if ($request_uri ~ (\.+\/)) { return 509; }
if ($request_uri ~* "(cost\()|(concat\()") { return 504; }
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]or[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]delete[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]update[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]insert[+|(%20)]") { return 504; }
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { return 505; }
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
if ($query_string ~ "proc/self/environ") { return 505; }
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { return 505; }
if ($query_string ~ "base64_(en|de)code\(.*\)") { return 505; }
if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 506; }
if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { return 506; }
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { return 506; }
name: gitlab-ingress
namespace: gitlab
spec:
rules:
- host: gitlab.xxx.com.cn
http:
paths:
- backend:
serviceName: gitlab
servicePort: 80
path: /
tls:
- hosts:
- gitlab.xxx.com.cn
secretName: xxx.com.cn
注意:本质上就是添加Nginx server{}下的配置,理论上可以实现任何可以通过Nginx.conf文件 server{}下配置 实现的需求
参考链接
SQL 注入拦截Nginx配置: https://blog.csdn.net/laidanlove250/article/details/123312742