353 Views
December 20, 24
スライド概要
Ingress-Nginx ControllerのRate limiting機能を用いてDoS攻撃を防御する
masuda
Ingress-Nginx Controllerの Rate limiting機能を用いてDoS攻撃を防御する NTTコミュニケーションズ株式会社 ソリューションサービス部 増田 和己 2024/12/10 © NTT Communications Corporation All Rights Reserved.
発表者 自己紹介 増田 和己 Kazuki Masuda ◆得意分野と現業務 Windows OS/Microsoft Azureを用いたシステム開発 やトラブルシューティングを得意とし、現在は Kubernetesの開発運用にも従事しています。 写真右が発表者 2020年ミャンマー勤務時に撮影 © NTT Communications Corporation All Rights Reserved. 2
本資料_概要 本資料はIngress-Nginx ControllerのRate-Limiting機能を用いて、 Kubernetesクラスタ内のコンテナをDoS攻撃から保護するための手順を記載したものである。 © NTT Communications Corporation All Rights Reserved. 3
前提 本検証にあたっての前提は以下の通り。 • KubernetesはAKS 1.29.9を用いている(AKS = Azure Kubernetes Service)。 • Ingress-Nginx Controller(OSS製品)を用いている。 • Ingress-Nginx Controllerはバージョン1.11.3である。 • AKSやIngress-Nginx Controllerの構築は完了している。 • Windows 11端末にDocker Desktopをインストールしている。 © NTT Communications Corporation All Rights Reserved. 4
目次 1. Ingress とは 2. システム構成 3. Rate-limiting機能_利用の流れ a. b. c. d. e. エラーページ表示用イメージを作成 エラーページ表示用イメージをAKSにデプロイ Ingress Controller(Deployment)の設定 Ingress Controller(ConfigMap)の設定 Ingress Ruleの設定 4. デモ © NTT Communications Corporation All Rights Reserved. 5
目次 1. Ingress とは 2. システム構成 3. Rate-limiting機能_利用の流れ a. b. c. d. e. エラーページ表示用イメージを作成 エラーページ表示用イメージをAKSにデプロイ Ingress Controller(Deployment)の設定 Ingress Controller(ConfigMap)の設定 Ingress Ruleの設定 4. デモ © NTT Communications Corporation All Rights Reserved. 6
1. Ingressとは • Kubernetes内のアプリケーション提供用podに対して、外部からの(HTTP/HTTPS)アクセス を管理するAPIオブジェクトである。 • Ingress RuleとIngress Controllerがあり、Ingress RuleはL7ロードバランサの設定を行う。 Ingress ControllerはIngress Ruleの設定内容に基づき各種制御する。 • Kubernetes上のL7ロードバランサとして、以下を含めた機能を提供する。 a. 外部からHTTPS通信を受付する際のSSL終端機能 b. Ingressとアプリケーション提供用pod間のセッションアフィニティ機能 c. URLパスベースのルーティング機能 (例 : /authの場合は認証用podに、/appの場合なアプリ用podに通信を振り分ける) d. 外部からのアクセス量を制御する機能(Rate Limiting機能) 本日のターゲット機能 © NTT Communications Corporation All Rights Reserved. 7
1. Ingressとは(Rate Limiting機能) • 特定IPアドレスからのHTTPリクエスト通信を時間単位で制御する • 制御された通信はデフォルトでHTTP 503のエラーを返す(※) ※本検証ではHTTP 502エラーを返すように変更 本日のターゲット機能 ※同機能詳細は以下Web参照 Annotations - Ingress-Nginx Controller © NTT Communications Corporation All Rights Reserved. 8
目次 1. Ingress とは 2. システム構成 3. Rate-limiting機能_利用の流れ a. b. c. d. e. エラーページ表示用イメージを作成 エラーページ表示用イメージをAKSにデプロイ Ingress Controller(Deployment)の設定 Ingress Controller(ConfigMap)の設定 Ingress Ruleの設定 4. デモ © NTT Communications Corporation All Rights Reserved. 9
2. システム構成 本検証にあたってのシステム構成は以下のとおり。 Ingress アプリケーション用pod AKSクラスタ DoS通信発生 させる人 Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller エラーページ表示用pod
目次 1. Ingress とは 2. システム構成 3. Rate-limiting機能_利用の流れ a. b. c. d. e. エラーページ表示用イメージを作成 エラーページ表示用イメージをAKSにデプロイ Ingress Controller(Deployment)の設定 Ingress Controller(ConfigMap)の設定 Ingress Ruleの設定 4. デモ © NTT Communications Corporation All Rights Reserved. 11
3-a. エラーページ表示用イメージを作成 Ingress アプリケーション用pod AKSクラスタ Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller
3-a. エラーページ表示用イメージを作成 保守端末にて、以下2つの資材を同一ディレクトリ階層に保存する。 • 以下内容が記載されたDockerfile • エラーページ用HTMLファイル(502.html)が格納されたwwwディレクトリ Dockerfile FROM registry.k8s.io/ingress-nginx/custom-errorpages:v1.0.2@sha256:b2259cf6bfda813548a64bded551b1854cb600c4f095738b49b4c 5cdf8ab9d21 COPY ./www /www ※イメージ格納元のレジストリ名は以下URLのyaml39行目から抽出 ingress-nginx/docs/examples/customization/custom-errors/custom-default-backend.yaml at main · kubernetes/ingress-nginx · GitHub © NTT Communications Corporation All Rights Reserved. 13
3-a(補足). 502.html © NTT Communications Corporation All Rights Reserved. 14
3-a. エラーページ表示用イメージを作成 Dockerコマンドでイメージの作成、ならびにACR(Azure Container Registory)への イメージのプッシュを行う。 cmd # イメージをビルド(※1) Docker build –t errorimage . # イメージにタグを割り当て(※2) Docker tag errorimage xxx.azurecr.io/Kubernetes-ingress-controller/nginx-error:v1.0 # イメージをACRにプッシュ Docker push xxx.azurecr.io/kubernetes-ingress-controller/nginx-error:v1.0 ※1:errorimageはイメージ名 ※2:acr01.azurecr.ioはACRのホスト名、nginx-error:v1.0はリポジトリ名とタグ © NTT Communications Corporation All Rights Reserved. 15
3-b. エラーページ表示用イメージをAKSにデプロイ Ingress アプリケーション用pod AKSクラスタ Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller エラーページ表示用pod
3-b. エラーページ表示用イメージをAKSにデプロイ 保守端末にエラーコンテナ用のDeploymentとServiceのマニフェストファイルを用意し、 AKSにデプロイする。 Cmd kubectl apply -f errordeployment.yaml kubectl apply -f errorservice.yaml ※基となるマニフェストファイルは以下から取得 ingress-nginx/docs/examples/customization/custom-errors/custom-default-backend.yaml at main · kubernetes/ingress-nginx · GitHub © NTT Communications Corporation All Rights Reserved. 17
3-b. エラーページ表示用イメージをAKSにデプロイ(Deployment) errordeployment.yaml (サンプル) apiVersion: apps/v1 kind: Deployment metadata: name: nginx-errors namespace: ingress-basic labels: app.kubernetes.io/name: nginx-errors app.kubernetes.io/part-of: ingress-nginx spec: replicas: 2 selector: matchLabels: app.kubernetes.io/name: nginx-errors app.kubernetes.io/part-of: ingress-nginx template: metadata: labels: app.kubernetes.io/name: nginx-errors app.kubernetes.io/part-of: ingress-nginx spec: containers: - name: nginx-error-server image: xxx.azurecr.io/nginx-error:v1.0 ports: - containerPort: 8080 © NTT Communications Corporation All Rights Reserved. 15頁にて設定したACRを指定 18
3-b. エラーページ表示用イメージをAKSにデプロイ(Service) errorservice.yaml (サンプル) apiVersion: v1 kind: Service metadata: name: nginx-errors namespace: ingress-basic labels: app.kubernetes.io/name: nginx-errors app.kubernetes.io/part-of: ingress-nginx spec: selector: app.kubernetes.io/name: nginx-errors app.kubernetes.io/part-of: ingress-nginx ports: - port: 80 targetPort: 8080 name: http © NTT Communications Corporation All Rights Reserved. 19
3-c. Ingress Controller(Deployment)の設定 Ingress アプリケーション用pod AKSクラスタ Deploymentを更新 Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller エラーページ表示用pod
3-c. Ingress Controller(Deployment)の設定 アクセス過多時の通信先をエラーページ表示用podに振り向かせるために、Ingress ControllerのDeployment YAMLのSpec-template-spec-containers-argsセクションに、 以下1行を追加する ingress-nginx-controller_(Deployment.yaml) kind: Deployment apiVersion: apps/v1 metadata: name: ingress-nginx-controller namespace: ingress-basic ~ spec: selector: matchLabels: app.kubernetes.io/component: controller ~ template: ~ spec: ~ containers: ~ args: ~ - '--default-backend-service=$(POD_NAMESPACE)/nginx-errors' © NTT Communications Corporation All Rights Reserved. 1秒間に許容するHTTPリクエスト数を超える場合、 エラーページ表示用podに通信させるための設定 21
3-d. Ingress Controller(ConfigMap)の設定 Ingress アプリケーション用pod AKSクラスタ ConfigMapを更新 Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller エラーページ表示用pod
3-d. Ingress Controller(ConfigMap)の設定 エラーページ表示用podアクセス時のHTTPレスポンスコードを指定するために、 Ingress ControllerのConfigMap YAMLのdataセクションに以下赤字2行を追加する ingress-nginx-controller (ConfigMap.yaml) kind: ConfigMap apiVersion: v1 metadata: name: ingress-nginx-controller namespace: ingress-basic ~ 1秒間に許容するHTTPリクエスト数を超える場合の data: HTTPレスポンスコードを指定 custom-http-errors: '502‘ limit-req-status-code: '502' © NTT Communications Corporation All Rights Reserved. 23
3-e. Ingress Ruleの設定 Ingress アプリケーション用pod AKSクラスタ Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller エラーページ表示用pod
3-e. Ingress Ruleの設定 1秒間に許可するアクセス量を指定するために、Ingress Ruleのannotationセクションに 以下赤字2行を追加する。 ingress-rule_Ingress.yaml kind: Ingress apiVersion: networking.k8s.io/v1 metadata: name: ingress-rule ~ annotations: ~ nginx.ingress.kubernetes.io/limit-rps: '1' © NTT Communications Corporation All Rights Reserved. 1秒間に許容するHTTPリクエスト数を指定 25
目次 1. Ingress とは 2. システム構成 3. Rate-limiting機能_利用の流れ a. b. c. d. e. エラーページ表示用イメージを作成 エラーページ表示用イメージをAKSにデプロイ Ingress Controller(Deployment)の設定 Ingress Controller(ConfigMap)の設定 Ingress Ruleの設定 4. デモ © NTT Communications Corporation All Rights Reserved. 26
4. デモ JMETER(通信負荷生成ツール)を用いて、ユーザーから大量アクセス時(※)の挙動を確認する。 ※本件では10HTTPリクエスト/秒 、limit-rps=1で実施。 Ingress アプリケーション用pod AKSクラスタ DoS通信発生 (10 HTTP req) Ingress Rule (/) ログオン画面 (/app1) Web画面 Internet Load Balancer ユーザー 保守 端末 Registory (Azure Container Registory) © NTT Communications Corporation All Rights Reserved. Ingress Controller エラーページ表示用pod 27
4. デモ 1秒間に10HTTPリクエストを発生させたときの結果(ユーザー側_JMETERで大量アクセス) 緑 : 正常通信(HTTP 200) 赤 : ブロック通信(HTTP 502) © NTT Communications Corporation All Rights Reserved. 28
4. デモ 1秒間に10HTTPリクエストを発生させたときの結果(ユーザー側_ブラウザでアクセス) HTTP 502エラーが返却 © NTT Communications Corporation All Rights Reserved. 29
4. デモ 1秒間に10HTTPリクエストを発生させたときのIngress Controller(サーバー側)のログ service custom error response for code 502、 格納した502.htmlに関する情報が記録 © NTT Communications Corporation All Rights Reserved. 30
本日お伝えしたかったこと • Ingress-Nginx ControllerのRate-Limiting機能を用いて、Kubernetesクラスタ内のコンテ ナをDoS攻撃から保護するための手順を紹介 • Rate-Limiting機能を用いて、ユーザ側とサーバ側(Ingress Controller)で必要以上のHTTP リクエストがブロックされることの確認 © NTT Communications Corporation All Rights Reserved. 31
補足 DoS攻撃のような特定通信元からのアクセス制御ではなく、Ingress-Nginx Controllerで システム全体のアクセス量を制御したい場合(サーキットブレーカ機能)、Global Rate Limiting機能が必要である。しかし、2024/8/27に同機能の記述が公式サイトから消去された。 2024/8/27に消去 © NTT Communications Corporation All Rights Reserved. Annotations - Ingress-Nginx Controller 32
ご静聴ありがとうございました © NTT Communications Corporation All Rights Reserved.