はじめて作ったIAMユーザーでRDSに接続してみる
AWSでアカウントを作るとルートユーザーができますが、このルートユーザーを日頃使わないようにするためにIAMユーザーを作成します。
参考 : AWS アカウントのルートユーザー - AWS Identity and Access Management
IAMユーザーを作成する
- AWSのコンソールにログイン > [IAM] > ユーザー > [ユーザーを追加する]ボタン押下
- 以下を入力 > [次のステップ...]
- [ユーザー名] : ログイン時に[サインイン名]として使いたい文字
- [AWS 認証情報タイプを選択] : 「アクセスキー...」「パスワード...」両方にチェック
- それぞれの意味は以下の「4.」を参照
- [コンソールのパスワード][パスワードのリセットが必要] : 初期値のまま
- [既存のポリシーを直接アタッチ] > [AdministratorAccess]をチェック > [次のステップ...]
- [タグの追加 (オプション)]画面では何も設定しない > [次のステップ...]
- [.csvのダウンロード]ボタンでSecret access keyなどが記載されたCSVファイルをダウンロードする > [閉じる]ボタンでIAMユーザー一覧へ戻る
作ったユーザーを確認する
AWS Management Consoleにログインする
ユーザー作成時に[AWS 認証情報タイプを選択]で「パスワード...」にチェックを入れていないとログインはできません。
- ダウンロードしたCSVファイルの[Console login link]にあるURLを表示する
- ダウンロードしたCSVファイルの[User name]と[Password]でログインする
- パスワード変更画面が表示されるので新しいパスワードを設定する
多要素認証を設定する
作成したIAMユーザーを安全に使えるように多要素認証(Multi-Factor Authentication : MFA)を設定します。 今回は、仮想MFAを使います。
- AWS Management Console > IAM コンソール > [ユーザー] > 作成したユーザー名のリンクを押下
- [認証情報]タブ > [MFAデバイスの割り当て]にある[管理]リンク押下
- [仮想 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
- mysqlコマンドを使って、マスターユーザー(RDS作成時に作成したユーザー)でRDSに接続します。
- 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
- (インストールされていなかったら)AWS CLIをインストールする
- 一時IAM認証トークンの生成します。
- 生成されたトークン文字列に「X-Amz-Expires=900」とあるのが気になった・・・有効時間は「900秒=15分」だそうです。
- IAM認証でRDS PostgreSQLに接続してみた | DevelopersIO
- mysqlコマンドでの接続します。
- 毎回、トークン生成して超長い文字列を指定するのは大変なのでよく使う場合は何か考えたほうがよさそうです。
# 一時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>