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.service 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

관련 정보