시크릿 매니저 랜덤 비밀번호 만들기, GetRandomPassword API 옵션과 CLI 사용법 정리

서비스를 만들다 보면 데이터베이스 계정, 관리자 초기 비밀번호, 외부 연동용 토큰처럼 사람이 직접 정하기 애매한 비밀번호가 계속 필요해져요. 그때마다 키보드를 아무렇게나 두드려 만들거나, 인터넷의 비밀번호 생성 사이트를 쓰는 건 생각보다 위험한 습관이에요. AWS를 쓰고 있다면 더 좋은 방법이 있어요. 바로 AWS Secrets Manager의 GetRandomPassword API예요. 오늘은 시크릿 매니저 랜덤 비밀번호 생성 기능이 무엇인지, 어떤 옵션이 있는지, 콘솔이 아닌 CLI와 Python 코드로 어떻게 호출하는지, 그리고 실무에서 놓치기 쉬운 보안 포인트까지 정리해 볼게요.


🔐 GetRandomPassword는 어떤 API일까

AWS Secrets Manager는 데이터베이스 자격 증명, API 키 같은 민감한 정보를 안전하게 저장하고 교체해 주는 서비스예요. 그 안에 포함된 GetRandomPassword는 이름 그대로 무작위 비밀번호 문자열을 만들어 돌려주는 API예요. 재미있는 점은 이 API가 비밀번호를 어딘가에 저장하지 않는다는 거예요. 호출하면 조건에 맞는 문자열 하나를 응답으로 돌려줄 뿐, 시크릿으로 보관하는 건 별도의 단계예요.

그럼 왜 굳이 이걸 쓸까요? 직접 만든 비밀번호는 사람의 습관이 묻어나서 패턴이 생기기 쉬워요. 반면 시크릿 매니저 랜덤 비밀번호는 AWS가 관리하는 암호학적으로 안전한 난수 생성 방식을 바탕으로 만들어져서 예측하기가 매우 어려워요. 게다가 길이, 포함할 문자 종류, 제외할 특수문자 같은 규칙을 파라미터로 정할 수 있어서, 특정 데이터베이스가 허용하지 않는 문자를 미리 빼고 만들 수도 있죠. 자동화 스크립트나 배포 파이프라인 안에서 사람 손을 거치지 않고 비밀번호를 만들고, 곧바로 시크릿에 저장하는 흐름을 짜기에 딱 좋은 도구예요.

⚙️ 꼭 알아야 할 파라미터 정리

GetRandomPassword는 모든 파라미터가 선택 사항이라 아무 옵션 없이 호출해도 동작해요. 하지만 실무에서는 대부분 몇 가지 옵션을 조합해서 써요. 시크릿 매니저 랜덤 비밀번호를 원하는 규칙대로 뽑으려면 아래 옵션만 알아 두면 충분해요.

파라미터의미기본값
PasswordLength비밀번호 길이32자
ExcludeCharacters결과에서 뺄 특정 문자 목록없음
ExcludeNumbers숫자 제외 여부false
ExcludePunctuation특수문자 제외 여부false
ExcludeUppercase대문자 제외 여부false
ExcludeLowercase소문자 제외 여부false
IncludeSpace공백 문자 포함 여부false
RequireEachIncludedType포함된 문자 종류를 최소 하나씩 반드시 넣을지 여부true

여기서 가장 자주 손대는 건 ExcludeCharacters예요. 예를 들어 데이터베이스 접속 문자열이나 셸 스크립트에서 따옴표, 슬래시, 골뱅이 같은 문자는 문제를 일으키기 쉬워요. 이런 문자를 미리 빼 두면 나중에 이스케이프 처리 때문에 골치 아플 일이 줄어들어요. 반대로 ExcludePunctuation을 켜서 특수문자를 통째로 빼 버리면 비밀번호 강도가 떨어지니, 문제가 되는 문자만 콕 집어 빼는 쪽을 추천해요. RequireEachIncludedType은 기본값이 true라서 대문자, 소문자, 숫자, 특수문자가 최소 한 번씩 들어가요. 비밀번호 정책이 까다로운 시스템에 넣을 때 특히 유용하죠.


💻 CLI와 Python으로 호출하는 방법

가장 간단한 방법은 AWS CLI예요. 자격 증명이 설정된 터미널에서 아래처럼 실행하면 길이 24자, 일부 특수문자를 제외한 비밀번호가 만들어져요.

aws secretsmanager get-random-password --password-length 24 --exclude-characters "/@:" --require-each-included-type

