1 个不稳定版本
0.1.0 | 2020年12月17日 |
---|
1560 在 数据库接口 中
26KB
191 行
sql-audit
跟踪更改是这里的全部目标。当有人插入、更新或删除记录时,这些更改应该被追踪并可以追溯到用户。这既服务于审计谁进行更改,又提供了一种撤销更改的方法。
限制
- 目前只支持Postgres,仅测试了版本10.12。
- 为了方便追踪特定记录的更改,该记录的主键将与其余数据分开记录。目前,这要求所有审计表都有一个名为
pk
的主键列,其类型为integer
。有计划使其更加灵活。 - 您的审计安全程度取决于数据库的权限!确保只有安全的审计账户才能访问审计模式/表/触发器。触发器将以创建它的用户的权限执行。
- 只审计连接数据库的
public
模式中的表。
如何使用
-
cargo安装 sql-audit-cli
-
创建一个类似以下内容的
audit.toml
database = "postgres://username:password@host/database" exclude_tables = ["test_2"] # Tables to not audit
请勿将此文件存档,因为它显然包含安全审计账户的数据库凭证。未来的版本应该使此配置更简单(例如,提示输入凭证)。
-
在此文件所在的目录中从命令行运行
sql-audit
。
工作原理
- 将在数据库中创建一个新的名为
sql_audit
的模式,其中包含名为audit
的表。 - 将创建一个名为
sql_audit_trigger
的函数。 - 将审计连接数据库的
public
模式中的所有表,除非在audit.toml
中的exclude_tables
列表中列出。 - 所有“审计”表(如上所述)将在
INSERT
、UPDATE
和DELETE
上获得TRIGGER
。这些触发器将数据插入为每行创建的audit
表中,以下列:- id:代理键
- ts:更改的时间
- table_name:更改发生的表
- pk:触发器运行的行的pk
- operation:根据触发触发器的动作,“INSERT”、“UPDATE”、“DELETE”。
- db_user:进行更改的数据库用户
- app_user:存储有关进行了更改的登录用户(到应用)的可选字符串数据(仅在插入或更新时使用)。更多详情请参考功能部分。
- request_id:表示特定Web请求的可选任意字符串。更多详情请参考功能部分。
- new_val:整个新行的JSON表示(仅在插入或更新时填充)。
- 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