postfixとpostfwdを使用してサーバー上の送信メッセージを制限する

さまざまなユーザーのサイトが配置されているサーバーでは、ほとんどの場合、ローカルメールサーバーを介してメッセージを送信できます。 サイトの1つがハッキングされた場合、スパムリストを送信する可能性があります。これは、ブロックリストにメールサーバーのIPアドレスを入力するなど、深刻な結果を招く可能性があります。



メールサーバーの信用を落とす可能性を防ぐために、各ユーザーが一定の時間内に送信できる送信メッセージの最大数を制限する必要があります。



問題は決して些細なものではありません。この記事の目的は、実稼働環境に適用できる既製のソリューションを示すことです。



初期データ:OS Debian 8( "Jessie")、Postfixメールサーバー。



postfwdパッケージをインストールして構成する



aptを使用してpostfwdパッケージをインストールします。



apt-get install postfwd
      
      





パッケージには構成ファイルがなく、デフォルトでは起動しません。 構成ファイル/etc/postfix/postfwd.cfを作成し、ルールを追加します(1人のユーザーに対して1時間あたり50メッセージまで送信します)。



 id=R001; action=rcpt(sender/50/3600/REJECT limit of 50 recipients per hour for sender $$sender exceeded)
      
      





プロジェクトのWebサイトのドキュメントでpostfwdの構成の詳細を読むことができます。



ファイル/ etc / default / postfwdを編集します。



 #    STARTUP=1 #   ,    CONF=/etc/postfix/postfwd.cf # IP ,        INET=127.0.0.1 # ,        PORT=10040 # ,     RUNAS="nobody" # ,      ARGS="--summary=600 --cache=600 --cache-rdomain-only --cache-no-size"
      
      





postfwdサービスを再起動します。



 service postfwd restart
      
      





そして、すべてが正常に機能することを確認します。



 srv1:~# tail /var/log/mail.log Jun 9 14:14:18 srv1 postfwd2/master[37242]: postfwd2 1.35 starting Jun 9 14:14:18 srv1 postfwd2/master[37244]: Started cache at pid 37245 Jun 9 14:14:18 srv1 postfwd2/master[37244]: Started server at pid 37246 Jun 9 14:14:18 srv1 postfwd2/cache[37245]: ready for input Jun 9 14:14:18 srv1 postfwd2/policy[37246]: ready for input
      
      





Postfixとpostfwdの統合



Postfixメールサーバーとpostfwdサービスを統合するには、構成ファイル/etc/postfix/main.cfを変更し、次のパラメーターを追加する必要があります。



 #   policy service - postfwd       smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:10040, permit_sasl_authenticated, reject_unauth_destination #   policy service - postfwd smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10040
      
      





posftwdの接続は最初に行う必要があります。これは、Postfixメールサーバーによるパラメーターの解釈の特性によるものです。 smtpd_recipient_restrictionsおよびsmtpd_end_of_data_restrictionsパラメーターが構成ファイルで既に設定されている場合、check_policy_service inet:127.0.0.1:10040およびpermit_sasl_authenticatedが先頭にあるように変更する必要があります。



設定をリロードします。



 srv1:~# postfix reload postfix/postfix-script: refreshing the Postfix mail system
      
      





再起動後、postfwdは作業を開始し、定期的にメールログ(/var/log/mail.log)に統計を表示します。



 srv1:~# tail /var/log/mail.log | grep postfwd Jun 9 14:24:18 srv1 postfwd2/master[37244]: [STATS] postfwd2::policy 1.35: 1 requests since 0 days, 00:09:59 hours Jun 9 14:24:18 srv1 postfwd2/master[37244]: [STATS] Requests: 0.10/min last, 0.10/min overall, 0.10/min top Jun 9 14:24:18 srv1 postfwd2/master[37244]: [STATS] Dnsstats: 0.00/min last, 0.00/min overall, 0.00/min top Jun 9 14:24:18 srv1 postfwd2/master[37244]: [STATS] Hitrates: 0.0% ruleset, 0.0% parent, 0.0% child, 0.0% rates Jun 9 14:24:18 srv1 postfwd2/master[37244]: [STATS] Timeouts: 0.0% (0 of 0 dns queries) Jun 9 14:24:18 srv1 postfwd2/master[37244]: [STATS] 1 matches for id: R001
      
      





これで、SMTPサーバーを介して電子メールメッセージを送信するすべてのユーザーには、postfwdで指定されたルールに対応する制限が設定されます(この場合、1つのルールのみが設定されます)。 ただし、/ usr / sbin / sendmailを介して送信されるすべてのメッセージはフィルター処理されません。Postfixはpostfwdをバイパスしてキューに直接送信するためです。



/ usr / sbin / sendmailのスタブの構成



