Amazon Linux 2023에 AWS Secrets Manager Agent 설치하는 방안
해당 기사에서는 Amazon Linux 2023에 AWS Secrets Manager Agent를 설치하는 방안에 대해서 설명합니다.
2024년 7월 AWS Secrets Manager는 Secrets Manager에서 보안 암호를 읽고 이를 메모리에 캐시하기 위해 컴퓨팅 환경에 설치하고 사용할 수 있으며 언어에 구애받지 않는 로컬 HTTP 서비스인 Secrets Manager 에이전트를 발표했습니다. [1]
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에 호출하는 대신 로컬 호스트에서 애플리케이션에 필요한 비밀을 가져올 수 있습니다. Secrets Manager Agent는 Secrets Manager에 읽기 요청만 할 수 있으며 비밀을 수정할 수는 없습니다. [2]
해당 기사의 최종 목적은 Amazon Linux 2023에 AWS Secrets Manager Agent를 설치하여 로컬 Secrets Manager Agent 엔드포인트를 호출하고 Secret의 저장된 값을 가져옵니다. 일반적으로 애플리케이션 등에서 SDK를 사용하여 AWS API 호출하여 Secrets Manager에서 비밀을 얻는 경우가 많습니다. Secrets Manager는 호출 횟수에 따라 요금이 부과되므로 비용을 절감하거나 대기 시간을 줄이기 위해 캐싱 전략을 고려하는 것이 중요합니다.
단계 1: Secrets Manager Agent 바이너리 빌드
1. GitHub 소스코드 다운
$ sudo dnf install git -y
$ sudo git clone https://github.com/aws/aws-secretsmanager-agent.git
$ cd aws-secretsmanager-agent
$ ls -l
total 120
-rw-r—r--. 1 ec2-user ec2-user 59 Aug 23 06:46 CODEOWNERS
-rw-r—r--. 1 ec2-user ec2-user 309 Aug 23 06:46 CODE_OF_CONDUCT.md
-rw-r—r--. 1 ec2-user ec2-user 3160 Aug 23 06:46 CONTRIBUTING.md
-rw-r—r--. 1 ec2-user ec2-user 69079 Aug 23 06:46 Cargo.lock
-rw-r—r--. 1 ec2-user ec2-user 97 Aug 23 06:46 Cargo.toml
-rw-r—r--. 1 ec2-user ec2-user 10142 Aug 23 06:46 LICENSE
-rw-r—r--. 1 ec2-user ec2-user 67 Aug 23 06:46 NOTICE
-rw-r—r--. 1 ec2-user ec2-user 19701 Aug 23 06:46 README.md
drwxr-xr-x. 6 ec2-user ec2-user 103 Aug 23 06:46 aws_secretsmanager_agent
drwxr-xr-x. 3 ec2-user ec2-user 52 Aug 23 06:46 aws_secretsmanager_caching
drwxr-xr-x. 3 ec2-user ec2-user 65 Aug 23 07:34 target
2. Rust 설치
Secrets Manager Agent 바이너리를 빌드하려면 표준 개발 도구와 Rust 도구가 필요합니다.
$ sudo yum -y groupinstall "Development Tools"
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
info: downloading installer
Welcome to Rust!
:
1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>
info: profile set to 'default'
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2024-06-13, rust version 1.79.0 (129f3b996 2024-06-10)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
15.3 MiB / 15.3 MiB (100 %) 1.5 MiB/s in 11s ETA: 0s
info: installing component 'rust-std'
24.4 MiB / 24.4 MiB (100 %) 9.3 MiB/s in 2s ETA: 0s
info: installing component 'rustc'
63.8 MiB / 63.8 MiB (100 %) 10.6 MiB/s in 6s ETA: 0s
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'
stable-x86_64-unknown-linux-gnu installed - rustc 1.79.0 (129f3b996 2024-06-10)
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.
This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env" # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish" # For fish
3. Cargo를 사용하여 빌드
$ cargo build --release
위 명령어 실행 시 아래와 같은 에러 발생 시, 다음 명령어를 통해 디렉토리(aws-secretsmanager-agent)의 소유자를 변경해줍니다.
error: Permission denied (os error 13) at path "/home/ec2-user/aws-secretsmanager-agent/targetKnlghI"
$ sudo chown -R ec2-user:ec2-user /home/ec2-user/aws-secretsmanager-agent
$ ls target/release/ -l
total 14836
-rwxrwxr-x. 2 ec2-user ec2-user 14692984 Jul 13 22:54 aws_secretsmanager_agent
-rw-rw-r--. 1 ec2-user ec2-user 1168 Jul 13 22:54 aws_secretsmanager_agent.d
drwxrwxr-x. 45 ec2-user ec2-user 16384 Jul 13 22:45 build
drwxrwxr-x. 2 ec2-user ec2-user 32768 Jul 13 22:54 deps
drwxrwxr-x. 2 ec2-user ec2-user 6 Jul 13 22:45 examples
drwxrwxr-x. 2 ec2-user ec2-user 6 Jul 13 22:45 incremental
-rw-rw-r--. 1 ec2-user ec2-user 515 Jul 13 22:54 libaws_secretsmanager_caching.d
-rw-rw-r--. 2 ec2-user ec2-user 417300 Jul 13 22:53 libaws_secretsmanager_caching.rlib
4. Secrets Manager Agent 구성
Secrets Manager Agent의 구성을 변경하려면 TOML 구성 파일을 만듭니다. 다음 목록은 Secrets Manager Agent에 대해 구성할 수 있는 옵션입니다. [3]
log_level – Secrets Manager Agent에 대한 로그에 보고된 세부 정보 수준: DEBUG, INFO, WARN, ERROR 또는 NONE. 기본값은 INFO입니다.
http_port – 로컬 HTTP 서버의 포트로, 범위는 1024~65535입니다. 기본값은 2773입니다.
region – 요청에 사용할 AWS 지역입니다. 지역이 지정되지 않으면 Secrets Manager Agent가 SDK에서 지역을 결정합니다.
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입니다.
5. 스크립트 설치
빌드 후 생성 된 aws_secretsmanager_agent 파일을 install 스크립트가 존재하는 aws-secretsmanager-agent/aws_secretsmanager_agent/configuration 하위에 복사합니다.
$ sudo cp aws_secretsmanager_agent /home/ec2-user/aws-secretsmanager-agent/aws_secretsmanager_agent/configuration
install 스크립트 설치 (구성 파일을 생성한 경우: --config config.toml)
$ sudo cd /home/ec2-user/aws-secretsmanager-agent/aws_secretsmanager_agent/configuration
$ sudo ./install
Created symlink /etc/systemd/system/multi-user.target.wants/awssmaseedtoken.service → /etc/systemd/system/awssmaseedtoken.service.
Created symlink /etc/systemd/system/multi-user.target.wants/awssmastartup.service → /etc/systemd/system/awssmastartup.service.
단계 2: 로깅
Secrets Manager Agent는 오류를 logs/secrets_manager_agent.log에 기록합니다. 애플리케이션에서 Secrets Manager Agent를 호출하여 비밀을 가져오면 해당 호출이 로컬 로그에 나타납니다. CloudTrail에는 기록되지 않습니다. Secrets Manager Agent가 Secrets Manager를 호출하여 비밀을 가져오면 해당 호출이 aws-secrets-managet-agent를 포함하는 사용자 에이전트 문자열과 함께 CloudTrail에 기록됩니다. [4]
에이전트 설치 후 로깅 된 내용은 다음과 같습니다.
$ cat /opt/aws/secretsmanageragent/logs/secrets_manager_agent.log
2024-08-24T09:54:06.883773287+00:00 INFO aws_secretsmanager_agent::logging - Logger initialized at Info log level.
2024-08-24T09:54:06.955913267+00:00 INFO aws_secretsmanager_agent - Agent/1.0.0 listening on http://127.0.0.1:2773
단계 3: Secrets Manager Agent를 사용하여 비밀 검색
에이전트를 사용하려면 로컬 Secrets Manager Agent 엔드포인트를 호출하고 ARN 암호의 이름 또는 암호를 쿼리 매개 변수로 포함해야 합니다. Secrets Manager Agent를 보호하려면 각 요청의 일부로 SSRF 토큰 헤더인 X-Aws-Parameters-Secrets-Token을 포함해야 합니다. Secrets Manager Agent는 이 헤더가 없거나 잘못된 SSRF 토큰이 있는 요청을 거부합니다. [5]
아래는 테스트를 위한 보안 암호를 생성하였습니다.
다음 curl 예제를 통해 Secrets Manager Agent로 부터 보안 암호를 가져올 수 있습니다.
$ curl -H "X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" 'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>'
관련 정보
[1] AWS Secrets Manager, Secrets Manager 에이전트의 오픈 소스 릴리스 발표 - https://aws.amazon.com/ko/about-aws/whats-new/2024/07/aws-secrets-manager-open-source-secrets-manager-agent/
[2] AWS Secrets Manager Agent - https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/secrets-manager-agent.html
[3] Secrets Manager 에이전트 구성 - https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/secrets-manager-agent.html#secrets-manager-agent-config
[5] Secrets Manager 에이전트를 통한 비밀 검색 - https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/secrets-manager-agent.html#secrets-manager-agent-call
관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 일 년 전lg...
- 질문됨 10달 전lg...
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 일 년 전