Sieve スクリプトから Bash スクリプトを呼び出す

Sieve スクリプトから Bash スクリプトを呼び出す

もし似たような質問をした方がいらっしゃるのかわかりませんね。
現在、電子メールがスパムフォルダの内外に移動したときにスパム/ハムとして認識できるように、電子メールをスパムフィルタにプッシュしようとしています。そのために、私は次のガイドに従いました。https://workaround.org/ispmail/stretch/filtering-out-spam-with-rspamd「ユーザー操作による学習」セクションで。
sieve スクリプトは指示に従って作成され、sievec で処理され、指示に従って権限が付与されました。これにより、2つのシェルスクリプトも作成されました。唯一の違いは、ユーザーまたはグループ「vmail」がないことです。私はそれを私たちのシステムの対応物であるdovecot:rootに設定しました。フォルダは次のとおりです。

drwxr-xr-x 2 dovecot root 4,0K Mai  7 10:52 .
drwxr-xr-x 3 root    root 4,0K Jul 29  2019 ..
-rw-r--r-- 1 dovecot root   85 Mai  7 10:47 learn-ham.sieve
-rw-r--r-- 1 root    root  246 Mai  7 10:47 learn-ham.svbin
-rw-r--r-- 1 dovecot root   86 Mai  7 10:47 learn-spam.sieve
-rw-r--r-- 1 root    root  250 Mai  7 10:47 learn-spam.svbin
-rw-r--r-- 1 dovecot root  509 Mär 16 13:57 mailfilter.sieve
-rw-r--r-- 1 root    root  398 Mai  6 18:02 mailfilter.svbin
-rwx------ 1 dovecot root   41 Mai  7 10:52 rspamd-learn-ham.sh
-rwx------ 1 dovecot root   42 Dez 14 10:42 rspamd-learn-spam.sh

シーブスクリプトが実行されてシェルスクリプトを呼び出すと、次のエラーが発生します。

Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Fatal: execvp(/etc/dovecot/sieve/global/rspamd-learn-spam.sh) failed: Permission denied
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: write(program stdin) failed: Broken pipe
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: program `/etc/dovecot/sieve/global/rspamd-learn-spam.sh' terminated with non-zero exit code 84
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: sieve: pipe action: failed to pipe message to program `rspamd-learn-spam.sh': refer to server log for more information. [2020-05-12 17:16:28]
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: sieve: left message in mailbox 'Junk'
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed

「サーバーログ」が何を意味するのか分からないという以外に、問題が何であるかはわかりません。もちろん、これは権限エラーのように見えますが、どうすれば解決できますか?

システム情報:Dovecot 2.3.4.1とpiginghole 0.5.4を含むDebian 10.4
編集する:
間違いを見つけました。 sieve_pipe_bin_dir を無効なフォルダに設定しました。これで、2つの.shファイルを含むフォルダを指していますが、まだ次のエラーが発生します。

Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Fatal: execvp(/etc/dovecot/sieve/global/rspamd-learn-spam.sh) failed: Permission denied
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: write(program stdin) failed: Broken pipe
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: program `/etc/dovecot/sieve/global/rspamd-learn-spam.sh' terminated with non-zero exit code 84
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: sieve: pipe action: failed to pipe message to program `rspamd-learn-spam.sh': refer to server log for more information. [2020-05-22 15:40:06]
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: sieve: left message in mailbox 'Junk'
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed

どの所有者を設定しても(root:rootまたはdovecot:root、「人間のユーザー」ではない唯一の他のユーザーは_apt、bin、nslcd、daemon、dovenull、www-dataなど)原因になる可能性があるすべてのアイデアですか?

編集2:
それでは、アプローチを変更してrspamcに直接パイプしようとしています。私のlearn-spam.sieveスクリプトは次のとおりです。

require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];

だから私は90-plugin.confを次のように変更しました。

sieve_pipe_bin_dir = /usr/bin/rspamc

