セキュリティを考慮したKubernetesのNginx Ingress ControllerのIngress設定例です。
※ これが完璧な設定というわけではなく、あくまで一設定例です。
難しい設定はspecに書けないので、以下のようにannotationsに書きます。server_tokens でNginxのバージョン情報を隠してます。
さらにModSecurityを用いてWAFを構築しています。WAFのルールにはOWASPを使いつつ、自分のルールも書けるようにしています。
tlsやrulesの設定は環境に合わせて適宜修正してください。
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: myapp
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/configuration-snippet: |
server_tokens off;
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/enable-modsecurity: "true"
nginx.ingress.kubernetes.io/modsecurity-transaction-id: "$request_id"
nginx.ingress.kubernetes.io/modsecurity-snippet: |
SecRuleEngine On
SecRequestBodyAccess On
SecAuditEngine RelevantOnly
SecAuditLogParts ABIJDEFHKZ
SecAuditLog /var/log/modsec_audit.log
SecDebugLog /var/log/modsec_audit_debug.log
Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
spec:
tls:
- hosts:
- example.com
secretName: example-com-tls-secret
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
自分のルールを書きたい場合は、Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf の前後辺りに書くと良いでしょう。例えば、myconf.php へのアクセスを防ぎたいなら以下のような設定になると思います。
Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
SecRule REQUEST_URI "myconf.php" "id:500001,phase:2,deny,log,status:405"