2012-03-12 3 views
2

이 문제는 pop-before-smtp/Postfix/Dovecot의 문맥에서 나옵니다. 그러나 Perl 문자열 구문 분석을 알고 있다면 직접 대답을 얻을 수 있습니다. 그러나 나는 너무 잃어 버렸기 때문에 정확한 질문조차 모릅니다. 위트로 :Perl이 수행하는 로그 파싱 라인은 무엇입니까? 어떻게 작동합니까?

우리는 지금 오랫동안 Postfix를 사용 해왔다. 이제 우리는 "근대로 이동"해야하며 사람들이 우리 네트워크 외부에있을 때에도 SMTP 서버에서 전자 메일을 보내도록해야합니다. 그래서,이 일을 맡았고, 나는 팝 - 이전 - smtp를 발견했습니다.

here을 찾을 수 있습니다.

그래서 모든 설정이 완료되었지만 테스트에는 실패합니다. 나는 방향 here을 사용하여 문제를 해결했으며 로그를 구문 분석하려고하는 Perl이 올바르지 않은 것으로 판단했습니다. 우리는 Dovecot을 IMAP/POP 서버로 사용하고 있으며 설정 파일에는 세 가지 선택 사항이 있습니다. 여기에 3 개 세트 보여주는 config 파일에서 발췌 한 것입니다

# For Dovecot POP3/IMAP when using syslog. 
#$pat = '^[LOGTIME] \S+ (?:dovecot:)?(?:imap|pop3)-login: ' . 
# 'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]'; 
#$out_pat = '^[LOGTIME] \S+ (?:dovecot:)?(?:imap|pop3)-login: ' . 
# 'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]'; 

# For Dovecot POP3/IMAP when it does its own logging. 
##$logtime_pat = '(\d\d\d\d-\d+-\d+ \d+:\d+:\d+)'; 
#$pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' . 
# 'Login: .+? rip=[:f]*(\d+\.\d+\.\d+\.\d+),'; 
#$out_pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' . 
# 'Disconnected.*? rip=[:f]*(\d+\.\d+\.\d+\.\d+),'; 

# For older Dovecot POP3/IMAP when it does its own logging. 
#$pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' . 
# 'Login: \S+ \[[:f]*(\d+\.\d+\.\d+\.\d+)\]'; 
#$out_pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' . 
# 'Disconnected.*? \[[:f]*(\d+\.\d+\.\d+\.\d+)\]'; 

하나는, 그러나, 그들 중 누구도 작동하지 적용하는 사람의 주석을 해제하기로되어있다.

'pat'은 로그인 패턴이고 out-pat은 로그 아웃하거나 그렇지 않으면 연결 해제하는 패턴이라고 추측합니다.

실제 로그 레코드 형식은이 세 가지와 분명히 다르지만 비슷합니다. 여기에 예제 쌍은 다음과 같습니다

Mar 11 17:53:55 imap-login: Info: Login: user=<username>, method=PLAIN, rip=208.54.4.205, lip=192.168.1.1, TLS 

Mar 11 17:59:10 IMAP(username): Info: Disconnected: Logged out bytes=352/43743 

POP를 사용하여, 'IMAP-로그인'팝업 로그인 '으로 대체되고, 로그 아웃시,'POP '은'IMAP '을 대체 - 총액 왜 변경 나는 말할 수 없다!

가져 오기 및 데이터 위치 : 타임 스탬프, 사용자 이름 및 로그인시 "원격"ip ("rip").

충분한 시간이 주어지면 작동하는 것을 조각으로 만들 수 있지만 실제로 펄을 알지 못하기 때문에 다소 힘듭니다. 우리의 Dovecot 패키지에 사용 된 로깅 출력을 파싱하는 새로운 규칙을 작성하도록 도와주세요.

+0

무엇이 당신의 질문입니까? 또한 과거의 질문을 받아들이십시오. – GoldenNewby

+0

FWIW, Perl은 약어로 취급하지 않습니다. – Charles

답변

1

