Kubernetes エージェント + Ingress Controller + モジュール
- English
- 日本語
この例では、Next-Gen WAF エージェントは Docker サイドカーとしてインストールされ、ingress-nginx Kubernetes Ingress Controller にインストールされた NGINX 用の Next-Gen WAF ネイティブモジュールと通信します。
注:アップストリームの
ingress-nginxリポジトリはアーカイブされました。Fastly の Ingress Controller イメージは、現在 Chainguard が管理するフォークをベースに構築されており、継続的なセキュリティメンテナンスが提供されています。インストール手順は以前と同じです。
Next-Gen WAF エージェントを Ingress Controller に統合する
アプリケーションごとに Next-Gen WAF をインストールするだけでなく、アプリケーションへのすべての外部トラフィックを受信する Kubernetes Ingress Controller に Next-Gen WAF をインストールすることも可能です。これは、Next-Gen WAF モジュールを搭載したアプリケーションにインストールするのと似ています。
Next-Gen WAF モジュールを Ingress Controller にインストールして設定します。
sigsci-agentコンテナを Ingress Pod に追加し、sigsci-agent ボリュームをマウントします。emptyDir{}ボリュームを追加して、sigsci-agentが一時的なデータを書き込む場所とします。
Kubernetes NGINX Ingress Controller
Kubernetes NGINX Ingress Controller は、Ingress API の NGINX ベースの実装です。Next-Gen WAF は、NGINX のネイティブモジュールをサポートしています。これにより、既存の ingress-nginx コントローラーに Next-Gen WAF モジュールを簡単にインストールできます。
ベース nginx-ingress-controller をラップして Next-Gen WAF モジュールをインストールする
nginx-ingress-controller をラップするには、ベースコントローラーを使用し、Next-Gen WAF ネイティブ NGINX モジュールをインストールします。ビルド済みのコンテナは、次のものを使用して Docker Hub からプルできます:docker pull signalsciences/sigsci-nginx-ingress-controller-chainguard:latest
インストール
インストール方法は2つあります。
前提条件
エージェントにアクセスさせたいサイトのエージェントキーをコピーします。エージェントキーは、Next-Gen WAF エージェントパッケージを設定する際に使用します。
オーバーライドを使用して Helm 経由でインストールする
以下の手順では、オーバーライドファイルを使用して、sigsci-nginx-ingress-controller-chainguard + sigsci-agent を公式の ingress-nginx チャート経由でインストールする方法を説明します。
ingress-nginxリポジトリを追加します:$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxsigsci-values.yaml ファイルに、エージェントキーを
SIGSCI_ACCESSKEYIDとSIGSCI_SECRETACCESSKEYとして追加します。リリース名
my-ingressでdefault名前空間にインストールします:$ helm install -f values-sigsci.yaml my-ingress ingress-nginx/ingress-nginx-nフラグを使用して名前空間を指定できます:$ helm install -n NAMESPACE -f values-sigsci.yaml my-ingress ingress-nginx/ingress-nginx数分後、エージェントは Next-Gen WAF コンソールの「エージェント」ページと Fastly コンソールの「デプロイ」ページに表示されます。
Ingress リソースを作成します。この手順はセットアップによって異なり、多くの設定方法に対応しています。基本使用法 - ホストベースのルーティングに関する公式ドキュメントを参照してください。
Ingress ファイルの例は次のとおりです。
1234567891011121314151617181920apiVersion: networking.k8s.io/v1kind: Ingressmetadata:annotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/rewrite-target: /name: hello-kubernetes-ingress#namespace: SET THIS IF NOT IN DEFAULT NAMESPACEspec:rules:- host: example.comhttp:paths:- pathType: Prefixpath: /testpathbackend:service:name: NAME OF SERVICEport:number: 80
オーバーライドファイルを使用した Helm アップグレード
sigsci-values.yaml ファイルで、
sigsci-nginx-ingress-controllerを最新バージョンに更新してingress-nginxチャートを更新します:controller:# Replaces the default nginx-controller image with a custom image that contains the Next-Gen WAF NGINX moduleimage:repository: signalsciences/sigsci-nginx-ingress-controller-chainguardtag: "latest"pullPolicy: IfNotPresentオーバーライドファイルを使用して
helm upgradeを実行します。この例では、前のセクションで作成したmy-ingressリリースに対して helm upgrade を実行しています。$ helm upgrade -f sigsci-values.yaml my-ingress ingress-nginx/ingress-nginxまたは
$ helm upgrade -f sigsci-nginxinc-values.yaml my-ingress ingress-nginx/ingress-nginxIngress がデフォルトの名前空間にない場合は、
-nを使用して名前空間を指定します:$ helm upgrade -n NAMESPACE -f sigsci-values.yaml my-ingress ingress-nginx/ingress-nginxまたは
$ helm upgrade -n NAMESPACE -f sigsci-nginxinc-values.yaml my-ingress ingress-nginx/ingress-nginx
リリースをアンインストールする
リリース
my-ingressをアンインストールします。$ helm uninstall my-ingressデフォルト名前空間にない場合は、
-nを使って名前空間を指定します:$ helm uninstall -n NAMESPACE my-ingress
カスタムファイルを使用してインストールする
Next-Gen WAF エージェントを統合する
エージェントコンテナイメージの統合を参照してください。
NGINX Ingress controller は、mandatory.yaml ファイルを使用してインストールされます。このファイルには、Ingress Controller の汎用 Deployment の修正されたテンプレートが含まれています。主な追加点は次のとおりです。
Ingress コンテナを変更してカスタム Ingress コンテナをロードし、モジュール/Ingress コンテナとエージェントサイドカーコンテナ間のソケットファイル通信用のボリュームマウントを追加します。
123456789...containers:- name: nginx-ingress-controllerimage: signalsciences/sigsci-nginx-ingress-controller-chainguard:latest...volumeMounts:- name: sigsci-tmpmountPath: /sigsci/tmp...NGINX の設定ファイル (
nginx.conf) の Next-Gen WAF モジュールをConfigMapから読み込みます。1234567891011kind: ConfigMapapiVersion: v1data:main-snippet: load_module /usr/lib/nginx/modules/ngx_http_sigsci_nxo_module-1.17.7.so;http-snippet: sigsci_agent_host unix:/sigsci/tmp/sigsci.sock;metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxNext-Gen WAF エージェント用のコンテナを追加します。
12345678910111213141516171819202122232425262728...containers:...# Next-Gen WAF agent running in default RPC mode- name: sigsci-agentimage: signalsciences/sigsci-agent:latestimagePullPolicy: IfNotPresentenv:- name: SIGSCI_ACCESSKEYIDvalueFrom:secretKeyRef:# This secret needs added (see docs on sigsci secrets)name: sigsci.my-site-name-herekey: accesskeyid- name: SIGSCI_SECRETACCESSKEYvalueFrom:secretKeyRef:# This secret needs added (see docs on sigsci secrets)name: sigsci.my-site-name-herekey: secretaccesskeysecurityContext:# The sigsci-agent container should run with its root filesystem read onlyreadOnlyRootFilesystem: truevolumeMounts:# Default volume mount location for sigsci-agent writeable data (do not change mount path)- name: sigsci-tmpmountPath: /sigsci/tmp...上記で使用したボリュームを定義します。
...volumes:# Define a volume where sigsci-agent will write temp data and share the socket file,# which is required with the root filesystem is mounted read only- name: sigsci-tmpemptyDir: {}...
セットアップ
mandatory.yaml ファイルは ingress-nginx 名前空間内のリソースを作成します。エージェントのアクセスキーを保存するために Kubernetes Secrets を使用する場合は、mandatory.yaml ファイルを実行する前に名前空間とアクセスキーを作成する必要があります。
エージェントキーのシークレットの名前を
mandatory.yamlで設定します。123456789101112131415...env:- name: SIGSCI_ACCESSKEYIDvalueFrom:secretKeyRef:# This secret needs added (see docs on sigsci secrets)name: sigsci.my-site-name-herekey: accesskeyid- name: SIGSCI_SECRETACCESSKEYvalueFrom:secretKeyRef:# This secret needs added (see docs on sigsci secrets)name: sigsci.my-site-name-herekey: secretaccesskey...NGINX ingress + Signal Sciences モジュールコンテナをプルまたはビルドします。任意のレジストリとリポジトリ名を設定し、
mandatory.yamlに一致するイメージを次のように設定します。$ docker pull signalsciences/sigsci-nginx-ingress-controller-chainguard:latest修正された汎用 Deployment を使用してデプロイします。
$ kubectl apply -f mandatory.yamlIngress Controller を公開するためのサービスを作成します。必要な手順はクラウドプロバイダーによって異なります。公式の手順については、https://kubernetes.github.io/ingress-nginx/deploy/#environment-specific-instructions をご覧ください。
以下は
service.yamlファイルの例です。1234567891011121314151617kind: ServiceapiVersion: v1metadata:name: ingress-nginxnamespace: ingress-nginxspec:externalTrafficPolicy: Clusterselector:app.kubernetes.io/name: ingress-nginxtype: LoadBalancerports:- name: httpport: 80targetPort: http- name: httpsport: 443targetPort: httpsIngress リソースを作成します。以下は Ingress リソースの例です。
123456789101112131415apiVersion: extensions/v1kind: Ingressmetadata:name: test-ingressnamespace: ingress-nginxannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:rules:- http:paths:- path: /testpathbackend:serviceName: nginxservicePort: 80