はじめに
このラボでは、PostgreSQL のロールと権限管理について学習します。主な目的は、特定の属性を持つロールを作成し、データベース権限を管理する方法を学ぶことです。
まず、NOLOGIN 属性を持つ reporting_role という名前のロールを作成し、データベースへの直接接続を防ぎます。次に、ロールの作成を確認します。その後のステップでは、データベース権限の付与とテスト、ユーザーの切り替えによるアクセス確認、ロールからの権限の取り消しについて説明します。
ロールの作成
このステップでは、PostgreSQL でロールを作成する方法を学びます。ロールは、データベースへのアクセスと権限を管理するために使用されます。
PostgreSQL サーバーへの接続:
ターミナルを開き、
psqlコマンドラインツールを使用してpostgresユーザーとして PostgreSQL サーバーに接続します。sudo -u postgres psql以下のようなプロンプトが表示されるはずです。
postgres=#reporting_roleロールの作成:次に、
CREATE ROLEコマンドを使用してreporting_roleを作成します。NOLOGIN属性を指定します。これは、このロールがデータベースに直接接続するために使用できないことを意味します。他のロールやユーザーに権限を付与するためだけにのみ使用されます。CREATE ROLE reporting_role NOLOGIN;このコマンドはロールを作成します。以下のような出力が表示されるはずです。
CREATE ROLEロール作成の確認:
ロールが作成されたことを確認するには、
\duコマンド(\list usersの略)を使用できます。このコマンドは、データベース内のすべてのロールを一覧表示します。\duロールの一覧に
reporting_roleが表示されるはずです。出力は以下のようになります。List of roles Role name | Attributes | Member of ----------------+------------------------------------------------------------+----------- labex | Superuser | {} postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} reporting_role | Cannot login | {}psql シェルを終了します。
\q
データベース権限の付与
このステップでは、ロールにデータベース権限を付与する方法を学びます。前のステップで作成した reporting_role を基盤とします。
PostgreSQL サーバーへの接続:
psqlコマンドラインツールを使用してpostgresユーザーとして PostgreSQL サーバーに接続します。sudo -u postgres psqlデータベースの作成:
reporting_roleがアクセスできるreporting_dbという名前のデータベースを作成しましょう。CREATE DATABASE reporting_db;以下のような出力が表示されるはずです。
CREATE DATABASEreporting_dbデータベースへの接続:新しく作成したデータベースに接続します。
\c reporting_dbプロンプトが
reporting_db=#に変わるはずです。テーブルの作成:
reporting_dbデータベース内にsales_dataという名前の簡単なテーブルを作成しましょう。CREATE TABLE sales_data ( id SERIAL PRIMARY KEY, product VARCHAR(255), amount DECIMAL );以下のような出力が表示されるはずです。
CREATE TABLEsales_dataテーブルに対するSELECT権限をreporting_roleに付与:次に、
sales_dataテーブルに対するSELECT権限をreporting_roleに付与します。これにより、reporting_roleのメンバーであるロールまたはユーザーは、sales_dataテーブルからデータを読み取ることができるようになります。GRANT SELECT ON sales_data TO reporting_role;以下のような出力が表示されるはずです。
GRANTpsql シェルを終了します。
\q
ユーザー作成と権限テスト
このステップでは、ユーザーを作成し、権限をテストするために reporting_role へのメンバーシップを付与します。
PostgreSQL サーバーへの接続:
psqlコマンドラインツールを使用してpostgresユーザーとして PostgreSQL サーバーに接続します。sudo -u postgres psqlreporting_dbデータベースへの接続:reporting_dbデータベースに接続します。\c reporting_dbユーザーの作成と
reporting_roleへのメンバーシップ付与:新しいユーザー
report_userを作成しましょう。次に、このユーザーにreporting_roleへのメンバーシップを付与します。これは、report_userがreporting_roleに付与された権限を継承することを意味します。CREATE USER report_user; GRANT reporting_role TO report_user;以下のような出力が表示されるはずです。
CREATE ROLE GRANT ROLEパスワードなし認証のための PostgreSQL の設定:
デフォルトでは、PostgreSQL は
peer認証を使用しており、この実験では接続の問題を引き起こす可能性があります。report_userのアクセスを簡素化するために、trustに変更します。まず、
psqlシェルを終了します。\q次に、
pg_hba.confファイルを変更して認証方法を変更します。以下のsedコマンドは、元のファイルをpg_hba.conf.bakとしてバックアップし、ローカル接続に対してpeerをtrustに置き換えます。sudo sed -i.bak 's/^local\s\+all\s\+all\s\+peer/local all all trust/' /etc/postgresql/14/main/pg_hba.conf変更を適用するために PostgreSQL をリロードします。
sudo service postgresql reloadsales_dataテーブルへのデータの挿入:postgresユーザーとしてデータベースに再度接続します。sudo -u postgres psql -d reporting_dbテスト目的で、
sales_dataテーブルにサンプルデータを挿入します。INSERT INTO sales_data (product, amount) VALUES ('Laptop', 1200.00), ('Mouse', 25.00), ('Keyboard', 75.00);以下のような出力が表示されるはずです。
INSERT 0 3psql シェルを終了します。
\qreport_userとしてreporting_dbデータベースに接続:新しいターミナルウィンドウを開き、以下のコマンドを使用します。
psql -d reporting_db -U report_userパスワードの入力を求められることなく、
report_userとしてデータベースに接続されます。権限のテスト:
次に、
sales_dataテーブルからデータを選択してみましょう。SELECT * FROM sales_data;挿入したデータが表示されるはずです。
id | product | amount ----+----------+-------- 1 | Laptop | 1200.00 2 | Mouse | 25.00 3 | Keyboard | 75.00 (3 rows)この出力が表示された場合、
report_userがsales_dataテーブルに対するSELECT権限を持っていることを意味します。この権限はreporting_roleを通じて付与されました。psql シェルを終了します。
\q
権限の取り消し
このステップでは、reporting_role から SELECT 権限を取り消し、report_user が sales_data テーブルにアクセスできなくなったことを確認します。
postgresユーザーとして PostgreSQL サーバーに接続:postgresユーザーとして接続しているターミナルに戻ります。psqlコマンドラインツールを使用してpostgresユーザーとして PostgreSQL サーバーに接続します。sudo -u postgres psqlreporting_dbデータベースへの接続:reporting_dbデータベースに接続します。\c reporting_dbreporting_roleから SELECT 権限を取り消し:次に、
reporting_roleからsales_dataテーブルに対するSELECT権限を取り消します。REVOKE SELECT ON sales_data FROM reporting_role;以下のような出力が表示されるはずです。
REVOKEpsql シェルを終了します。
\qreport_userとしてreporting_dbデータベースに接続:report_userとして接続しているターミナルに戻ります。psql -d reporting_db -U report_userreport_userとしてアクセス拒否を確認:report_userとして、sales_dataテーブルのデータへのアクセスがなくなったことを確認するために、再度SELECTクエリを実行します。SELECT * FROM sales_data;以下のようなエラーメッセージが表示されるはずです。
ERROR: permission denied for table sales_dataこれにより、
report_userがreporting_roleから権限が取り消されたため、sales_dataテーブルに対するSELECT権限を失ったことが確認できます。psql シェルを終了します。
\q
まとめ
この実験では、PostgreSQL におけるロールの作成、権限の付与、ユーザーの作成、ユーザーへのロールの割り当て、および権限の取り消し方法について学びました。これらは、データベースのセキュリティとアクセス制御を管理するための基本的な概念です。


