RDS Proxy를 위한 데이터베이스 자격 증명 설정하기

RDS Proxy를 위한 데이터베이스 자격 증명 설정하기 (Setting up database credentials for RDS Proxy)

Amazon RDS의 RDS Proxy는 AWS Secrets Manager를 사용해 데이터베이스 자격 증명을 안전하게 저장하고 관리해요. 이 페이지에서 프록시용 Secrets Manager 시크릿을 만드는 방법을 설명해요.

출처: 문서

본문

Amazon RDS의 RDS Proxy는 AWS Secrets Manager를 사용해 데이터베이스 자격 증명을 안전하게 저장하고 관리해요. 애플리케이션에 자격 증명을 직접 넣는 대신, 필요한 인증 정보가 담긴 Secrets Manager 시크릿에 프록시를 연결해요. 프록시가 RDS DB 인스턴스에서 연결하는 각 데이터베이스 사용자 계정에 대해 별도의 Secrets Manager 시크릿을 만들게 돼요.

또는 RDS Proxy가 엔드투엔드 IAM 인증을 사용하도록 구성할 수도 있어요. 이러면 Secrets Manager에 데이터베이스 자격 증명을 저장할 필요가 없어져요. RDS Proxy는 클라이언트-프록시 연결과 프록시-데이터베이스 연결 모두에 IAM 인증을 사용해요. 이 방식은 시크릿이나 암호를 관리할 필요 없이 완전히 통합된 IAM 기반 인증 솔루션을 제공해요. 새 IAM DB 사용자를 추가하는 방법에 대한 자세한 내용은 IAM 인증을 사용해 데이터베이스 계정 생성하기(Creating a database account using IAM authentication)를 참조하세요.

Topics
  • RDS Proxy에서 사용할 시크릿 생성하기 (Creating secrets to use with RDS Proxy)

RDS Proxy에서 사용할 시크릿 생성하기 (Creating secrets to use with RDS Proxy)

프록시를 만들기 전에 먼저 데이터베이스 자격 증명을 저장하는 시크릿을 최소 1개 만들어야 해요.

시크릿을 생성하려면
  1. https://console.aws.amazon.com/secretsmanager/ 에서 Secrets Manager 콘솔을 엽니다.
  2. Store a new secret(새 시크릿 저장)을 선택합니다.
  3. Credentials for Amazon RDS database(Amazon RDS 데이터베이스용 자격 증명)을 선택합니다.
  4. 사용자 이름과 암호를 입력합니다. 입력한 자격 증명은 연결된 RDS 데이터베이스에 존재하는 데이터베이스 사용자의 자격 증명과 일치해야 해요. RDS Proxy는 이 자격 증명을 사용해 애플리케이션을 대신해 데이터베이스에 인증하고 연결을 설정해요.
    • 불일치가 있으면 시크릿을 업데이트해 데이터베이스 암호와 일치시킬 수 있어요. 시크릿을 업데이트하기 전까지 그 시크릿을 사용한 프록시 연결 시도는 실패하지만, 다른 유효한 시크릿을 사용한 연결은 계속 동작해요.
  5. Database(데이터베이스)에서 시크릿이 접근할 Amazon RDS 데이터베이스를 선택합니다.
  6. 시크릿에 대한 다른 설정을 입력한 다음 Store(저장)를 선택합니다. 자세한 지침은 AWS Secrets Manager 사용자 가이드의 AWS Secrets Manager 시크릿 생성하기(Creating an AWS Secrets Manager secret)를 참조하세요.

참고

RDS for SQL Server의 경우 RDS Proxy는 DB 인스턴스의 데이터 정렬(collation) 설정과 관계없이 Secrets Manager에서 대/소문자를 구분하는 시크릿을 요구해요. 애플리케이션이 "Admin"과 "admin"처럼 다른 대소문자 조합의 사용자 이름을 허용한다면 각각에 대해 별도의 시크릿을 만들어야 해요. RDS Proxy는 클라이언트와 프록시 사이의 대소문자를 구분하지 않는 사용자 이름 인증을 지원하지 않아요.

SQL Server의 데이터 정렬에 대한 자세한 내용은 Microsoft SQL Server 설명서를 참조하세요.

