IAM 認証を使用して Amazon RDS for MySQL に接続しようとすると、アクセス拒否エラーが発生するのはなぜですか?

所要時間2分
0

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 コンソールから、[データベース認証] を選択してインスタンスを変更できます。次に、[パスワードと IAM データベース認証] を選択し、[続行] をクリックして設定を更新します。

注: クラスター設定の更新時に [すぐに適用] を選択すると、保留中のすべての変更が (メンテナンス期間中ではなく) ただちに適用されます。このアクションにより、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-username は、IAM 認証に関連付けられているデータベースアカウントユーザーに置き換えます。

さらに、ARN を指定するだけではなく、正しいリソース ID を使用していることを確認してください。DB インスタンスのリソース ID を見つけるには、AWS マネジメントコンソールで [リソース] タブを選択します。次に、[設定] タブを選択して、リソース ID を表示します。

IAM ポリシーの例にリストされている要素の詳細については、「IAM データベースのアクセス用の IAM ポリシーの作成と使用」を参照してください。

データベースユーザーの設定が不適切

Amazon RDS for MySQL では、IAM 認証は AWSAuthenticationPlugin によって処理されます。したがって、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 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 インスタンスへの接続」を参照してください。


関連情報

IAM 認証情報を使用して Amazon RDS MySQL DB インスタンスに対する認証をユーザーに許可する方法を教えてください。

IAM データベース認証

MySQL および PostgreSQL の IAM データベース認証

コメントはありません

関連するコンテンツ