As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Agente do AWS Secrets Manager
O agente do AWS Secrets Manager é um serviço HTTP do lado do cliente que pode ser usado para padronizar o consumo de segredos do Secrets Manager em ambientes como o AWS Lambda, o Amazon Elastic Container Service, o Amazon Elastic Kubernetes Service e o Amazon Elastic Compute Cloud. O Agente do Secrets Manager pode recuperar e armazenar segredos na memória para que suas aplicações possam consumir segredos diretamente do cache. Isso significa que é possível buscar os segredos de que sua aplicação precisa no host local em vez de fazer chamadas para o Secrets Manager. O Agente do Secrets Manager só pode fazer solicitações de leitura para o Secrets Manager - ele não pode modificar segredos.
O Agente do Secrets Manager usa as credenciais da AWS que você fornece no seu ambiente para fazer chamadas para o Secrets Manager. O Agente do Secrets Manager oferece proteção contra falsificação de solicitações do lado do servidor (SSRF) para ajudar a melhorar a segurança dos segredos. É possível configurar o Agente do Secrets Manager definindo o número máximo de conexões, o tempo de vida (TTL), a porta HTTP do host local e o tamanho do cache.
Como o Agente do Secrets Manager usa um cache em memória, ele é redefinido quando o Agente do Secrets Manager é reiniciado. O Agente do Secrets Manager atualiza periodicamente o valor do segredo armazenado em cache. A atualização acontece quando você tenta ler um segredo do Agente do Secrets Manager após a expiração do TTL. A frequência de atualização padrão (TTL) é de 300 segundos, e é possível alterá-la usando um Arquivo de configuração que você passa para o Agente do Secrets Manager usando o argumento da linha de comando --config
. O Agente do Secrets Manager não inclui a invalidação do cache. Por exemplo, se um segredo alternar antes que a entrada do cache expire, o Agente do Secrets Manager poderá retornar um valor de segredo obsoleto.
O Agente do Secrets Manager retorna valores de segredos no mesmo formato da resposta de GetSecretValue
. Os valores de segredos não são criptografados no cache.
Para baixar o código-fonte, consulte https://github.com/aws/aws-secretsmanager-agent no GitHub.
Etapa 1: criar o binário do Agente do Secrets Manager
Para criar o binário do Agente do Secrets Manager de forma nativa, você precisa das ferramentas de desenvolvimento padrão e das ferramentas Rust. Como alternativa, é possível fazer a compilação cruzada para sistemas que oferecem suporte a ele ou usar o cruzamento do Rust para fazer a compilação cruzada.
- RPM-based systems
-
-
Em sistemas baseados em RPM, como o AL2023, é possível instalar as ferramentas de desenvolvimento usando o grupo Ferramentas de Desenvolvimento.
sudo yum -y groupinstall "Development Tools"
-
Siga as instruções em Instalar o Rust na documentação do Rust.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
Crie o agente usando o comando cargo build:
cargo build --release
Você encontrará o executável em target/release/aws-secrets-manager-agent
.
- Debian-based systems
-
-
Em sistemas baseados no Debian, como o Ubuntu, é possível instalar as ferramentas do desenvolvedor usando o pacote build-essential.
sudo apt install build-essential
-
Siga as instruções em Instalar o Rust na documentação do Rust.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
Crie o agente usando o comando cargo build:
cargo build --release
Você encontrará o executável em target/release/aws-secrets-manager-agent
.
- Windows
-
Para desenvolver no Windows, siga as instruções em Configuração do seu ambiente de desenvolvimento no Windows para Rust na documentação do Microsoft Windows.
- Cross-compile natively
-
Em distribuições em que o pacote mingw-w64 está disponível, como o Ubuntu, você pode fazer a compilação cruzada de forma nativa.
# Install the cross compile tool chain
sudo add-apt-repository universe
sudo apt install -y mingw-w64
# Install the rust build targets
rustup target add x86_64-pc-windows-gnu
# Cross compile the agent for Windows
cargo build --release --target x86_64-pc-windows-gnu
Você encontrará o executável em target/x86_64-pc-windows-gnu/release/aws-secrets-manager-agent.exe
.
- Cross compile with Rust cross
-
Se as ferramentas de compilação cruzada não estiverem disponíveis nativamente no sistema, será possível usar o projeto cruzado Rust. Para obter mais informações, consulte https://github.com/cross-rs/cross.
Recomendamos 32 GB de espaço em disco para o ambiente de compilação.
# Install and start docker
sudo yum -y install docker
sudo systemctl start docker
sudo systemctl enable docker # Make docker start after reboot
# Give ourselves permission to run the docker images without sudo
sudo usermod -aG docker $USER
newgrp docker
# Install cross and cross compile the executable
cargo install cross
cross build --release --target x86_64-pc-windows-gnu
Etapa 2: instalar o Agente do Secrets Manager
Com base no tipo de computação, você tem várias opções para instalar o Agente do Secrets Manager.
- Amazon EKS, Amazon EC2, and Amazon ECS
-
Para instalar o Agente do Secrets Manager
-
Use o script install
fornecido no repositório.
O script gera um token SSRF aleatório no startup e o armazena no arquivo /var/run/awssmatoken
. O token pode ser lido pelo grupo awssmatokenreader
criado pelo script de instalação.
-
Para permitir que sua aplicação leia o arquivo de token, você precisa adicionar ao grupo awssmatokenreader
a conta de usuário na qual sua aplicação é executada. Por exemplo, é possível conceder permissões para que sua aplicação leia o arquivo de token com o comando usermod a seguir, onde <APP_USER>
é o ID do usuário sob o qual sua aplicação é executada.
sudo usermod -aG awssmatokenreader <APP_USER>
- Docker
-
É possível executar o Agente do Secrets Manager como um contêiner auxiliar junto com sua aplicação usando o Docker. Então, sua aplicação pode recuperar segredos do servidor HTTP local fornecido pelo Agente do Secrets Manager. Para obter informações sobre o Docker, consulte a documentação do Docker.
Para criar um contêiner auxiliar para o Agente do Secrets Manager com Docker
-
Crie um Dockerfile para o contêiner auxiliar do Agente do Secrets Manager. O exemplo a seguir cria um contêiner do Docker com o binário do Agente do Secrets Manager.
# Use the latest Debian image as the base
FROM debian:latest
# Set the working directory inside the container
WORKDIR /app
# Copy the Secrets Manager Agent binary to the container
COPY secrets-manager-agent .
# Install any necessary dependencies
RUN apt-get update && apt-get install -y ca-certificates
# Set the entry point to run the Secrets Manager Agent binary
ENTRYPOINT ["./secrets-manager-agent"]
-
Crie um Dockerfile para sua aplicação cliente.
-
Crie um arquivo Docker Compose para executar ambos os contêineres, certificando-se de que eles usem a mesma interface de rede. Isso é necessário porque o Agente do Secrets Manager não aceita solicitações de fora da interface localhost. O exemplo a seguir mostra um arquivo Docker Compose em que a chave network_mode
anexa o contêiner secrets-manager-agent
ao namespace de rede do contêiner client-application
, o que permite que eles compartilhem a mesma interface de rede.
Você deve carregar as credenciais da AWS e o token SSRF para que a aplicação possa usar o Agente do Secrets Manager. Veja o seguinte:
version: '3'
services:
client-application:
container_name: client-application
build:
context: .
dockerfile: Dockerfile.client
command: tail -f /dev/null # Keep the container running
secrets-manager-agent:
container_name: secrets-manager-agent
build:
context: .
dockerfile: Dockerfile.agent
network_mode: "container:client-application" # Attach to the client-application container's network
depends_on:
- client-application
-
Copie o binário do secrets-manager-agent
para o mesmo diretório que contém seus arquivos Dockerfile e Docker Compose.
-
Crie e execute os contêineres com base nos Dockerfiles fornecidos usando o comando docker-compose
a seguir.
docker-compose up --build
No contêiner do cliente, agora é possível usar o Agente do Secrets Manager para recuperar segredos. Para ter mais informações, consulte Etapa 3: recuperar segredos com o Agente do Secrets Manager.
- AWS Lambda
-
É possível empacotar o Agente do Secrets Manager como uma extensão do AWS Lambda. Em seguida, é possível adicioná-lo à sua função do Lambda como uma camada e chamar o Agente do Secrets Manager a partir da sua função da Lambda para obter segredos.
As instruções a seguir mostram como obter um segredo chamado MyTest
usando o script de exemplo secrets-manager-agent-extension.sh
em https://github.com/aws/aws-secretsmanager-agent para instalar oAgente do Secrets Manager como uma extensão do Lambda.
Para criar uma extensão do Lambda que empacote o Agente do Secrets Manager
Crie uma função do Lambda do Python que consulte http://localhost:2773/secretsmanager/get?secretId=MyTest
para obter o segredo. Certifique-se de implementar a lógica de repetição no código da aplicação para acomodar atrasos na inicialização e no registro da extensão do Lambda.
-
Na raiz do pacote de código do Agente do Secrets Manager, execute os comandos a seguir para testar a extensão do Lambda.
AWS_ACCOUNT_ID=<AWS_ACCOUNT_ID>
LAMBDA_ARN=<LAMBDA_ARN>
# Build the release binary
cargo build --release --target=x86_64-unknown-linux-gnu
# Copy the release binary into the `bin` folder
mkdir -p ./bin
cp ./target/x86_64-unknown-linux-gnu/release/aws_secretsmanager_agent ./bin/secrets-manager-agent
# Copy the `secrets-manager-agent-extension.sh` script into the `extensions` folder.
mkdir -p ./extensions
cp aws_secretsmanager_agent/examples/example-lambda-extension/secrets-manager-agent-extension.sh ./extensions
# Zip the extension shell script and the binary
zip secrets-manager-agent-extension.zip bin/* extensions/*
# Publish the layer version
LAYER_VERSION_ARN=$(aws lambda publish-layer-version \
--layer-name secrets-manager-agent-extension \
--zip-file "fileb://secrets-manager-agent-extension.zip" | jq -r '.LayerVersionArn')
# Attach the layer version to the Lambda function
aws lambda update-function-configuration \
--function-name $LAMBDA_ARN \
--layers "$LAYER_VERSION_ARN"
Invoque a função do Lambda para verificar se o segredo está sendo buscado corretamente.
Etapa 3: recuperar segredos com o Agente do Secrets Manager
Para usar o agente, você chama o endpoint local do Agente do Secrets Manager e inclui o nome ou ARN do segredo como um parâmetro de consulta. Por padrão, o Agente do Secrets Manager recupera a versão AWSCURRENT
do segredo. Para recuperar uma versão diferente, é possível definir versionStage
ou versionId
.
Para ajudar a proteger o Agente do Secrets Manager, você deve incluir um cabeçalho de token SSRF como parte de cada solicitação: X-Aws-Parameters-Secrets-Token
. O Agente do Secrets Manager nega solicitações que não tenham esse cabeçalho ou que tenham um token SSRF inválido. É possível personalizar o nome do cabeçalho SSRF em Arquivo de configuração.
O Agente do Secrets Manager usa o SDK da AWS para Rust, que usa a cadeia de fornecedores de credenciais padrão. A identidade dessas credenciais do IAM determina as permissões que o Agente do Secrets Manager tem para recuperar segredos.
Permissões obrigatórias:
Para ter mais informações, consulte Referência de permissões.
Depois que o valor do segredo é inserido no Agente do Secrets Manager, qualquer usuário com acesso ao ambiente computacional e ao token SSRF pode acessar o segredo a partir do cache do Agente do Secrets Manager. Para ter mais informações, consulte Considerações sobre segurança.
- curl
-
O exemplo de curl a seguir mostra como obter um segredo do Agente do Secrets Manager. O exemplo depende da presença do SSRF em um arquivo, que é onde ele é armazenado pelo script de instalação.
curl -v -H \
"X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" \
'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>
}'; \
echo
- Python
-
O exemplo de Python a seguir mostra como obter um segredo do Agente do Secrets Manager. O exemplo depende da presença do SSRF em um arquivo, que é onde ele é armazenado pelo script de instalação.
import requests
import json
# Function that fetches the secret from Secrets Manager Agent for the provided secret id.
def get_secret():
# Construct the URL for the GET request
url = f"http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>
}"
# Get the SSRF token from the token file
with open('/var/run/awssmatoken') as fp:
token = fp.read()
headers = {
"X-Aws-Parameters-Secrets-Token": token.strip()
}
try:
# Send the GET request with headers
response = requests.get(url, headers=headers)
# Check if the request was successful
if response.status_code == 200:
# Return the secret value
return response.text
else:
# Handle error cases
raise Exception(f"Status code {response.status_code} - {response.text}")
except Exception as e:
# Handle network errors
raise Exception(f"Error: {e}")
Configurar o Agente do Secrets Manager
Para alterar a configuração do Agente do Secrets Manager, crie um arquivo de configuração TOML e, em seguida, chame ./aws-secrets-manager-agent --config config.toml
.
A lista a seguir mostra as opções que podem ser configuradas para o Agente do Secrets Manager.
log_level: o nível de detalhes relatado nos logs do Secrets Manager Agent: DEBUG, INFO, WARN, ERROR ou NONE. O padrão é INFO.
http_port: a porta para o servidor HTTP local, no intervalo de 1024 a 65535. O padrão é 2773.
região: a região da AWS a ser usada para solicitações. Se nenhuma região for especificada, o Agente do Secrets Manager determinará a região a partir do SDK. Para obter mais informações, consulte Especificação das suas credenciais e região padrão no Guia do desenvolvedor do SDK da AWS para Rust.
ttl_seconds: o TTL em segundos para os itens em cache, no intervalo de 1 a 3600. O padrão é 300. Essa configuração não será usada se o tamanho do cache for 0.
cache_size: o número máximo de segredos que podem ser armazenados no cache, no intervalo de 0 a 1000. 0 indica que não há armazenamento em cache. O padrão é 1000.
ssrf_headers: uma lista de nomes de cabeçalhos que o Agente do Secrets Manager verifica para o token SSRF. O padrão é "X-Aws-Parameters-Secrets-Token, X-Vault-Token".
ssrf_env_variables: uma lista de nomes de variáveis de ambiente que o Agente do Secrets Manager verifica para o token SSRF. A variável de ambiente pode conter o token ou uma referência ao arquivo de token, como em: AWS_TOKEN=file:///var/run/awssmatoken
. O padrão é "AWS_TOKEN, AWS_SESSION_TOKEN".
path_prefix: o prefixo do URI usado para determinar se a solicitação é baseada em caminho. O padrão é "/v1/".
max_conn: o número máximo de conexões de clientes HTTP que o Agente do Secrets Manager permite, na faixa de 1 a 1000. O padrão é 800.
Registro em log
O Agente do Secrets Manager registra erros em log localmente no arquivo logs/secrets_manager_agent.log
. Quando sua aplicação chama o Agente do Secrets Manager para obter um segredo, essas chamadas aparecem no registro local. Elas não são exibidas nos logs do CloudTrail.
O Agente do Secrets Manager cria um novo arquivo de log quando o arquivo atinge 10 MB, e armazena até cinco arquivos de log no total.
O log não vai para o Secrets Manager, CloudTrail ou CloudWatch. As solicitações para obter segredos do Agente do Secrets Manager não aparecem nesses logs. Quando o agente do Secrets Manager faz uma chamada para o Secrets Manager para obter um segredo, essa chamada é gravada no CloudTrail com uma string de agente do usuário contendo aws-secrets-manager-agent
.
É possível configurar o log usando no Arquivo de configuração.
Considerações sobre segurança
Para uma arquitetura de agente, o domínio de confiança é onde o endpoint do agente e o token SSRF estão acessíveis, o que geralmente é o host inteiro. O domínio de confiança do Agente do Secrets Manager deve corresponder ao domínio em que as credenciais do Secrets Manager estão disponíveis para manter a mesma postura de segurança. Por exemplo, no Amazon EC2, o domínio de confiança do Agente do Secrets Manager seria o mesmo que o domínio das credenciais ao usar funções para o Amazon EC2.
Aplicações preocupadas com a segurança que ainda não estejam usando uma solução de agente com as credenciais do Secrets Manager bloqueadas na aplicação devem considerar o uso de SDKs da AWS específicos do idioma ou soluções de cache. Para ter mais informações, consulte Obter segredos de AWS Secrets Manager.