コンテンツへスキップ

Security-Guardのインストール

ここでは、KnativeにSecurity-Guardをインストールする方法を示します。Security-Guardはknative-Servingの拡張機能であり、Knative-Servingのインストールが成功した後にインストールする必要があります。

Security-Guardを使用するには、クラスタで拡張キュープロキシイメージを使用する必要があります。

さらに、Security-Guardには、サービスごとのGuardianを自動学習するための自動化が含まれています。自動学習には、Kubernetesクラスタに`guard-service`をデプロイする必要があります。`guard-service`は`knative-serving`名前空間にインストールする必要があります。

本番環境では、通常、以下に説明するように、TLSとトークンサポートを有効にして、`guard-service`とのキュープロキシ通信を保護することも望ましいでしょう。

始める前に

Security-Guardをインストールする前に、Security-Guardについて学習してください。

インストール手順

このチュートリアルを開始するには、Knative Servingをインストールした後、次の手順を実行してキュープロキシイメージを置き換え、`guard-service`をデプロイします。

  1. `git clone git@github.com:knative-extensions/security-guard.git`を使用してSecurity-Guardリポジトリをクローンします。

  2. `cd security-guard`を実行します。

  3. `ko apply -Rf ./config`を実行します。

リリース済みのイメージを使用して、システムを更新してSecurity-Guardを有効にします。

  1. config-features ConfigMapで`queueproxy.mount-podinfo`という名前の機能を`allowed`に設定します。

    それを行う簡単な方法は、

    kubectl apply -f https://raw.githubusercontent.com/knative-extensions/security-guard/release-0.4/config/deploy/config-features.yaml
    
  2. config-deployment ConfigMapでデプロイメントパラメータ`queue-sidecar-image`を`gcr.io/knative-releases/knative.dev/security-guard/cmd/queue`に設定します。

    それを行う簡単な方法は、

    kubectl apply -f https://github.com/knative-extensions/security-guard/releases/download/v0.4.0/queue-proxy.yaml
    
  3. 次のコマンドを使用して、必要なSecurity-Guardリソースをクラスタに追加します。

    kubectl apply -f https://raw.githubusercontent.com/knative-extensions/security-guard/release-0.4/config/resources/gateAccount.yaml
    kubectl apply -f https://raw.githubusercontent.com/knative-extensions/security-guard/release-0.4/config/resources/serviceAccount.yaml
    kubectl apply -f https://raw.githubusercontent.com/knative-extensions/security-guard/release-0.4/config/resources/guardiansCrd.yaml
    
  4. マイクロルールの自動学習を有効にするために、システムに`guard-service`をデプロイします。

    それを行う簡単な方法は、

    kubectl apply -f https://github.com/knative-extensions/security-guard/releases/download/v0.4.0/guard-service.yaml
    

注記

以下の例は、Kourier Ingressが使用されている場合を示しています。IstioまたはContourでインストールする場合は、必要な変更を加えてください。

Knative Operatorを使用してKourierと共にSecurity-GuardとServingをインストールするための例スクリプト。

kubectl apply --filename - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: knative-serving
---
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
  security:
    securityGuard:
      enabled: true
  ingress:
    kourier:
      enabled: true
  config:
    network:
      ingress.class: "kourier.ingress.networking.knative.dev"
EOF

kubectl apply -f https://raw.githubusercontent.com/knative-extensions/security-guard/release-0.4/config/resources/gateAccount.yaml

名前空間ごとの設定

名前空間にガード保護されたサービスをデプロイするには、使用されている各名前空間に必要な権限を`guard-gate`に付与します。

kubectl apply -f https://raw.githubusercontent.com/knative-extensions/security-guard/release-0.4/config/resources/gateAccount.yaml

追加の本番環境設定

次の方法のいずれかを使用して、`guard-service`とのキュープロキシ間の通信を保護することをお勧めします。

  1. `guard-service`の環境に`GUARD_SERVICE_TLS=true`を追加して、Knative発行証明書を使用したTLSとサーバー側認証を有効にします。`guard-service`は`knative-serving`名前空間の`knative-serving-certs`シークレット内のキーを使用します。

  2. `guard-service`の環境に`GUARD_SERVICE_AUTH=true`を追加して、トークンを使用したクライアント側認証を有効にします。

  3. `knative-serving`名前空間の`config-deployment` configmapの`queue-sidecar-rootca`パラメータを`knative-serving`名前空間の`knative-serving-certs`シークレットの`ca-cert.pem`キーで定義された公開キーに設定します。これにより、キュープロキシはTLSを使用し、guard-service証明書を承認します。

  4. `knative-serving`名前空間の`config-deployment` configmapで`queue-sidecar-token-audiences = "guard-service"`を設定します。これにより、すべてのキュープロキシインスタンスに対して、オーディエンス`guard-service`を持つトークンが生成されます。

