PostgreSQL のユーザーとロールについて

ここでは、Cloud SQL での PostgreSQL ユーザーとロールの操作方法について説明します。PostgreSQL のロールを使用すると、PostgreSQL インスタンスにアクセスするユーザーのアクセス権と機能を制御できます。

PostgreSQL のロールの詳細については、PostgreSQL ドキュメントのデータベース ロールをご覧ください。Cloud SQL ユーザーの作成と管理について詳しくは、ユーザーを作成して管理するをご覧ください。

ユーザーとロールの違い

PostgreSQL のロールは、単一のロールにすることも、複数のロールのグループとして機能させることもできます。ユーザーとは、ログインする機能を持つロールです(ロールが LOGIN 属性を持つ)。Cloud SQL で作成されるすべてのロールは LOGIN 属性を持つため、Cloud SQL ではロールとユーザーという言葉が同じ意味で使用されます。ただし、psql クライアントでロールを作成する場合、そのロールは必ずしも LOGIN 属性を持つわけではありません。

すべての PostgreSQL ユーザーにはパスワードが必要です。パスワードを持たないユーザーでのログインはできません。

スーパーユーザーの制限

Cloud SQL for PostgreSQL はマネージド サービスであるため、高度な権限が必要な特定のシステム プロシージャやテーブルへのアクセスを制限します。Cloud SQL では、スーパーユーザー属性を持つユーザーの作成、またそのようなユーザーへのアクセスはできません。

スーパーユーザー権限を持つデータベース ユーザーは作成できません。ただし、cloudsqlsuperuser ロールを持つデータベース ユーザーは作成できます。このロールには、次のようなスーパーユーザー権限があります。

  • スーパーユーザー権限が必要な拡張機能の作成
  • イベント トリガーの作成
  • レプリケーション ユーザーの作成
  • レプリケーション パブリケーションとサブスクリプションの作成
  • pg_largeobject カタログ テーブルに対する完全アクセス権

デフォルトの PostgreSQL ユーザー

新しい Cloud SQL for PostgreSQL インスタンスを作成すると、デフォルトの管理ユーザー postgres が作成されますが、パスワードは作成されません。ログインするには、このユーザーのパスワードを設定する必要があります。設定するには、Google Cloud Console または次の gcloud コマンドを使用します。

gcloud sql users set-password postgres \
--instance=INSTANCE_NAME \
--password=PASSWORD

postgres ユーザーは cloudsqlsuperuser ロールに含まれ、CREATEROLECREATEDBLOGIN 属性(特権)を持っています。SUPERUSER または REPLICATION 属性は持っていません。

デフォルトの cloudsqlimportexport ユーザーは、CSV のインポート / エクスポート オペレーションに必要な最小限の権限で作成されます。これらのオペレーションを実行する独自のユーザーを作成することもできますが、作成しない場合は、デフォルトの cloudsqlimportexport ユーザーが使用されます。cloudsqlimportexport ユーザーはシステム ユーザーであり、ユーザーが直接使用することはできません。

IAM データベース認証のための Cloud SQL IAM ユーザー

IAM は、IAM データベース認証と呼ばれる機能で Cloud SQL と統合されています。この機能を使用してインスタンスを作成すると、IAM ユーザーはその IAM ユーザー名とパスワードを使用してインスタンスにログインできます。IAM データベース認証を使用する利点は、データベースへのアクセスを許可する際に、ユーザーの既存の IAM 認証情報を使用できることです。ユーザーが組織を離れた場合、ユーザーの IAM アカウントは一時停止され、自動的にアクセス権が削除されます。IAM データベース認証について詳しくは、Cloud SQL IAM データベース認証をご覧ください。

その他の PostgreSQL ユーザー

その他の PostgreSQL ユーザーを作成、またはその他の PostgreSQL ロールを作成できます。Cloud SQL を使用して作成されるユーザーはすべて、作成時に cloudsqlsuperuser 役割が設定され、postgres ユーザーと同じ属性セット(CREATEROLECREATEDBLOGIN)が設定されます。ALTER ROLE コマンドを使用すると、任意のユーザーの属性を変更できます。

psql クライアントで新しいユーザーを作成する場合、そのユーザーを別のロールに関連付けることや、別の属性を指定することができます。

pg_shadow ビューと pg_authid テーブルへのアクセス権

pg_shadow ビューを使用すると、pg_authid カタログ テーブルで rolcanlogin とマークされたロールのプロパティを操作できます。

pg_shadow ビューには、クラスタへのログインが許可されたロール(ユーザー)のハッシュされたパスワードと、その他のプロパティが含まれます。pg_authid カタログ テーブルには、すべてのデータベース ロールのハッシュされたパスワードとその他のプロパティが含まれています。

Cloud SQL では、デフォルトの権限を使用して pg_shadow ビューや pg_authid テーブルにアクセスすることはできません。ただし、次のような場合は、ロール名とハッシュされたパスワードへのアクセスが有用です。

  • 既存のユーザーとパスワードを使用してプロキシまたはロード バランシングを設定する
  • パスワードを変更せずにユーザーを移行する
  • パスワード ポリシー管理用のカスタム ソリューションを実装する

pg_shadow ビューと pg_authid テーブルのフラグの設定

pg_shadow ビューにアクセスするには、cloudsql.pg_shadow_select_role フラグを PostgreSQL ロール名に設定します。pg_authid テーブルにアクセスするには、cloudsql.pg_authid_select_role フラグを PostgreSQL ロール名に設定します。

cloudsql.pg_shadow_select_role が存在する場合は、pg_shadow ビューへの読み取り専用(SELECT)アクセス権が付与されています。cloudsql.pg_authid_select_role が存在する場合は、pg_authid テーブルに対する SELECT アクセス権が付与されています。

どちらのロールも存在しない場合、設定は無効となりますがエラーも発生しません。ただし、ユーザーがビューまたはテーブルにアクセスしようとすると、エラーがログに記録されます。このエラーは、PostgreSQL データベース ログ(cloudsql.googleapis.com/postgres.log)に記録されます。このログの表示の詳細については、インスタンスのログを表示するをご覧ください。

構成されたロールが存在し、cloudsql.pg_shadow_select_role フラグまたは cloudsql.pg_authid_select_role フラグの値に入力ミスがないことを確認します。また、pg_has_role 関数を使用して、ユーザーがロールのメンバーであることを確認することもできます。この関数の詳細については、システム情報関数と演算子のページをご覧ください。

PostgreSQL ロール メンバーシップcloudsql.pg_shadow_select_role フラグまたは cloudsql.pg_authid_select_role フラグを使用すると、複数のユーザーの pg_shadow アクセス権または pg_authid アクセス権を管理できます。

どちらのフラグを変更しても、データベースの再起動は必要ありません。

サポートされているフラグの詳細について詳しくは、データベース フラグを構成するをご覧ください。

パスワードの保存形式の選択

Cloud SQL for PostgreSQL は、ユーザーのパスワードをハッシュ形式で保存します。password_encryption フラグを使用して、暗号化アルゴリズムを md5 または scram-sha-256 に設定できます。md5 アルゴリズムには幅広い互換性があります。一方、scram-sha-256 はより安全ですが、古いクライアントとは互換性がない場合があります。

Cloud SQL インスタンスからロールのプロパティをエクスポートするために pg_shadow アクセスを有効にする場合は、クライアントでサポートされている最も安全なアルゴリズムの使用を検討してください。

PostgreSQL のドキュメントで、以下の内容をご覧ください。

次のステップ