Dockerコンテナーからメールを送信する(postfixとsaslのドッカー化)

アプリケーションをDockerコンテナーに配置し、別のDockerコンテナーのメールサーバーにメールを送信しようとすると、予期しない問題が発生しました。 デフォルトでは、Postfixメールサーバーはローカルクライアントからのみメールを任意の受信者ドメインに送信します。 他のすべてのドメインはrelay_domainsパラメーターに登録する必要があり、mynetworsパラメーターが正しく構成されている場合、mynetworsのクライアントからrelay_domainsパラメーターにリストされているドメインにメールが送信されます。



原則として、これで十分でした。 理論的には、アプリケーションは正確に1つの企業メールサーバーにメールを送信する必要がありました。 しかし、そのような解決策は、タスクがいつでも変わる可能性があるため、私にはあまり適していませんでした。 したがって、私はsasl認証を設定しようとしました。これにより、任意のドメインの許可されたユーザーにメールを送信できます。





私が使用しようとした最初の解決策は、Dockerコンテナの外部にpostfixをインストールし、クライアントからDockerコンテナからポート25に直接メッセージを送信することでした。 もちろん、失望は私を待っていました、なぜなら コンテナ内のlocalhhostは、コンテナ外のlocalhostとは関係ありません。



したがって、localhostを介さずにpostfixにアクセスする必要があります。 はい。当初の目標は、サーバー上の環境に依存せずに、必要なものをすべてコンテナにインストールすることでした。 つまり、コンテナにpostfixをインストールすることが望まれていました。



コンテナ内にpostfixをインストールすることの追加の利点は、ポートをdocker-composeで明示的に公開しない限り、外部環境に完全に近いことです。



コンテナ内で実行されるpostfixサーバーにアクセスできるようにするには、承認を構成する必要があります。 最も一般的なソリューションは、sasl承認です。 sasldb2を使用して構成することにしました。 判明したように、sasldb2を使用してpostfixにsaslをインストールする詳細な手順はあまりありません。 一部の指示には古い情報が含まれていて、必要な情報が含まれていませんでした。 その結果、最初の承認は頑固に拒否されました。 判明したように、2つの主な理由は次のとおりでした。sasslは何も知らない「サンドボックス」/ var / spool / postfix /のファイルシステムのpostfixサーバーの使用と、saslユーザーが作成するデータベースファイル/ etc / sasldb2に権限を分配する必要性-ユーザーの接尾辞。



結果のDockerfileは非常に単純ですが、主にユーザー権限を使用してソリューションの検索をいじらなければなりませんでした。これについては、後で詳しく説明します。



FROM ubuntu:xenial ARG UID RUN \ useradd -u $UID www-arc && \ apt-get update && apt-get install tzdata && \ echo Europe/Kiev | tee /etc/timezone && \ dpkg-reconfigure --frontend noninteractive tzdata && \ apt-get install -y postfix rsyslog sasl2-bin && \ postconf -e "mydestination = localhost" && \ postconf -e "myhostname = example.com" && \ postconf -e "always_bcc = www-arc@localhost" && \ postconf -e "smtpd_sasl_auth_enable=yes" && \ postconf -e "broken_sasl_auth_clients=yes" && \ postconf -e "smtpd_relay_restrictions=permit_sasl_authenticated,reject_unauth_destination" && \ postconf -e "smtpd_sasl_security_options = noanonymous" && \ echo 123456 | saslpasswd2 -c -p -u example.com postfix && \ ln /etc/sasldb2 /var/spool/postfix/etc/sasldb2 && \ adduser postfix sasl && \ touch /var/log/mail.log COPY ./smtpd.conf /etc/postfix/sasl/smtpd.conf CMD service rsyslog start && service postfix start && tail -f /var/log/mail.log
      
      





ln /etc/sasldb2 /var/spool/postfix/etc/sasldb2



デフォルトでは、postfixはサンドボックス/ var / spool / postfix /内のファイルシステムで動作します。 そこで、彼はlogins / etc / sasldb2を持つファイルを探します。 したがって、サンドボックスから実際のファイルへの/ etc / sasldb2ファイルへのリンクを設定します。 リンクは(-sオプションなしで)ハードのみにする必要があります。



adduser postfix sasl



は非常に理解しやすく、非常に重要なアクションにより、postfixがファイル/ var /スプール/ postfix / etc / sasldb2を処理できるようになります。



postconf -e "smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination"



ルールpostconf -e "smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination"



を使用すると、認証されたすべてのsaslクライアントに任意のドメインにメールを送信できます。



./smtpd.confファイルのSasl許可構成:



 log_level: 3 pwcheck_method: auxprop auxprop_plugin: sasldb mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
      
      





postconf -e "mydestination = localhost"



パラメーターpostconf -e "mydestination = localhost"



は、このドメインへのメールをこれ以上送信せずに、このホストで受信することを示します。 経験からわかるように、メールを受信するはずのメールサーバーは、多くの場合、正しく構成されておらず、メールを失います。 時々これは重要です 郵便物に商品やサービスの購入のためのクライアントの申し込みが含まれている場合、ビジネスに害を及ぼす可能性があります。 したがって、この構成は、ローカル受信者postconf -e "always_bcc = www-arc@localhost"