guard-serviceでTLSとトークンサポートを設定するためのスクリプトを次に示します。

echo "Add TLS and Tokens to guard-service"
kubectl patch deployment guard-service -n knative-serving -p '{"spec":{"template":{"spec":{"containers":[{"name":"guard-service","env":[{"name": "GUARD_SERVICE_TLS", "value": "true"}, {"name": "GUARD_SERVICE_AUTH", "value": "true"}]}]}}}}'

guard-gatesでTLSとトークンサポートを設定するためのスクリプトを次に示します。

echo "Copy the certificate to a temporary file"
ROOTCA="$(mktemp)"
FILENAME=`basename $ROOTCA`
kubectl get secret -n knative-serving knative-serving-certs -o json| jq -r '.data."ca-cert.pem"' | base64 -d >  $ROOTCA

echo "Get the certificate in a configmap friendly form"
CERT=`kubectl create cm config-deployment --from-file $ROOTCA -o json --dry-run=client |jq .data.\"$FILENAME\"`

echo "Add TLS and Tokens to config-deployment configmap"
kubectl patch cm config-deployment -n knative-serving -p '{"data":{"queue-sidecar-token-audiences": "guard-service", "queue-sidecar-rootca": '"$CERT"'}}'

echo "cleanup"
rm  $ROOTCA

guard-serviceとguard-gatesのTLSとトークン設定を読み取るためのスクリプトを次に示します。

echo "Results:"
kubectl get cm config-deployment -n knative-serving -o json|jq '.data'
kubectl get deployment guard-service -n knative-serving -o json|jq .spec.template.spec.containers[0].env

guard-serviceでTLSとトークンサポートを無効にするためのスクリプトを次に示します。

echo "Remove TLS and Tokens from  guard-service deployment"
kubectl patch deployment guard-service -n knative-serving -p '{"spec":{"template":{"spec":{"containers":[{"name":"guard-service","env":[{"name": "GUARD_SERVICE_TLS", "value": "false"}, {"name": "GUARD_SERVICE_AUTH", "value": "false"}]}]}}}}'

guard-gatesでTLSとトークンサポートを無効にするためのスクリプトを次に示します。

echo "Remove TLS and Tokens from config-deployment configmap"
kubectl patch cm config-deployment -n knative-serving -p '{"data":{"queue-sidecar-token-audiences": "", "queue-sidecar-rootca": ""}}'

注記

以下の例は、Kourier Ingressが使用されている場合を示しています。IstioまたはContourでインストールする場合は、必要な変更を加えてください。

Knative Operatorを使用してKourierと共にTLSとSecurity-Guardをインストールするための例スクリプト。

kubectl apply --filename - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: knative-serving
---
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
EOF

echo "Waiting for secret to be created (CTRL-C to exit)"
PEM=""
while [[ -z $PEM ]]
do
  echo -n "."
  sleep 1
  DOC=`kubectl get secret -n knative-serving knative-serving-certs -o json 2> /dev/null`
  PEM=`echo $DOC | jq -r '.data."ca-cert.pem"'`
done
echo " Secret found!"

echo "Copy the certificate to file"
ROOTCA="$(mktemp)"
FILENAME=`basename $ROOTCA`
echo $PEM | base64 -d >  $ROOTCA

echo "Create a temporary config-deployment configmap with the certificate"
CERT=`kubectl create cm config-deployment --from-file $ROOTCA -o json --dry-run=client |jq .data.\"$FILENAME\"`

echo "cleanup"
rm $ROOTCA

kubectl apply --filename - <<EOF
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
  deployments:
  - name: guard-service
    env:
    - container: guard-service
      envVars:
      - name: GUARD_SERVICE_TLS
        value: "true"
      - name: GUARD_SERVICE_AUTH
        value: "true"
  security:
    securityGuard:
      enabled: true
  ingress:
    kourier:
      enabled: true
  config:
    network:
      ingress.class: "kourier.ingress.networking.knative.dev"
    deployment:
      queue-sidecar-rootca: ${CERT}
      queue-sidecar-token-audiences: guard-service
EOF

サイトトラフィックを理解するために、分析とCookieを使用しています。当サイトのご利用に関する情報は、その目的でGoogleと共有されます。詳細はこちら。