Configurar políticas de autorização em sidecars no GKE
Nesta página, mostramos instruções para configurar diferentes tipos de políticas de autorização em sidecars do Cloud Service Mesh no GKE.
Antes de começar
Você precisa conhecer a API Gateway e as extensões de autorização.
Antes de criar uma política de autorização, siga estas etapas:
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho sem custos financeiros.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Network Security, Network Services APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Network Security, Network Services APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
AuthzPolicy em todo o namespace
Se você quiser negar um padrão de tráfego esperado para todo o namespace, configure uma política de autorização para negar todas as solicitações HTTP recebidas para todas as cargas de trabalho em um namespace:
cat >ns-authz-policy-deny.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: ns-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector: {}
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/bad_token"
action: DENY
enforcementLevel: L7
EOF
kubectl apply -f ns-authz-policy-deny.yaml
O selector: {} vazio segmenta todos os pods no namespace.
Se você quiser permitir um padrão de tráfego esperado para todo o namespace, configure uma política de autorização para permitir solicitações HTTP de entrada para todas as cargas de trabalho em um namespace:
cat >ns-authz-policy-allow.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: ns-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector: {}
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/headers"
methods: ["GET"]
action: ALLOW
enforcementLevel: L7
EOF
kubectl apply -f ns-authz-policy-allow.yaml
O selector: {} vazio segmenta todos os pods no namespace.
Negar solicitações de entrada para uma carga de trabalho
Se você tiver uma carga de trabalho que deve fazer apenas chamadas de saída, como um cron job, configure uma política de autorização para negar todas as solicitações HTTP recebidas para a carga de trabalho:
cat >deny-path-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: my-workload-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector:
matchLabels:
app: EXAMPLE_APP
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/deny_path"
action: DENY
enforcementLevel: L7
EOF
kubectl apply -f deny-path-authz-policy.yaml
A saída é semelhante a:
gcpauthzpolicy.networking.gke.io/my-workload-authz created
Depois que essa política for aplicada, qualquer solicitação HTTP recebida para o caminho /deny_path nos pods que correspondem ao app: EXAMPLE_APP será rejeitada, e o autor da chamada receberá um código de resposta HTTP 403 Forbidden.
Permitir solicitações de entrada específicas para uma carga de trabalho
Também é possível configurar uma política de ALLOW que permita apenas solicitações que correspondam a um
critério específico e rejeite as demais.
O exemplo a seguir configura uma
política de autorização na implantação example-app para permitir apenas solicitações mTLS
de pods com identidade spiffe://cluster.local/NAMESPACE/pod1.
cat >allow-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: my-workload-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector:
matchLabels:
app: EXAMPLE_APP
rules:
- from:
sources:
- principals:
- principal:
type: Exact
value: "spiffe://cluster.local/NAMESPACE/pod1"
action: ALLOW
enforcementLevel: L7
EOF
kubectl apply -f allow-authz-policy.yaml
A saída é semelhante a:
gcpauthzpolicy.networking.gke.io/my-workload-authz created
Somente as solicitações recebidas autenticadas usando mTLS que apresentarem a identidade SPIFFE
exata spiffe://cluster.local/NAMESPACE/pod1 receberão um HTTP
200 OK. Qualquer outra solicitação será rejeitada pelo proxy com um HTTP 403
Forbidden.
Delegar para um mecanismo de autorização externo
É possível usar seu próprio mecanismo de autorização e configurar o Cloud Service Mesh para delegar todas as decisões de autorização de uma carga de trabalho ao mecanismo configurado.
Instale a CRD
GCPAuthzExtensionse ela ainda não estiver instalada:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/main/config/crd/networking.gke.io_gcpauthzextensions.yamlImplante uma carga de trabalho de extensão de autorização baseada em chamada no Kubernetes que ofereça suporte ao protocolo gRPC
ext_proce configure um recurso de extensão de autorização:cat >authz-extension.yaml <<EOF apiVersion: networking.gke.io/v1 kind: GCPAuthzExtension metadata: name: my-authz-ext namespace: NAMESPACE spec: backendRef: group: "" kind: Service name: authz-service port: PORT authority: "authz-service.NAMESPACE.svc.cluster.local" forwardHeaders: - Authorization failOpen: false timeout: "100ms" wireFormat: ExtProcGRPC EOF kubectl apply -f authz-extension.yamlSubstitua:
NAMESPACE: o namespace do serviçoauthz-servicee das cargas de trabalho.PORT: a porta do serviçoauthz-serviceque disponibiliza a API gRPCext_proc.
Esse comando cria uma extensão de autorização baseada em chamada que é executada como um serviço do Kubernetes
authz-service.A saída é semelhante a:
gcpauthzextension.networking.gke.io/my-authz-ext createdConfigure a política de autorização para delegar decisões de autorização da carga de trabalho à extensão de autorização configurada anteriormente:
cat >authz-policy.yaml <<EOF apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: my-workload-authz namespace: NAMESPACE spec: targetRefs: - group: "" kind: Pod selector: matchLabels: app: EXAMPLE_APP rules: - from: sources: - principals: - principal: type: Exact value: "spiffe://cluster.local/NAMESPACE/pod1" to: operations: - paths: - type: Exact value: "/api/payments-schedule" action: CUSTOM enforcementLevel: L7 customProviders: extensionRefs: - group: networking.gke.io kind: GCPAuthzExtension name: my-authz-ext EOF kubectl apply -f authz-policy.yamlA saída é semelhante a:
gcpauthzpolicy.networking.gke.io/my-workload-authz createdO proxy aguarda a resposta da extensão de autorização antes de encaminhar a solicitação ao aplicativo. Se a extensão rejeitar a solicitação encerrando a chamada com um erro ou se a chamada falhar ou expirar enquanto
failOpenforfalse, o autor da chamada vai receber uma resposta HTTP 500. Se a extensão enviar uma resposta imediata, o autor da chamada vai receber o código de status dessa resposta.