Redshift IAM認証でのユーザーの自動作成を試してみる

2022.07.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

以前RedshiftのIAM認証を使用したデータベース接続の検証を行う記事を書きました。その時に行ったのは予めRedshiftでユーザーを作成し接続する際にそのユーザーを使うという方法でしたが、接続オプションにはRedshiftユーザーを自動作成するものがあるので今回はそちらを試してみたのでまとめます。

Redshiftのユーザー自動作成

Redshiftのユーザーを自動作成とはReshift上に予めユーザーを作成していない状態でもJDBC URLにAutoCreateオプションを付けることで自動的にReshiftユーザーを作成してそのユーザー情報を使ってRedshiftへの接続を行える機能です。Redshiftユーザーを自動作成するのでそのままではPUBLICグループになってしまうため先にRedshift上でグループを作成しそのグループに自動作成ユーザーを所属させるようにします。

Redshiftのユーザー自動作成を行うには以下の様に進めます。

  1. Redshiftで自動作成のユーザーを所属させるグループを作成する
  2. IAMユーザーのポリシーをユーザー自動作成用に修正する
  3. JDBC URLをユーザー自動作成用のものに書き換える

では早速設定を行っていきます。

Redshift上でグループを作成

はじめにユーザーの自動作成では接続をする際にグループを指定しないとPUBLICだけに所属することになるのでこのままではあまり使えません。したがって先にRedshiftでグループを作成しておき、そのグループに新ユーザーを追加するようすることで柔軟に権限管理を行えます。

今回はstg_readonlyグループを作成しstgスキーマに対してselectだけの権限を付けて、新ユーザーにstg_readonlyグループを所属させます。

-- グループの作成
CREATE GROUP stg_readonly;

-- SCHEMA利用権限付与
GRANT USAGE ON SCHEMA stg TO GROUP stg_readonly;

-- table参照権限付与
GRANT SELECT ON ALL TABLES IN SCHEMA stg TO GROUP stg_readonly;
ALTER default privileges IN SCHEMA stg GRANT SELECT ON tables TO GROUP stg_readonly;

Redshiftユーザー自動作成用のIAMポリシーの修正

次にRedshiftへのIAM認証接続を行うIAMユーザーにアタッチするポリシーを修正する必要があります。具体的にはRedshiftユーザーを作成するためのredshift:CreateClusterUserアクションと自動作成したユーザーをRedshiftのグループに所属させるためのredshift:JoinGroupアクションを許可する必要がります。これは公式ドキュメントにサンプルのポリシー( GetClusterCredentials を使用するポリシーの例 )があるのでこれを参考にします。

既存のRedshiftユーザーを使う場合のポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": [
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbuser:{クラスター識別子}/user1",
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbname:{クラスター識別子}/dev"
            ]
        }
    ]
}

上記が既存のRedshiftユーザーを使うポリシーでしたがこれを以下のように修正します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetClusterCredsStatement",
            "Effect": "Allow",
            "Action": [
                "redshift:GetClusterCredentials"
            ],
            "Resource": [
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbuser:{クラスター識別子}/user2",
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbname:{クラスター識別子}/dev",
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbgroup:{クラスター識別子}/stg_readonly"
            ]
        },
        {
            "Sid": "CreateClusterUserStatement",
            "Effect": "Allow",
            "Action": [
                "redshift:CreateClusterUser"
            ],
            "Resource": [
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbuser:{クラスター識別子}/user2"
            ]
        },
        {
            "Sid": "RedshiftJoinGroupStatement",
            "Effect": "Allow",
            "Action": [
                "redshift:JoinGroup"
            ],
            "Resource": [
                "arn:aws:redshift:{リージョン}:{アカウントID}:dbgroup:{クラスター識別子}/stg_readonly"
            ]
        }
    ]
}

修正箇所としては以下になります。

JDBC URLをユーザー自動作成用のものに修正

Redshiftグループの作成と接続ユーザー用のポリシーが作成できたので接続を行います。接続する際にはJDBC URLにオプションを付ける必要があります。 認証情報については前回同様に.aws/credentialsに登録されたプロファイルを使って接続を行いますが、それに加えてRedshiftのユーザーを自動作成するAutoCreateと作成したユーザーを所属させるグループを指定するDbGroupsを使用して以下のようなJDBC URLを作成します。

jdbc:redshift:iam://{クラスター識別子}:{リージョン}:5439/dev?Profile=cm_rs_iam&DbUser=user2&DbGroups=stg_readonly&AutoCreate=true

ここまでできたら後は前回同様DBeaverなりクライアントツールにて作成したJDBC URLを設定すればRedshiftのユーザーを新規作成した上でRedshiftに接続することができます。ちなみにRedshiftで自動作成されたユーザーはIAM:ユーザー名という形でIAM認証で自動作成されたユーザーだと一目できる形式になっています。

今回の例では作成したRedshiftユーザーはstg_readonlyグループのみに所属させていますが、複数グループに所属させたい場合はIAMポリシーのリソースで複数グループを指定するのとJDBC URLのDbGroupsにカンマ区切りで複数グループを指定すること可能になります。

データベースユーザー認証情報を作成するための JDBC および ODBC のオプション - Amazon Redshift

まとめ

IAM認証を使用したRedshiftデータベースへの接続でユーザーの自動作成を行いました。IAMユーザーにRedshiftへの接続を行わせたい場合に都度Redshift上にて手作業でユーザーを作る必要はなくIAMポリシーの設定のみでユーザーを管理できるのはとても便利だと感じました。

最後まで読んで頂いてありがとうございました。