As contas de serviço representam utilizadores não humanos. Destinam-se a cenários em que uma carga de trabalho, como uma aplicação personalizada, precisa de aceder a recursos ou realizar ações sem a participação do utilizador final.
Embora as contas de serviço sejam uma ferramenta útil, existem várias formas de abusar de uma conta de serviço:
- Aumento de privilégios: um ator malicioso pode obter acesso a recursos aos quais, de outra forma, não teria acesso, fazendo-se passar pela conta de serviço.
- Roubo de identidade: um interveniente malicioso pode usar a representação da conta de serviço para ocultar a respetiva identidade.
- Não repúdio: um autor malicioso pode ocultar a respetiva identidade e ações através da utilização de uma conta de serviço para realizar operações em seu nome. Em alguns casos, pode não ser possível rastrear estas ações até ao interveniente prejudicial.
- Divulgação de informações: um ator malicioso pode obter informações sobre a sua infraestrutura, aplicações ou processos a partir da existência de determinadas contas de serviço.
Para ajudar a proteger as contas de serviço, considere a sua natureza dupla:
- Uma vez que uma conta de serviço é um principal, tem de limitar os respetivos privilégios para reduzir o potencial dano que pode ser causado por uma conta de serviço comprometida.
- Uma vez que uma conta de serviço é um recurso, tem de a proteger contra o compromisso.
Este guia apresenta práticas recomendadas para gerir, usar e proteger contas de serviço.
Escolha quando usar contas de serviço
Nem todos os cenários requerem uma conta de serviço para aceder aos Trusted Cloud serviços, e muitos cenários podem ser autenticados com um método mais seguro do que usar uma chave de conta de serviço. Recomendamos que evite usar chaves de contas de serviço sempre que possível.
Quando acede aos Trusted Cloud by S3NS serviços através da CLI Google Cloud, das bibliotecas de cliente da nuvem, das ferramentas que suportam as credenciais predefinidas da aplicação (ADC) como o Terraform ou os pedidos REST, use o diagrama seguinte para ajudar a escolher um método de autenticação:
Este diagrama orienta-o através das seguintes perguntas:
-
Está a executar código num ambiente de desenvolvimento de utilizador único, como a sua própria estação de trabalho,
o Cloud Shell ou uma interface de computador virtual?
- Em caso afirmativo, avance para a pergunta 4.
- Caso contrário, avance para a pergunta 2.
- Está a executar código no Trusted Cloud by S3NS?
- Em caso afirmativo, avance para a pergunta 3.
- Caso contrário, avance para a pergunta 5.
- Está a executar contentores no Google Kubernetes Engine?
- Em caso afirmativo, use a federação de identidades da carga de trabalho para o GKE para anexar contas de serviço a pods do Kubernetes.
- Se não, anexe uma conta de serviço ao recurso.
-
O seu exemplo de utilização requer uma conta de serviço?
Por exemplo, quer configurar a autenticação e a autorização de forma consistente para a sua aplicação em todos os ambientes.
-
A sua carga de trabalho autentica-se com um fornecedor de identidade externo que suporta a
federação de identidade da carga de trabalho?
- Se sim, configure a federação de identidades da carga de trabalho para permitir que as aplicações executadas no local ou noutros fornecedores de nuvem usem uma conta de serviço.
- Se não, crie uma chave de conta de serviço.
Faça a gestão das contas de serviço
As contas de serviço diferem de outros tipos de responsáveis, não só na forma como são usadas, mas também na forma como têm de ser geridas. As secções seguintes fornecem práticas recomendadas para gerir contas de serviço.
Práticas recomendadas:
Faça a gestão das contas de serviço como recursos.Crie contas de serviço de finalidade única.
Siga uma convenção de nomenclatura e documentação.
Identifique e desative contas de serviço não usadas.
Desative as contas de serviço não usadas antes de as eliminar.
Faça a gestão das contas de serviço como recursos
Normalmente, as contas de utilizadores individuais são geridas de acordo com os processos de admissão, transferência e saída de uma organização: quando um funcionário é admitido, é criada uma nova conta de utilizador para o mesmo. Quando mudam de departamento, a respetiva conta de utilizador é atualizada. Além disso, quando sai da empresa, a respetiva conta de utilizador é suspensa ou eliminada.
Por outro lado, as contas de serviço não estão associadas a nenhum funcionário específico. Em alternativa, é melhor pensar nas contas de serviço como recursos que pertencem ou fazem parte de outro recurso, como uma instância de VM específica ou uma aplicação.
Para gerir eficazmente as contas de serviço, não as analise isoladamente. Em alternativa, considere-as no contexto do recurso ao qual estão associadas e faça a gestão da conta de serviço e do respetivo recurso associado como uma unidade: aplique os mesmos processos, o mesmo ciclo de vida e a mesma diligência à conta de serviço e ao respetivo recurso associado, e use as mesmas ferramentas para os gerir.
Crie contas de serviço de finalidade única
A partilha de uma única conta de serviço em várias aplicações pode complicar a gestão da conta de serviço:
- As aplicações podem ter ciclos de vida diferentes. Se uma aplicação for desativada, pode não ser claro se a conta de serviço também pode ser desativada ou se ainda é necessária.
- Ao longo do tempo, os requisitos de acesso das aplicações podem divergir. Se as aplicações usarem a mesma conta de serviço, pode ter de conceder à conta de serviço acesso a um número crescente de recursos, o que, por sua vez, aumenta o risco geral.
- Os registos de auditoria da nuvem incluem o nome da conta de serviço que efetuou uma alteração ou acedeu aos dados, mas não mostram o nome da aplicação que usou a conta de serviço. Se várias aplicações partilharem uma conta de serviço, pode não conseguir rastrear a atividade até à aplicação correta.
Em particular, alguns Trusted Cloud serviços, incluindo o App Engine e o Compute Engine, criam uma conta de serviço predefinida que tem a função de editor (roles/editor
) no projeto por predefinição. Quando cria um recurso, como uma instância de máquina virtual (VM) do Compute Engine, e não especifica uma conta de serviço, o recurso pode usar automaticamente a conta de serviço predefinida. Embora a conta de serviço predefinida facilite o início, é muito arriscado partilhar uma conta de serviço tão poderosa em várias aplicações.
Pode tomar várias medidas para evitar estas complicações:
- Crie contas de serviço dedicadas para cada aplicação e evite usar contas de serviço predefinidas.
- Não use concessões de funções automáticas para contas de serviço predefinidas.
- Use as ferramentas da Google para compreender a utilização das contas de serviço, o que pode ajudar a monitorizar a utilização e impedir que as contas de serviço sejam partilhadas em várias aplicações.
Seguir uma convenção de nomenclatura e documentação
Para ajudar a acompanhar a associação entre um serviço e uma aplicação ou um recurso, siga uma convenção de nomenclatura quando criar novas contas de serviço:
- Adicione um prefixo ao endereço de email da conta de serviço que identifique como a conta é usada. Por exemplo:
vm-
para contas de serviço anexadas a uma instância de VM.wlifgke-
para contas de serviço usadas pela federação de identidades da carga de trabalho para o GKE.wlif-
para contas de serviço usadas pela federação de identidades da carga de trabalho.onprem-
para contas de serviço usadas por aplicações no local.
- Incorporar o nome da aplicação no endereço de email da conta de serviço,
por exemplo:
vm-travelexpenses@
se a VM executar uma aplicação de despesas de viagens. - Use o campo de descrição para adicionar uma pessoa de contacto, links para documentação relevante ou outras notas.
Não incorpore informações confidenciais nem termos no endereço de email de uma conta de serviço.
Identifique e desative contas de serviço não usadas
Quando uma conta de serviço deixa de ser usada, desative-a. Ao desativar contas de serviço não usadas, reduz o risco de as contas de serviço serem usadas indevidamente para movimento lateral ou para elevação de privilégios por um agente malicioso.
Para contas de serviço de finalidade única associadas a um recurso específico, como uma instância de VM, desative a conta de serviço assim que o recurso associado for desativado ou eliminado.
Desative as contas de serviço não usadas antes de as eliminar
Se eliminar uma conta de serviço e, em seguida, criar uma nova conta de serviço com o mesmo nome, é atribuída uma identidade diferente à nova conta de serviço. Como resultado, nenhuma das vinculações de IAM originais se aplica à nova conta de serviço. Por outro lado, se desativar e reativar uma conta de serviço, todas as associações do IAM permanecem intactas.
Para evitar perder inadvertidamente associações de IAM, é melhor não eliminar contas de serviço imediatamente. Em alternativa, desative uma conta de serviço se já não for necessária e elimine-a apenas após um determinado período.
Nunca elimine contas de serviço predefinidas, como a conta de serviço predefinida do App Engine ou a conta de serviço predefinida do Compute Engine. Não é possível recriar estas contas de serviço sem desativar e reativar a API respetiva, o que pode afetar a implementação existente. Se não usar as contas de serviço predefinidas, desative-as.
Limite os privilégios da conta de serviço
As contas de serviço são principais e podem receber acesso a um recurso como qualquer outro tipo de principal. No entanto, as contas de serviço têm frequentemente maior acesso a mais recursos do que outros tipos de principais. Além disso, à medida que adiciona funcionalidades às suas aplicações, as respetivas contas de serviço tendem a ganhar cada vez mais acesso ao longo do tempo. Também pode esquecer-se de revogar o acesso que já não é necessário.
Práticas recomendadas:
Não use concessões de funções automáticas para contas de serviço predefinidas.Não confie nos âmbitos de acesso quando anexar uma conta de serviço a uma instância de VM.
Use a API IAM Credentials para elevação temporária de privilégios.
Não use concessões de funções automáticas para contas de serviço predefinidas
Alguns Trusted Cloud by S3NS serviços criam contas de serviço predefinidas quando ativa pela primeira vez a respetiva API num Trusted Cloud projeto. Consoante a configuração da política da organização,
estas contas de serviço podem receber automaticamente a função de editor
(roles/editor
) no seu Trusted Cloud projeto, o que lhes permite ler e
modificar todos os recursos no Trusted Cloud projeto. A função é concedida para sua conveniência, mas não é essencial para o funcionamento dos serviços: para aceder aos recursos no seu Trusted Cloud projeto Trusted Cloud , os serviços usam agentes de serviço e não as contas de serviço predefinidas.
Para impedir que as contas de serviço predefinidas recebam automaticamente a função de editor, ative a restrição Desativar concessões de IAM automáticas para contas de serviço predefinidas (constraints/iam.automaticIamGrantsForDefaultServiceAccounts
) na sua organização. Para aplicar a restrição a vários Trusted Cloud projetos,
configure-a no nó da pasta ou da organização.
A aplicação da restrição não remove a função de editor das contas de serviço predefinidas existentes.
Se aplicar esta restrição, as contas de serviço predefinidas em novos projetos não têm acesso aos seus Trusted Cloud recursos. Tem de conceder funções adequadas às contas de serviço predefinidas para que possam aceder aos seus recursos.
Não confie nos âmbitos de acesso quando anexar uma conta de serviço a uma instância de VM
Quando anexa uma conta de serviço a uma instância de VM, pode especificar um ou mais âmbitos de acesso. Os âmbitos de acesso permitem restringir os serviços aos quais a VM pode aceder. As restrições são aplicadas além das políticas de permissão.
Os âmbitos de acesso são pouco detalhados. Por exemplo, ao usar o âmbito https://www.googleapis.com/auth/devstorage.read_only
, pode restringir o acesso a operações de leitura do Cloud Storage, mas não pode restringir o acesso a contentores específicos. Por conseguinte, os âmbitos de acesso não são uma substituição adequada para políticas de autorização detalhadas.
Em vez de depender dos âmbitos de acesso, crie uma conta de serviço dedicada e use políticas de autorização detalhadas para restringir os recursos aos quais a conta de serviço tem acesso.
Se todas as contas de serviço atuais e futuras num projeto, numa pasta ou numa organização específicos partilharem requisitos, use conjuntos de principais de contas de serviço para lhes conceder funções em vez de usar grupos personalizados.
Use a API Service Account Credentials para a elevação temporária de privilégios
Algumas aplicações só requerem acesso a determinados recursos em momentos específicos ou em circunstâncias específicas. Por exemplo:
- Uma aplicação pode exigir acesso a dados de configuração durante o arranque, mas pode não exigir esse acesso depois de inicializada.
- Uma aplicação de supervisão pode iniciar periodicamente tarefas em segundo plano em que cada tarefa tem requisitos de acesso diferentes.
Em tais cenários, a utilização de uma única conta de serviço e a concessão de acesso a todos os recursos vai contra o princípio do menor privilégio. Isto deve-se ao facto de, em qualquer momento, a aplicação ter provavelmente acesso a mais recursos do que realmente precisa.
Para ajudar a garantir que as diferentes partes da sua aplicação só têm acesso aos recursos de que precisam, use a API Service Account Credentials para a elevação temporária de privilégios:
- Crie contas de serviço dedicadas para cada parte da aplicação ou exemplo de utilização e conceda apenas à conta de serviço acesso aos recursos necessários.
- Crie outra conta de serviço que funcione como supervisor. Conceda à conta de serviço do supervisor a função de criador de tokens de contas de serviço nas outras contas de serviço para que possa pedir tokens de acesso de curta duração para estas contas de serviço.
- Divida a sua aplicação para que uma parte da aplicação funcione como agente de tokens e permita que apenas esta parte da aplicação use as contas de serviço do supervisor.
- Use o agente de tokens para emitir contas de serviço de curta duração para as outras partes da aplicação.
Para obter ajuda com a criação de credenciais de curta duração, consulte o artigo Crie credenciais de curta duração para uma conta de serviço.
Proteja-se contra ameaças de escalada de privilégios
Uma conta de serviço à qual não foram concedidas funções, que não tem acesso a recursos e que não está associada a regras de firewall, tem normalmente um valor limitado. Depois de conceder a uma conta de serviço acesso a recursos, o valor da conta de serviço aumenta: a conta de serviço torna-se mais útil para si, mas também se torna um alvo mais atrativo para ataques de escalada de privilégios.
Por exemplo, considere uma conta de serviço que tenha acesso total a um contentor do Cloud Storage que contenha informações confidenciais. Nesta situação, a conta de serviço é tão valiosa quanto o contentor do Cloud Storage. Em vez de tentar aceder diretamente ao contentor, um interveniente malicioso pode tentar assumir o controlo da conta de serviço. Se essa tentativa for bem-sucedida, o autor da ameaça pode aumentar os respetivos privilégios ao roubar a identidade da conta de serviço, o que, por sua vez, lhe dá acesso às informações confidenciais no contentor.
As técnicas de escalada de privilégios que envolvem contas de serviço enquadram-se normalmente nestas categorias:
Autenticação como conta de serviço: pode conceder inadvertidamente a um utilizador autorização para usar a identidade de uma conta de serviço ou para criar uma chave de conta de serviço para uma conta de serviço. Se a conta de serviço tiver mais privilégios do que o próprio utilizador, o utilizador pode autenticar-se como a conta de serviço para aumentar os respetivos privilégios e obter acesso a recursos aos quais, de outra forma, não conseguiria aceder.
Usar recursos que tenham uma conta de serviço anexada: se um utilizador tiver permissão para aceder e modificar pipelines de CI/CD, instâncias de VMs ou outros sistemas de automatização que tenham contas de serviço anexadas, pode conseguir realizar ações através das contas de serviço anexadas desses recursos. Como resultado, apesar de não terem autorização para se fazerem passar pela conta de serviço, podem continuar a usar as autorizações da conta de serviço para realizar ações que não lhes seriam permitidas.
Por exemplo, se um utilizador tiver acesso SSH a uma instância de VM do Compute Engine, pode executar código na instância para aceder a qualquer recurso ao qual a conta de serviço anexada da instância possa aceder.
Permitir modificações de políticas, grupos ou funções personalizadas: um utilizador que não tenha acesso a uma conta de serviço privilegiada pode continuar a ter autorização para modificar as políticas de permissão da conta de serviço, incluindo oTrusted Cloud projeto ou a pasta. Em seguida, o utilizador pode expandir uma destas políticas de autorização para se conceder a si próprio autorização para (direta ou indiretamente) autenticar como a conta de serviço.
As secções seguintes fornecem práticas recomendadas para proteger as contas de serviço de ameaças de escalada de privilégios.
Práticas recomendadas:
Evite permitir que os utilizadores se façam passar por contas de serviço com mais privilégios do que os próprios utilizadores.Evite permitir que os utilizadores alterem as políticas de autorização de contas de serviço que tenham mais privilégios do que os próprios utilizadores.
Não permita que os utilizadores criem nem carreguem chaves de contas de serviço.
Não conceda acesso a contas de serviço ao Trusted Cloud nível do projeto ou da pasta.
Não execute código de fontes menos protegidas em recursos de computação que tenham uma conta de serviço privilegiada anexada.
Limite o acesso à shell a VMs que tenham uma conta de serviço privilegiada anexada.
Limite o acesso do servidor de metadados a utilizadores e processos selecionados.
Evite permitir que os utilizadores façam a autenticação como contas de serviço com mais privilégios do que os próprios utilizadores
Ao roubar a identidade de uma conta de serviço, um utilizador ganha acesso a alguns ou a todos os recursos aos quais a conta de serviço pode aceder. Se a conta de serviço tiver um acesso mais extenso do que o utilizador, é efetivamente mais privilegiada do que o utilizador.
Conceder a um utilizador autorização para se fazer passar por uma conta de serviço com mais privilégios pode ser uma forma de permitir deliberadamente que os utilizadores elevem temporariamente os respetivos privilégios, semelhante à utilização da ferramenta sudo
no Linux ou à utilização da elevação de processos no Windows. A menos que esteja a lidar com um cenário em que essa elevação temporária de privilégios seja necessária, é melhor evitar que os utilizadores se façam passar por uma conta de serviço com mais privilégios.
Os utilizadores também podem obter indiretamente as autorizações de uma conta de serviço anexando-a a um recurso e, em seguida, executando código nesse recurso. A execução de código desta forma não é uma representação da conta de serviço porque envolve apenas uma identidade autenticada (a da conta de serviço). No entanto, pode conceder a um utilizador acesso que, de outra forma, não teria.
As autorizações que permitem a um utilizador usar a identidade de uma conta de serviço ou anexar uma conta de serviço a um recurso incluem o seguinte:
iam.serviceAccounts.getAccessToken
iam.serviceAccounts.getOpenIdToken
iam.serviceAccounts.actAs
iam.serviceAccounts.implicitDelegation
iam.serviceAccounts.signBlob
iam.serviceAccounts.signJwt
iam.serviceAccountKeys.create
deploymentmanager.deployments.create
cloudbuild.builds.create
As funções que contêm algumas destas autorizações incluem (mas não se limitam a):
- Proprietário (
roles/owner
) - Editor (
roles/editor
) - Utilizador da conta de serviço (
roles/iam.serviceAccountUser
) - Criador de tokens de contas de serviço (
roles/iam.serviceAccountTokenCreator
) - Administrador da chave da conta de serviço (
roles/iam.serviceAccountKeyAdmin
) - Administrador da conta de serviço (
roles/iam.serviceAccountAdmin
) - Utilizador do Workload Identity (
roles/iam.workloadIdentityUser
) - Editor do Deployment Manager (
roles/deploymentmanager.editor
) - Editor do Cloud Build (
roles/cloudbuild.builds.editor
)
Antes de atribuir qualquer uma destas funções a um utilizador, pondere o seguinte:
- A que recursos dentro e fora do projeto atual é que o utilizador pode aceder ao roubar a identidade da conta de serviço? Trusted Cloud
- Este nível de acesso é justificado?
- Existem proteções suficientes em vigor que controlam as circunstâncias em que o utilizador pode roubar a identidade da conta de serviço?
Não atribua a função se não conseguir confirmar todas as perguntas. Em alternativa, considere atribuir ao utilizador uma conta de serviço diferente com menos privilégios.
Evite permitir que os utilizadores alterem as políticas de permissão de contas de serviço com mais privilégios
Os utilizadores que podem usar ou roubar a identidade de uma conta de serviço são captados pela política de autorização da conta de serviço. A política de permissão pode ser modificada ou alargada por utilizadores que tenham a autorização iam.serviceAccounts.setIamPolicy
na conta de serviço específica. As funções que contêm essa autorização incluem:
- Proprietário (
roles/owner
) - Administrador de segurança (
roles/iam.securityAdmin
) - Administrador da conta de serviço (
roles/iam.serviceAccountAdmin
)
As funções que incluem a autorização iam.serviceAccounts.setIamPolicy
dão a um utilizador controlo total sobre uma conta de serviço:
- O utilizador pode conceder a si próprio autorização para se fazer passar pela conta de serviço, o que lhe dá a capacidade de aceder aos mesmos recursos que a conta de serviço.
- O utilizador pode conceder a outros utilizadores o mesmo nível de acesso ou um nível semelhante à conta de serviço.
Antes de atribuir qualquer uma destas funções a um utilizador, pergunte-se a que recursos dentro e fora do projeto atual o utilizador pode obter acesso ao roubar a identidade da conta de serviço. Trusted Cloud Não permita que um utilizador altere a política de autorização de uma conta de serviço se a conta de serviço tiver mais privilégios do que o utilizador.
Não permitir que os utilizadores criem nem carreguem chaves de contas de serviço
As chaves de contas de serviço permitem que as aplicações ou os utilizadores se autentiquem como uma conta de serviço. Ao contrário de outras formas de representação de contas de serviço, a utilização de uma chave de conta de serviço não requer qualquer forma de autenticação anterior. Qualquer pessoa que possua uma chave de conta de serviço pode utilizá-la.
O efeito líquido da utilização de uma chave de conta de serviço para autenticar é semelhante ao efeito da simulação da conta de serviço. Se um utilizador tiver acesso a uma chave de conta de serviço ou lhe for concedida autorização para criar uma nova chave de conta de serviço, o utilizador pode autenticar-se como a conta de serviço e aceder a todos os recursos aos quais a conta de serviço pode aceder.
Criar
ou carregar uma chave de conta de serviço requer a autorização iam.serviceAccountKeys.create
, que está
incluída nas funções de administrador da chave de conta de serviço (roles/iam.serviceAccountKeyAdmin
)
e editor (roles/editor
).
Antes de atribuir qualquer função que inclua a autorização iam.serviceAccountKeys.create
a um utilizador, pergunte-se a que recursos dentro e fora do projeto
Trusted Cloud atual o utilizador pode obter acesso ao roubar a identidade da conta
de serviço. Não permitir que um utilizador crie chaves de contas de serviço para contas de serviço
que tenham mais privilégios do que ele.
Se o seu Trusted Cloud projeto não precisar de chaves de contas de serviço, aplique as restrições da política da organização Desativar a criação de chaves de contas de serviço e Desativar o carregamento de chaves de contas de serviço ao Trusted Cloud projeto ou à pasta que o contém.
Estas restrições impedem que todos os utilizadores criem e carreguem chaves de contas de serviço, incluindo os que têm a autorização iam.serviceAccountKeys.create
numa conta de serviço.
Não conceda acesso a contas de serviço ao Trusted Cloud nível do projeto ou da pasta
As contas de serviço são recursos e fazem parte da hierarquia de recursos. Por conseguinte, pode gerir o acesso às contas de serviço em qualquer um dos seguintes níveis:
- A conta de serviço individual
- O Trusted Cloud projeto
- Uma pasta na hierarquia do projeto Trusted Cloud
- O nó da organização
A gestão do acesso ao Trusted Cloud nível do projeto ou a um nível superior da hierarquia de recursos pode ajudar a reduzir os custos administrativos, mas também pode levar à concessão excessiva de privilégios. Por exemplo, se conceder a um utilizador a função de criador de tokens de conta de serviço num Trusted Cloud projeto, o utilizador pode roubar a identidade de qualquer conta de serviço no Trusted Cloud projeto. A capacidade de se fazer passar por qualquer conta de serviço implica que o utilizador pode potencialmente obter acesso a todos os recursos aos quais essas contas de serviço podem aceder, incluindo recursos fora desse projeto Trusted Cloud .
Para evitar a concessão excessiva, não faça a gestão do acesso às contas de serviço ao Trusted Cloud nível do projeto ou da pasta. Em alternativa, pode gerir individualmente o acesso de cada conta de serviço.
Não execute código de fontes menos protegidas em recursos de computação que tenham uma conta de serviço privilegiada associada
Quando associa uma conta de serviço a um recurso de computação, como uma instância de VM, os processos em execução nesse recurso podem usar o servidor de metadados para pedir tokens de acesso e tokens de ID. Estes tokens permitem que o processo seja autenticado como a conta de serviço e aceda aos recursos em nome da mesma.
Por predefinição, o acesso ao servidor de metadados não está restrito a processos ou utilizadores específicos. Em alternativa, qualquer código executado no recurso de computação pode aceder ao servidor de metadados e obter uma chave de acesso. Esse código pode incluir:
- O código da sua aplicação.
- Código enviado por utilizadores finais, se a sua aplicação permitir qualquer avaliação de scripts do lado do servidor.
- Código lido a partir de um repositório de origem remoto, se o recurso de computação fizer parte de um sistema de CI/CD.
- Scripts de arranque e encerramento disponibilizados por um contentor do Cloud Storage.
- Políticas de convidados distribuídas pelo VM Manager.
Se o código for enviado por utilizadores ou lido a partir de uma localização de armazenamento remoto, tem de se certificar de que é fidedigno e que as localizações de armazenamento remoto estão, pelo menos, tão bem protegidas como a conta de serviço anexada. Se uma localização de armazenamento remoto estiver menos bem protegida do que a conta de serviço, um agente malicioso pode conseguir aumentar os respetivos privilégios. Podem fazê-lo injetando código malicioso que usa os privilégios da conta de serviço nessa localização.
Limite o acesso à shell a VMs que tenham uma conta de serviço privilegiada anexada
Alguns recursos de computação suportam o acesso interativo e permitem que os utilizadores obtenham acesso à shell do sistema. Por exemplo:
- O Compute Engine permite-lhe usar SSH ou RDP para iniciar sessão numa instância de VM.
- O Google Kubernetes Engine permite-lhe usar kubectl exec para executar um comando ou iniciar uma shell num contentor do Kubernetes.
Se uma instância de VM tiver uma conta de serviço privilegiada anexada, qualquer utilizador com acesso à shell do sistema pode autenticar e aceder aos recursos como a conta de serviço. Para impedir que os utilizadores abusem desta capacidade para aumentar os respetivos privilégios, tem de garantir que o acesso à shell está, pelo menos, tão bem protegido quanto a conta de serviço associada.
Para instâncias do Linux, pode aplicar o acesso SSH de forma mais restritiva do que o acesso à conta de serviço anexada através do Início de sessão do SO: para estabelecer ligação a uma instância de VM com o Início de sessão do SO ativado, um utilizador não só tem de ter autorização para usar o Início de sessão do SO, como também tem de ter a autorização iam.serviceAccounts.actAs
na conta de serviço anexada.
O mesmo nível de controlo de acesso não se aplica a instâncias de VMs que usam chaves baseadas em metadados nem a instâncias do Windows: a publicação de uma chave SSH nos metadados ou o pedido de credenciais do Windows requer acesso aos metadados da instância de VM e à autorização iam.serviceAccounts.actAs
na conta de serviço anexada. No entanto, depois de a chave SSH ter sido publicada ou as credenciais do Windows terem sido obtidas, os inícios de sessão subsequentes não estão sujeitos a verificações de autorizações da IAM adicionais.
Da mesma forma, se uma instância de VM usar um módulo de autenticação conectável do Linux personalizado para autenticação ou for membro de um domínio do Active Directory, é possível que os utilizadores que, de outra forma, não teriam autorização para autenticar como a conta de serviço tenham autorização para iniciar sessão. Para mais informações, consulte as práticas recomendadas para executar o Active Directory no Trusted Cloud.
Limite o acesso ao servidor de metadados a utilizadores e processos selecionados
Quando anexa uma conta de serviço a uma instância de VM, as cargas de trabalho implementadas na VM
podem aceder ao servidor de metadados para pedir tokens para as contas de serviço. Por predefinição, o acesso ao servidor de metadados não está limitado a nenhum processo ou utilizador específico na VM. Mesmo os processos executados como um utilizador com poucos privilégios, como nobody
no Linux ou LocalService
no Windows, têm acesso total ao servidor de metadados e podem obter tokens para a conta de serviço.
Para limitar o acesso ao servidor de metadados a utilizadores específicos, configure a firewall do anfitrião do sistema operativo convidado para permitir apenas que estes utilizadores abram ligações de saída para o servidor de metadados.
No Linux, pode usar as opções --uid-owner
e --gid-owner
para configurar uma regra iptables
que se aplica apenas a utilizadores ou grupos específicos. No Windows, o comando Set-NetFirewallSecurityFilter
permite personalizar uma regra de firewall para que se aplique a utilizadores ou grupos selecionados.
Proteja-se contra ameaças de divulgação de informações
Práticas recomendadas:
Evite divulgar informações confidenciais em endereços de email de contas de serviço.Evite divulgar informações confidenciais em endereços de email de contas de serviço
Para conceder a uma conta de serviço acesso a um recurso noutro Trusted Cloud projeto, pode adicionar uma associação de funções à política de autorização do recurso. Tal como o próprio recurso, a política de autorização faz parte do outro Trusted Cloud projeto e a respetiva visibilidade também é controlada por esse outro Trusted Cloud projeto.
Normalmente, a visualização de políticas de autorização não é considerada uma operação privilegiada. Muitas funções incluem a autorização *.getIamPolicy
necessária, incluindo a função básica de leitor.
Um utilizador que pode ver uma política de autorização também pode ver os endereços de email dos diretores aos quais foi concedido acesso ao recurso. No caso das contas de serviço, os endereços de email podem dar pistas a intervenientes prejudiciais.
Por exemplo, uma política de autorização pode incluir uma associação para uma conta de serviço com o endereço de email jenkins@deployment-project-123.s3ns-system.iam.gserviceaccount.com
. Para um ator malicioso, este endereço de email não só revela que existe um Trusted Cloud projeto
com o ID deployment-project-123
, mas também que o Trusted Cloud projeto executa um
servidor Jenkins. Ao escolher um nome mais genérico, como deployer@deployment-project-123.s3ns-system.iam.gserviceaccount.com
, evita a divulgação de informações sobre o tipo de software que está a usar no deployment-project-123
.
Se conceder a uma conta de serviço acesso a recursos num Trusted Cloud projeto com acesso menos rigoroso (como uma sandbox ou um projeto de Trusted Cloud desenvolvimento), certifique-se de que o endereço de email da conta de serviço não divulga informações. Em particular, não divulgue informações confidenciais nem informações que possam dar pistas aos atacantes.
Proteja-se contra ameaças de não repúdio
Sempre que detetar atividade suspeita que afete um dos seus recursos no Trusted Cloud, os registos de auditoria na nuvem são uma fonte importante de informações para saber quando ocorreu a atividade e que utilizadores estiveram envolvidos.
Sempre que os registos de auditoria da nuvem indicam que a atividade foi realizada por uma conta de serviço, essas informações por si só podem não ser suficientes para reconstruir a cadeia completa de eventos. Nestes casos, também tem de conseguir saber que utilizador ou aplicação fez com que a conta de serviço realizasse a atividade.
Esta secção contém práticas recomendadas que podem ajudar a manter uma trilha de auditoria não repudiável.
Práticas recomendadas:
Use chaves de contas de serviço apenas quando não existir uma alternativa viável.Ative os registos de acesso aos dados para as APIs IAM.
Certifique-se de que o histórico de CI/CD pode ser correlacionado com os registos de auditoria do Cloud.
Crie entradas de registo personalizadas para utilizadores individuais de uma aplicação.
Use chaves de contas de serviço apenas quando não existir uma alternativa viável
Se não conseguir usar métodos de autenticação mais seguros, pode ter de criar uma chave de conta de serviço para a aplicação. No entanto, a autenticação com uma chave de conta de serviço introduz uma ameaça de não repúdio. Os registos de auditoria do Cloud criam um registo quando uma conta de serviço modifica um recurso, mas se a conta de serviço for autenticada com uma chave de conta de serviço, não existe uma forma fiável de saber quem usou a chave. Em comparação, a autenticação como uma conta de serviço através da representação da conta de serviço com credenciais de utilizador regista o principal que atuou como a conta de serviço.
Recomendamos que impeça a criação de chaves de contas de serviço aplicando a restrição da política da organização Desativar a criação de chaves de contas de serviço ao Trusted Cloud projeto ou à pasta envolvente. Se tiver de usar chaves de conta de serviço para um cenário que não possa ser resolvido com nenhuma das alternativas recomendadas, conceda uma exceção à restrição da política, o mais restritamente possível, e reveja as práticas recomendadas para gerir chaves de conta de serviço.
Ative os registos de acesso aos dados para APIs IAM
Para ajudar a identificar e compreender cenários de roubo de identidade de contas de serviço, os serviços como o Compute Engine incluem uma secção serviceAccountDelegationInfo
nos registos de auditoria do Cloud. Esta secção indica se a conta de serviço estava a ser roubada e por que utilizador.
Nem todos os serviços incluem detalhes de roubo de identidade nos respetivos registos de auditoria do Cloud. Para registar todos os eventos de roubo de identidade, também tem de ativar os registos de acesso a dados para as seguintes APIs:
- API Identity and Access Management (IAM) em todos os Trusted Cloud projetos que contêm contas de serviço
- API Security Token Service em todos os Trusted Cloud projetos que contêm Workload Identity Pools
Ao ativar estes registos, garante que é adicionada uma entrada aos registos de auditoria na nuvem sempre que um utilizador pede um token de acesso ou um token de ID para uma conta de serviço.
Certifique-se de que o histórico de CI/CD pode ser correlacionado com os registos de auditoria do Cloud
As contas de serviço são usadas frequentemente por sistemas de CI/CD para fazer implementações depois de uma alteração de código ter sido validada e aprovada com êxito para implementação. Normalmente, os sistemas de CI/CD mantêm um histórico de eventos que levam a uma implementação. Este histórico pode incluir os IDs das revisões de código, das confirmações e das execuções de pipelines correspondentes, bem como informações sobre quem aprovou a implementação.
Se uma implementação modificar recursos em Trusted Cloud, estas alterações são registadas nos registos de auditoria do Google Cloud dos respetivos recursos. Os registos de auditoria da nuvem contêm informações sobre o utilizador ou a conta de serviço que iniciou a alteração. No entanto, numa implementação acionada por um sistema de CI/CD, a conta de serviço em si é frequentemente insuficiente para reconstruir toda a cadeia de eventos que levaram à alteração.
Para estabelecer uma trilha de auditoria consistente no seu sistema de CI/CD e Trusted Cloud, tem de garantir que os registos do Cloud Audit Logs podem ser correlacionados com eventos no histórico do sistema de CI/CD. Se encontrar um evento inesperado nos registos de auditoria do Google Cloud, pode usar esta correlação para determinar se a alteração foi realmente efetuada pelo sistema de CI/CD, por que motivo foi efetuada e quem a aprovou.
Seguem-se algumas formas de estabelecer uma correlação entre os registos do Cloud Audit Logs e os eventos no histórico do sistema de CI/CD:
- Registe os pedidos de API realizados por cada execução da pipeline de CI/CD.
- Sempre que a API devolve um ID de operação, registe o ID nos registos do sistema de CI/CD.
Adicione um
X-Goog-Request-Reason
cabeçalho HTTP aos pedidos de API e transmita o ID da execução da pipeline de CI/CD. O Terraform pode adicionar automaticamente este cabeçalho se especificar um motivo do pedido.Em alternativa, incorpore as informações no cabeçalho
User-Agent
para que sejam captadas nos registos de auditoria do Cloud.
Para ajudar a garantir a não repudiação, configure os ficheiros de registo e os históricos de commits de forma que sejam imutáveis e que um interveniente malicioso não consiga ocultar retroativamente os seus rastos.
Crie entradas de registo personalizadas para utilizadores individuais de uma aplicação
As contas de serviço também são úteis para aplicações em que um utilizador se autentica com um esquema de autenticação personalizado e, em seguida, acede indiretamente Trusted Cloud a recursos. Estas aplicações podem confirmar que o utilizador está autenticado e autorizado e, em seguida, usar uma conta de serviço para fazer a autenticação nos Trusted Cloud serviços e aceder aos recursos. No entanto, os registos de auditoria do Google Cloud registam que a conta de serviço acedeu a um recurso e não que utilizador estava a usar a sua aplicação.
Para ajudar a rastrear esse acesso até ao utilizador, crie uma lógica de aplicação para escrever uma entrada de registo personalizada sempre que um utilizador acede a um recurso e correlacione as entradas de registo personalizadas com os registos de auditoria na nuvem.
O que se segue?
- Compreenda as práticas recomendadas para gerir chaves de contas de serviço.
- Reveja as nossas práticas recomendadas para usar contas de serviço em pipelines de implementação.
- Saiba mais acerca das práticas recomendadas para usar a Workload Identity Federation.