使用 IAM 身分驗證嘗試連線至 Amazon RDS for MySQL 時,遇到存取遭拒的錯誤

上次更新日期︰2021 年 8 月 20 日

我正在嘗試使用 AWS Identity Access Management (IAM) 身分驗證連線至我的 MySQL 執行個體的 Amazon Relational Database Service (Amazon RDS)。但一直收到「存取遭拒」錯誤:

錯誤 1045 (28000)︰使用者 'root'@'10.0.4.253' 存取遭拒 (使用密碼︰是)

如何對此問題進行疑難排解?

簡短描述

如果您無法使用 IAM 身分驗證連線至 Amazon RDS for MySQL 或 Aurora 資料庫執行個體,請檢查以下原因:

  • 已停用 IAM 身分驗證
  • IAM 角色許可不足
  • 資料庫使用者設定不正確
  • 連線字串不正確

解決方案

已停用 IAM 身分驗證

依預設,IAM 身分驗證已停用。請檢閱 Amazon RDS for MySQL 叢集的組態設定,並確定已啟用 IAM 身分驗證。在 Amazon RDS 主控台中,您可以選擇 Database Authentication (資料庫身分驗證) 來修改執行個體。然後,選擇 Password and IAM database authentication (密碼和 IAM 資料庫身分驗證),並選擇 Continue (繼續) 以更新您的組態設定。

注意:如果您在更新叢集組態設定時選擇 Apply Immediately (立即套用),則會立即 (而非在維護期間) 套用所有擱置中修改。此動作可能會導致 Amazon RDS for MySQL 執行個體的延期中斷。如需詳細資訊,請參閱使用「立即套用」設定

IAM 角色許可不足

若要使用 IAM 資料庫身分驗證成功連線至您的 Amazon RDS for MySQL 執行個體,必須具有 rds-db:connect 動作的存取權。rds-db:connect 動作允許連線至資料庫執行個體。

例如:

{
    "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"
        ]
    }]
}

注意:用與 IAM 身分驗證關聯的資料庫帳戶使用者取代 db-user-name

此外,請確定您使用正確的資源 ID (而非僅指定 ARN)。若要尋找資料庫執行個體的資源 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 身分驗證無法運作。因此,在嘗試連線至資料庫時,您會收到存取遭拒錯誤。

此外,由於身分驗證字符包含多個字元 (在命令列上可能會變得笨拙),因此,請將字符儲存至環境變數。然後,在連線至 MySQL 資料庫執行個體時使用該變數。例如:

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=jane_doe --password=$TOKEN

如需有關如何使用環境變數連線至 MySQL 資料庫執行個體的詳細資訊,請參閱連線至資料庫執行個體