3月末頃の脆弱性の対応ということでチャートのバージョンアップを行ったが思いのほか難航したのでその備忘録です。
https://www.wiz.io/blog/ingress-nginx-kubernetes-vulnerabilities
チャート直下のvalues.yamlの設定で脆弱性の入り口になるらしいadmissionWebhooksをenabled:falseにしてた(過去のhelmチャートアップデート時に設定が増えたときに使わない余計なリソースを食う可能性がある設定として無効化した)のでネットワーク越しに狙われる危険性は低い状態ではあったが、4.11.5もパッチ済バージョンでエラーでないのでそちらで対応してた。
しかしAKS1.31に対応するingress-nginxチャートバージョンが4.12.1以降でAKS1.30が7月でEOLなので対応を迫られたという経緯。
・チャートの管理方法について(前提)
helm pullで指定バージョンをダウンロードしてアプリのチャートのchartsディレクトリに入れてgitで管理、helm upgradeてアプリのチャートと一緒に入れてる(AzureDevOpsでパイプライン組んでプルリクでhelm diffプラグインで差分でてマージでupgradeでAKSにデプロイされる方式)
この記事で言う設定更新上書きはアプリ側のチャート直下のvalues.yamlでchartsのしたの依存チャートのvalues.yamlを上書きを指します。
・アノテーションのエラー
ingress-nginx4.12.1helmチャートアップデートしたら、
ingressControllerのログにエラーがでてサイトが見えなくなった。
E0328 08:19:59.091704 7 store.go:938] annotation group ServerSnippet contains risky annotation based on ingress configuration
原因は、以下issueにかかれているとおりアノテーションのスニペット設定のセキュリティレベルが引き下げられたためとあり、
https://github.com/kubernetes/ingress-nginx/issues/12648
https://github.com/kubernetes/ingress-nginx/issues/12656
以下の設定を行うことでエラーが回避できるところまでは動作確認できました。
ingress-nginx:
controller:
electionID: ingress-controller-leader
ingressClassByName: true
ingressClassResource:
@@ -44,6 +47,7 @@ ingress-nginx:
#ingressClass: "nginx"
config:
server-tokens: "false"
+ annotations-risk-level: "Critical"
・正規表現のエラー
unknown directiveというような以下のエラーが出ました。影響としては新規のPodがCrashloopBackoffになりデプロイに失敗してました。サイトは見えるので障害おきないがPodが更新されないという状態でした。
チャートのvalues.yamlではなく、ingressリソース側の設定の問題だとわかるまで設定差分を調べました。
-------------------------------------------------------------------------------
Warning RELOAD 2m35s nginx-ingress-controller Error reloading NGINX:
-------------------------------------------------------------------------------
Error: exit status 1
2025/04/08 08:59:25 [emerg] 29#29: unknown directive "8})/" in /tmp/nginx/nginx-cfg773932017:7186
nginx: [emerg] unknown directive "8})/" in /tmp/nginx/nginx-cfg773932017:7186
nginx: configuration file /tmp/nginx/nginx-cfg773932017 test failed
pathまわりでエラーに合致する箇所が見つかり、正規表現の問題と思われました。
copilotに「ingress-nginxチャート4.12.1 正規表現 エラー」的な内容と現状の設定を食わせてissueが見つかり、正規表現の一部が4.12.1のチャートから使えなくなっているということがわかりました。
https://github.com/kubernetes/ingress-nginx/issues/13101
原因の正規表現の箇所(kind:ingressのとこ)↓
- path: /test.([0-9]{8})
対処↓ チャートを4.12.1にする際に以下のannotationを追加すると解決
nginx.ingress.kubernetes.io/use-regex: "true"
・rewriteのエラー
正規表現きいてるか確認しようとingressコントローラのPodにkubectl exec
でわたってnginx.confの位置を特定してkubectl cp
でコピーしてきてgrepでチャートアプデ前後の差分比較したところなんかrewrite設定がだめそう+ingressコントローラPodのログをよく見たらrewriteの警告でていた。
$ kubectl logs test-ingress-nginx-internal-controller-8c4488c87-xxxxx|grep -i rewrite
W0605 04:07:59.624584 6 validators.go:243] validation error on ingress default/ingress-internal: annotation rewrite-target contains invalid value /xxxx/daily/xxx?baseDay=$1
W0605 04:07:59.624901 6 main.go:148] rewrite-targetis invalid, defaulting to empty
issueとデフォルト値比較で以下を入れればいいようだという話に。
https://github.com/kubernetes/ingress-nginx/issues/11003
https://github.com/kubernetes/ingress-nginx/issues/13092
controller:
enableAnnotationValidations: false
↑この値は ingress-nginx4.11.3,4.11.5までは初期値がfalseだけど4.12.1からtrueになってたので戻したところ、kind:ingressのほうの以下のアノテーションの設定の?
かなにかがバリデーションに引っかかって無効化されてたnginx.confの影響がなくなってrewriteの設定が有効になっていた。後方互換性を崩される対処方法についてドキュメントにも注意書きはあった。
https://kubernetes.github.io/ingress-nginx/examples/rewrite/
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /xxxx/daily/xxx?baseDay=$1
ingressリダイレクト参考
https://qiita.com/piggydev/items/2a24b382f9e082074921