1. 導入
データベースのセキュリティ運用において、ユーザー(ロール)の権限管理は非常に重要です。システム要件の変化に応じて、既存のユーザーに「データベース作成権限を付与したい」「同時接続数を制限したい」「パスワードを変更させたい」といったニーズが発生します。PostgreSQLにおいて、これらを適切に管理するために不可欠なのが ALTER ROLE コマンドです。本記事では、実務で安全にロール属性を変更するための手順と注意点を解説します。
2. 基礎知識
PostgreSQLにおける「ロール」とは、ユーザーやグループを包括的に扱う概念です。
ALTER ROLE を使用することで、ロール作成時に定義した属性(ログイン可否、スーパーユーザー権限、接続制限など)を、ロールを削除・再作成することなく動的に変更できます。
重要な権限の考え方として、以下の3点を押さえてください。
・スーパーユーザーは、すべてのロールの全属性を変更可能です。
・CREATEROLE権限を持つロールは、自身より権限が低いロールの属性を変更可能です。
・一般ロールは、自分自身のパスワード変更のみが許可されています。
3. 実装/解決策
ロールの属性変更は ALTER ROLE [ロール名] WITH [オプション] の形式で行います。複数の属性を同時に変更することも可能です。
現場でよくあるシナリオとして、「開発環境で一時的に権限を付与し、作業後に権限を剥奪する」といった運用が挙げられます。変更時は、現在の状態を必ず \du [ロール名] コマンドで確認し、意図しない権限付与になっていないか確認する癖をつけましょう。
4. サンプルプログラム
以下は、実務で頻出する属性変更のコード例です。SQLコンソール等で実行可能です。
— 1. 特定ロールに対して同時接続数を制限し、ログイン権限を付与する
ALTER ROLE app_user WITH CONNECTION LIMIT 5 LOGIN;
— 2. 既存のロールからデータベース作成権限を剥奪し、パスワードを更新する
— 実務ではパスワードはシングルクォートで囲み、平文管理には注意が必要です
ALTER ROLE app_user WITH NOCREATEDB PASSWORD ‘NewSecurePassword123!’;
— 3. 現在のセッションユーザー自身がパスワードを変更する場合
— ユーザー名を直接指定せず SESSION_USER を使用することで汎用性が高まります
ALTER ROLE SESSION_USER WITH PASSWORD ‘MySecretPassword’;
— 4. 属性変更後の確認コマンド
— 変更が正しく反映されたかを確認するために必ず実行してください
\du app_user
5. 応用・注意点
現場でトラブルを避けるための重要なポイントをまとめます。
・最小権限の原則を守る
属性を変更する際は、必要最小限の権限のみを付与してください。特に SUPERUSER や CREATEROLE の付与は、セキュリティリスクを大幅に高めるため、慎重に判断してください。
・権限不足エラーの理解
一般ユーザーが他者の権限を変更しようとすると ERROR: 権限がありません と表示されます。自動化スクリプト等でエラーが出た場合は、実行しているユーザーの権限レベルを確認してください。
・パスワードの有効期限管理
VALID UNTIL オプションを使用すると、パスワードに有効期限を設定できます。退職者や期間限定アカウントのセキュリティ管理に非常に有効ですので、あわせて活用することをお勧めします。
適切な ALTER ROLE の活用は、セキュアで柔軟なデータベース運用の第一歩です。ぜひ本番環境の設定を見直す際の参考にしてください。

コメント