Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

Kubernetes

k8s Nginx Ingress ControllerでWAF

セキュリティを考慮した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"

Kubernetesのコンパイル

昨今、OSSを製品からコンパイルして使うことは少なくなってきましたが、Kubernetesのソースを改変したりデバッグしたりしてみたかったので、コンパイルしてみました。

コンパイルって結構面倒なイメージですが、KubernetesのコンパイルはDockerを利用してコンパイルするためのスクリプトが用意されています。つまりDockerが使える環境なら、スクリプトを実行するだけです。
※ Dockerのインストールはここでは割愛します。

まずは、ソースコードをcloneし、ディレクトリを移動します。

# git clone https://github.com/kubernetes/kubernetes.git
# cd kubernetes

コンパイルします。引数にmakeだけを指定するとLinuxのバイナリを生成してくれます。
※ コンパイル環境まで数分かかりました。

# ./build/run.sh make
~ 略 ~
Coverage is disabled.
+++ [1029 21:59:25] Placing binaries
+++ [1029 22:00:00] Syncing out of container
+++ [1029 22:00:00] Stopping any currently running rsyncd container
+++ [1029 22:00:00] Starting rsyncd container
+++ [1029 22:00:01] Running rsync
+++ [1029 22:00:25] Stopping any currently running rsyncd container

バイナリは_outputディレクトリに出力されました。

# ls _output/dockerized/bin/linux/amd64/
apiextensions-apiserver  genswaggertypedocs       kube-scheduler
conversion-gen           genyaml                  kubeadm
deepcopy-gen             ginkgo                   kubectl
defaulter-gen            go-bindata               kubelet
e2e.test                 go-runner                kubemark
e2e_node.test            go2make                  linkcheck
gendocs                  kube-apiserver           mounter
genkubedocs              kube-controller-manager  openapi-gen
genman                   kube-proxy

非常に簡単ですね。

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