기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS Secrets Manager 에이전트
AWS Secrets Manager Agent는 AWS Lambda, Amazon Elastic Container Service, Amazon Elastic Kubernetes Service 및 Amazon Elastic Compute Cloud 같은 환경 전반에서 Secrets Manager의 보안 암호 사용을 표준화하는 데 사용할 수 있는 클라이언트 측 HTTP 서비스입니다. Secrets Manager Agent는 메모리에서 암호를 검색하고 캐시하여 애플리케이션이 캐시에서 직접 암호를 사용할 수 있도록 합니다. 즉, Secrets Manager를 직접적으로 호출하는 대신 localhost에서 애플리케이션에 필요한 보안 암호를 가져올 수 있습니다. Secrets Manager Agent는 Secrets Manager에 대한 읽기 요청만 할 수 있으며 보안 암호를 수정할 수는 없습니다.
Secrets Manager Agent는 사용자 환경에서 제공하는 AWS 자격 증명을 사용하여 Secrets Manager를 직접적으로 호출합니다. Secrets Manager Agent는 서버 측 요청 위조(SSRF)에 대한 보호를 제공하여 보안 암호의 보안을 개선합니다. 최대 연결 수, TTL(Time to Live), localhost HTTP 포트, 캐시 크기를 설정하여 Secrets Manager Agent를 구성할 수 있습니다.
Secrets Manager Agent는 인 메모리 캐시를 사용하기 때문에 Secrets Manager Agent가 다시 시작될 때 재설정됩니다. Secrets Manager Agent는 캐시된 보안 암호 값을 주기적으로 새로 고칩니다. 새로 고침은 TTL이 만료된 후 Secrets Manager Agent에서 암호를 읽으려고 할 때 발생합니다. 기본 새로 고침 빈도(TTL)는 300초이며, --config
명령줄 인수를 사용해 Secrets Manager Agent에 전달하는 구성 파일을 사용하여 이러한 빈도를 변경할 수 있습니다. Secrets Manager Agent에는 캐시 무효화가 포함되지 않습니다. 예를 들어 캐시 항목이 만료되기 전에 보안 암호가 교체되면 Secrets Manager Agent는 오래된 보안 암호 값을 반환할 수도 있습니다.
Secrets Manager Agent는 GetSecretValue
의 응답과 동일한 형식으로 보안 암호 값을 반환합니다. 보안 암호 값은 캐시에서 암호화되지 않습니다.
소스 코드를 다운로드하려면 GitHub의 https://github.com/aws/aws-secretsmanager-agent를 참조하세요.
1단계: Secrets Manager Agent 바이너리 빌드
기본적으로 Secrets Manager Agent 바이너리를 빌드하려면 표준 개발 도구와 Rust 도구가 필요합니다. 또는 이를 지원하는 시스템에 대해 교차 컴파일하거나, Rust 교차 컴파일을 사용하여 교차 컴파일을 수행할 수 있습니다.
- RPM-based systems
-
-
AL2023 같은 RPM 기반 시스템에서는 개발 도구 그룹을 사용하여 개발 도구를 설치할 수 있습니다.
sudo yum -y groupinstall "Development Tools"
-
Rust 설명서의 Install Rust 지침을 따릅니다.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
cargo build화 명령을 사용하여 에이전트를 빌드합니다.
cargo build --release
target/release/aws-secrets-manager-agent
에서 실행 파일을 찾을 수 있습니다.
- Debian-based systems
-
-
Ubuntu 같은 Debian 기반 시스템에서는 build-essential 패키지를 사용하여 개발자 도구를 설치할 수 있습니다.
sudo apt install build-essential
-
Rust 설명서의 Install Rust 지침을 따릅니다.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
cargo build화 명령을 사용하여 에이전트를 빌드합니다.
cargo build --release
target/release/aws-secrets-manager-agent
에서 실행 파일을 찾을 수 있습니다.
- Windows
-
Windows에서 빌드하려면 Microsoft Windows 설명서의 Set up your dev environment on Windows for Rust 지침을 따릅니다.
- Cross-compile natively
-
Ubuntu 같이 mingw-w64 패키지가 제공되는 배포에서는 기본적으로 교차 컴파일을 수행할 수 있습니다.
# 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
target/x86_64-pc-windows-gnu/release/aws-secrets-manager-agent.exe
에서 실행 파일을 찾을 수 있습니다.
- Cross compile with Rust cross
-
시스템에서 교차 컴파일 도구가 기본적으로 제공되지 않는 경우 Rust 크로스 프로젝트를 사용할 수 있습니다. 자세한 내용은 https://github.com/cross-rs/cross를 참조하세요.
빌드 환경에는 32GB 디스크 공간을 권장합니다.
# 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
2단계: Secrets Manager Agent 설치
컴퓨팅 유형에 따라 여러 가지 옵션으로 Secrets Manager Agent를 설치할 수 있습니다.
- Amazon EKS, Amazon EC2, and Amazon ECS
-
Secrets Manager Agent를 설치하는 방법
-
리포지토리에 제공된 install
스크립트를 실행합니다.
스크립트는 시작 시 무작위 SSRF 토큰을 생성한 후 이를 /var/run/awssmatoken
파일에 저장합니다. 설치 스크립트가 생성하는 awssmatokenreader
그룹에서 토큰을 읽을 수 있습니다.
-
애플리케이션이 토큰 파일을 읽을 수 있도록 하려면 애플리케이션을 실행하는 사용자 계정을 awssmatokenreader
그룹에 추가해야 합니다. 예를 들어 다음 usermod 명령을 사용하여 토큰 파일을 읽을 수 있는 권한을 애플리케이션에 부여할 수 있습니다. 여기서 <APP_USER>
는 애플리케이션을 실행하는 사용자 ID입니다.
sudo usermod -aG awssmatokenreader <APP_USER>
- Docker
-
Docker를 사용하여 Secrets Manager Agent를 애플리케이션과 함께 사이드카 컨테이너로 실행할 수 있습니다. 이렇게 하면 애플리케이션은 Secrets Manager Agent가 제공하는 로컬 HTTP 서버에서 보안 암호를 검색할 수 있습니다. Docker에 대한 자세한 내용은 Docker 설명서를 참조하세요.
Docker를 사용하여 Secrets Manager Agent의 사이드카 컨테이너를 생성하는 방법
-
Secrets Manager Agent 사이드카 컨테이너에 대한 Dockerfile을 생성합니다. 다음 예제에서는 Secrets Manager Agent 바이너리를 사용하여 Docker 컨테이너를 생성합니다.
# 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"]
-
애플리케이션에 대한 Dockerfile을 생성합니다.
-
Docker Compose 파일을 생성하여 두 컨테이너를 모두 실행한 다음, 둘 다 동일한 네트워크 인터페이스를 사용하는지 확인합니다. 이렇게 해야 하는 이유는 Secrets Manager Agent가 localhost 인터페이스 외부의 요청을 수락하지 않기 때문입니다. 다음 예제에서는 Docker Compose 파일을 보여줍니다. 여기에서 network_mode
키는 secrets-manager-agent
컨테이너를 client-application
컨테이너의 네트워크 네임스페이스에 연결하는데, 이는 서로 동일한 네트워크 인터페이스를 공유할 수 있도록 해줍니다.
Secrets Manager Agent를 사용하려면 애플리케이션에 대한 AWS 자격 증명과 SSRF 토큰을 로드해야 합니다. 다음 항목을 참조하십시오.
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
-
Dockerfiles 및 Docker Compose 파일이 포함된 동일한 디렉터리에 secrets-manager-agent
바이너리를 복사합니다.
-
다음 docker-compose
명령을 사용하여, 제공된 Dockerfile을 기반으로 컨테이너를 빌드하고 실행합니다.
docker-compose up --build
이제 클라이언트 컨테이너에서 Secrets Manager Agent를 사용하여 보안 암호를 검색할 수 있습니다. 자세한 내용은 3단계: Secrets Manager Agent를 사용하여 보안 암호 검색 단원을 참조하십시오.
- AWS Lambda
-
Secrets Manager Agent를 AWS Lambda 확장으로 패키징할 수 있습니다. 그런 다음, Lambda 함수에 계층으로 추가한 후 Lambda 함수에서 Secrets Manager Agent를 직접적으로 호출하여 보안 암호를 가져올 수 있습니다.
다음 지침에서는 https://github.com/aws/aws-secretsmanager-agent의 예제 스크립트 secrets-manager-agent-extension.sh
를 사용하여 Secrets Manager Agent를 Lambda 확장으로 설치함으로써 MyTest
라는 보안 암호를 가져오는 방법을 보여줍니다.
Secrets Manager Agent를 패키징하는 Lambda 확장을 생성하는 방법
http://localhost:2773/secretsmanager/get?secretId=MyTest
를 쿼리하는 Python Lambda 함수를 생성하여 보안 암호를 가져옵니다. 애플리케이션 코드에 재시도 로직을 구현하여 Lambda 확장의 초기화 및 등록 지연을 수용할 수 있도록 해야 합니다.
-
Secrets Manager Agent 코드 패키지의 루트에서 다음 명령을 실행하여 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"
Lambda 함수를 간접적으로 호출하여 보안 암호를 올바르게 가져오는지 확인합니다.
3단계: Secrets Manager Agent를 사용하여 보안 암호 검색
에이전트를 사용하려면 로컬 Secrets Manager Agent 엔드포인트를 직접적으로 호출하고 보안 암호의 이름 또는 ARN을 쿼리 파라미터로 포함합니다. 기본적으로 Secrets Manager Agent는 보안 암호의 AWSCURRENT
버전을 검색합니다. 다른 버전을 검색하려면 versionStage
또는 versionId
를 설정할 수 있습니다.
Secrets Manager Agent를 보호하려면 각 요청의 일부로 SSRF 토큰 헤더 X-Aws-Parameters-Secrets-Token
을 포함해야 합니다. Secrets Manager Agent는 이 헤더가 없거나, 잘못된 SSRF 토큰이 있는 요청을 거부합니다. 구성 파일에 있는 SSRF 헤더 이름을 사용자 지정할 수 있습니다.
Secrets Manager Agent는 기본 자격 증명 공급자 체인을 활용하는 AWS SDK for Rust를 사용합니다. 이러한 IAM 자격 증명의 ID는 Secrets Manager Agent가 보안 암호를 검색하는 데 필요한 권한을 결정합니다.
필요한 권한:
자세한 내용은 권한 참조 단원을 참조하십시오.
보안 암호 값을 Secrets Manager Agent로 가져오면, 컴퓨팅 환경 및 SSRF 토큰에 액세스할 수 있는 모든 사용자가 Secrets Manager Agent 캐시에서 보안 암호에 액세스할 수 있습니다. 자세한 내용은 보안 고려 사항 단원을 참조하십시오.
- curl
-
다음 curl 예제에서는 Secrets Manager Agent에서 보안 암호 값을 가져오는 방법을 보여줍니다. 이 예제는 파일에 있는 SSRF를 기반으로 하며, SSRF는 설치 스크립트에 저장됩니다.
curl -v -H \
"X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" \
'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>
}'; \
echo
- Python
-
다음 Python 예제에서는 Secrets Manager Agent에서 보안 암호 값을 가져오는 방법을 보여줍니다. 이 예제는 파일에 있는 SSRF를 기반으로 하며, SSRF는 설치 스크립트에 저장됩니다.
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}")
Secrets Manager Agent 구성
Secrets Manager Agent의 구성을 변경하려면 TOML 구성 파일을 생성한 다음 ./aws-secrets-manager-agent --config config.toml
을 직접적으로 호출합니다.
다음 목록은 Secrets Manager Agent에 대해 구성할 수 있는 옵션을 보여줍니다.
log_level – Secrets Manager Agent: DEBUG, INFO, WARN, ERROR 또는 NONE에 대해 로그에 보고되는 세부 정보의 수준입니다. 기본값은 INFO입니다.
http_port – 로컬 HTTP 서버의 포트로, 포트 범위는 1024~65535입니다. 기본값은 2773입니다.
region - 요청에 사용할 AWS 리전입니다. 리전이 지정되지 않은 경우 Secrets Manager Agent가 SDK에서 리전을 결정합니다. 자세한 내용은 AWS SDK for Rust 개발자 안내서의 Specify your credentials and default Region 단원을 참조하세요.
ttl_seconds – 캐시된 항목의 TTL(초 단위)로, 범위는 1~3600입니다. 기본값은 300입니다. 캐시 크기가 0인 경우 이 설정은 사용되지 않습니다.
cache_size – 캐시에 저장할 수 있는 최대 보안 암호 수로, 범위는 0~1000입니다. 0은 캐싱이 없음을 나타냅니다. 기본값은 1000입니다.
ssrf_headers – Secrets Manager Agent가 SSRF 토큰이 있는지 확인하는 헤더 이름 목록입니다. 기본값은 ‘X-Aws-Parameters-Secrets-Token, X-Vault-Token’입니다.
ssrf_env_variables – Secrets Manager Agent가 SSRF 토큰이 있는지 확인하는 환경 변수 이름 목록입니다. 환경 변수에는 토큰 또는 AWS_TOKEN=file:///var/run/awssmatoken
에서와 같이 토큰 파일에 대한 참조가 포함될 수 있습니다. 기본값은 ‘AWS_TOKEN, AWS_SESSION_TOKEN’입니다.
path_prefix – 요청이 경로 기반 요청인지 여부를 결정하는 데 사용되는 URI 접두사입니다. 기본값은 ‘/v1/’입니다.
max_conn – Secrets Manager Agent가 허용하는 HTTP 클라이언트의 최대 연결 수로, 범위는 1~1000입니다. 기본값은 800입니다.
로깅
Secrets Manager Agent는 오류를 logs/secrets_manager_agent.log
파일에 로컬로 기록합니다. 애플리케이션이 Secrets Manager Agent를 호출하여 보안 암호를 가져오면 해당 호출이 로컬 로그에 표시됩니다. CloudTrail 로그에는 표시되지 않습니다.
Secrets Manager Agent는 파일이 10MB에 도달하면 새 로그 파일을 생성하고 총 5개의 로그 파일을 저장합니다.
로그는 Secrets Manager, CloudTrail 또는 CloudWatch로 이동하지 않습니다. Secrets Manager Agent에서 보안 암호를 가져오라는 요청은 이러한 로그에 표시되지 않습니다. Secrets Manager Agent가 암호를 가져오기 위해 Secrets Manager를 직접적으로 호출하면 해당 호출은 aws-secrets-manager-agent
가 포함된 사용자 에이전트 문자열과 함께 CloudTrail에 기록됩니다.
구성 파일에서 로깅을 구성할 수 있습니다.
보안 고려 사항
에이전트 아키텍처의 경우, 신뢰 도메인은 에이전트 엔드포인트 및 SSRF 토큰이 액세스할 수 있는 곳으로, 대개 전체 호스트입니다. 동일한 보안 태세를 유지하려면 Secrets Manager Agent의 신뢰 도메인은 Secrets Manager 자격 증명이 제공되는 도메인과 일치해야 합니다. 예를 들어 Amazon EC2에서 Secrets Manager Agent의 신뢰 도메인은 Amazon EC2에 대한 역할을 사용할 경우 자격 증명의 도메인과 동일합니다.
Secrets Manager 자격 증명이 애플리케이션에 잠긴 에이전트 솔루션을 사용하지 않는 보안 인식 애플리케이션은 언어별 AWS SDK 또는 캐싱 솔루션을 사용하는 방안을 고려해야 합니다. 자세한 내용은 AWS Secrets Manager에서 보안 암호 가져오기 단원을 참조하십시오.