[홍석범 CISO 보안팁-1] AWS 환경에서 API 키 보안을 위한 가이드

2025-05-11

AWS 등 클라우드 환경에서 시스템과 애플리케이션을 운영하다 보면, API 키(Secret Key)를 어떻게 안전하게 관리하고 사용할지에 대한 고민이 생기게 된다. API 키는 일종의 자격 증명(credentials)으로, CLI 사용 시 $HOME/.aws/credentials 파일에 평문으로 저장되거나, 소스 코드에 하드코딩되는 경우도 적지 않다. 이러한 방식은 키가 실수로 S3 버킷이나 Git 리포지토리에 포함되어 배포되는 등 다양한 경로를 통해 유출될 수 있어 보안상 큰 위협이 된다.

■키 유출을 막기 위한 안전한 운영 방법

Key를 사용하는 경우는 자동화 환경 및 단발성 호출 방식 두가지가 있는데, 각각의 경우에 대해 살펴보도록 하자.

▲방법1. 자동화 환경에서는 IAM Role 사용

EC2, Lambda, CI/CD 등 자동화된 환경에서는 AWS 리소스에 IAM Role을 직접 연결해 키 없이 인증하는 방식이 가장 권장된다. 이 방식은 AWS SDK 또는 CLI가 자동으로 임시 자격 증명을 사용하므로, 별도의 키 관리가 필요 없기 때문이다. 임시 세션은 일반적으로 1시간 이내로 유효하며, 자동으로 갱신되므로 보안성이 높다고 할 수 있다. 예를 들어, EC2에서 S3의 객체 목록을 가져오는 애플리케이션이 있다면, 해당 EC2 인스턴스에 S3 접근 권한이 있는 IAM Role을 연결해 주면 된다. 이 경우, 인스턴스 내부의 SDK 또는 CLI는 http://169.254.169.254/latest/meta-data/iam/security-credentials/ 경로를 통해 임시 보안 자격 증명을 자동으로 획득하고 사용하게 된다. 물론 Role이 제거되면 해당 자격 증명은 즉시 무효화된다.

▲방법2. IAM Role을 사용할 수 없는 경우: AWS Secrets Manager 사용

다른 방식으로는 AWS Secrets Manager를 사용하는 방법이 있는데, 이는 리소스가 온프라미스등 외부에 있어 IAM Role을 직접 연결할 수 없는 경우에 대안으로 활용할 수 있다. 즉, 이는 Secrets Manager에 Key나 DB 비밀번호, API 토큰 등의 민감정보를 암호화하여 저장하는 방식인데, IAM 정책 기반 접근 제어로 안전하게 참조가 가능하며 자동 로테이션도 할 수 있다는 장점이 있다. 아래는 코드내에 키를 하드코딩하지 않고, Secrets Manager에 저장된 키를 호출하여 사용하는 코드 예를 보여주고 있는데, 변수만 지정되어 있기 때문에 설사 소스코드가 유출되어도 키까지 유출되지는 않게 된다.

다음으로는 단발성 호출 방식인 경우에 대해 살펴보도록 하자.

▲방법 1. aws configure sso (SSO 기반 인증)

이 명령어를 실행하면 웹 브라우저를 통해 SSO 로그인한 후 AWS CLI 를 사용할 수 있는 방식으로, 로그인시 MFA등 조직의 보안 정책을 적용할 수 있고 로그인이 성공하면 영구 키 대신 해당 세션에서만 유효한 단기 임시 자격 증명이 자동으로 발급되어 보안 측면에서 더욱 안전하다는 장점이 있다. 다만, 이 방식은 IAM Identity Center(구 AWS SSO) 기반의 인증 방식이므로, Okta, Azure AD, Google Workspace와 같은 외부 IdP와 연동하거나, AWS의 내부 디렉터리 기반 사용자 관리를 설정해 두어야 사용할 수 있다는 조건이 필요하다. 이 기능을 사용하기 위해서는 다음의 절차를 따르게 된다.

aws configure sso 명령어 실행

