Amazon Relational Database Service(Amazon RDS) for PostgreSQL 인스턴스 또는 Amazon Aurora PostgreSQL 호환 버전 클러스터에 연결하려고 합니다. AWS Identity Access Management(IAM) 인증을 사용하여 연결할 때 "PAM authentication failed for user" 오류가 발생합니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
IAM 인증이 비활성화됨
기본적으로 IAM 인증은 비활성화되어 있습니다. PostgreSQL 인스턴스 또는 Aurora PostgreSQL 호환 클러스터용 RDS에 대한 IAM 인증을 활성화하십시오.
IAM 정책에 rds-db:connect 작업이 포함되지 않음
IAM 데이터베이스 인증을 사용하여 DB 인스턴스에 연결하려면 rds-db:connect 작업을 포함하도록 정책을 업데이트하십시오.
정책 예시:
{
"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"
]
}
]
}
참고: 정책에 올바른 리소스 ID와 ARN을 사용해야 합니다. DB 인스턴스의 리소스 ID를 찾으려면 Amazon RDS 콘솔에서 DB 인스턴스 또는 클러스터를 선택한 다음 구성 탭을 선택합니다.
자세한 내용은 IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용을 참조하세요.
참고: IAM 인증은 정책 문의 조건 요소에서 서비스별 또는 글로벌 조건 컨텍스트 키를 지원하지 않습니다.
rds_iam 역할이 데이터베이스 사용자와 연결되지 않음
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
) AS 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;
연결이 올바르지 않음
인증 토큰에는 명령줄에서 사용하기 어려울 수 있는 여러 문자가 포함되어 있습니다. 대신 인증 토큰을 환경 변수에 저장하십시오. 이후 Aurora PostgreSQL 클러스터에 연결할 때 환경 변수를 사용하십시오.
환경 변수를 사용한 인증 토큰 생성의 예시:
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"
클라이언트가 SSL/TLS 연결 없이 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/TLS 연결이 필요합니다. DB 인스턴스와 주고받는 모든 데이터는 암호화되기 때문입니다. 위의 오류를 방지하려면 SSL/TLS 연결을 사용해야 합니다. sslmode 옵션을 verify-full로 사용하고 연결 문자열의 sslrootcert 옵션에 인증서를 제공하는 것이 모범 사례입니다.
최신 CA(인증 기관) 인증서를 다운로드하려면 SSL/TLS를 사용하여 DB 클러스터에 대한 연결 암호화를 참조하십시오.
올바르지 않은 IAM 역할을 사용함
인증 토큰을 생성할 때 잘못된 IAM 역할을 사용하는 경우 오류 메시지가 표시될 수 있습니다. 현재 IAM 사용자가 수임한 역할을 확인하려면 get-caller-identity 명령을 실행합니다.
aws sts get-caller-identity
수임한 역할이 잘못된 경우 올바른 IAM 사용자로 전환하거나 올바른 역할을 맡으십시오.
여전히 오류 메시지가 표시되면 AWS 계정이 AWS Organizations 조직에 속하는지 확인하십시오. 계정이 조직의 일부인 경우 **rds-db:**를 허용하는 SCP(서비스 제어 정책)를 생성하십시오. 자세한 내용은 SCP가 권한에 미치는 영향을 참조하십시오.
또한 rds-db 권한이 없는 IAM 사용자 계층 구조가 있는지 확인합니다. 자세한 내용은 서비스 제어 정책을 사용하여 AWS 조직의 계정 간에 권한 가드레일을 설정하는 방법을 참조하십시오.
IAM 엔티티에 대한 권한 경계를 사용하는 경우 IAM 사용자 또는 역할에 rds-db:connect 작업을 허용하십시오. 사용자의 권한 경계를 수정하려면 사용자의 권한 경계 변경을 참조하십시오.