AWS CLI로 프록시를 생성할 때는 해당하는 시크릿의 Amazon 리소스 이름(ARN)을 지정해요. 이 작업은 프록시가 접근할 수 있는 모든 DB 사용자 계정에 대해 수행해요. AWS Management Console에서는 시크릿을 설명 이름으로 선택해요.

RDS Proxy에 사용할 Secrets Manager 시크릿을 만들려면 create-secret 명령을 사용해요.

aws secretsmanager create-secret \
  --name "secret_name" \
  --description "secret_description" \
  --region region_name \
  --secret-string '{"username":"db_user","password":"db_user_password"}'

Secrets Manager 시크릿을 암호화할 커스텀 키를 만들 수도 있어요. 다음 명령은 예시 키를 만들어요.

aws kms create-key --description "test-key" --policy '{
  "Id":"kms-policy",
  "Version": "2012-10-17",
  "Statement":
    [
      {
        "Sid":"Enable IAM User Permissions",
        "Effect":"Allow",
        "Principal":{"AWS":"arn:aws:iam::account_id:root"},
        "Action":"kms:*","Resource":"*"
      },
      {
        "Sid":"Allow access for Key Administrators",
        "Effect":"Allow",
        "Principal":
          {
            "AWS":
              ["$USER_ARN","arn:aws:iam::account_id:role/Admin"]
          },
        "Action":
          [
            "kms:Create*",
            "kms:Describe*",
            "kms:Enable*",
            "kms:List*",
            "kms:Put*",
            "kms:Update*",
            "kms:Revoke*",
            "kms:Disable*",
            "kms:Get*",
            "kms:Delete*",
            "kms:TagResource",
            "kms:UntagResource",
            "kms:ScheduleKeyDeletion",
            "kms:CancelKeyDeletion"
          ],
        "Resource":"*"
      },
      {
        "Sid":"Allow use of the key",
        "Effect":"Allow",
        "Principal":{"AWS":"$ROLE_ARN"},
        "Action":["kms:Decrypt","kms:DescribeKey"],
        "Resource":"*"
      }
    ]
}'

예를 들어 다음 명령은 두 데이터베이스 사용자에 대한 Secrets Manager 시크릿을 만들어요.

aws secretsmanager create-secret \
  --name secret_name_1 --description "db admin user" \
  --secret-string '{"username":"admin","password":"choose_your_own_password"}'

aws secretsmanager create-secret \
  --name secret_name_2 --description "application user" \
  --secret-string '{"username":"app-user","password":"choose_your_own_password"}'

이 시크릿들을 커스텀 AWS KMS 키로 암호화하려면 다음 명령을 사용해요.

aws secretsmanager create-secret \
  --name secret_name_1 --description "db admin user" \
  --secret-string '{"username":"admin","password":"choose_your_own_password"}' \
  --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id

aws secretsmanager create-secret \
  --name secret_name_2 --description "application user" \
  --secret-string '{"username":"app-user","password":"choose_your_own_password"}' \
  --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id

AWS 계정이 소유한 시크릿을 보려면 list-secrets 명령을 사용해요.

aws secretsmanager list-secrets

CLI로 프록시를 생성할 때는 하나 이상의 시크릿 ARN(Amazon 리소스 이름)을 --auth 매개변수로 전달해요. 다음 예시는 AWS 계정이 소유한 각 시크릿의 이름과 ARN만 포함하는 보고서를 준비하는 방법을 보여줘요. 이 예시는 AWS CLI 버전 2에서 사용할 수 있는 --output table 매개변수를 사용해요. AWS CLI 버전 1을 사용한다면 --output text를 대신 사용하세요.

aws secretsmanager list-secrets --query '*[].[Name,ARN]' --output table

시크릿에 올바른 형식의 자격 증명이 들어 있는지 확인하려면 get-secret-value 명령을 사용해요. your_secret_name을 시크릿의 짧은 이름 또는 ARN으로 바꾸세요.

aws secretsmanager get-secret-value --secret-id your_secret_name

출력에는 다음과 유사한 JSON 인코딩 값이 담긴 줄이 포함돼요.

...
"SecretString": "{\"username\":\"your_username\",\"password\":\"your_password\"}",
...

더 알아보기 (Learn more)