응답은 JSON 형태로 돌아오고, RandomPassword라는 키 안에 생성된 문자열이 들어 있어요. 스크립트에서 값만 꺼내 쓰고 싶다면 CLI의 query 옵션으로 RandomPassword만 뽑고 출력 형식을 text로 지정하면 돼요.

애플리케이션 코드에서 쓴다면 Python의 boto3가 편해요. secretsmanager 클라이언트를 만든 뒤 get_random_password 메서드를 호출하면 되고, 파라미터 이름은 위 표와 똑같아요. 아래는 한 줄로 이어 쓴 예시예요.

import boto3; client = boto3.client("secretsmanager", region_name="ap-northeast-2"); resp = client.get_random_password(PasswordLength=24, ExcludeCharacters="/@:", RequireEachIncludedType=True); password = resp["RandomPassword"]

이렇게 만든 값은 곧바로 create_secret이나 put_secret_value로 시크릿에 저장하는 게 정석이에요. 시크릿 매니저 랜덤 비밀번호를 만들고 저장하는 과정이 한 흐름 안에서 끝나니, 비밀번호가 사람 눈에 노출될 틈이 거의 없어져요.

🛡️ 권한 설정과 보안 주의점

GetRandomPassword를 호출하려면 IAM 정책에 secretsmanager:GetRandomPassword 권한이 있어야 해요. 이 작업은 특정 시크릿에 묶이는 동작이 아니라서 리소스를 개별 시크릿 ARN으로 제한할 수 없고, 보통 전체 리소스를 대상으로 허용해요. 대신 꼭 필요한 역할에만 이 권한을 주는 식으로 범위를 관리하는 게 좋아요.

보안 측면에서 가장 흔한 실수는 로그예요. 생성된 비밀번호를 디버깅한다고 print로 찍거나, CI 파이프라인 로그에 그대로 남기는 경우가 의외로 많아요. 로그는 생각보다 많은 사람이 볼 수 있고 오래 보관되니, 비밀번호 값 자체는 절대 출력하지 않는 습관을 들이세요. 시크릿 매니저 랜덤 비밀번호를 아무리 강하게 만들어도 로그 한 줄로 유출되면 소용이 없거든요. CloudTrail에는 API 호출 기록이 남지만 응답으로 받은 비밀번호 값은 기록되지 않도록 설계돼 있어요. 또한 생성한 비밀번호는 환경 변수나 코드에 하드코딩하지 말고 시크릿에 저장한 뒤, 애플리케이션이 실행될 때 GetSecretValue로 읽어 오는 구조가 안전해요. 마지막으로 비용도 참고해 두세요. Secrets Manager는 저장된 시크릿 개수와 API 호출 횟수에 따라 요금이 붙는데, API 호출은 1만 건당 과금되는 구조라 비밀번호 생성 자체의 비용은 아주 작은 편이에요. 정확한 금액은 리전과 시점에 따라 다를 수 있으니 AWS 요금 안내를 확인해 보세요.


🔄 자동 교체와 함께 쓰면 더 강력해요

시크릿 매니저 랜덤 비밀번호의 진짜 힘은 자동 교체 기능과 만날 때 나와요. Secrets Manager는 일정 주기마다 Lambda 함수를 실행해 비밀번호를 바꾸는 로테이션 기능을 제공하는데, 이 Lambda 안에서 새 비밀번호를 만들 때 바로 GetRandomPassword를 호출하는 방식이 널리 쓰여요. AWS가 제공하는 데이터베이스용 로테이션 템플릿도 내부적으로 같은 원리를 활용하고요. 사람이 비밀번호를 정하지 않고, 사람이 바꾸지도 않고, 사람이 보지도 않는 구조가 만들어지는 거죠.

인프라를 코드로 관리한다면 CloudFormation의 시크릿 리소스에서 GenerateSecretString 속성을 쓰는 방법도 있어요. 이 속성도 길이와 제외 문자 같은 옵션을 비슷하게 지정할 수 있어서, 스택을 만들 때 비밀번호가 자동으로 생성돼 시크릿에 저장돼요. 정리하면 일회성으로 비밀번호가 필요할 땐 CLI로 GetRandomPassword를, 애플리케이션 흐름 안에서는 boto3 같은 SDK를, 인프라 단위로는 CloudFormation 속성을 쓰면 돼요. 어떤 방법이든 핵심은 같아요. 비밀번호는 기계가 만들고, 안전한 저장소에 넣고, 주기적으로 바꾼다. 이 세 가지 원칙만 지켜도 비밀번호 때문에 생기는 사고는 크게 줄일 수 있어요.

Leave a Comment