コピーを送信するように構成されています。 この受信者は、現在のユーザーID useradd -u $UID www-arc



作成されます。



現在のユーザーはdocker-compose構成で定義されています:



  postfix: build: context: ./docker/postfix args: - UID volumes: - ./docker/postfix/mail:/var/mail
      
      





ビルド中、現在のユーザーは環境env UID=$UID docker-compose build



から転送されます。



別のdockerコンテナーからこのサービスに接続するには、ホストとしてpostfix(docker-compose.ymlからのサービスの名前)、およびドメイン名(postfix@example.com)とパスワードを指定する必要があります。 すべての場合において、名前の接尾辞はオプションであり、構成可能です。



アプリケーション側とメールサービス側でメールを設定することは、実行する必要があることの半分でもありません。 ドメイン設定でこれ以外に行う必要があるのは、多くの場合、開発者またはdevopa、およびドメインアカウントを編集する権限を持つ専門家の管理外にあります。 破損した電話で通信する必要がある相手。 「ちょっとみんな、そこのあなたの場所を見て、これがあなたのバックアップです」というスタイルでのんびりした会話があります-あなたのIPアドレスは、それらを除外するのが非常に難しい場所から、さまざまなメールサービスのブラックリストに行きます。 したがって、たとえばdocs.aws.amazon.com/ses/latest/DeveloperGuide/postfix.htmlなどの有料メールサービスのサービスをすぐに使用することは理にかなっています。 APIを介してそれらと統合できますが、私の観点からは、 relayhost = [email-smtp.us-west-2.amazonaws.com]:587



設定することにより、postfix(この目的を目的としています)を介してこれを行う方がより信頼できます。 統合の詳細については、AWS Webサイト(上記のリンク)を参照してください。 一方で、彼らはあなたのIPがブラックリストに載らないことを保証し、あなたのメールはスパムになりますが、彼ら自身はいつでもあなたをスパマーと宣言してあなたのメールをブロックすることができます。 そのため、完璧なソリューションはありません。



追加。



もちろん、問題を解決するとき、私は他の開発者がオープンリポジトリでそれを行う方法を「覗き見」し、これらのソースから多くを学びました。 したがって、いくつかの構成が同様の問題を解決する方法を分析します。



レビューのために、Googleの検索「docker sasl postfix」でキーフレーズを使用しました。 したがって、誰かが他のリポジトリをアドバイスするなら、私はそれらをこのリストに含めます。



1) github.com/MarvAmBass/docker-versatile-postfix



著者はプラグインの接尾辞auxprop_plugin: sasldb



使用しませんでしたが、標準ツールsasl pwcheck_method: saslauthd



。 これは、コンテナで実行される別の追加プロセスであり、構成するのにあまり便利ではありません。 デフォルトではオフです。 したがって、作成者はそのような構成を自分の構成に適用します。

 RUN sed -i 's/^START=.*/START=yes/g' /etc/default/saslauthd; \ sed -i 's/^MECHANISMS=.*/MECHANISMS="shadow"/g' /etc/default/saslauthd RUN sed -i 's/^OPTIONS=/#OPTIONS=/g' /etc/default/saslauthd; \ echo 'OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"' >> /etc/default/saslauthd
      
      







2) github.com/cloudposse/postfix



前のものと同様に、 pwcheck_method: saslauthd



使用されpwcheck_method: saslauthd







3) github.com/floriandejonckheere/docker-postfix



著者は、postfixプラグインでsasldb2を使用しましたが、サンドボックスメカニズム: smtp inet n - n - - smtpd



無効にし、スーパバイザを使用してプロセスを開始しました。



4) github.com/catatnight/docker-postfix

前の例と同様に、作成者はサンドボックスをオフにしました: postconf -F '*/*/chroot = n'



およびスーパーバイザーを使用しました。



5) github.com/juanluisbaptiste/docker-postfix



パスワード付きのフラットファイルを使用: echo "[$SMTP_SERVER]:587 $SMTP_USERNAME:$SMTP_PASSWORD" >> /etc/postfix/sasl_passwd







6) github.com/container-images/postfix



サンドボックスsed -i 's/^smtp\(\s*\)inet\(.*\)/docker_smtp\1inet\tn\ty\tn\t-\t-\tsmtpd -v/g' "$MASTER"



無効化sed -i 's/^smtp\(\s*\)inet\(.*\)/docker_smtp\1inet\tn\ty\tn\t-\t-\tsmtpd -v/g' "$MASTER"







全体として、たとえば、サンドボックスを無効にしたり、1つのコンテナ内の複数のプロセスをリンクしたりすることは、より失敗したソリューションであるとは主張しません。



リポジトリのこのリストが追加されたことに感謝し、コメントに応じてこのリストをすぐに補足することを約束します。



有用な文献のリスト



1. VScaleのDebianにDocker + Docker Compose + Postfix + OpenDKIMをインストールして構成し、署名付きの電子メールを送信します。 ヴァディム・ハクロフ。 2016年12月7日19時25分



apapacy@gmail.com

2018年4月8日



All Articles