2012-03-12 1 views
2

この問題はpop-before-smtp/Postfix/Dovecotの文脈の下にありますが、Perlの文字列解析を知っていれば、自分自身で答えを出すことができます。しかし、私は失われているので、私は正確な質問を知らない。私たちはPostfixを長い間使ってきましたが、これに夢中になっています。今、私たちは "現代に近づく"必要があり、人々が私たちのネットワークの外にいてもSMTPサーバーから電子メールを送信できるようにする必要があります。だから、この仕事に取り組んで、私はPOPの前にsmtpを見つけました。Perlのログ解析にはどのような行がありますか?どのように動くかもしれないものを考え出すには?

hereがあります。

これですべての設定が完了しましたが、テストに失敗しました。私は方向hereを使用してトラブルシューティングを行い、ログを解析しようとしているPerlが正しくないと判断しました。私たちはIMAP/POPサーバーとしてDovecotを使用しています。設定ファイルには3つの選択肢があります。ここでは3組の示すコンフィグファイルからの抜粋です:

# 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はログアウトする、または切断するパターンであると推測します。

実際のログレコード形式は、これら3つのいずれかとは明らかに異なりますが、近いです。ここでは例のペアです:

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」)。

十分な時間があれば、私は作品をまとめることができるかもしれませんが、私は実際にPerlを知らないので、これは厳しいものです。私たちのDovecotパッケージで使われているログ出力を解析するための新しいルールを書くのを助けてください。

+0

あなたの質問は何ですか?過去の質問をいくつか受け入れて受け入れてください。 – GoldenNewby

+0

FWIWでは、Perlは略語として扱われるべきではありません。 – Charles

答えて

1

Perlの正規表現の(:?..部分は、クラスタリングしかしを捕捉しないを求めます。これにより、キャプチャグループ番号に影響を与えることなく、グループ全体をグループとして一致または無視することができます。すべての行は1つのフィールド、つまり許可するIPを正確に取得します。 (少し奇妙されており、私は、ユーザー名とIPの両方を期待しているかもしれませんが、これは長期的に簡単になります。)

# 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.*'; 

を、私は、彼らがあなたの入力ではありませんでしたので、dovecot部分を削除しました。私は両方の行にInfo:を追加しました。私は$out_patを、オリジナルのの代わりにimap-loginの代わりに使用するように変更しました。 (ユーザ名に空白があると、の使用は壊れてしまいます。この仮定はファイルのどこかで作成されたので、うまくいけばいいと思います。)

ログアウトラインのためにキャプチャする任意のIPアドレスはもはや存在しないので、それはおそらく最高のに定義されていない$out_pat - お好みのエントリも$out_patを提供する場合START OF PATTERNSコメントブロックフレーズを含み、その変数のコメントを解除して、サーバーに接続しているユーザー(ThunderbirdキャッシュがIMAP接続を開いているなど)を追跡できるようにする必要があります。

私はこれをテストしていませんが、私はそれについて良い気持ちを持っています。

+0

ありがとうございます。残念ながら、動作していないようです。それでも、私は近づいています。 IPアドレスが必要なだけだと思う​​理由は、切断(out_pat)が一致しないIPアドレスを探しているようだからだと思う。これは本当にうまくいくとは思わないと思います。 ...私はPERLプログラマーになる時間は本当にありません。私がしなければならない他のすべてのプログラミングの上に!しかし、今は時が来ているようです。この問題のみを解決するためのあらゆる指針(ユーザ名とIPの両方を取得してからログアウトする) - 学習する必要がある最小限のものなど? Tnx。 –

+0

ああ、私はそれが簡単すぎると思ったと思った。ソフトウェアをリリースする前に、常にこれを実行して_tests_を実行するようにしてください。 'dovecot'を変更してログアウト時にIPアドレスを強制的に発行することができますか? (_ワーストケースはあまりにも悪くないかもしれないことに注意してください。結局のところ、誰かがそのIPアドレスを正当に使用していて、あなたのユーザーの1人がゾンビであればそれほど問題にはなりません。送信されたスパム、送信された時間、または時間によって送信されます)。 – sarnold

+0

設定可能なタイムアウトがあるため気になるとは思えません。スパムまでしか開くことはできませんクライアントが使用していた特定のIPですので、安全である可能性は非常に高いです。 ...今、私はあなたのコードがうまくいかない理由を理解しようとしています! - スマイル - フォールバック計画は、Dovecotのロギング特性を変更するか、Dovecotを別のIMAPサーバーに置き換えることができますが、私は新しいパスワード認証を試すことを心配していません。 –

関連する問題