はじめて作ったIAMユーザーでRDSに接続してみる

AWSでアカウントを作るとルートユーザーができますが、このルートユーザーを日頃使わないようにするためにIAMユーザーを作成します。

参考 : AWS アカウントのルートユーザー - AWS Identity and Access Management

IAMユーザーを作成する

  1. AWSのコンソールにログイン > [IAM] > ユーザー > [ユーザーを追加する]ボタン押下
  2. 以下を入力 > [次のステップ...]
    1. [ユーザー名] : ログイン時に[サインイン名]として使いたい文字
    2. [AWS 認証情報タイプを選択] : 「アクセスキー...」「パスワード...」両方にチェック
      1. それぞれの意味は以下の「4.」を参照
        1. AWS アカウントでの IAM ユーザーの作成 - AWS Identity and Access Management
    3. [コンソールのパスワード][パスワードのリセットが必要] : 初期値のまま
    4. [既存のポリシーを直接アタッチ] > [AdministratorAccess]をチェック > [次のステップ...]
      1. 権限の設定は自己責任でやりましょう
    5. [タグの追加 (オプション)]画面では何も設定しない > [次のステップ...]
    6. [確認]画面で内容を確認 > [ユーザーの作成]ボタンを押下してユーザーを作成する
    7. [.csvのダウンロード]ボタンでSecret access keyなどが記載されたCSVファイルをダウンロードする > [閉じる]ボタンでIAMユーザー一覧へ戻る
      1. ダウンロードしたCSVファイルは誰にも見せずにとっても大切に管理しましょう

作ったユーザーを確認する

  1. 作ったユーザーを確認するために一旦AWSからサインアウトします。
  2. ダウンロードしたCSVファイルを開く

AWS Management Consoleにログインする

ユーザー作成時に[AWS 認証情報タイプを選択]で「パスワード...」にチェックを入れていないとログインはできません。

  1. ダウンロードしたCSVファイルの[Console login link]にあるURLを表示する
  2. ダウンロードしたCSVファイルの[User name]と[Password]でログインする
  3. パスワード変更画面が表示されるので新しいパスワードを設定する
    AWS Management Consoleが表示されたらOK

多要素認証を設定する

作成したIAMユーザーを安全に使えるように多要素認証(Multi-Factor Authentication : MFA)を設定します。 今回は、仮想MFAを使います。

  1. AWS Management Console > IAM コンソール > [ユーザー] > 作成したユーザー名のリンクを押下
  2. [認証情報]タブ > [MFAデバイスの割り当て]にある[管理]リンク押下
  3. [仮想 MFA デバイス]を選択 > [続行] > スマホGoogle認証システムアプリなどでQRコードを読み取って登録

RDSに接続してみる

さっそく作ったIAMユーザーを使ってみます。今回は、IAM認証を使ってRDSに接続してみます。

RDSを作成する

RDSでMySQLを作ります。 ポイントは、IAMユーザーで接続できるように[データベース認証]に「パスワードと IAM データベース認証」を設定することです。 ponsuke-tarou.hatenablog.com

「IAM データベース認証」が有効になっているかは、「RDS > データベース > {DB インスタンス識別子}リンク > [設定]タブ > IAM DB 認証」とたどっていくと確認できます。

もし、「無効」になっていたら[変更]ボタンから変更できます。

データベースにIAMユーザー用のアカウントを作成する

参考 : IAM 認証を使用したデータベースアカウントの作成 - Amazon Relational Database Service

  1. mysqlコマンドを使って、マスターユーザー(RDS作成時に作成したユーザー)でRDSに接続します。
  2. IAMユーザー用のアカウントを作成します。
    • AWSAuthenticationPlugin : IAMユーザーの認証をしてくれるプラグイン
    • AS 'RDS' : 認証方式を指定
# マスターユーザーでRDSに接続
$ mysql -h {DB インスタンス識別子}...{リージョン}.rds.amazonaws.com -P 3306 -u {マスターユーザー} -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 8.0.28 Source distribution

# IAMユーザー用のアカウント「iam_ponsuke」を作成
mysql> CREATE USER iam_ponsuke IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
Query OK, 0 rows affected (0.31 sec)

# 作成されたアカウントを確認
mysql> select host,user,plugin,password_expired,account_locked from mysql.user;
+-----------+------------------+-------------------------+------------------+----------------+
| host      | user             | plugin                  | password_expired | account_locked |
+-----------+------------------+-------------------------+------------------+----------------+
| %         | {マスターユーザー}  | mysql_native_password   | N                | N              |
| %         | iam_ponsuke      | AWSAuthenticationPlugin | N                | N              |
| localhost | mysql.infoschema | caching_sha2_password   | N                | Y              |
| localhost | mysql.session    | caching_sha2_password   | N                | Y              |
| localhost | mysql.sys        | caching_sha2_password   | N                | Y              |
| localhost | rdsadmin         | mysql_native_password   | N                | N              |
+-----------+------------------+-------------------------+------------------+----------------+

一時IAM認証トークンを使ってmysqlコマンドでRDSに接続する

参考 : コマンドラインから IAM 認証を使用して、DB インスタンスに接続する: AWS CLI および mysql クライアント - Amazon Relational Database Service

  1. (インストールされていなかったら)AWS CLIをインストールする
  2. 一時IAM認証トークンの生成します。
    1. 生成されたトークン文字列に「X-Amz-Expires=900」とあるのが気になった・・・有効時間は「900秒=15分」だそうです。
    2. IAM認証でRDS PostgreSQLに接続してみた | DevelopersIO
  3. mysqlコマンドでの接続します。
    1. 毎回、トークン生成して超長い文字列を指定するのは大変なのでよく使う場合は何か考えたほうがよさそうです。
# 一時IAM認証トークンの生成
$ aws rds generate-db-auth-token --hostname {DB インスタンス識別子}...{リージョン}.rds.amazonaws.com --port 3306 --region us-east-2 --username {IAMユーザー用のアカウント}
{DB インスタンス識別子}...{リージョン}.rds.amazonaws.com:3306/?Action=connect&DBUser={IAMユーザー用のアカウント}&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAZT5ALBP3CG7P753L%2F20220826%2Fus-east-2%2Frds-db%2Faws4_request&X-Amz-Date=20220826T072830Z&X-Amz-Expires=900&X-Amz-SignedHeaders=ho....

# mysqlコマンドでの接続
$ mysql --host={DB インスタンス識別子}...{リージョン}.rds.amazonaws.com --port=3306 --enable-cleartext-plugin --user={IAMユーザー用のアカウント} --password="{一時IAM認証トークン}"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>