使用 pgAudit 审核 PostgreSQL

此页面介绍了如何使用 pgAudit 扩展程序进行数据库审核;该扩展程序可帮助您配置许多日志,遵守政府、财务和 ISO 认证通常需要这些日志。

如需大致了解 Cloud SQL 中的 PostgreSQL 扩展程序,请参阅 PostgreSQL 扩展程序

概览

Cloud SQL for PostgreSQL 中的数据库审核可通过开源 pgAudit 扩展程序进行。

使用此扩展程序,您可以有选择地记录和跟踪针对给定数据库实例执行的 SQL 操作。此扩展程序可为您提供监控和记录选定部分操作的审核功能。

pgAudit 扩展程序适用于已执行的 SQL 命令和查询。相比之下,Cloud Audit Logs 应该用于审核针对 Cloud SQL 实例完成的管理和维护操作。

如需详细了解 Cloud SQL 中的审核日志,请参阅审核日志页面。

在 Cloud SQL 中设置数据库审核

使用 pgAudit 扩展程序进行审核日志记录的步骤包括:

  1. 在 Cloud SQL 中启用 cloudsql.enable_pgaudit 标志。
  2. 运行命令以创建 pgAudit 扩展程序。
  3. 设置 pgaudit.log 标志的值。

设置数据库审核后,您可以查看日志,并在必要时停用日志记录。

设置审核

本部分介绍了设置数据库审核操作的基础知识。

用于启用审核的初始标志

在 Cloud SQL 中,您可以使用数据库标志执行许多操作,包括调整 PostgreSQL 参数和配置实例。cloudsql.enable_pgaudit 标志用于为给定数据库实例启用审核。您可以通过 Google Cloud Console 或 gcloud 命令更改 cloudsql.enable_pgaudit 标志的值。

按照标志的标准说明启用 cloudsql.enable_pgaudit 标志,并将值设置为 on。例如,要使用 gcloud 命令,请指定以下内容,并将 [INSTANCE_NAME] 替换为您的实例名称:

gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on

cloudsql.enable_pgaudit 标志与其他支持的标志一起列出,并且特定于 Cloud SQL。

运行命令以创建 pgAudit 扩展程序

启用数据库标志后,使用兼容的 psql 客户端运行 CREATE EXTENSION 命令。以下命令会为 Cloud SQL 实例中的所有数据库创建 pgAudit 扩展程序:

CREATE EXTENSION pgaudit;

设置 pgaudit.log 标志的值

按照标志的标准说明设置 pgaudit.log 标志的值。

例如,如需为针对实例的所有数据库操作启用审核,您可以使用以下 gcloud 命令:

$ gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

配置数据库的其他设置

要为数据库配置审核设置,请按照自定义数据库审核日志记录部分中的步骤操作。

查看数据库审核日志

如需查看审核日志,请为项目启用数据访问审核日志。针对给定实例生成的 pgAudit 日志将作为数据访问审核日志发送到 Cloud Logging。用户可以通过日志查看器应用查看生成的 pgAudit 日志。

日志查看器(经典版)应用中,您可以通过选择 cloudaudit.googleapis.com/data_access 日志过滤器来查看 pgAudit 日志,如下所示:


此图片展示了用户如何通过日志查看器应用查看生成的 pgAudit 日志。

或者,您也可以通过高级过滤器界面使用以下查询显示给定 Cloud SQL 项目的所有 pgAudit 日志。

resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"

pgAudit 日志格式

数据访问审核日志中的每个 pgAudit 日志条目都有一些字段,代表针对查询收集的信息。

示例如下:

{
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    methodName: "cloudsql.instances.query"
    request: {
      @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
      auditClass: "READ"
      auditType: "SESSION"
      chunkCount: "1"
      chunkIndex: "1"
      command: "SELECT"
      database: "finance"
      databaseSessionId: 2209692
      parameter: "[not logged]"
      statement: "SELECT * FROM revenue"
      statementId: 2
      substatementId: 1
      user: "alice"
    }
  }
}

下面介绍了数据访问审核日志中的字段:

  • auditClass。所记录的语句的类型。可能的值包括 READWRITEFUNCTIONROLEDDLMISCMISC_SET
  • auditTypeSESSIONOBJECT
  • chunkCount。对 parameterstatement 字段中提供的数据可能发生 。chunkCount 字段表示区块的总数。另请参阅 chunkIndex 字段的说明。
  • chunkIndex。在 parameterstatement 字段中(在当前 request 容器中)指定数据块的索引编号。初始编号为 1。另请参阅 chunkCount 字段的说明。
  • command。例如 ALTER TABLESELECT
  • parameterchunkIndex 字段可以确定此字段的内容;请参阅 chunkIndex 字段的说明。如果设置了 pgaudit.log_parameter 的值,则 parameter 字段可以包含语句参数作为 CSV 引用数据。如果没有参数,则此字段包含 [none]。否则,此字段包含 [not logged]
  • statement。在后端执行的语句。chunkIndex 字段可以确定 statement 字段的内容;请参阅 chunkIndex 字段的说明。
  • statementId。此会话的唯一语句 ID。每个语句 ID 代表一个后端调用。即使未记录某些语句,语句 ID 也是有序的。
  • substatementId。主语句中的每个子语句的顺序 ID。

