procmail이 구성 파일을 읽을 수 없더라도 종료 코드 0을 반환합니다. 이를 방지하는 방법은 무엇입니까?

procmail이 구성 파일을 읽을 수 없더라도 종료 코드 0을 반환합니다. 이를 방지하는 방법은 무엇입니까?

이 문제를 다루는 것은 이번이 처음 procmail이므로 다음 질문이 어리석었다면 사과드립니다. 제작 에 들어가기 procmail전에 몇 가지 기본적인 테스트를 하고 있습니다 . 그 중 하나는 완전히 예상치 못한 결과를 가져왔으며, 이로 인해 내 시나리오에서는 거의 쓸모가 없게 되었습니다.

구성 파일을 읽을 수 없는 경우에도 완료 시 procmail종료 코드를 (true)로 설정 합니다. 0내 시나리오에서는 procmail구성 파일을 읽을 수 fetchmail없으면 procmail필요에 따라 메시지를 처리(전달)할 수 없지만 완료 시 종료 코드 가 0설정됩니다. fetchmail업스트림이 성공적으로 전달되고 삭제되었습니다. 전반적으로 이로 인해 이러한 메시지가 손실됩니다.

이 경우 권한은 매우 복잡하므로( fetchmail++ 이상, 자신의 사용자 계정으로 실행 등), 무언가를 변경해야 할 때 procmail누군가 권한에 실수를 했을 가능성이 높습니다. 이러한 오류는 위의 문제로 인해 메시지가 손실될 수 있습니다.cyrdeliverlmtpfetchmailprocmailsuidsetgid

그래서 구성 파일을 읽을 수 없는 경우 어떻게 실패하고 종료하도록 할 수 있는지 궁금합니다 procmail(종료 코드 제외).0

이것이 의미하는 바를 이해하려면 다음 터미널 세션을 고려하십시오(관련 없는 행은 제거됨). 이것은 내 테스트 사례이므로 구성 디렉터리의 소유권/권한이 의도적으로 잘못되었다는 점에 유의하세요.

root@morn /etc/fetchmail # whoami
root

root@morn /etc/fetchmail # dir
total 52K
drwx------   2 fetchmail root 4.0K 2022-01-23 10:09 .
drwxr-xr-x 123 root      root  12K 2022-01-22 17:17 ..
-rw-------   1 fetchmail root 2.4K 2022-01-23 10:09 fetchmailrc
-rw-------   1 root      mail  282 2022-01-23 02:49 procmailrc
-rw-r--r--   1 root      root  110 2022-01-23 00:36 testmessage

root@morn /etc/fetchmail # dir `which procmail`
-rwsr-sr-x 1 root mail 92K 2017-11-16 23:42 /usr/bin/procmail
    
root@morn /etc/fetchmail # cat /etc/systemd/system/pp-fetchmail.service    
User=fetchmail
Group=mail
ExecStart=/usr/bin/fetchmail -f /etc/fetchmail/fetchmailrc --pidfile /run/fetchmail/fetchmail.pid --syslog

root@morn /etc/fetchmail # cat fetchmailrc
poll
pop3.example.com
proto pop3
bad-header accept
user "[email protected]"
ssl
pass "supersecret"
is "user1" here
no rewrite
mda "/usr/bin/procmail TARGET=user1 /etc/fetchmail/procmailrc"

root@morn /etc/fetchmail # cat testmessage
From: [email protected]
To: [email protected]
Subject: Test message

This is a test message.

root@morn /etc/fetchmail # sudo -u fetchmail -g mail /usr/bin/procmail /etc/fetchmail/procmailrc < testmessage && echo "procmail exited 0" 
procmail: Couldn't read "/etc/fetchmail/procmailrc"
procmail exited 0

물론 마지막 두 줄이 문제다. 누구든지 그것을 우회하는 방법을 알고 있습니까? 물론 권한을 수정하면 작동하게 되지만, 제가 명시적으로 요구하는 것은 아닙니다. 나는 오류(내 오류 또는 다른 사람의 오류)가 발생한 경우 더욱 강력한 솔루션을 원합니다.

답변1

Procmail이 성공을 반환하면 분명히 의도한 곳은 아니더라도 어딘가에 메시지를 성공적으로 전달한 것입니다. 대체가 소진되어 어디에도 전달할 수 없는 경우 실패가 발생합니다. 메시지가 어디로 가는지 파악하려면 로그 파일을 확인하세요. 로그 파일을 명시적으로 구성하지 않으면 표준 오류로 전송됩니다. 그러나 명시적인 로그 구성이 없으면 주로 실제 전송 로그만 표시됩니다.

From [email protected]  Wed Apr 1, 2022 09:10:11 UTC
 Subject: Your inheritance from Nigeria
  Folder: /var/mail/fetchmail                       12524

기본적으로 Procmail은 DEFAULT추가 지침 없이 간단히 전송됩니다. 이 -m옵션에는 구성 파일이 필요하며 읽을 수 없는 경우 오류(종료 코드 73)와 함께 실패하지만 결국에는 원하는 기능이 아닐 수도 있는 일부 일반 전달 기능이 꺼집니다.

전반적으로 귀하의 구성은 매우 취약한 것 같습니다. 그 자체로는 Procmail에서는 이해가 되지 않으므로 실제로 해당 정보를 처리할 파일이 TARGET=user있어야 합니다 . 문제의 사용자에게 명시적으로 전달하고 롤백 등을 강력하게 처리하기 procmailrc위해 정기적인 전달 메커니즘이 사용됩니다 . -d user(그러나 나는 Fetchmail에 대해 충분히 알지 못하여 여기서 적절하게 사용할 내용에 대한 정보를 얻을 수 없습니다.)

답변2

이 경우 호출을 래핑 "/usr/bin/procmail TARGET=user1 /etc/fetchmail/procmailrc"하지만 사전에 프로필 권한 확인을 수행하는 래퍼 셸 스크립트를 작성합니다. 구성 파일을 읽을 수 없으면 1이 반환되고, 읽을 수 있으면 호출 "/usr/bin/procmail TARGET=user1 /etc/fetchmail/procmailrc"이 실행되어 반환됩니다.

그런 다음 fetchmailrc파일에서 다음을 수행합니다.

mda "/path/to/your/wrapper/script"

관련 정보