Kubernetes エージェント + Ingress Controller + モジュール

この例では、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 チャート経由でインストールする方法を説明します。

  1. ingress-nginx リポジトリを追加します:

    $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
  2. sigsci-values.yaml ファイルに、エージェントキーを SIGSCI_ACCESSKEYID と SIGSCI_SECRETACCESSKEY として追加します。

  3. リリース名 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
  4. 数分後、エージェントは Next-Gen WAF コンソールの「エージェント」ページと Fastly コンソールの「デプロイ」ページに表示されます。

  5. Ingress リソースを作成します。この手順はセットアップによって異なり、多くの設定方法に対応しています。基本使用法 - ホストベースのルーティングに関する公式ドキュメントを参照してください。

    Ingress ファイルの例は次のとおりです。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    name: hello-kubernetes-ingress
    #namespace: SET THIS IF NOT IN DEFAULT NAMESPACE
    spec:
    rules:
    - host: example.com
    http:
    paths:
    - pathType: Prefix
    path: /testpath
    backend:
    service:
    name: NAME OF SERVICE
    port:
    number: 80

オーバーライドファイルを使用した Helm アップグレード

  1. 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 module
    image:
    repository: signalsciences/sigsci-nginx-ingress-controller-chainguard
    tag: "latest"
    pullPolicy: IfNotPresent
  2. オーバーライドファイルを使用して 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-nginx

    Ingress がデフォルトの名前空間にない場合は、-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

リリースをアンインストールする

  1. リリース my-ingress をアンインストールします。

    $ helm uninstall my-ingress
  2. デフォルト名前空間にない場合は、-n を使って名前空間を指定します:

    $ helm uninstall -n NAMESPACE my-ingress

カスタムファイルを使用してインストールする

Next-Gen WAF エージェントを統合する

エージェントコンテナイメージの統合を参照してください。

NGINX Ingress controller は、mandatory.yaml ファイルを使用してインストールされます。このファイルには、Ingress Controller の汎用 Deployment の修正されたテンプレートが含まれています。主な追加点は次のとおりです。

  1. Ingress コンテナを変更してカスタム Ingress コンテナをロードし、モジュール/Ingress コンテナとエージェントサイドカーコンテナ間のソケットファイル通信用のボリュームマウントを追加します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    containers:
    - name: nginx-ingress-controller
    image: signalsciences/sigsci-nginx-ingress-controller-chainguard:latest
    ...
    volumeMounts:
    - name: sigsci-tmp
    mountPath: /sigsci/tmp
    ...
  2. NGINX の設定ファイル (nginx.conf) の Next-Gen WAF モジュールを ConfigMap から読み込みます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    kind: ConfigMap
    apiVersion: v1
    data:
    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-configuration
    namespace: ingress-nginx
    labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  3. Next-Gen WAF エージェント用のコンテナを追加します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ...
    containers:
    ...
    # Next-Gen WAF agent running in default RPC mode
    - name: sigsci-agent
    image: signalsciences/sigsci-agent:latest
    imagePullPolicy: IfNotPresent
    env:
    - name: SIGSCI_ACCESSKEYID
    valueFrom:
    secretKeyRef:
    # This secret needs added (see docs on sigsci secrets)
    name: sigsci.my-site-name-here
    key: accesskeyid
    - name: SIGSCI_SECRETACCESSKEY
    valueFrom:
    secretKeyRef:
    # This secret needs added (see docs on sigsci secrets)
    name: sigsci.my-site-name-here
    key: secretaccesskey
    securityContext:
    # The sigsci-agent container should run with its root filesystem read only
    readOnlyRootFilesystem: true
    volumeMounts:
    # Default volume mount location for sigsci-agent writeable data (do not change mount path)
    - name: sigsci-tmp
    mountPath: /sigsci/tmp
    ...
  4. 上記で使用したボリュームを定義します。

    ...
    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-tmp
    emptyDir: {}
    ...

セットアップ

mandatory.yaml ファイルは ingress-nginx 名前空間内のリソースを作成します。エージェントのアクセスキーを保存するために Kubernetes Secrets を使用する場合は、mandatory.yaml ファイルを実行する前に名前空間とアクセスキーを作成する必要があります。

  1. エージェントキーのシークレットの名前を mandatory.yaml で設定します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ...
    env:
    - name: SIGSCI_ACCESSKEYID
    valueFrom:
    secretKeyRef:
    # This secret needs added (see docs on sigsci secrets)
    name: sigsci.my-site-name-here
    key: accesskeyid
    - name: SIGSCI_SECRETACCESSKEY
    valueFrom:
    secretKeyRef:
    # This secret needs added (see docs on sigsci secrets)
    name: sigsci.my-site-name-here
    key: secretaccesskey
    ...
  2. NGINX ingress + Signal Sciences モジュールコンテナをプルまたはビルドします。任意のレジストリとリポジトリ名を設定し、mandatory.yaml に一致するイメージを次のように設定します。

    $ docker pull signalsciences/sigsci-nginx-ingress-controller-chainguard:latest
  3. 修正された汎用 Deployment を使用してデプロイします。

    $ kubectl apply -f mandatory.yaml
  4. Ingress Controller を公開するためのサービスを作成します。必要な手順はクラウドプロバイダーによって異なります。公式の手順については、https://kubernetes.github.io/ingress-nginx/deploy/#environment-specific-instructions をご覧ください。

    以下は service.yaml ファイルの例です。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    kind: Service
    apiVersion: v1
    metadata:
    name: ingress-nginx
    namespace: ingress-nginx
    spec:
    externalTrafficPolicy: Cluster
    selector:
    app.kubernetes.io/name: ingress-nginx
    type: LoadBalancer
    ports:
    - name: http
    port: 80
    targetPort: http
    - name: https
    port: 443
    targetPort: https
  5. Ingress リソースを作成します。以下は Ingress リソースの例です。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    apiVersion: extensions/v1
    kind: Ingress
    metadata:
    name: test-ingress
    namespace: ingress-nginx
    annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
    rules:
    - http:
    paths:
    - path: /testpath
    backend:
    serviceName: nginx
    servicePort: 80