Policy Controller est fourni avec une bibliothèque par défaut de modèles de contrainte qui peuvent être utilisés avec le lot de règles de sécurité Cloud Service Mesh pour auditer la conformité des failles et des bonnes pratiques de sécurité de votre maillage.
Ce groupe de contraintes aborde et applique les règles dans les domaines suivants :
- Cloud Service Mesh applique le trafic mTLS
- Bonnes pratiques concernant les règles d'autorisation Cloud Service Mesh
- Application de la sécurité des charges de travail Cloud Service Mesh
Contraintes liées aux bundles de règles Cloud Service Mesh
Nom de la contrainte | Description de la contrainte | ID de commande |
---|---|---|
asm-policy-v0.0.1-asm-ingressgateway-label | N'applique le libellé ingressgateway d'Istio que sur les pods ingressgateway. | 1.1.1 |
asm-policy-v0.0.1-asm-sidecar-injection | Applique le proxy side-car Istio, toujours injecté dans les pods de la charge de travail. | 1.1.2 |
asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny | Applique la règle de refus AuthorizationPolicy par défaut au niveau du maillage. | 1.2.1 |
asm-policy-v0.0.1-asm-authz-policy-normalization | Applique la normalisation de la règle AuthorizationPolicy. | 1.2.2 |
asm-policy-v0.0.1-asm-authz-policy-safe-pattern | Applique les modèles sécurisés de la règle AuthorizationPolicy. | 1.2.3 |
asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls | Applique PeerAuthentication en mode mTLS strict au niveau du maillage. | 1.3.1 |
asm-policy-v0.0.1-asm-peer-authn-strict-mtls | L'application de l'ensemble des PeerAuthentications ne peut pas écraser le mode mTLS strict. | 1.3.2 |
asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers | Appliquez la règle jwtRules outputPayloadToHeader pour ne pas contenir d'en-têtes de requête HTTP connus | 1.4.1 |
Profils de groupes
Dans le groupe de règles de sécurité Cloud Service Mesh, vous pouvez utiliser deux profils en fonction du niveau de rigueur. Le niveau de rigueur faible est associé à moins de contraintes, ce qui offre une plus grande flexibilité. Le niveau de rigueur élevé est soumis à davantage de contraintes, ce qui offre un contrôle plus sécurisé des règles.
Faible niveau de rigueur
Le profil de faible niveau de rigueur comporte les contraintes de règle suivantes :
Le libellé
istio:ingressgateway
ne peut être utilisé que par les pods de la passerelle d'entrée Istio.Dans
AuthorizationPolicy
, vous ne pouvez utiliser les champshosts
ounotHosts
qu'en sélectionnant la passerelle d'entrée Istio associée au libelléistio:ingressgateway
.Dans
AuthorizationPolicy
, lorsque les champsmethods
ounotMethods
sont utilisés, les valeurs doivent être en majuscules.Dans
AuthorizationPolicy
, lorsque le champrequest.headers
est utilisé, les valeurs ne peuvent pas contenir d'espaces.Dans
AuthorizationPolicy
, lorsque les champspaths
ounotPaths
sont utilisés, les valeurs doivent être normalisées.
Niveau de rigueur élevé
Le niveau de rigueur élevé inclut toutes les contraintes du niveau de rigueur faible, ainsi que les contraintes suivantes :
Pour tous les pods de charge de travail, l'annotation
sidecar.istio.io/inject: false
ne peut pas être appliquée pour contourner l'injection du proxy.Une règle
AuthorizationPolicy
au niveau du maillage qui définit une règle de refus par défaut est appliquée.La règle
AuthorizationPolicy
doit suivre le modèle ALLOW-with-positive-matching ou DENY-with-negative-match.Dans
AuthorizationPolicy
, lorsque les champshosts
ounotHosts
sont utilisés, les valeurs doivent être des paires de<host-name>
et de<host-name>:*
.Une règle
PeerAuthentication
au niveau du maillage qui définit le mode mTLS strict est appliquée.Pour toutes les règles
PeerAuthentication
du maillage, le mode mTLS ne peut être queUNSET
ouSTRICT
, afin de suivre le mode mTLS strict.
Paramètres du groupe
Setter KPT | Description |
---|---|
strictness-level | Profil de niveau de rigueur du bundle Cloud Service Mesh, les options sont "Faible" ou "Élevé" (par défaut) |
Avant de commencer
- Installez et initialisez Google Cloud CLI, qui fournit les commandes
gcloud
etkubectl
utilisées dans ces instructions. Si vous utilisez Cloud Shell, Google Cloud CLI est préinstallé. - Installez Policy Controller v1.11.2 ou version ultérieure sur votre cluster avec la bibliothèque par défaut de modèles de contraintes. Vous devez également activer la compatibilité avec les contraintes référentielles, car ce bundle contient des contraintes référentielles.
- Vérifiez que Cloud Service Mesh est installé sur votre cluster.
Configurer Policy Controller pour les contraintes référentielles
Enregistrez le manifeste YAML suivant sous le nom
policycontroller-config.yaml
:apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata: name: config namespace: "gatekeeper-system" spec: sync: syncOnly: - group: "" version: "v1" kind: "Namespace" - group: "security.istio.io" version: "v1beta1" kind: "AuthorizationPolicy" - group: "security.istio.io" version: "v1beta1" kind: "PeerAuthentication"
Ce fichier manifeste configure Policy Controller pour surveiller des types d'objets spécifiques.
Appliquez le fichier manifeste
policycontroller-config.yaml
:kubectl apply -f policycontroller-config.yaml
Auditer le bundle de règles Cloud Service Mesh
Policy Controller vous permet d'appliquer des règles à votre cluster Kubernetes. Pour tester vos charges de travail et leur conformité avec les règles de sécurité Cloud Service Mesh décrites dans le tableau précédent, vous pouvez déployer ces contraintes en mode "audit" pour révéler les cas de non-respect et, plus important, vous donner la possibilité de les corriger avant de les appliquer à votre cluster Kubernetes.
Vous pouvez appliquer ces règles en définissant le paramètre spec.enforcementAction
sur dryrun
à l'aide de kpt ou de Config Sync.
kubectl
(Facultatif) Prévisualisez les contraintes de règle avec kubectl :
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
Appliquez les contraintes de règle avec kubectl :
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
Le résultat est le suivant :
asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny created asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization created asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern created asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label created asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls created asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls created asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers created asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection created
Vérifiez que les contraintes de règles ont été installées et si des cas de non-respect existent dans le cluster :
kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
Le résultat ressemble à ce qui suit :
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection dryrun 0
kpt
Installez et configurez kpt. kpt est utilisé dans ces instructions pour personnaliser et déployer les ressources Kubernetes.
Téléchargez le groupe de règles de sécurité Cloud Service Mesh à partir de GitHub à l'aide de kpt :
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
Exécutez la fonction kpt
set-enforcement-action
pour définir l'action d'application des règles surdryrun
:kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
Exécutez la fonction setter de kpt pour définir des champs spécifiques aux règles de sécurité Cloud Service Mesh :
kpt fn eval asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \ strictness-level="Low"
Initialisez le répertoire de travail avec kpt, qui crée une ressource pour suivre les modifications :
cd asm-policy-v0.0.1 kpt live init
Appliquez les contraintes de règles avec kpt :
kpt live apply
Le résultat est le suivant :
asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-authz-policy-mesh-default-deny created asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-authz-policy-normalization created asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-authz-policy-safe-pattern created asmingressgatewaylabel.constraints.gatekeeper.sh/asm-ingressgateway-label created asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-mesh-strict-mtls created asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-strict-mtls created asmsidecarinjection.constraints.gatekeeper.sh/asm-sidecar-injection created 7 resource(s) applied. 7 created, 0 unchanged, 0 configured, 0 failed
Vérifiez que les contraintes de règles ont été installées et si des cas de non-respect existent dans le cluster :
kpt live status --output table --poll-until current
L'état
CURRENT
confirme l'installation correcte des contraintes.
Config Sync
- Installez et configurez kpt. kpt est utilisé dans ces instructions pour personnaliser et déployer les ressources Kubernetes.
Les opérateurs qui utilisent Config Sync pour déployer des règles sur leurs clusters peuvent suivre ces instructions :
Accédez au répertoire de synchronisation pour Config Sync :
cd SYNC_ROOT_DIR
Pour créer ou ajouter
.gitignore
avecresourcegroup.yaml
, procédez comme suit :echo resourcegroup.yaml >> .gitignore
Créez un répertoire
policies
dédié :mkdir -p policies
Téléchargez le groupe de règles de sécurité Cloud Service Mesh à partir de GitHub à l'aide de kpt :
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1 policies/asm-policy-v0.0.1
Exécutez la fonction kpt
set-enforcement-action
pour définir l'action d'application des règles surdryrun
:kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
Exécutez la fonction setter de kpt pour définir des champs spécifiques aux règles de sécurité de Cloud Service Mesh :
kpt fn eval policies/asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \ strictness-level="Low"
(Facultatif) Prévisualisez les contraintes de règles à créer :
kpt live init policies/asm-policy-v0.0.1 kpt live apply --dry-run policies/asm-policy-v0.0.1
Le résultat est le suivant :
Dry-run strategy: client inventory update started inventory update finished apply phase started asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny apply successful asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization apply successful asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern apply successful asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label apply successful asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls apply successful asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls apply successful asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers apply successful asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection apply successful apply phase finished inventory update started inventory update finished apply result: 8 attempted, 8 successful, 0 skipped, 0 failed
Si votre répertoire de synchronisation pour Config Sync utilise Kustomize, ajoutez
policies/asm-policy-v0.0.1
à votre fichierkustomization.yaml
racine. Sinon, supprimez le fichierpolicies/asm-policy-v0.0.1/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/asm-policy-v0.0.1/kustomization.yaml
Transférez les modifications au dépôt Config Sync :
git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1 git commit -m 'Adding ASM security policy audit enforcement' git push
Vérifiez l'état de l'installation :
watch gcloud beta container fleet config-management status --project PROJECT_ID
L'état
SYNCED
confirme l'installation des règles .
Consulter les notifications de non-respect des règles
Une fois les contraintes de règle installées en mode audit, les cas de non-respect du cluster peuvent être visualisés dans l'interface utilisateur à l'aide du tableau de bord Policy Controller.
Vous pouvez également utiliser kubectl
pour afficher les cas de non-respect sur le cluster à l'aide de la commande suivante :
kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
En cas de non-respect des règles, vous pouvez consulter la liste des messages de non-respect par contrainte avec :
kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Modifier l'action d'application du bundle de règles Cloud Service Mesh
Une fois que vous avez examiné les cas de non-respect des règles sur votre cluster, vous pouvez envisager de modifier le mode d'application afin que le contrôleur d'admission génère un avertissement (warn
) ou bloque (deny
) l'application des ressources non conformes sur le cluster.
kubectl
Utilisez kubectl pour définir la mesure coercitive des règles sur
warn
:kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
Vérifiez que la mesure coercitive des contraintes de règle a été mise à jour :
kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
kpt
Exécutez la fonction kpt
set-enforcement-action
pour définir la mesure coercitive des règles surwarn
:kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
Appliquez les contraintes de règles :
kpt live apply
Config Sync
Les opérateurs qui utilisent Config Sync pour déployer des règles sur leurs clusters peuvent suivre ces instructions :
Accédez au répertoire de synchronisation pour Config Sync :
cd SYNC_ROOT_DIR
Exécutez la fonction kpt
set-enforcement-action
pour définir la mesure coercitive des règles surwarn
:kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
Transférez les modifications au dépôt Config Sync :
git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1 git commit -m 'Adding ASM security policy bundle warn enforcement' git push
Vérifiez l'état de l'installation :
gcloud alpha anthos config sync repo list --project PROJECT_ID
Le dépôt qui s'affiche dans la colonne
SYNCED
confirme l'installation des règles.
Tester l'application des règles
Créez une ressource non conforme sur le cluster à l'aide de la commande suivante :
cat <<EOF | kubectl apply -f -
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: non-compliant-authz-policy
spec:
action: ALLOW
rules:
- to:
- operation:
methods: ["get"]
EOF
Le contrôleur d'admission doit générer un avertissement répertoriant les cas de violation des règles que cette ressource ne respecte pas, comme indiqué dans l'exemple suivant :
Warning: [asm-policy-v0.0.1-asm-authz-policy-normalization] in rules-to-operation, methods or notMethods must be uppercase authorizationpolicy.security.istio.io/non-compliant-authz-policy created
Supprimer le bundle de règles Cloud Service Mesh
Si nécessaire, le bundle de règles Cloud Service Mesh peut être supprimé du cluster.
kubectl
Utilisez kubectl pour supprimer les règles :
kubectl delete constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
kpt
Supprimez les règles :
kpt live destroy
Config Sync
Les opérateurs qui utilisent Config Sync pour déployer des règles sur leurs clusters peuvent suivre ces instructions :
Transférez les modifications au dépôt Config Sync :
git rm -r SYNC_ROOT_DIR/policies/asm-policy-v0.0.1 git commit -m 'Removing Cloud Service Mesh policies' git push
Vérifiez l'état :
gcloud alpha anthos config sync repo list --project PROJECT_ID
Le dépôt qui s'affiche dans la colonne
SYNCED
confirme la suppression des règles.