pgAudit 文档中介绍了其中一些字段。

停用审核

要停用数据库审核,请将 cloudsql.enable_pgaudit 标志的值设置为 off。您可以通过 Google Cloud Console 或 gcloud 命令更改此值。按照标志的标准说明停用 cloudsql.enable_pgaudit 标志。

此外,使用兼容的 psql 客户端运行 DROP EXTENSION 命令以移除扩展程序状态:

DROP EXTENSION pgaudit;

在 Cloud SQL 中自定义数据库审核日志记录

本部分介绍自定义数据库实例的审核行为的方法。

如需了解此扩展程序的其他功能,请参阅 pgAudit 文档

超级用户权限的要求

在 Cloud SQL 中,只能由属于 cloudsqlsuperuser 角色的用户创建扩展程序。创建新的 PostgreSQL 实例时,系统会为您创建默认 PostgreSQL 用户(但您必须设置该用户的密码)。默认 PostgreSQL 用户属于 cloudsqlsuperuser 角色。如需了解详情,请参阅 PostgreSQL 用户

为实例上的所有数据库操作配置审核

如需为实例中的所有数据库配置审核,您必须在系统级层应用 pgAudit 设置。系统级审核参数只能通过 Google Cloud Console 或 gcloud 命令设置为数据库标志。例如,如需为实例上的所有数据库操作启用审核,您可以使用以下 gcloud 命令:

$ gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

对所有实例数据库配置特定操作

如需审核所有实例数据库,您可以使用 Google Cloud Console 或 gcloud 命令。例如,如需仅针对实例上的读取和写入操作启用审核,您可以使用以下 gcloud 命令。以下示例使用基于列表的语法指定多个值:

$ gcloud sql instances patch [INSTANCE_NAME] \
  --database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write

该命令会覆盖现有数据库标志。

为特定数据库配置审核

如需为特定数据库配置审核,请在数据库级层设置 pgAudit 参数。例如,您可以使用以下 SQL 命令为数据库 finance 启用读取/写入审核:

finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';

为关系配置审核

关系的审核比特定数据库的审核范围小一些。

审核关系时,系统会将一个唯一的审核员角色分配给 pgaudit.role 参数。系统会记录授予此角色的任何对象或关系。

例如,如需为 employee 数据库中 salary 关系的所有 SELECT 查询配置审核,您可以使用以下命令:

employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;

您还可以审核给定关系的一部分列。

例如,以下命令将审核日志记录配置为仅当访问 salary 关系中的列 incometax_status 时发生:

employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;

为数据库用户配置审核

您可以通过在各个 ROLE 级层设置 pgaudit.log 参数来为特定用户启用审核。

例如,以下 SQL 命令会对用户 Alice 执行的所有数据库操作设置审核:

finance=> ALTER ROLE alice SET pgaudit.log = 'all';

Cloud SQL 中的审核管理提示

自定义审核行为时,请注意以下事项:

  • 关闭数据库标志 cloudsql.enable_pgaudit 时,审核日志记录会立即停止。不过,除非明确移除,否则已应用的 pgAudit 设置(例如 pgaudit.log 参数设置)会保留下来。
  • 每当 cloudsql.enable_pgaudit 的数据库标志值发生更改时,系统都会重启数据库实例。
  • 通过显式 CREATE ROLE 命令创建的数据库用户无权修改审核设置。只有通过 Google Cloud Console 和 gcloud 命令创建的数据库用户才能修改审核设置。

Cloud SQL for PostgreSQL 中的 pgAudit 扩展程序的限制

审核日志暂时写入其实例的磁盘,占用日志空间后再将日志发送到 Cloud Logging。因此,在使用此功能之前,请查看以下所有信息:

  • 日志提取速率为 4 MB/秒。当日志生成的负载超过提取速率时,可能会发生以下情况:
    • 磁盘使用可能会发生不必要的增长。
    • 磁盘空间可能会用尽。
  • 如果您已启用此功能,并且运行许多符合审核条件的查询,则磁盘使用速度可能会变得过快。
  • 使用此功能之前,请计划如何:
    • 启用存储空间自动扩容功能
    • 监控整体磁盘使用率;无法对日志世代的负载进行单独监控。 在 Metrics Explorer 中使用 cloudsql.googleapis.com/database/disk/utilization 指标。
    • 如有必要,通过运行较少的查询或减少审核日志来减少磁盘使用量。
  • 如果可用磁盘空间耗尽,则某些查询的审核日志可能会丢失。