最も簡単で効果的なソリューションは、スクリプト/ usr / sbin / sendmailに「スタブ」を使用することです。これにより、すべての通信が許可されたSMTPサーバーを介して送信されます。 したがって、許可されていないローカルユーザーへのSMTP経由のメッセージ送信を禁止することも必要です。 /etc/postfix/main.cf構成ファイルにsmtpd_recipient_restrictionsのpermit_mynetworksパラメーターが欠落していることを確認します-この場合、ローカルユーザーでさえ認証が必要です。

実際に「スタブ」を使用してソリューションを適用するには、ユーザーに対応するメールサーバー上にメールボックスとデフォルトのボックスを作成する必要があります。次に例を示します。





すべてのメールボックス(site1、site2など)に1つのパスワードを設定し、default @ myserver.orgに別のパスワードを設定する必要があります。 これらのメールボックスにレターを保存する必要はないため、/ dev / nullで転送を構成できます。

上記のpostfwdルールの同様の構成では、「個別の」アカウントを持つすべてのユーザーに1時間あたり最大50文字を送信し、個別のアカウントを持たないユーザーに「すべての」50メッセージを送信できます。

スタブは次のように機能します。



  1. スクリプトを実行したユーザーの名前を特定する
  2. 手順1で取得したユーザー名を使用してメールサーバーにログインします。
  3. エラーが発生した場合、デフォルトとして承認
  4. メールを転送する


コードはPerlで記述されており、追加モジュールのインストールが必要です。CPANを介してインストールします。



 srv1:~# cpan Net::SMTP_auth Email::Address
      
      





スクリプトを保存するディレクトリ(/ usr / local / bin / privateなど)と、ディレクトリとスクリプトの「所有者」になる非特権ユーザーを作成します。



 srv1:~# mkdir /usr/local/bin/private srv1:~# useradd sendmail
      
      





作成したディレクトリ(/usr/local/bin/private/sendmail.pl)に「スタブ」スクリプトを追加し、変数$ smtp_password、$ smtp_default_passwordおよび$ serverをそれぞれユーザーメールボックスのパスワード、メールボックスのパスワード「default」、およびアドレスに置き換えますボックスが作成されるホスト:



 #!/usr/bin/perl use strict; use warnings; use Net::SMTP_auth; use Email::Address; my $user = getpwuid( $< ); my $smtp_password = 'password'; my $smtp_default_password = 'password'; my $server = 'srv1.re-hash.org'; my $input = ''; my $to_string = ''; foreach my $line ( <STDIN> ) { $input .= $line; if ($line =~ /^To:/) { $to_string = $line; } } my @addrs = Email::Address->parse($to_string); if (0+@addrs eq 0) { die "No recipients"; } my $rec = $addrs[0]; $rec =~ s/\@/\\@/; my $smtp = Net::SMTP_auth->new('127.0.0.1', Port => 25, Timeout => 10, Debug => 0); die "Could not connect to SMTP server!\n" unless $smtp; if (!$smtp->auth('PLAIN', $user.'@'.$server, $smtp_password)) { $smtp->auth('PLAIN', 'default@'.$server, $smtp_default_password) or die "Auth failed!\n"; } $smtp->mail($user.'\@'.$server); $smtp->to($rec); $smtp->data(); $smtp->datasend($input); $smtp->dataend(); $smtp->quit;
      
      





ディレクトリとスクリプトに権利を設定します。 ユーザーがスクリプトを実行できるが、読み取れないことを確認する必要があります。



 srv1:~# chown -R sendmail:sendmail /usr/local/bin/private srv1:~# chmod -R 4711 /usr/local/bin/private
      
      





古いファイル/ usr / sbin / sendmail(たとえば、sendmail-postfix)の名前を変更するか、実行権限を削除できます。

原則として、今では/ usr / sbin / sendmailの代わりに、パス/usr/local/bin/private/sendmail.plを使用できます(またはすぐにスクリプトを/ usr / sbin / sendmailとして保存します)が、別の方法でやりたいと思いました。 そこで、/ usr / sbin / sendmailを置き換える別のラッパー(はい、ラッパーの上にあるラッパー)を作成することにしました。 ラッパーコード(wrapper.c)はCで記述され、次のようになります。



 /* wrapper.c */ #define REAL_PATH "/usr/local/bin/private/sendmail.pl" main(ac, av) char **av; { execv(REAL_PATH, av); }
      
      





このファイルをコンパイルし、/ usr / sbinにコピーして適切な権限を設定します。



 srv1:~# cc -o sendmail wrapper.c srv1:~# cp -a ./sendmail /usr/sbin/sendmail srv1:~# chown -R sendmail:sendmail /usr/sbin/sendmail srv1:~# chmod -R 4711 /usr/sbin/sendmail
      
      





上記の手順を実行した後、すべてのサイトは以前と同じ方法でメールメッセージを送信する必要がありますが、postfwd構成で設定された制限とルールが送信メッセージに適用され始めます。



ラッパーのソースコードはGitHubで入手できます: github.com/xtremespb/sendmail-wrapper

コメントの制限メカニズムを改善するためのコメントと提案を歓迎します。



All Articles