펄 정규 표현식 (:?.. 부는 클러스터링 그러나 캡처하지 요청; 이렇게하면 전체 그룹을 캡처 그룹 번호에 영향을주지 않고 그룹과 일치 시키거나 무시할 수 있습니다. 모든 라인은 정확히 하나의 필드, 허용 할 IP를 포착합니다. (조금 이상한 어느, 둘 다 이름과 IP를 예상했을 수도 있지만, 이것은 장기적으로 쉬울 수 있습니다.) 그들은 당신의 입력에없는 때문에 나는 dovecot 조각을 제거했습니다

# For Dovecot POP3/IMAP when using syslog. 
$pat = '^[LOGTIME] \S+ (?:imap|pop3)-login: Info: ' . 
    'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]'; 
# not necessary? see comment header START OF PATTERNS 
# $out_pat = '^[LOGTIME] \S+ (?:IMAP|POP3)\(\S+\): Info: ' . 
# 'Disconnected.*'; 

. 두 줄 모두에 Info:을 추가했습니다. $out_pat을 원래의 imap-login 대신에 IMAP(username) 대신 사용하도록 수정했습니다. (사용자 이름에 공백이있을 경우 \S+을 사용하면 문제가 해결됩니다.이 가정은 파일의 다른 곳에서 작성된 것이므로 좋을 것입니다.)

로그 아웃 라인 캡처하는 모든 IP 주소가 더 이상 존재하기 때문에, 아마 가장 에 정의되지 $out_pat - 당신의 선택의 항목도 $out_pat를 제공하는 경우 START OF PATTERNS 주석 블록 문구 을 포함, 그 변수의 주석을 풀어서 서버에 여전히 연결되어있는 사용자를 추적 할 수 있도록해야합니다 (예 : Thunderbird 캐시가 IMAP 연결을 열어 캐시 함).

나는 이것을 테스트하지는 않았지만 좋은 감정을 가지고 있습니다.

+0

감사합니다. 불행히도 작동하지 않는 것 같습니다. 아직도, 나는 점점 가까워지고있다. IP 주소 만 필요하다고 생각하는 이유는 연결 해제 (out_pat)가 일치하지 않는 IP 주소를 찾고있는 것처럼 보이기 때문이라고 생각합니다. 이것은 정말로 올바르게 작동하지 않을 것이라는 것을 의미합니다. ... 필자는 PERL 프로그래머가 될 시간을 정말로 가질 수 없다. 그러나 지금은 시간이 될 것 같습니다. 이 문제 만 해결할 수있는 모든 포인터 (사용자 이름과 IP를 모두 가져 와서 로그 아웃 한 후 일치시켜야 함) - 배울 필요가있는 최소량 등? Tnx. –

+0

아, 나는 너무 쉬운 것 같다고 생각했다. 소프트웨어를 출시하기 전에 항상 _tests_를 실행하여이를 테스트하십시오. 'dovecot'을 수정하여 로그 아웃시 IP 주소를 강제로 생성 할 수 있습니까? (_worst_의 경우는별로 좋지 않습니다. 어쨌든 누군가가 그 IP 주소를 합법적으로 사용합니다. 사용자 중 하나가 좀비라면 큰 문제가되지 않을 것입니다. 5 분 또는 10 분이 소요될 것입니다. 스팸이 보내지거나 보낸 시간과 시간이 어느 쪽이든간에 전송되는 경우도 있습니다. – sarnold

+0

구성 가능한 시간 제한이 있기 때문에 걱정할 필요가 없다고 생각합니다. 스팸 메일 만 열어 둡니다. 클라이언트가 사용했던 특정 IP이므로 안전하다는 확률은 매우 높습니다. ... 이제 코드가 작동하지 않는 이유를 알아 내려고 노력 중입니다! -smile- 폴백 (fall-back) 계획은 Dovecot의 로깅 특성을 변경하거나 새로운 암호 인증을 시도하지 않더라도 Dovecot을 다른 IMAP 서버로 교체하는 것일 수도 있습니다. –