監査は、データを可能な限り安全に保ち、データベースで何が起こっているかを知るための良い方法です。また、PCI-Payment Card Industryなど、多くのセキュリティ規制や標準にも必要です。これはPostgreSQLデータベースの例外ではありません。
PostgreSQLは、実績のあるアーキテクチャ、信頼性、データの整合性、堅牢な機能セット、拡張性、およびパフォーマンスと革新的なソリューションを一貫して提供するソフトウェアの背後にあるオープンソースコミュニティの献身的な取り組みで高い評価を得ています。
そうは言っても、PostgreSQLデータベースを監査するオプションであるはずですよね?ええと、答えはイエスです。このブログでは、pgAudit拡張機能とは何か、およびそれをPostgreSQLデータベースにインストールして使用する方法について説明します。
pgAuditとは何ですか?
PostgreSQL Audit Extension(pgAudit)は、標準のPostgreSQLログ機能を介して詳細なセッションおよびオブジェクト監査ログを提供します。
基本的なステートメントロギングは、log_statement=allを使用した標準のロギング機能によって提供できます。これは、監視やその他の基本的な使用法には受け入れられますが、監査に一般的に必要な詳細レベルは提供されません。データベースに対して実行されたすべての操作のリストを用意するだけでは不十分です。また、監査人が関心を持つ特定のステートメントを見つけることが可能でなければなりません。標準のロギング機能はユーザーが要求したものを表示しますが、pgAuditはデータベースが要求を満たしている間に何が起こったかの詳細に焦点を合わせます。
PostgreSQLにpgAuditをインストールする方法
この例では、CentOS7インストールを使用します。この時点では、PostgreSQLデータベースがインストールされていると想定しています。そうでない場合は、このブログ投稿に従って、ClusterControlを使用して簡単にデータベースを起動して実行できます。
これで、OSにPostgreSQLリポジトリが必要になります。次のようになります。
$ cat /etc/yum.repos.d/postgresql.repo
# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions
[pgdg-common]
name=PostgreSQL common for RHEL/CentOS $releasever - $basearch
baseurl=http://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
# PGDG Red Hat Enterprise Linux / CentOS stable repositories:
[pgdg]
name=PostgreSQL 12 $releasever - $basearch
#baseurl=http://yum.postgresql.org/12/redhat/rhel-$releasever-$basearch
baseurl=http://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch/
enabled=1
gpgcheck=0
[pgdg-source]
name=PostgreSQL 12 $releasever - $basearch - Source
baseurl=http://yum.postgresql.org/srpms/12/redhat/rhel-$releasever-$basearch
enabled=0
gpgcheck=0
利用可能なpgauditパッケージを確認する場合は、次のものが必要です。
pgaudit14_12.x86_64 : PostgreSQL Audit Extension
では、インストールしましょう:
$ yum install pgaudit14_12
次に、デフォルトで/var/lib/pgsql/12/data/postgresql.confにあるpostgresql.conf構成ファイルに追加し、PostgreSQLサービスを再起動して適用する必要があります。変更。
shared_preload_libraries = 'pgaudit, pg_stat_statements'
データベースサービスを再起動した後、拡張機能を作成する必要があります:
postgres=# CREATE EXTENSION pgaudit;
CREATE EXTENSION
And now, you can run the following query to check the new extension created:
postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';
name | default_version | installed_version | comment
---------+-----------------+-------------------+---------------------------------
pgaudit | 1.4.1 | 1.4.1 | provides auditing functionality
(1 row)
pgAudit構成
次のクエリを実行して、現在の構成を確認できます。
postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit%';
name | setting
----------------------------+---------
pgaudit.log | none
pgaudit.log_catalog | on
pgaudit.log_client | off
pgaudit.log_level | log
pgaudit.log_parameter | off
pgaudit.log_relation | off
pgaudit.log_statement_once | off
pgaudit.role |
(8 rows)
- pgaudit.log :セッション監査ログによってログに記録されるステートメントのクラスを指定します。デフォルトはnoneです。可能な値は次のとおりです。
- 読み取り:ソースがリレーションまたはクエリの場合は、SELECTとCOPYを実行します。
- 書き込み:宛先がリレーションの場合、INSERT、UPDATE、DELETE、TRUNCATE、およびCOPY。
- FUNCTION:関数呼び出しとDOブロック。
- ROLE:役割と特権に関連するステートメント:GRANT、REVOKE、CREATE / ALTER /DROPROLE。
- DDL:ROLEクラスに含まれていないすべてのDDL。
- MISC:その他のコマンド(例: DISCARD、FETCH、CHECKPOINT、VACUUM、SET。
- MISC_SET:その他のSETコマンド(例:役割を設定します。
- すべて:上記のすべてを含めます。
- pgaudit.log_catalog :ステートメント内のすべてのリレーションがpg_catalogにある場合に、セッションロギングを有効にする必要があることを指定します。この設定を無効にすると、カタログを頻繁にクエリするpsqlやPgAdminなどのツールからのログのノイズが減少します。デフォルトはオンです。
- pgaudit.log_client :ログメッセージをpsqlなどのクライアントプロセスに表示するかどうかを指定します。この設定は通常無効のままにしておく必要がありますが、デバッグやその他の目的に役立つ場合があります。デフォルトはオフです。
- pgaudit.log_level :ログエントリに使用されるログレベルを指定します。この設定は回帰テストに使用され、テストやその他の目的でエンドユーザーに役立つ場合もあります。デフォルトはログです。
- pgaudit.log_parameter :監査ログに、ステートメントで渡されたパラメーターを含める必要があることを指定します。パラメータが存在する場合、それらはステートメントテキストの後にCSV形式で含まれます。デフォルトはオフです。
- pgaudit.log_relation :セッション監査ログが、SELECTまたはDMLステートメントで参照されるリレーション(TABLE、VIEWなど)ごとに個別のログエントリを作成するかどうかを指定します。これは、オブジェクト監査ログを使用せずに徹底的なログを記録するための便利なショートカットです。デフォルトはオフです。
- pgaudit.log_statement_once :ログにステートメントテキストとパラメーターを、ステートメント/サブステートメントの組み合わせの最初のログエントリに含めるか、すべてのエントリに含めるかを指定します。この設定を無効にすると、ログの詳細が少なくなりますが、ログエントリを生成したステートメントを特定するのが難しくなる可能性があります。ただし、前のエントリでログに記録されたステートメントテキストを識別するには、ステートメントとサブステートメントのペアとプロセスIDで十分です。デフォルトはオフです。
- pgaudit.role :オブジェクト監査ログに使用するマスターロールを指定します。複数の監査ロールは、それらをマスターロールに付与することで定義できます。これにより、複数のグループが監査ログのさまざまな側面を担当できるようになります。デフォルトはありません。
pgAuditの使用法
構成パラメーターを確認したので、実際の使用方法の例を見てみましょう。
すべての読み取り、書き込み、およびDDLクエリを監査するには、次のコマンドを実行します。
test1=# set pgaudit.log = 'read,write,ddl';
SET
次に、次の文を実行します。
test1=# CREATE TABLE table1 (id int, name text);
CREATE TABLE
test1=# INSERT INTO table1 (id, name) values (1, 'name1');
INSERT 0 1
test1=# INSERT INTO table1 (id, name) values (2, 'name2');
INSERT 0 1
test1=# INSERT INTO table1 (id, name) values (3, 'name3');
INSERT 0 1
test1=# SELECT * FROM table1;
id | name
----+-------
1 | name1
2 | name2
3 | name3
(3 rows)
PostgreSQLログファイルを確認すると、次のように表示されます。
2020-11-20 19:17:13.848 UTC [25142] LOG: AUDIT: SESSION,3,1,DDL,CREATE TABLE,,,"CREATE TABLE table1 (id int, name text);",<not logged>
2020-11-20 19:18:45.334 UTC [25142] LOG: AUDIT: SESSION,4,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (1, 'name1');",<not logged>
2020-11-20 19:18:52.332 UTC [25142] LOG: AUDIT: SESSION,5,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (2, 'name2');",<not logged>
2020-11-20 19:18:58.103 UTC [25142] LOG: AUDIT: SESSION,6,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (3, 'name3');",<not logged>
2020-11-20 19:19:07.261 UTC [25142] LOG: AUDIT: SESSION,7,1,READ,SELECT,,,SELECT * FROM table1;,<not logged>
もちろん、これは基本的な例です。前のセクションで説明した構成パラメーターを使用して、ビジネスに適合させることができます。
ClusterControlでpgAuditを有効にする
pgAuditを手動でインストールして有効にする代わりに、ClusterControlCLIを使用してジョブを実行することもできます。このために、ClusterControlサーバーから次のコマンドを実行できます。
$ s9s cluster --setup-audit-logging --cluster-id=ID
実行中に、ClusterControlジョブをチェックすることでステータスを監視できます。まず、ジョブリストから取得できるジョブIDが必要になります:
$ s9s job --list
163 18 RUNNING test_dba admins 19:41:45 90% Setup Audit Logging
次に、仕事の詳細を確認します:
$ s9s job --log --job-id=163
Using SSH credentials from cluster.
Cluster ID is 18.
The username is 'root'.
10.10.10.129:5432: Configuring audit logging.
10.10.10.129:5432: Installing 'pgaudit14_12'.
10.10.10.129:5432: Setting pgaudit.log to ROLE,DDL,MISC.
Writing file '10.10.10.129:/var/lib/pgsql/12/data/postgresql.conf'.
10.10.10.129:5432: Restarting PostgreSQL node.
10.10.10.129: waiting for server to shut down.... done
server stopped
waiting for server to start....2020-11-20 19:41:52.069 UTC [25137] LOG: pgaudit extension initialized
2020-11-20 19:41:52.069 UTC [25137] LOG: starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
2020-11-20 19:41:52.069 UTC [25137] LOG: listening on IPv4 address "0.0.0.0", port 5432
2020-11-20 19:41:52.069 UTC [25137] LOG: listening on IPv6 address "::", port 5432
2020-11-20 19:41:52.080 UTC [25137] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-11-20 19:41:52.102 UTC [25137] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-11-20 19:41:52.130 UTC [25137] LOG: redirecting log output to logging collector process
2020-11-20 19:41:52.130 UTC [25137] HINT: Future log output will appear in directory "log".
done
server started
10.10.10.129:5432: Waiting for node to be accessible.
10.10.10.129:5432: pgaudit 1.4.1 is enabled.
このアクションでは、同じタスクでClusterControlによって実行されるデータベースサービスの再起動が必要になります。再起動すると、pgAudit拡張機能が有効になり、使用できるようになります。
postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';
name | default_version | installed_version | comment
---------+-----------------+-------------------+---------------------------------
pgaudit | 1.4.1 | 1.4.1 | provides auditing functionality
(1 row)
以上です!これで、前に示したのと同じ方法でpgAuditを構成して使用できます。
監査は多くのセキュリティ規制に必要であり、データベースで何が起こったのか、いつ、誰がその責任を負ったのかを知りたい場合にも役立ちます。
このブログでは、PostgreSQLデータベースを監査するための優れた方法としてpgAudit PostgreSQL拡張機能について説明し、手動とClusterControlCLIの両方を使用して実装する方法も示しました。
構成によっては、pgAuditが膨大な量のデータを生成する可能性があることに注意してください。したがって、監査する必要があるものとその期間を慎重に決定する必要があります。