IAM 인증을 사용하여 Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL 클러스터에 연결하는 동안 발생하는 문제를 해결하려면 어떻게 해야 합니까?

4분 분량
0

Amazon Relational Database Service(RDS) for PostgreSQL 인스턴스 또는 Amazon Aurora PostgreSQL 호환 클러스터에 연결하려고 합니다. AWS Identity Access Management(IAM) 인증을 사용하여 연결하려고 하면 “PAM authentication failed for user” 오류가 발생합니다.

간략한 설명

다음 이유 중 하나로 인해 IAM 인증을 사용하여 Amazon RDS for PostgreSQL 또는 Aurora DB 인스턴스에 연결하지 못할 수 있습니다.

  • IAM 인증이 꺼짐
  • IAM 역할 권한이 부족하거나 정책이 잘못됨
  • 데이터베이스 사용자가 부적절하게 구성됨
  • 잘못된 연결 문자열
  • 잘못된 IAM 엔터티

해결 방법

IAM 인증이 꺼짐

기본적으로 IAM 인증은 꺼져 있습니다. RDS for PostgreSQL 인스턴스 또는 Aurora PostgreSQL 클러스터의 구성 설정을 검토하세요. IAM 인증이 켜져 있는지 확인하세요. Amazon RDS 콘솔에서 **데이터베이스 인증(Database Authentication)**을 선택하여 Aurora 클러스터 또는 RDS 인스턴스를 수정할 수 있습니다. 그런 다음 **IAM 데이터베이스 인증(IAM database authentication)**을 선택하고 **계속(Continue)**을 선택하여 구성 설정을 업데이트합니다.

참고: 클러스터 구성 설정을 업데이트할 때 **즉시 적용(Apply Immediately)**을 선택하면 보류 중인 모든 수정 사항이 즉시 적용됩니다. 이 작업으로 인한 가동 중지는 발생하지 않습니다.

IAM 역할 권한 부족

IAM 데이터베이스 인증을 사용하여 DB 인스턴스에 성공적으로 연결하려면 rds-db:connect 작업에 대한 액세스 권한이 있어야 합니다. rds-db:connect 작업은 DB 인스턴스에 연결할 수 있게 해 줍니다.

예를 들어, 다음과 같습니다.

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "rds-db:connect"
        ],
        "Resource": [
            " arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name"
        ]
    }]

참고: db-user-name을 IAM 인증과 연결된 데이터베이스 계정 사용자로 바꾸세요.

또한 ARN만 지정하는 말고 올바른 리소스 ID도 사용하고 있는지 확인합니다. DB 인스턴스의 리소스 ID를 찾으려면 Amazon RDS 콘솔에서 DB 인스턴스 또는 클러스터를 선택합니다. 그런 다음 구성(Configuration) 탭을 선택하여 리소스 ID를 확인합니다.

IAM 정책 예제에 나열된 요소에 대한 자세한 내용은 IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용을 참조하세요.

참고: IAM 인증은 정책 명령문의 조건 요소에 사용할 수 있는 서비스별 컨텍스트 키를 지원하지 않습니다. 또한 IAM 인증은 모든 글로벌 조건 컨텍스트 키를 지원하지는 않습니다. 글로벌 조건 컨텍스트 키에 대한 자세한 내용은 IAM 사용 설명서의 AWS 글로벌 조건 컨텍스트 키를 참조하세요.

데이터베이스 사용자가 부적절하게 구성됨

PostgreSQL에 IAM 인증을 사용하려면 데이터베이스 사용자에게 rds_iam 역할을 부여합니다. 이 역할이 사용자와 연결되어 있는지 확인하려면 다음 명령을 실행합니다.

참고: 이 명령은 PostgreSQL 클라이언트에서만 실행됩니다.

\du

출력은 다음과 유사합니다.

List of roles
   Role name    |                         Attributes                         |                          Member of                          
-----------------+------------------------------------------------------------+-------------------------------------------------------------
db_user_name    |                                                            | {rds_iam}                                
postgres        | Create role, Create DB                                    +| {rds_superuser}          
                | Password valid until infinity                              |

모든 플랫폼에서 실행되는 다음 쿼리를 사용할 수도 있습니다.

SELECT r.rolname,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) memberof
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

사용자를 생성하고 rds_iam 역할을 부여하려면 다음 명령을 실행합니다.

CREATE USER db_user_name WITH LOGIN; 
GRANT rds_iam TO db_user_name;

잘못된 연결 문자열

인증 토큰은 명령줄에서 사용하기 까다로운 여러 문자로 구성되어 있습니다. 대신 토큰을 환경 변수에 저장한 다음 PostgreSQL DB 인스턴스에 연결할 때 해당 변수를 사용하세요.

예를 들어, 다음과 같습니다.

export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com'
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)"
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"

환경 변수를 사용하여 PostgreSQL DB 인스턴스에 연결하는 방법에 대한 자세한 내용은 Aurora PostgreSQL 클러스터에 연결을 참조하세요.

이 예와 비슷한 오류가 발생하면 클라이언트가 SSL 없이 DB 인스턴스에 연결하려고 하는 것입니다.

FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off 
FATAL: password authentication failed for user "db_user_name"

IAM 데이터베이스 인증에는 SSL 연결이 필요하며 RDS DB로 전송되거나 여기서 전송하는 모든 데이터는 암호화됩니다. 이 오류를 방지하려면 연결이 SSL을 사용하고 있는지 확인합니다. sslmode 옵션을 verify-full로 사용하고 연결 문자열의 sslrootcert 옵션에 인증서를 제공하는 것이 좋습니다.

최신 CA 인증서를 다운로드하려면 SSL/TLS를 사용하여 DB 클러스터에 대한 연결 암호화를 참조하세요.

잘못된 IAM 엔터티

인증 토큰이 올바른 IAM 역할에 의해 생성되고 있는지 확인합니다. 현재 IAM 사용자가 수임한 역할을 확인하려면 다음 명령을 실행합니다.

aws sts get-caller-identity

수임한 역할이 올바르지 않은 경우 올바른 IAM 사용자/역할로 전환하거나 올바른 역할을 수임할 수 있습니다. 올바른 IAM 역할을 사용하여 인증 토큰을 생성하고 있는지 확인하세요.

여전히 "PAM authentication failed for your user"와 같은 오류를 수신하는 경우, AWS 계정이 AWS Organizations 조직에 속해 있는지 확인합니다. 계정이 조직의 일부인 경우 조직의 SCP에 rds-db:*를 추가합니다. 자세한 내용은 서비스 제어 정책의 생성, 업데이트 및 삭제를 참조하세요.

계정이 조직의 일부인 경우 rds-db 권한이 없는 IAM 사용자 계층 구조가 있는지 확인합니다. 자세한 내용은 AWS Organization의 여러 계정에서 서비스 제어 정책을 사용해 권한 가드레일을 설정하는 방법을 참조하세요.

IAM 엔터티에 권한 경계를 사용하는 경우 IAM 사용자/역할에 rds-db:connect 작업이 허용되는지 확인합니다. 권한 경계에 대한 자세한 내용은 IAM 엔터티의 권한 경계를 참조하세요. 사용자의 권한 경계를 수정하려면 사용자의사용자의 권한 경계 변경을 참조하세요.


AWS 공식
AWS 공식업데이트됨 2년 전