IAM 인증을 사용하여 Amazon RDS for MySQL에 연결하려고 할 때 액세스 거부 오류가 발생하는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 12월 2일

AWS Identity Access Management(IAM) 인증을 사용하여 MySQL 인스턴스에 대한 Amazon Relational Database Service(Amazon RDS)에 연결하려고 합니다. 그러나 다음과 같은 ‘액세스 거부(Access Denied)’ 오류가 계속 발생합니다.

ERROR 1045 (28000): Access denied for user 'root'@'10.0.4.253' (using password: YES)

이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

IAM 인증을 사용하여 Amazon RDS for MySQL 또는 Aurora DB 인스턴스에 연결할 수 없는 경우 다음 이유를 확인합니다.

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

해결 방법

IAM 인증이 꺼짐

기본적으로 IAM 인증은 꺼져 있습니다. Amazon RDS for MySQL 클러스터에 대한 구성 설정을 검토하고 IAM 인증이 꺼져 있는지 확인합니다. Amazon RDS 콘솔에서 Database Authentication을 선택하여 인스턴스를 수정할 수 있습니다. 그런 다음 Password and IAM database authentication을 선택하고 Continue를 선택하여 구성 설정을 업데이트합니다.

참고: 클러스터 구성 설정을 업데이트할 때 Apply Immediately를 선택하면 유지 관리 기간이 아닌 보류 중인 모든 수정 사항이 즉시 적용됩니다. 이 작업을 수행하면 Amazon RDS for MySQL 인스턴스에 대한 중단이 연장될 수 있습니다. 자세한 내용은 즉시 적용 설정 사용을 참조하세요.

IAM 역할 권한 부족

IAM 데이터베이스 인증을 사용하여 Amazon RDS for MySQL 인스턴스에 성공적으로 연결하려면 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 or DbClusterResourceId)/db-user-name"
      ]
    }
  ]
}

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

또한 ARN만 지정하는 대신 올바른 리소스 ID를 사용하고 있는지 확인합니다. DB 인스턴스의 리소스 ID를 찾으려면 AWS 관리 콘솔에서 [리소스(Resource)] 탭을 선택합니다. 그런 다음 [구성(Configuration)] 탭을 선택하여 리소스 ID를 확인합니다.

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

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

Amazon RDS for MySQL를 사용하면 AWSAuthenticationPlugin에서 IAM 인증을 처리합니다. 따라서 IAM 인증을 사용하여 Amazon RDS for MySQL 인스턴스에 연결하려면 AWSAuthenticationPlugin을 사용해야 합니다. 이 플러그인이 IAM 역할과 연결되어 있는지 확인하려면 이 명령을 실행합니다.

select user,plugin,host from mysql.user where user like '%db-user-name%';

그러면 이와 유사한 출력이 나타납니다.

+------+-------------------------+------+
| user | plugin | host |
+------+-------------------------+------+
| root | AWSAuthenticationPlugin | % |
+------+-------------------------+------+
1 row in set (0.00 sec)

IAM 역할이 특정 호스트를 사용하도록 제한되어 있는 경우 올바른 호스트 이름을 사용하고 있는지 확인합니다. 또한 지정된 데이터베이스에 액세스할 수 있는 적절한 권한이 있는지 확인합니다.

사용자에게 부여된 권한을 보려면 이 명령 구문을 사용합니다.

show grants for <user>;

다른 사용자에게 권한을 부여하려면 이 명령 구문을 사용합니다.

grant select on <mydb>.<mytable> to <user>;

잘못된 연결 문자열

Amazon RDS for MySQL 데이터베이스에 연결할 때는 연결 문자열에 --enable-cleartext-plugin 옵션을 사용해야 합니다. --enable-cleartext-plugin 구문은 인증 토큰 역할을 하는 암호를 전달하는 데 사용됩니다.

예:

$ mysql -h <endpoint> -P 3306 --enable-cleartext-plugin --user=RDSConnect --password=$

--enable-cleartext-plugin 구문은 데이터베이스 연결에 AWSAuthenticationPlugin을 사용해야 함을 나타냅니다. 이 플러그인은 데이터베이스 사용자를 구성할 때 필요하며 IAM 인증 작동에도 필요합니다. AWSAuthenticationPlugin이 잘못 구성된 경우 IAM 인증이 작동하지 않습니다. 따라서 데이터베이스에 연결하려고 할 때 액세스 거부(Access Denied) 오류가 발생합니다.

또한 인증 토큰은 여러 문자(명령줄에서 다루기 힘들 수 있음)로 구성되므로 대신 환경 변수에 토큰을 저장합니다. 그런 다음 MySQL DB 인스턴스에 연결할 때 해당 변수를 사용합니다. 예:

RDSHOST="rdsmysql.123456789012.us-west-2.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username db-user-name)"
mysql --host=$RDSHOST --port=3306 --enable-cleartext-plugin --user=db-user-name --password=$TOKEN

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