跟踪 Linux 本地主机中 PostgreSQL 身份验证失败的根源

跟踪 Linux 本地主机中 PostgreSQL 身份验证失败的根源

我的 PostgreSQL 数据库日志文件中有这些日志,这些日志是在我更改数据库密码后出现的。

2023-09-14 11:57:15.937 UTC [3401773] username@db-name FATAL:  password authentication failed for user "username"
2023-09-14 11:57:15.937 UTC [3401773] username@db-name DETAIL:  Password does not match for user "username" 
Connection matched pg_hba.conf line 96: "host    all             all             127.0.0.1/32            md5"

我如何追踪该请求的来源?我的所有服务都从 docker 容器运行,即使我停止它们,相同的错误仍然显示在 PostgreSQL 日志中。

这是我认为与这些请求相关的系统日志:

Sep 14 12:43:23 dev supervisord[539]: 2023-09-14 12:43:23,814 INFO exited: laravel-worker_04 (exit status 1; not expected)
Sep 14 12:43:27 dev supervisord[539]: 2023-09-14 12:43:27,025 INFO spawned: 'laravel-worker_04' with pid 3417768
Sep 14 12:43:28 dev supervisord[539]: 2023-09-14 12:43:28,229 INFO success: laravel-worker_04 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

而且,即使我重新启动系统,这些日志也会不断重复。我想知道如何在重新启动后找到导致这些请求的文件。我检查了 crontab 和服务,没有与此相关的 cronjob 或服务。

更新

我可以从 PostgreSQL 连接找到进程 ID。这是输出ps aux pid

postgres: 12/main: username database 127.0.0.1(s-port) idle

答案1

有什么办法可以找到命令执行的位置

一般来说,简单的答案是是的它将/var/log/audit/audit.log作为以下结果审计Linux 中的子系统。但您必须定制/etc/audit/rules.d/audit.rules文件才能捕获此类内容。我不相信默认情况下会捕获每个命令...这会在一小时后炸毁audit.log。

在您的情况下,您可以在文件夹位置上放置一个监视-w来捕获正在运行的此类命令,或者作为规则专门调用该命令,然后搜索audit.log该命令。审核行上会有一个exe=字段显示正在运行的命令,然后在该行或后续行上显示cwd=当前工作目录该命令是从哪里执行的。

这是一些示例/etc/audit/rules.d/audit.rules

-a always,exit -F path=/usr/sbin/semanage -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/sbin/setsebool -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/bin/chcon -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/sbin/setfiles -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/bin/passwd -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/sbin/unix_chkpwd -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/bin/gpasswd -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/bin/chage -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/sbin/userhelper -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/bin/su -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/bin/sudo -F auid>=1000 -F auid!=unset -k privileged-priv_change

-w /var/run/faillock -p wa -k logins
-w /var/log/lastlog -p wa -k logins
-w /etc/sudoers -p wa -k privileged-actions
-w /etc/sudoers.d/ -p wa -k privileged-actions

完成您可以使用的 /etc/audit/rules.d/audit.rules 文件

将下面的内容设为整个/etc/audit/rules.d/audit.rules文本文件;将现有的备份到audit.rules.orig.然后执行 a ,service auditd restart然后执行 aservice auditd status -l来查看是否有任何语法错误,状态应以以下内容响应活动(运行)基本信息没有任何错误。

## First rule - delete all
-D

## Increase the buffers to survive stress events.
## Make this bigger for busy systems
# -b 8192

# set from 8k to 1mb
-b 1048576


# 2 is shutdown, 1 is runlevel 1
-f 1


-a always,exit -F arch=b32 -S execve -C uid!=euid -F euid=0 -k setuid
-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k setuid
-a always,exit -F arch=b32 -S execve -C gid!=egid -F egid=0 -k setgid
-a always,exit -F arch=b64 -S execve -C gid!=egid -F egid=0 -k setgid

-a always,exit -F arch=b32 -S chown -F auid>=1000 -F auid!=unset -k perm_mod
-a always,exit -F arch=b64 -S chown -F auid>=1000 -F auid!=unset -k perm_mod