위 입력 후 AWS CLI가 브라우저를 열고, 로그인 완료 후, CLI에서 접근 가능한 AWS 계정 목록과 역할 목록이 출력되고 사용할 계정과 역할을 선택하면 된다. 이후 아래와 같이 CLI 기본값을 입력한다.

CLI default client Region: ap-northeast-2CLI default output format: jsonCLI profile name: my-sso-profile

이후 아래 명령어를 실행하면, 브라우저가 열리며 Identity Center에 로그인하면서 세션이 시작된다.

aws sso login --profile my-sso-profile

이제 아래와 같은 명령어를 실행하면 된다.

$ aws s3 ls --profile my-sso-profile

참고로 aws configure sso 에서의 인증은 SSO profile을 설정하는 단계로 최초 1회만 실행하면 되며 ~/.aws/config 파일에 SSO profile 관련 정보가 저장된다.(credentials은 없음)

aws sso login --profile <프로파일명> 은 사용할 때마다 실행해야 하는데, AWS CLI에서 자격 증명이 필요한 작업을 수행하기 전에 로그인 세션을 발급하는 단계로 1~12시간의 세션이 만료되면 다시 aws sso login을 실행해야 한다.

▲방법 2. STS + MFA 기반 임시 자격 증명 사용

두 번째 방법은 SSO 연동 여부와 관계없이, 또는 SSO를 사용하지 않는 환경에서도 적용할 수 있는 방식으로 이 방법은 API 키를 사용해 호출할 때 사전에 등록된 MFA 디바이스에서 생성된 유효한 OTP 코드를 입력하여 STS (Security Token Service) 를 통해 단기 세션 자격 증명을 발급받는 방식이다.

기본적으로 console에서 MFA를 활성화해도 console 로그인에만 적용되며 CLI에는 적용이 안 되므로 이를 위해서는 먼저 Add permission > Create inline policy > json 선택후 다음의 json 설정을 추가하여 적용하도록 한다.

이후, 해당 IAM 사용자의 보안 자격 증명 메뉴에서 MFA 디바이스를 등록하여 활성화한 후 다음 명령어를 실행하여 1시간동안 유효한 임시세션을 발급한다. 이때 <6자리 OTP>는 해당 명령어를 실행할 때의 6자리 OTP코드를 입력하여야 한다.

aws sts get-session-token \--serial-number arn:aws:iam::<계정 ID>:mfa/<사용자명> \--token-code <6자리 OTP> \--duration-seconds 3600

이후 출력되는 임시 자격 증명을 참고하여 아래와 같이 환경 변수로 적용한다.

export AWS_ACCESS_KEY_ID=...export AWS_SECRET_ACCESS_KEY=...export AWS_SESSION_TOKEN=...

이후에는 유효한 시간동안 aws s3 ls 와 같이 명령어를 실행하면 정상 작동하는 것을 확인할 수 있을 것이다.

이 방법은 OTP코드를 사용해야 하므로 매우 안전하지만 .bash_history 나 로그 파일 등에 민감정보가 저장되지 않도록 주의하여야 하며 매번 실행시마다 OTP코드를 수동으로 입력해야 하기 때문에 배치 등 스크립트에는 부적합한 한계가 있다. 또한 설정 단계가 다소 복잡하기 때문에 실제 사용하려면 대부분 스크립트를 만들어 사용하는 것이 좋다.

이상으로 AWS 환경에서 API 키를 안전하게 사용하는 방법에 대해 자동화 및 수동 환경을 기준으로 정리해 보았다. 각자의 환경에 따라 적절한 방법을 선택하되, 원칙은 "키를 저장하거나 하드코딩하지 말고, 역할(Role) 또는 임시 자격 증명을 사용하자"라는 것을 주의하기 바란다. (다음 편에 계속...)

[글. 홍석범 크래프톤 CISO / antihong@gmail.com]

★정보보안 대표 미디어 데일리시큐 / Dailysecu, Korea's leading security media!★

Menu

Kollo 를 통해 내 지역 속보, 범죄 뉴스, 비즈니스 뉴스, 스포츠 업데이트 및 한국 헤드라인을 휴대폰으로 직접 확인할 수 있습니다.