CodeGym /课程 /SQL SELF /访问审计和用户操作日志记录

访问审计和用户操作日志记录

SQL SELF
第 48 级, 课程 0
可用

想象一下,你的数据库就像一个有超严格会员制度的俱乐部。只有自己人能进,但我们还想知道是谁来了、什么时候来的、呆了多久、都干了啥。这就是PostgreSQL里搞审计的意义。有了它你可以:

  1. 追踪用户操作。 比如,谁在什么时间执行了重要的查询。

  2. 发现可疑活动。 比如有人试图读取他本不该看的数据。

  3. 满足法律和行业标准要求。 很多行业(比如金融或医疗)都要求详细记录用户操作。

  4. 深入了解系统内部。 日志记录能帮你搞清楚哪些查询最常被执行,哪里可能有瓶颈,怎么优化性能。

日志参数配置

PostgreSQL可以通过配置参数来搞定操作审计,比如log_statement和log_connections。咱们来细说下它们。

  1. log_statement:记录啥?

log_statement参数决定哪些SQL语句会被写进日志。这对了解系统里发生了啥特别有用。

log_statement的可选值:

  • none — 什么都不记录(适合喜欢刺激的同学)。
  • ddl — 只记录修改数据库结构的命令(比如CREATE TABLE)。
  • mod — 记录会改数据的命令(比如INSERT、UPDATE、DELETE)。
  • all — 全都记录。

配置示例: 要改这个参数,你得去改postgresql.conf文件:

# 配置记录所有SQL语句
log_statement = 'all'

然后保存并重启PostgreSQL服务器:

pg_ctl reload

现在你的俱乐部会把每个动作都写进日志,从点饮料到跳舞都不会漏。

  1. log_connections:谁进了俱乐部?

log_connections参数负责把每个新数据库连接的信息写进日志。还有个相关参数log_disconnections,它会记录连接关闭的时刻。

配置示例: 还是要改postgresql.conf文件:

# 记录连接
log_connections = on

# 记录断开
log_disconnections = on

这有啥用?比如你能在日志里看到你的经理凌晨三点用错密码连了俩小时数据库。没错,真事。

日志分析:能发现啥?

配置好log_statement和log_connections后,PostgreSQL就会开始写日志。下面是log_statement = 'mod'时日志文件的样子:

2023-11-01 12:45:01 UTC [12345] LOG:  connection authorized: user=admin database=university
2023-11-01 12:46:15 UTC [12345] STATEMENT:  INSERT INTO students (name, age) VALUES ('Alice', 22);
2023-11-01 12:47:30 UTC [12345] STATEMENT:  UPDATE students SET age = 23 WHERE name = 'Alice';
2023-11-01 12:48:45 UTC [12345] LOG:  disconnection: session time: 2:45 connection: 1/5

有意思的点:

  1. 谁连进来了: user=admin database=university — 这就是咱老板。
  2. 干了啥: 插入了一条名字叫Alice的记录,还更新了她的年龄。
  3. 啥时候走的: 12:48:45,活跃了两分半钟。

实战案例:怎么用审计

咱们来看看几个场景,看看审计和日志记录怎么帮上忙。

场景1:追踪数据变更

你怀疑有人在改students表的数据。可以这样搞:

  1. 设置log_statement = 'mod',记录所有改数据的操作。
  2. 分析日志:
cat /var/log/postgresql/postgresql.log | grep "UPDATE students"

这样你就能看到是谁、啥时候、改了啥。

场景2:发现可疑连接

如果日志里出现了很多不同IP的连接,可能有点不对劲。分析方法:

  1. 看连接日志(log_connections)。
  2. 按IP过滤:
cat /var/log/postgresql/postgresql.log | grep "connection authorized"

场景3:分析查询性能

想知道为啥服务器慢?最简单的办法就是短时间(比如一小时)开log_statement = 'all',收集日志,然后看看服务器都在忙啥。

最佳实践

别啥都记录。 配置log_statement,只记录重要操作——DDL和数据变更。

自动化日志分析。 用脚本或工具定期读日志,比如grep、awk,甚至ELK Stack(Elasticsearch, Logstash, Kibana)。

管理日志大小。 用PostgreSQL参数或操作系统工具(比如Linux下的logrotate)搞定日志轮转。

希望你现在已经是自己数据库的牛仔警长了。日志和审计不仅能保护你,还能帮你更懂自己的系统。咱们看看这些知识怎么在实际项目里用起来!

2
任务
SQL SELF, 第 48 级, 课程 0
已锁定
开启所有SQL查询的日志记录
开启所有SQL查询的日志记录
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION