Neste tutorial, mostramos como melhorar a postura de segurança do cluster e do app. Imagine que você é um administrador de plataforma e uma organização gerencia os apps para a loja on-line com o Cloud Service Mesh, uma pacote de ferramentas que ajuda você a monitorar e gerenciar uma malha de serviço confiável. Você é responsável por garantir a segurança da malha e dos apps.
É possível evitar configurações incorretas e validar automaticamente as políticas do Cloud Service Mesh usando o Policy Controller e o Config Sync. O Policy Controller permite a aplicação de políticas totalmente programáveis nos clusters. O Policy Controller também tem uma biblioteca padrão de modelos de restrição que pode ser usada com o pacote de segurança do Cloud Service Mesh para auditar a compliance das vulnerabilidades de segurança da malha e práticas recomendadas. O Config Sync reconcilia continuamente o estado dos clusters com um conjunto central de arquivos de configuração declarativos do Kubernetes. Usando Juntos, o Policy Controller e o Config Sync permitem que você aplicar restrições nas configurações de política do Cloud Service Mesh.
O diagrama a seguir mostra uma visão geral de como o Cloud Service Mesh, o Policy Controller e o Config Sync funcionam juntos neste tutorial para gerenciar e proteger um gateway de entrada e os apps de exemplo da Online Boutique utilizados neste tutorial:
Objetivos
- Criar um cluster do Google Kubernetes Engine (GKE) e registrá-lo em uma frota.
- Instalar o Policy Controller, o Config Sync e o Cloud Service Mesh em um cluster
- Configurar o Config Sync para sincronizar vários repositórios.
- Usar as práticas recomendadas para implantar configurações, apps e recursos do Istio com o Config Sync.
- Implantar configurações de cluster, os apps de exemplo da Online Boutique e um gateway de entrada com o Config Sync.
- Aproveite as
Pacote de políticas do Cloud Service Mesh
do Policy Controller para aplicar as seguintes práticas recomendadas de segurança:
- Garantir que todas as cargas de trabalho na malha tenham injeção automática de arquivo secundário.
- Criptografe todo o tráfego na malha.
- Garanta que todas as cargas de trabalho na malha tenham controle de acesso granular.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
- GKE.
- GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
Prepare o ambiente
Nesta seção, você vai preparar o ambiente para instalar Cloud Service Mesh, Policy Controller e Config Sync:
-
In the Google Cloud console, activate Cloud Shell.
Faça upgrade para a versão mais recente do Google Cloud CLI:
gcloud components update
Para armazenar os arquivos criados neste tutorial, crie um diretório:
mkdir ~/asm-acm-tutorial-dir
Para simplificar o restante do tutorial, crie as seguintes variáveis de ambiente:
PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID CLUSTER=asm-acm-tutorial CLUSTER_ZONE=us-east4-a MEMBERSHIP=asm-acm-tutorial PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')
Substitua
PROJECT_ID
pelo ID do projeto que quer usar neste tutorial.Se for solicitado que você autorize o Cloud Shell, clique em Autorizar para concluir a operação.
Ative as APIs necessárias para este tutorial:
gcloud
gcloud services enable \ mesh.googleapis.com \ anthos.googleapis.com
Config Connector
Este tutorial inclui recursos do Config Connector. É possível usar esses recursos para realizar as mesmas tarefas que você concluiu na guia
gcloud
. Para utilizar esses recursos, instale o Config Connector e aplique os recursos da maneira que funcionar melhor para seu ambiente.Use o manifesto
Services
a seguir:apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: mesh.googleapis.com spec: resourceID: mesh.googleapis.com projectRef: external: PROJECT_ID --- apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: anthos.googleapis.com spec: resourceID: anthos.googleapis.com projectRef: external: PROJECT_ID
A conclusão dessa operação pode levar mais de um minuto.
Configurar um cluster do GKE
Nesta seção, você criará um cluster do GKE e o registrará em uma frota. As frotas são um conceito do Google Cloud para organizar logicamente clusters e outros recursos. Elas permitem que você use e gerencie recursos de vários clusters e aplique políticas consistentes nos seus sistemas.
O cluster criado nesta seção é o cluster instalado Cloud Service Mesh, Policy Controller e Config Sync ativados. É também o cluster em que você implanta os apps de exemplo da Online Boutique.
Para configurar o cluster, siga estas etapas:
Crie um cluster do GKE:
gcloud
gcloud container clusters create ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --machine-type=e2-standard-4 \ --num-nodes 4 \ --workload-pool ${PROJECT_ID}.svc.id.goog \ --labels mesh_id=proj-${PROJECT_NUMBER}
Config Connector
Use os manifestos
ContainerCluster
eContainerNodePool
abaixo:apiVersion: container.cnrm.cloud.google.com/v1beta1 kind: ContainerNodePool metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: clusterRef: name: asm-acm-tutorial location: us-east4-a nodeConfig: machineType: e2-standard-4 nodeCount: 4 --- apiVersion: container.cnrm.cloud.google.com/v1beta1 kind: ContainerCluster metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID cnrm.cloud.google.com/remove-default-node-pool: "true" labels: mesh_id: proj-PROJECT_NUMBER name: asm-acm-tutorial spec: location: us-east4-a initialNodeCount: 1 workloadIdentityConfig: workloadPool: PROJECT_ID.svc.id.goog
Substitua
PROJECT_NUMBER
pelo valor da variável de ambientePROJECT_NUMBER
recuperada anteriormente.A conclusão dessa operação pode levar mais de cinco minutos.
Para garantir a criação do cluster do GKE, descreva o status dele:
gcloud container clusters list \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}
O resultado será assim:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS asm-acm-tutorial us-east4-a 1.23.12-gke.100 35.186.179.30 e2-standard-4 1.23.12-gke.100 3 RUNNING
Conecte-se ao cluster do GKE:
gcloud container clusters get-credentials ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}
Registre o cluster em uma frota.
gcloud
gcloud container fleet memberships register ${MEMBERSHIP} \ --project ${PROJECT_ID} \ --gke-cluster ${CLUSTER_ZONE}/${CLUSTER} \ --enable-workload-identity
O resultado será assim:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be created...done. Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial] Generating the Connect Agent manifest... Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]... Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]. Finished registering the cluster [asm-acm-tutorial] with the Fleet.
Config Connector
Use o manifesto
GKEHubMembership
a seguir:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubMembership metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: location: global authority: issuer: https://container.googleapis.com/v1/projects/PROJECT_ID/locations/us-east4-a/clusters/asm-acm-tutorial endpoint: gkeCluster: resourceRef: name: asm-acm-tutorial
Para garantir o registro bem-sucedido do cluster do GKE, descreva seu status:
gcloud container fleet memberships list
O resultado será assim:
NAME EXTERNAL_ID LOCATION asm-acm-tutorial 0e12258c-8831-4d81-b5c0-5e7099a468cc global
Analisar os repositórios
Na seguinte seção de instalação, você vai aplicar uma
arquivo de manifesto acm-config.yaml
. Esse manifesto configura
cluster a ser sincronizado pelo
Pasta asm-acm-tutorial
do repositório de amostra. Essa pasta contém todos
os arquivos de configuração necessários para concluir o restante do tutorial.
Para simplificar este tutorial, use os comandos sed
para atualizar
acm-config.yaml
. Com o arquivo acm-config.yaml
,
o Config Sync implanta os manifestos necessários para cada etapa deste tutorial.
Atualizar um único arquivo ajuda você a se concentrar nos conceitos e no fluxo
da proteção dos clusters, da malha e dos aplicativos sem manipular
os arquivos e executar comandos git
repetidamente.
Para usar a capacidade do Config Sync de sincronizar vários repositórios, use os seguintes recursos:
root-sync
, como um repositórioRootSync
, contém todas as configurações no cluster, inclusiveRepoSyncs
,Constraints
,ClusterRole
,RoleBindings
e recursos incluídos em alguns namespaces do sistema, comoistio-system
.ingress-gateway
, como o primeiroRepoSync
, contém todos os recursos necessários para implantar um gateway de entrada e protegê-lo progressivamente ao longo deste tutorial.online-boutique
, como um segundoRepoSync
, contém todos os recursos necessários para implantar os apps da Online Boutique e protegê-los progressivamente ao longo deste tutorial.
Instalar o Policy Controller, o Config Sync e o Cloud Service Mesh gerenciado
Agora que você criou e registrou seu cluster, é possível instalar
Config Sync, Policy Controller e Cloud Service Mesh no cluster e
configure o cluster para sincronização com base nas configurações do RootSync
padrão:
Ative o operador
ConfigManagement
, que gerencia o Config Sync e o Policy Controller:gcloud
gcloud beta container fleet config-management enable
Config Connector
Use o manifesto
GKEHubFeature
a seguir:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: configmanagement spec: projectRef: external: PROJECT_ID location: global resourceID: configmanagement
Ative o Cloud Service Mesh na sua frota.
gcloud
gcloud container fleet mesh enable
Config Connector
Use o manifesto
GKEHubFeature
a seguir:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: servicemesh spec: projectRef: external: PROJECT_ID location: global resourceID: servicemesh
Ative o gerenciamento automático do Cloud Service Mesh para permitir que o Google aplicar a configuração recomendada do Cloud Service Mesh gerenciado:
gcloud
gcloud container fleet mesh update \ --management automatic \ --memberships ${MEMBERSHIP}
Config Connector
Use o manifesto
GKEHubFeatureMembership
a seguir:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: servicemesh-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: servicemesh mesh: management: MANAGEMENT_AUTOMATIC
Ative o Config Sync e o Policy Controller:
gcloud
Salve o manifesto a seguir como
acm-config.yaml
no diretório~/asm-acm-tutorial-dir
:applySpecVersion: 1 spec: configSync: enabled: true policyDir: asm-acm-tutorial/root-sync/init secretType: none sourceFormat: unstructured syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples syncBranch: main policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: true
Para saber mais sobre os campos de configuração da Google Cloud CLI, consulte gcloud apply spec fields.
Aplique o arquivo:
gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Config Connector
Use o manifesto
GKEHubFeatureMembership
a seguir:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: configmanagement-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: configmanagement configmanagement: configSync: sourceFormat: unstructured git: policyDir: asm-acm-tutorial/root-sync/init secretType: none syncBranch: main syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: true
O Policy Controller e o Config Sync estão instalados no cluster. Em seguida, o Config Sync começa a sincronizar todas as configurações do
RootSync
padrão com o cluster. Essas configurações instalam e configuram os seguintes componentes-chave:Os objetos
RepoSync
que configuram os apps da Online Boutique e o gateway de entrada são sincronizados:Como os reconciliadores
RepoSync
precisam de permissões adicionais para criar recursos do Istio, um objetoClusterRole
e dois objetosRoleBinding
para conceder essas permissões também são aplicados ao seu cluster:
Para garantir a instalação bem-sucedida do Policy Controller e do Config Sync, verifique o status:
gcloud beta container fleet config-management status
O resultado será assim:
Name: asm-acm-tutorial Status: SYNCED Last_Synced_Token: 4b3384d Sync_Branch: main Last_Synced_Time: 2022-05-04T21:32:58Z Policy_Controller: INSTALLED Hierarchy_Controller: PENDING
Se você vir
PENDING
ouNOT_INSTALLED
nas linhasStatus
ouPolicy_Controller
, aguarde alguns minutos e executegcloud beta container fleet config-management status
novamente.Para garantir a instalação bem-sucedida do Cloud Service Mesh, descreva o status dele:
gcloud container fleet mesh describe
O resultado será assim:
createTime: '2022-09-13T23:12:56.477042921Z' membershipSpecs: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: |- Revision(s) ready for use: asm-managed. All Canonical Services have been reconciled successfully. updateTime: '2022-09-14T00:19:10.571552206Z' name: projects/PROJECT_ID/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-09-14T00:19:14.135113118Z'
Se você vir
state.code: ERROR
em vez destate.code: OK
, aguarde alguns minutos e executegcloud container fleet mesh describe
novamente. Antes de prosseguir com o tutorial, verifique se o camposervicemesh.controlPlaneManagement.details.code
tem o valorREVISION_READY
.
Implantar um gateway de entrada e um app de exemplo
Nesta seção, você implanta o aplicativo de exemplo da Online Boutique e um gateway de entrada para gerenciar o tráfego de entrada.
Implante o aplicativo de amostra Online Boutique e o gateway de entrada.
O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
para que o Config Sync implante os recursos necessários para implantar o gateway de entrada e o app de amostra.sed -i "s,root-sync/init,root-sync/deployments,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
Essa etapa pode levar alguns minutos para ser concluída.
Veja o status do Config Sync de
RootSync
e dos doisRepoSyncs
:gcloud alpha anthos config sync repo describe
A resposta é semelhante a:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Para ver apenas as informações de um repositório, use as sinalizações
--sync-name
e--sync-namespace
. Para ver os recursos gerenciados em detalhes, adicione a flag--managed-resources
. Para mais informações, consulte Ver o status do Config Sync em vários clusters.Aguarde o provisionamento do endereço IP público do gateway de entrada:
until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
Anote o endereço IP público do gateway de entrada:
EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
Acesse o endereço IP do seu navegador para verificar se o app Online Boutique foi implantado:
echo http://${EXTERNAL_IP}
Aplicar políticas para proteger a malha
Nas seções a seguir, você vai usar Policy Controller (link em inglês) para aplicar as políticas Pacote de políticas do Cloud Service Mesh criando restrições.
Aplicar injeção de proxies sidecar
Nesta seção, você aplicará políticas para garantir que todas as cargas de trabalho na malha tenham a injeção automática de arquivo secundário ativada.
Para aplicar a injeção de proxies sidecar, aplique restrições.
O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
e fazer com que o Config Sync implante os recursos associados.sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
O comando anterior implanta os seguintes recursos:
Um
K8sRequiredLabels
Constraint
que exigeNamespace
na malha para conter o Rótulo de injeção do proxy sidecar do Cloud Service Mesh:Um
AsmSidecarInjection
Constraint
que proíbe qualquerPod
na malha de ignorar a injeção do sidecar do proxy do Istio:
Veja o status do Config Sync para o
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
A saída é semelhante a:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Verifique se as
Constraints
foram criadas:kubectl get constraints
Pode levar alguns minutos para o Policy Controller avaliar essas restrições. Se os valores não aparecerem na coluna
TOTAL-VIOLATIONS
, aguarde e executekubectl get constraints
novamente.A saída é semelhante a:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0
Como configuramos corretamente nossos
Namespaces
ePods
, há0
TOTAL-VIOLATIONS
para essesConstraints
.Para ver essas
Constraints
em funcionamento, tente criar umNamespace
no cluster sem umlabel
nem umannotation
:kubectl create namespace test
A resposta será semelhante a esta:
Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
Aplicar criptografia de tráfego
Nesta seção, você aplicará políticas para garantir que todo o tráfego na malha seja criptografado.
Para aplicar a criptografia do tráfego, aplique restrições.
O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
e fazer com que o Config Sync implante os recursos associados.sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
O comando anterior implanta os seguintes recursos:
Um
AsmPeerAuthnMeshStrictMtls
Constraint
que aplica o mTLSPeerAuthentication
no nível da malha no namespaceistio-system
:Uma restrição referencial
Config
no namespacegatekeeper-system
. Essa restrição referencial permite que oAsmPeerAuthnMeshStrictMtls
Constraint
faça referência a outro objeto na definição (por exemplo, pesquisar qualquerPeerAuthentication
noistio-system
Namespace
):Um
Constraint
DestinationRuleTLSEnabled
que proíbe a desativação do TLS para todos os hosts e subconjuntos de hosts noDestinationRules
do Istio:Um
Constraint
AsmPeerAuthnStrictMtls
que exige que todos osPeerAuthentications
não substituam mTLSSTRICT
:
Veja o status do Config Sync para o
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
A saída é semelhante a:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Execute o seguinte comando para ver mais informações sobre a violação
PeerAuthentication
:kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}' | jq
A saída é semelhante a:
[ { "enforcementAction": "deny", "group": "constraints.gatekeeper.sh", "kind": "AsmPeerAuthnMeshStrictMtls", "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication", "name": "mesh-level-strict-mtls", "version": "v1beta1" } ]
Corrija o problema implantando um
PeerAuthentication
noistio-system
. Para impedir que todos os serviços na malha aceitem tráfego de texto simples, defina uma políticaPeerAuthentication
para toda a malha, com o modo mTLS definido comoSTRICT
. Quando você implanta a política, o plano de controle provisiona certificados TLS automaticamente, para que as cargas de trabalho possam ser autenticadas entre si.O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
e fazer com que o Config Sync implante os recursos associados.sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
O comando anterior implanta o seguinte
PeerAuthentication
mTLSSTRICT
no namespaceistio-system
. Isso aplica mTLSSTRICT
a toda a malha:Veja o status do Config Sync para o
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
A saída é semelhante a:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Verifique se as
Constraints
foram criadas:kubectl get constraints
Pode levar alguns minutos para o Policy Controller avaliar esses
Constraints
. Aguarde e execute novamente o comandokubectl get constraints
até receber valores na colunaTOTAL-VIOLATIONS
de cada linha.A saída é semelhante a:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0
Aplicar controle de acesso granular
Nesta seção, você aplicará políticas para garantir que todas as cargas de trabalho na malha tenham controle de acesso granular.
Para aplicar o controle de acesso granular, aplique restrições.
O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
e fazer com que o Config Sync implante os recursos associados.sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
O comando anterior implanta os seguintes recursos:
Uma
AsmAuthzPolicyDefaultDeny
Constraint
que aplica a negação padrão da malhaAuthorizationPolicy
na páginaistio-system
namespace:Um
AsmAuthzPolicyEnforceSourcePrincipals
Constraint
, que determina que qualquerAuthorizationPolicies
esteja definindo principais de origem granulares (que não sejam "*"). Somente o gateway de entrada no namespaceasm-ingress
é uma exceção a essa regra para receber o tráfego dos usuários finais e redirecionar o tráfego para o appfrontend
da Online Boutique.
Veja o status do Config Sync para o
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
A saída é semelhante a:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Execute o seguinte comando para ver mais informações sobre a violação associada:
kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}' | jq
A saída é semelhante a:
[ { "enforcementAction": "deny", "group": "constraints.gatekeeper.sh", "kind": "AsmAuthzPolicyDefaultDeny", "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy", "name": "default-deny-authorization-policies", "version": "v1beta1" } ]
Corrija o problema implantando o
AuthorizationPolicy
no namespaceistio-system
.O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
e fazer com que o Config Sync implante os recursos associados.sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
O comando anterior implanta o seguinte
AuthorizationPolicy
de negação de todos no namespaceistio-system
:Veja o status do Config Sync para o
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
A saída é semelhante a:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Verifique se as
Constraints
foram criadas:kubectl get constraints
Pode levar alguns minutos para o Policy Controller avaliar esses
Constraints
. Aguarde e execute novamente o comandokubectl get constraints
até receber valores na colunaTOTAL-VIOLATIONS
de cada linha.A saída é semelhante a:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all deny 0
Acesse o app "Online Boutique" no seu navegador:
echo http://${EXTERNAL_IP}
Você receberá o erro:
RBAC: access denied
, que confirma que a negação padrãoAuthorizationPolicy
é aplicada a toda a malha.Para corrigir esse problema, implante uma
AuthorizationPolicies
mais granular nos namespacesasm-ingress
eonlineboutique
.O comando a seguir usa
sed
para atualizar o manifestoacm-config.yaml
e fazer com que o Config Sync implante os recursos associados.sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yaml
O comando anterior implanta os seguintes recursos:
Um
AuthorizationPolicy
no namespaceasm-ingress
:Um
AuthorizationPolicy
por app no namespaceonlineboutique
. Veja o exemplo do appcartservice
:Uma
ServiceAccount
por app nos namespacesasm-ingress
eonlineboutique
para que uma identidade exclusiva por app seja avaliada comoprincipal
emAuthorizationPolicies
. Veja o exemplo do appcartservice
:
Veja o status do Config Sync de
RootSync
e dos doisRepoSyncs
:gcloud alpha anthos config sync repo describe
A resposta é semelhante a:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main", "status": "SYNCED" } ]
Se você vir
status: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Para ver apenas as informações de um repositório, use as sinalizações
--sync-name
e--sync-namespace
. Para ver em detalhes os recursos gerenciados, adicione a flag--managed-resources
. Para mais informações, consulte Ver o status do Config Sync em vários clusters.Acesse o app Online Boutique novamente no seu navegador:
echo http://${EXTERNAL_IP}
Depois de alguns minutos, o site voltará a funcionar.
Confira o status dos recursos de segurança do GKE Enterprise
É possível ver o status dos recursos de segurança do GKE Enterprise, incluindo políticas de autenticação e autorização, no Console do Google Cloud.
No console do Google Cloud, acesse a página Segurança do GKE Enterprise.
Acessar a segurança do GKE Enterprise
O Resumo da política exibe o status da segurança do aplicativo, incluindo o controle de acesso ao serviço (
AuthorizationPolicies
) e a mTLS.Clique em Auditoria de políticas para ver os status da política da carga de trabalho para o cluster e os dois namespaces (
asm-ingress
eonlineboutique
).Os cards Controle de acesso ao serviço e Status mTLS oferecem uma visão geral de alto nível.
A lista Cargas de trabalho mostra o controle de acesso ao serviço e o status mTLS de cada carga de trabalho.
Você protegeu o cluster e a malha com o Policy Controller e o Config Sync.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Excluir recursos individuais
Para excluir os recursos individuais:
Cancele o registro do cluster na frota:
gcloud
gcloud container fleet memberships unregister ${CLUSTER} \ --project=${PROJECT_ID} \ --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
O resultado será assim:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be deleted...done. Deleting membership CR in the cluster...done. Deleting namespace [gke-connect] in the cluster...done.
Config Connector
kubectl delete -f ~/asm-acm-tutorial-dir/fleet-membership.yaml
Exclua o cluster:
gcloud
gcloud container clusters delete ${CLUSTER} \ --zone ${CLUSTER_ZONE}
Pressione
y
quando for solicitado. A conclusão desse comando pode levar cerca de cinco minutos.O resultado será assim:
Deleting cluster asm-acm-tutorial...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].
Config Connector
kubectl delete -f ~/asm-acm-tutorial-dir/container-cluster.yaml
Exclua os arquivos que você criou:
rm -r ~/asm-acm-tutorial-dir
A seguir
- Descubra as práticas recomendadas de segurança do Cloud Service Mesh.
- Saiba mais sobre o pacote de políticas do Cloud Service Mesh
- Explore a biblioteca de modelos de restrição do Policy Controller.
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.