如何跟踪运行 PostgreSQL 的 Amazon RDS 数据库实例的失败登录尝试?

上次更新时间:2019 年 12 月 11 日

我需要跟踪连接运行 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS) 数据库实例失败的次数。该如何操作?

解决方法

PostgreSQL 每小时​​生成新的日志文件。要跟踪运行 PostgreSQL 的数据库实例的失败登录尝试,请在与数据库实例关联的自定义参数组中启用 log_connections 参数。有关更多信息,请参阅修改数据库参数组中的参数。启用 log_connections 参数后,在用户尝试使用错误的凭证登录您的数据库实例时,则会将失败的尝试记录到日志中,例如 error/postgresql.log.2018-04-19-10

以下是不成功登录尝试的示例:

2018-04-19 10:12:31 UTC:123.45.67.8(6789):[unknown]@[unknown]:[12507]:LOG: connection received: host=123.45.67.8port=12345
2018-04-19 10:12:31 UTC:123.45.67.8(6789):test_user@Test_DB:[12507]:FATAL: password authentication failed for user "test_user"

您还可以使用 PostgreSQL log_connections 参数记录对运行 PostgreSQL 的数据库实例的成功登录尝试。

以下是成功登录尝试的示例:

2018-04-19 10:19:20 UTC:123.45.67.8(6789):[unknown]@[unknown]:[17196]:LOG: connection received: host=123.45.67.8 port=12345
2018-04-19 10:19:20 UTC:123.45.67.8(6789):test_user@Test_DB:[17196]:LOG: connection authorized: user=test_user database=Test_DB SSL enabled (protocol=xxxx, cipher=xxxx, compression=off)

您可以使用 log_connections log_disconnections 参数来记录用户会话的持续时间。

以下是会话持续时间的示例:

2018-04-19 10:19:43 UTC:123.45.67.8(6789):test_user@Test_DB:[17196]:LOG: disconnection: session time: 0:00:23.753 user=test_user database=Test_DB host=123.45.67.8 port=12345

注意:客户端计算机的 IP 地址为 123.45.67.8,而 6789 是 PostgreSQL 数据库进程的 PID(进程 ID)。

解析日志文件

使用 AWS 命令行界面 (AWS CLI) 或使用 Amazon RDS 控制台下载日志。然后,使用 grep 实用程序搜索失败的连接尝试:

$ grep -B 1 "authentication failed" postgresql.log.2018-04-19-10
2018-04-19 10:12:31 UTC:123.45.67.8(6789):[unknown]@[unknown]:[12507]:LOG: connection received: host=123.45.67.8port=12345
2018-04-19 10:12:31 UTC:123.45.67.8(6789):test_user@Test_DB:[12507]:FATAL: password authentication failed for user "test_user"

注意:- B 1 参数指示 grep 还要显示与您要搜索的模式匹配的行前面的行。在本示例中,模式为身份验证失败

您还可以使用 PostgreSQL log_fdw 扩展将这些日志作为外部表进行访问。如果您要使 PostgreSQL 日志文件的保留时间超过保留期限,那么如果您使用 PostgreSQL 版本 9.6.6 和更高版本以及 10.4 和更高版本,则可以将 Amazon RDS PostgreSQL 日志导出到 CloudWatch Logs