#audit #change #postgresql #track #sql #database-table

app sql-audit-cli

运行一条命令即可开始跟踪您的Postgres数据库中的所有更改!

1 个不稳定版本

0.1.0 2020年12月17日

1560数据库接口

MIT 许可证

26KB
191

sql-audit

跟踪更改是这里的全部目标。当有人插入、更新或删除记录时,这些更改应该被追踪并可以追溯到用户。这既服务于审计谁进行更改,又提供了一种撤销更改的方法。

限制

  1. 目前只支持Postgres,仅测试了版本10.12。
  2. 为了方便追踪特定记录的更改,该记录的主键将与其余数据分开记录。目前,这要求所有审计表都有一个名为 pk 的主键列,其类型为 integer。有计划使其更加灵活。
  3. 您的审计安全程度取决于数据库的权限!确保只有安全的审计账户才能访问审计模式/表/触发器。触发器将以创建它的用户的权限执行。
  4. 只审计连接数据库的 public 模式中的表。

如何使用

  1. cargo安装 sql-audit-cli

  2. 创建一个类似以下内容的 audit.toml

    database = "postgres://username:password@host/database"
    exclude_tables = ["test_2"] # Tables to not audit
    

    请勿将此文件存档,因为它显然包含安全审计账户的数据库凭证。未来的版本应该使此配置更简单(例如,提示输入凭证)。

  3. 在此文件所在的目录中从命令行运行 sql-audit

工作原理

  1. 将在数据库中创建一个新的名为 sql_audit 的模式,其中包含名为 audit 的表。
  2. 将创建一个名为 sql_audit_trigger 的函数。
  3. 将审计连接数据库的 public 模式中的所有表,除非在 audit.toml 中的 exclude_tables 列表中列出。
  4. 所有“审计”表(如上所述)将在 INSERTUPDATEDELETE 上获得 TRIGGER。这些触发器将数据插入为每行创建的 audit 表中,以下列:
    1. id:代理键
    2. ts:更改的时间
    3. table_name:更改发生的表
    4. pk:触发器运行的行的pk
    5. operation:根据触发触发器的动作,“INSERT”、“UPDATE”、“DELETE”。
    6. db_user:进行更改的数据库用户
    7. app_user:存储有关进行了更改的登录用户(到应用)的可选字符串数据(仅在插入或更新时使用)。更多详情请参考功能部分。
    8. request_id:表示特定Web请求的可选任意字符串。更多详情请参考功能部分。
    9. new_val:整个新行的JSON表示(仅在插入或更新时填充)。
    10. new_val:整个旧行的JSON表示(仅在更新或删除时填充)。

功能

存储app_user

此设置仅持续事务期间。.

app_user的目的是能够跟踪在应用级别进行更改的用户,而不是在数据库级别。通常,应用程序将使用单一套数据库凭据,无论哪个用户发起Web请求。因此,记录应用级别的用户通常比仅记录数据库用户更有用。然而,此值可由任何发起查询的人设置,因此您应像信任db_user一样信任此值。db_user

此功能的使用完全由消费应用程序自行决定。可以通过从Rust调用sql_audit::set_local_app_user或使用SELECT set_config('sql_audit.app_user', $1, true)来设置,其中$1是要存储的内容。强烈建议使用参数和绑定,因为用户名/电子邮件通常是某种用户提供的输入。您不希望以审计用户的权限运行任意SQL!

存储request_id

此设置仅持续事务期间。.

此字段在此用于跟踪目的。当用户发起Web请求时,您通常会记录一些唯一的请求ID以跟踪错误/更改等。您也可以将此唯一ID存储在这里,以将数据库更改跟踪回特定的Web请求(或相反)。

此功能的使用完全由消费应用程序自行决定。可以通过从Rust调用sql_audit::set_local_app_user或使用SELECT set_config('sql_audit.request_id', $1, true)来设置,其中$1是要存储的内容。

依赖项

~28-41MB
~779K SLoC