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`をデプロイします。
-
`git clone git@github.com:knative-extensions/security-guard.git`を使用してSecurity-Guardリポジトリをクローンします。
-
`cd security-guard`を実行します。
-
`ko apply -Rf ./config`を実行します。
リリース済みのイメージを使用して、システムを更新してSecurity-Guardを有効にします。
-
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
-
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
-
次のコマンドを使用して、必要な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
-
マイクロルールの自動学習を有効にするために、システムに`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`とのキュープロキシ間の通信を保護することをお勧めします。
-
`guard-service`の環境に`GUARD_SERVICE_TLS=true`を追加して、Knative発行証明書を使用したTLSとサーバー側認証を有効にします。`guard-service`は`knative-serving`名前空間の`knative-serving-certs`シークレット内のキーを使用します。
-
`guard-service`の環境に`GUARD_SERVICE_AUTH=true`を追加して、トークンを使用したクライアント側認証を有効にします。
-
`knative-serving`名前空間の`config-deployment` configmapの`queue-sidecar-rootca`パラメータを`knative-serving`名前空間の`knative-serving-certs`シークレットの`ca-cert.pem`キーで定義された公開キーに設定します。これにより、キュープロキシはTLSを使用し、guard-service証明書を承認します。
-
`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