-a always,exit -F arch=b32 -S chmod -F auid>=1000 -F auid!=unset -k perm_mod
-a always,exit -F arch=b64 -S chmod -F auid>=1000 -F auid!=unset -k perm_mod


-a always,exit -F arch=b32 -S setxattr -F auid>=1000 -F auid!=unset -k perm_mod
-a always,exit -F arch=b64 -S setxattr -F auid>=1000 -F auid!=unset -k perm_mod

-a always,exit -F arch=b32 -S open -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access
-a always,exit -F arch=b32 -S open -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access
-a always,exit -F arch=b64 -S open -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access
-a always,exit -F arch=b64 -S open -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access

-a always,exit -F path=/usr/sbin/semanage -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/sbin/setsebool -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/bin/chcon -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/sbin/setfiles -F auid>=1000 -F auid!=unset -k privileged-priv_change

-w /var/run/faillock -p wa -k logins
-w /var/log/lastlog -p wa -k logins

-a always,exit -F path=/usr/bin/passwd -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/sbin/unix_chkpwd -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/bin/gpasswd -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/bin/chage -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/sbin/userhelper -F auid>=1000 -F auid!=unset -k privileged-passwd
-a always,exit -F path=/usr/bin/su -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/bin/sudo -F auid>=1000 -F auid!=unset -k privileged-priv_change

-w /etc/sudoers -p wa -k privileged-actions
-w /etc/sudoers.d/ -p wa -k privileged-actions

-a always,exit -F path=/usr/bin/newgrp -F auid>=1000 -F auid!=unset -k privileged-priv_change
-a always,exit -F path=/usr/bin/chsh -F auid>=1000 -F auid!=unset -k privileged-priv_change

-a always,exit -F arch=b32 -S mount -F auid>=1000 -F auid!=unset -k privileged-mount
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=unset -k privileged-mount
-a always,exit -F path=/usr/bin/mount -F auid>=1000 -F auid!=unset -k privileged-mount

-a always,exit -F path=/usr/bin/umount -F auid>=1000 -F auid!=unset -k privileged-mount
-a always,exit -F path=/usr/sbin/postdrop -F auid>=1000 -F auid!=unset -k privileged-postfix
-a always,exit -F path=/usr/sbin/postqueue -F auid>=1000 -F auid!=unset -k privileged-postfix
-a always,exit -F path=/usr/libexec/openssh/ssh-keysign -F auid>=1000 -F auid!=unset -k privileged-ssh
-a always,exit -F path=/usr/bin/crontab -F auid>=1000 -F auid!=unset -k privileged-cron
-a always,exit -F path=/usr/sbin/pam_timestamp_check -F auid>=1000 -F auid!=unset -k privileged-pam
-a always,exit -F arch=b32 -S create_module -k module-change
-a always,exit -F arch=b64 -S create_module -k module-change
-a always,exit -F arch=b32 -S init_module -k module-change
-a always,exit -F arch=b64 -S init_module -k module-change


-a always,exit -F arch=b32 -S delete_module -k module-change
-a always,exit -F arch=b64 -S delete_module -k module-change

-a always,exit -F arch=b32 -S unlink -F auid>=1000 -F auid!=unset -k delete
-a always,exit -F arch=b64 -S unlink -F auid>=1000 -F auid!=unset -k delete

-w /usr/bin/kmod -p x -F auid!=unset -k module-change
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/security/opasswd -p wa -k identity

答案2

如果您将 %h 添加到您的Postgresql 日志配置您将在这些日志中获得 IP 地址。我认为如果不重新启动 DBMS 就无法完成此操作。或者,您可以从 iptables 记录新连接并协调日志数据。假设接受政策并且没有现有规则......

iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j LOG --log-prefix ' INBOUND TCP ' --log-level 4

答案3

我终于找到了!我发布的第二篇日志是关于supervisord服务的。但当时我并不知道什么是supervisord。当我检查supervisord进程时,我发现这是一个名为的进程laravel-worker正在后台运行排队作业。

相关内容