rspamc の位置。これでエラーが発生します。

Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: Error: sieve: pipe action: failed to pipe message to program: program `rspamc' not found
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: sieve: left message in mailbox 'Junk'
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed

何が間違っていますか?それとも、pidgeonholeパイプラインコマンドはシェルスクリプトのみを呼び出すことができますか?

答え1

うまくいかないものが見つかったようです。何らかの理由で、dovecotにはシェルスクリプトに対する実行権限がないようです。したがって、解決策は実際にsudo -u dovecot chmod +x *.sh
私の場合の正しいファイル権限は次のとおりです。

/etc/dovecot/sieve/global # ls -la
insgesamt 44K
drwxr-xr-x 2 dovecot root 4,0K Jul  8 07:33 .
drwxr-xr-x 3 root    root 4,0K Jul 29  2019 ..
-rw-r--r-- 1 dovecot root  144 Jun  5 10:06 learn-ham.sieve
-rw-r--r-- 1 root    root  306 Jun  5 10:07 learn-ham.svbin
-rw-r--r-- 1 dovecot root   86 Jun 17 15:45 learn-spam.sieve
-rw-r--r-- 1 root    root  250 Jun 17 15:45 learn-spam.svbin
-rw-r--r-- 1 dovecot root  509 Mär 16 13:57 mailfilter.sieve
-rw-r--r-- 1 dovecot root  462 Jul 29  2019 mailfilter.sieve~
-rw-r--r-- 1 root    root  398 Mai  6 18:02 mailfilter.svbin
-rwxrwxr-x 1 dovecot root   41 Jun  5 10:25 rspamd-learn-ham.sh
-rwxrwxr-x 1 dovecot root   42 Jul  8 07:33 rspamd-learn-spam.sh

答え2

sieve_pipe_bin_dir設定が上書きされていることを確認してください。この場合、コメントを外したり、削除したり、デフォルトのディレクトリを使用したりできます(例:90-plugin.conf90-sieve-extprograms.conf90-sieve-extprograms.conf90-plugin.conf90-plugin.conf/usr/lib/dovecot/sieve-pipe/

sieve_pipe_bin_dir実行可能ファイルのファイル名ではなく、元のディレクトリ名と同じディレクトリ名に設定する必要があります。

Permission deniedプログラムを実行することは、dovecotがプログラム(実行ファイルまたは親ディレクトリ)を読み取ったり実行したりする権限を持っていないことを意味します。stat $file実行可能ファイルの権限を使用または確認できますls -l $filechmod +x $file実行可能にします(すべてのユーザー)。 dovecotがプログラムを実行してプログラムを実行できるかどうかをテストすることができますsudo -u dovecot $file(このように実行してもスクリプトが悪いことをしないと仮定します)。 $file例えば/etc/dovecot/sieve/global/rspamd-learn-spam.sh

答え3

ちなみに、これを達成するために実行した手順は次のとおりです。

  1. ディレクトリ(たとえばmail_processor.py)にスクリプトを作成します/usr/lib/dovecot/sieve-execute/

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • スクリプトとターゲットファイルに正しい権限があることを確認してください。

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. プラグインの有効化sieve_extprograms:

    • 以下を使用して変更された\etc\dovecot\conf.d\90-sieve.confプラグインセクション:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • 鳩を再ロードしてください:

      $ service dovecot restart
      
  3. シーブフィルタを作成します(例: Roundcube で goto settings-> filters-> actions-> edit filter set)。

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

このフィルタを使用してメールボックスに転送されたすべてのメッセージはパイプラインを通過しますmail_processor.py

Pigeonhole Sieve: Extprograms プラグイン参考までに

答え4

一般的な例を使用して、同様の問題に直面しましたpipe :copy "dovecot-lda"

まず、パイプライン実行可能ファイルがどこにあるかをDovecoに伝えます。 00-zzzzz.confファイルからsieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe。これはSieveスクリプトの「パイプライン」コマンドにのみ適用されます。 HyperActiveの答えは「実行」コマンドです。 dovecot.confまたは.confファイルをインポートできる他の場所に!includeがある限り、.confファイルは重要ではありません。 (90-sieve.conf、90-sieve-extprograms.confなど)

2番目:Dovecotを再起動して設定をロードします。

3番目:フォルダを作成します。 mkdir /usr/lib/dovecot/sieve-pipe 私はこれをルートとしています。他のユーザーがフォルダにアクセスできるようにするには、chmod 755を使用します。

第四:パイプするCLIコマンドの実行可能ファイルをこのフォルダに保存します。
dovecot-ldaにはすでに「deliver」というシンボリックリンクがあります。これはdovecot-ldaへのハードコーディングを防ぐための一般的な参照です。だから私は/usr/lib/dovecot/deliverを/usr/lib/dovecot/sieve-pipeにコピーしました。

5番目:dovecot-lda実行可能ファイル自体の権限が755であることを確認してください。 「deliver」の権限は777と表示されますが、宛先の実際の権限はで確認できますls -LaAFl /usr/lib/dovecot/deliver。 755はこの目的に最適です。

要約:

  • あなたのふるいスクリプトは次のように言いますpipe :copy
  • この指示は合格しましたrequire ["vnd.dovecot.pipe", "copy"...
  • :copyの後に続くすべてのコマンドは、:copyで識別されるフォルダに定義する必要があります。sieve_pipe_bin_dirアクティブな Dovecot .conf ファイルでこの変数を設定するには、Dovecot を再起動する必要があります。
  • OP の場合、これは /usr/lib/dovecot/sieve-pipe に /usr/bin/rspamc を指す "rspamc" へのシンボリックリンクがあることを意味します。

さて、何年も遅れましたが、このQ&Aを偶然発見した方のためです。

関連情報