FreeBSD 11で独自のメールサーバーを構築する

独自の電子メールサーバーを実行することは、かなりやりがいがあります。あなたはあなたのデータを担当しています。また、配信オプションの柔軟性も向上します。ただし、いくつかの課題があります。サーバーを脆弱性にさらすリスクを冒し、サーバーをスパマーが使用する潜在的なリレーにする可能性があります。

これで、独自のメールサーバーを実行してみましょう。

概観

インストールに必要なソフトウェアは3つありますが、これらはFreeBSDベースシステムに含まれていません。

  • OpenSMTPd
  • ダブコット
  • スパム

OpenSMTPdは、メール転送エージェント(MTA)およびメール配信エージェント(MDA)です。つまり、SMTPプロトコルを介して他のメールサーバーと通信でき、個々のユーザーのメールボックスへのメール配信も処理します。OpenSMTPdを設定して、外部サーバーと通信し(spamdでフィルタリング)、ローカルユーザーにメールを配信したり、ユーザー間でローカルメールを配信したりできるようにします。

Dovecotは、ローカルのメールボックスを読み取り、IMAPまたはPOP3経由でユーザーに提供するMDAです。ローカルユーザーのメールボックスを使用して、このコンテンツを提供します。

Spamdはメールフィルタリングサービスです。spamdを介してメールを転送でき、さまざまなブラックリスト、ホワイトリスト、およびグレーリストに基づいてメールをフィルタリングします。

このメールサーバーの一般的なアイデアには、いくつかの異なるパスが必要です。

Outside world -> Firewall -> spamd -> OpenSMTPD -> User mail boxes
Outside world -> Firewall (spamd-whitelist) -> OpenSMTPD -> User mailboxes
Outside world -> Firewall (IMAP/POP3) -> Dovecot
Outside world -> Firewall (SMTPD submission)

このチュートリアルでは、ファイアウォールにOpenBSDのPFのFreeBSDバージョンを使用します。ipfw構成が非常に似ているを使用することもできます。

注: デフォルトでは、Vultrはポート25をブロックします。ポート25は、SMTPサーバーがあらゆる場所で使用します。完全に機能する電子メールサーバーを実行する場合は、そのポートを開いておく必要があります。

初期設定

まず、必要なプログラムをインストールする必要があります。

sudoアクセスが設定されたユーザーとして実行していると仮定すると、次のコマンドを実行できます。それらは、ポートを使用しているかパッケージを使用しているかによって異なります。

パッケージ(推奨)

これらのユーティリティに組み込まれた特定の機能が必要でない限り、パッケージを介してインストールすることをお勧めします。より簡単で、サーバー時間とリソースが少なくて済み、直感的でユーザーフレンドリーなインターフェースを提供します。

sudo pkg install opensmtpd dovecot spamd

次のmakeコマンドは、多くのコンパイルオプションを提供します。デフォルトで問題なく動作します。何をしているのか正確に知らない限り、これらを変更しないでください。

sudo portsnap fetch update   # or run portsnap fetch extract if using ports for the first time
cd /usr/ports/mail/opensmtpd  
make install  # Installs openSMTPd
make clean
cd /usr/ports/mail/dovecot
make install  # Installs dovecot
make clean
cd /usr/ports/mail/spamd
make install  # Installs spamd
make clean

次の行をに追加する必要があります/etc/rc.conf

pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"

obspamd_enable="YES"
obspamd_flags="-v"
obspamlogd_enable="YES"

dovecot_enable="YES"

ファイアウォールの設定

PFを構成するには、/usr/local/etc/pf.conf次のように作成します。

## Set public interface ##
ext_if="vtnet0"

## set and drop IP ranges on the public interface ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
          10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
          0.0.0.0/8, 240.0.0.0/4 }"

table <spamd> persist
table <spamd-white> persist

# Whitelisted webmail services
table <webmail> persist file "/usr/local/etc/pf.webmail.ip.conf"

## Skip loop back interface - Skip all PF processing on interface ##
set skip on lo

## Sets the interface for which PF should gather statistics such as bytes in/out and packets passed/blocked ##
set loginterface $ext_if

# Deal with attacks based on incorrect handling of packet fragments 
scrub in all


# Pass spamd whitelist
pass quick log on $ext_if inet proto tcp from <spamd-white> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# Pass webmail servers
rdr pass quick log on $ext_if inet proto tcp from <gmail> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# pass submission messages.
pass quick log on $ext_if inet proto tcp from any to $ext_if port submission modulate state
# Pass unknown mail to spamd
rdr pass log on $ext_if inet proto tcp from {!<spamd-white> <spamd>} to $ext_if port smtp \
    -> 127.0.0.1 port 8025 

## Blocking spoofed packets
antispoof quick for $ext_if

## Set default policy ##
block return in log all
block out all

# Drop all Non-Routable Addresses 
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians

pass in inet proto tcp to $ext_if port ssh

# Allow Ping-Pong stuff. Be a good sysadmin 
pass inet proto icmp icmp-type echoreq

# Open up imap/pop3 support
pass quick on $ext_if proto tcp from any to any port {imap, imaps, pop3, pop3s} modulate state


# Allow outgoing traffic
pass out on $ext_if proto tcp from any to any modulate state
pass out on $ext_if proto udp from any to any keep state

これは、動作するPF構成です。比較的シンプルですが、説明が必要ないくつかの癖があります。

まず、後でデバイスで使用する$ext_if変数を定義しますvtnet0。外部インターフェイスでドロップする必要がある無効なIPアドレスも定義します。

我々はまた、2つのテーブルを定義し、spamdそしてspamd-white-この2つのテーブルは、それのデフォルトの設定ではspamdによって作成されます。同様に、webmailいくつかの主要なウェブメールプロバイダーが通過できるようにするために使用するという名前のテーブルを定義します。

テーブルを表示するには、コマンドpfctl -t tablename -T showを使用して、テーブル内の要素を一覧表示できます。

いくつかのPFルールを設定します。ローカルインターフェースでの処理をスキップし、外部インターフェースで統計を有効にし、着信パケットをスクラブします。

次は、重要な部分の1つで、spamdまたはOpenSMTPdへのトラフィックの送信を管理します。

最初はリダイレクトルールです(ここでの構文に注意してください。FreeBSD11は古いスタイルのPF構文(OpenBSD 4.6より前)を使用しているため、構文が奇妙に見える場合があります。spamd表にリストされている、またはspamd-whiteテーブルには、我々はこれらの接続を扱うspamdをデーモンに至るまでの接続をリダイレクトする。次の3つのルールは、私たちが実際にメールを受信できるようにすることをパススルールールです。私たちは、に記載されているIPアドレスからのメッセージを通過spamd-whiteし、webmailまっすぐに至るまでのテーブルOpenSMTPd。また、送信ポート(587)でメッセージを受け入れます。

次に、デフォルトのポリシーを設定し、SSHおよびICMPメッセージを受け入れるいくつかのハウスキーピングルールがあります。

次に、Dovecotにアクセスするために、外部インターフェイスでIMAPとPOP3を渡します。

最後に、すべての発信トラフィックを許可します。セキュリティをさらに追加したい場合は、渡すポートを制限できますが、使い捨てサーバーの場合は、すべてを渡すことは問題ありません。

PFを開始します。

sudo service pf start

ファイアウォールのセットアップが完了したので、メールサーバーの構成に進みます。

OpenSMTPd

OpenSMTPdには、非常にシンプルで読みやすい設定構文があります。以下に示すように、作業構成全体は14行に収まります。

#This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.

ext_if=vtnet0

# If you edit the file, you have to run "smtpctl update table aliases"
table aliases   file:/etc/mail/aliases
table domains   file:/etc/mail/domains

# Keys
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
# If you want to listen on multiple subdomains (e.g. mail.davidlenfesty) you have to add more lines
# of keys, and more lines of listeners

# Listen for local SMTP connections
listen on localhost hostname mail.example.com

# listen for filtered spamd connections
listen on lo0 port 10026

# Listen for submissions
listen on $ext_if port 587 tls-require auth pki mail.example.com tag SUBMITTED

# Accept mail from external sources.
accept from any for domain <domains> alias <aliases> deliver to maildir "~/mail"

accept for local alias <aliases> deliver to maildir "~/mail"
accept from local for any relay tls
accept tagged SUBMITTED for any relay tls

最初に、外部インターフェースと、いくつかのテーブル、エイリアス、ドメインを再度定義します。次に、メールを処理するすべてのドメインのSSLキーと証明書に進みます。

次のセクションでは、リッスンするインターフェースとポートを定義します。まず、mail.example.comドメインのローカルホストでローカル接続をリッスンします。次に、スパムフィルター処理されたメッセージと送信されたメッセージを外部インターフェイスでリッスンします。最後に、提出物をリッスンします。これらはポート587で行われ、セキュリティ上の理由から、認証を要求します。

最後にaccept設定です。domainsテーブル内のエイリアス用にテーブルで定義されているドメインのメッセージを受け入れaliases、ホームディレクトリにmaildir形式で配信します。次に、ローカルメールボックスのすべてのローカル接続を受け入れてメッセージを中継し、メールを送信できるようにします。最後に、送信されたメッセージをリレーに受け入れます。提出ポートに認証を必要としない場合、これはセキュリティ上の大きな危険になります。これにより、誰でも私たちのサーバーをスパムリレーとして使用できます。

エイリアス

FreeBSDには、デフォルトのエイリアスファイル/etc/mail/aliasesが次の形式で付属しています。

vuser1:  user1
vuser2:  user1
vuser3:  user1
vuser4:  user2

これは、さまざまなメールボックス、およびこれらの定義されたメールボックスに送信されたメッセージを転送する場所を定義します。ユーザーをローカルシステムユーザーまたは転送先の外部メールボックスとして定義できます。デフォルトのFreeBSDファイルは非常にわかりやすいので、参照用に参照できます。

ドメイン

FreeBSDはデフォルトのドメインファイルを提供しませんが、これは信じられないほど簡単です:

# Domains
example.com
mail.example.com
smtp.example.com

これは、新しい行でリッスンする各ドメインのプレーンテキストファイルです。#記号でコメントできます。このファイルは単純に存在するので、使用する構成の行を減らすことができます。

SSL証明書

メールサーバーとの通信をセキュリティで保護するには、自己署名証明書と署名済み証明書の2つの方法があります。証明書に自己署名することは確かに可能ですが、Let's Encryptなどのサービスは無料で非常に使いやすい署名を提供します。

まず、certbotプログラムをインストールする必要があります。

sudo pkg install py-certbot

または、ポートを使用してインストールすることもできます。

cd /usr/ports/security/py-certbot
make install
make clean

次に、証明書を取得する80には、外部インターフェイスのポートを開いていることを確認する必要があります。のフィルタリングルールのどこかに次の行を追加します/usr/local/etc/pf.conf

pass quick on $ext_if from any to any port http

次に、実行pfctl -f /usr/local/etc/pf.confしてルールセットをリロードします。

次に、証明書を取得する任意のドメインに対してコマンドを実行できます。

certbot certonly --standalone -d mail.example.com

certbot renew証明書の有効期限が切れないように、crontabエントリを6か月に1回実行するように設定することをお勧めします。

次に、関連するすべてのドメインに対して、正しいキーファイルを指すように行を変更できます。

pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"

証券を編集します。

sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*

注: 元のキーファイルごとにこれを行う必要があります。そうしないと、OpenSMTPdはそれらを開きません。

これでサービスを開始できます:

sudo service smtpd start

spamdの構成

ここでは、OpenBSDのspamdデーモンを使用して、インターネットから取得するスパムの量を減らしています。基本的に、これは、さまざまなスパム送信元からの不良として知られているIPからのメッセージと、(デフォルトでは)着信接続の「グレーリスト」をフィルタリングします。Spamdはまた、ブラックリストとグレーリストの接続を「途切れさせる」ことでスパマーのタイミングを無駄にしようとします。つまり、応答を数秒にわたって分散させ、クライアントを通常よりも長く開いたままにします。

接続のグレイリストは、ブラックリストまたはホワイトリストにない新しいIPアドレスが接続するときに行われます。新しいアドレスが接続されると、spamdは無害なエラーメッセージを含むメッセージをドロップし、一時的なリストに追加します。スパマーは配信されたメッセージに対して支払いを受けるので、エラーで再試行することはありませんが、正当なサービスは比較的すぐに再試行します。

マウントするには、次のコマンドを実行する必要がありますfdescfs

mount -t fdescfs null /dev/fd

次に、この行を/etc/fstab次の行に追加する必要があります。

fdescfs     /dev/fd     fdescfs rw      0       0

デフォルトの設定ファイル(にあります/usr/local/etc/spamd/spamd.conf.sample)は正常に動作します。これを編集して、新しいソースを追加したり、使用するソースを変更したりできます。

sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf

次のようにしてサービスを開始できます。

sudo service obspamd start

この時点でspamdが設定されています。

ウェブメールサービスの有効化

グレイリストアプローチの1つの問題は、大規模なメールサービスが多くの異なるスプールの1つを介してメールを送信することが多く、毎回同じサーバーがメッセージを送信することが保証されないことです。これに対する1つの解決策は、さまざまなWebメールサービスで使用されるIP範囲をホワイトリストに登録することです。これは、PF構成でWebメールテーブルが使用されるものです。スパマーが使用するIPアドレスを含める場合、この戦略は逆効果になる可能性がありますが、テーブルに入力する範囲に注意している限り問題ありません。

電子メール範囲をwebmailテーブルに追加するには、次のコマンドを実行します。

pfctl -t webmail -T add 192.0.2.0/24

ダブコット

ユーザーがSSH経由でログインせずにメールにアクセスできるようにするには、IMAPやPOP3をサポートするMDAが必要です。非常に人気のあるプログラムは、かなり単純な構成と強力な機能を備えたDovecotです。

デフォルトの設定をコピーできます:

cd /usr/local/etc/dovecot
cp -R example-config/* ./

構成は、かなりの数の異なるファイルで構成されています。設定とdovecotのデフォルトの違いを確認するには、以下のコマンドを実行します。

sudo doveconf -n

以下は、単純で機能する構成です。

# 2.3.2.1 (0719df592): /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 11.2-RELEASE amd64  
# Hostname: mail.example.com
hostname = mail.example.com
mail_location = maildir:~/mail
namespace inbox {
  inbox = yes
  location = 
  mailbox Archive {
    auto = create
    special_use = \Archive
  }
  mailbox Archives {
    auto = create
    special_use = \Archive
  }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = create
    autoexpunge = 60 days
    special_use = \Junk
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Mail" {
    auto = no
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    auto = no
    special_use = \Sent
  }
  mailbox Spam {
    auto = no
    special_use = \Junk
  }
  mailbox Trash {
    auto = no
    autoexpunge = 90 days
    special_use = \Trash
  }
  prefix = 
  separator = /
}
passdb {
  args = imap
  driver = pam
}
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_dh = </usr/local/etc/dovecot/dh.pem
ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem
userdb {
  driver = passwd
}

ほとんどの設定ファイルは conf.d

重要なものはあり10-auth.conf10-mail.conf10-ssl.conf

で使用するさまざまなメールボックスを設定できます15-mailboxes.conf。上記の表示は多くのシステムに適した構成ですが、使用距離は異なる場合があります。できるだけ多くのクライアントでこれをいじることをお勧めします。

認証

ほとんどのデフォルト設定は適切です。認証にシステムユーザーを使用する場合は、を編集する必要があります10-auth.conf

次の行のコメントを外します。

!include auth-system.conf.ext

暗号化

Diffie-Hellmanパラメータを生成する必要があります。

sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem

注: 実行には長い時間がかかります。予想よりもはるかに長い。

これでDovecotを起動できます:

sudo service dovecot start

結論

この時点で、機能的で安全な、比較的スパムのないメールサーバーが完成しました。

ここからさらに検討する必要があるのは、SpamAssassinを使用してヒューリスティックにスパムを取り除くことと、信頼できるソースから出されたスパムのブラックリストを見つけることです。


Tags: #BSD #Email

ヘルスケア2021における人工知能の影響

ヘルスケア2021における人工知能の影響

ヘルスケアにおけるAIは、過去数十年から大きな飛躍を遂げました。したがって、ヘルスケアにおけるAIの未来は、日々成長を続けています。

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

最近、Appleは問題を修正するための補足アップデートであるmacOS Catalina 10.15.4をリリースしましたが、このアップデートにより、Macマシンのブリックにつながる問題がさらに発生しているようです。詳細については、この記事をお読みください

原子力が必ずしも悪ではないことを証明する5つの例

原子力が必ずしも悪ではないことを証明する5つの例

原子力は、過去の出来事のために私たちが決して尊重しないことを常に軽蔑していますが、それは必ずしも悪ではありません。詳細については、投稿をお読みください。

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

これを読んで、人工知能が小規模企業の間でどのように人気を博しているか、そして人工知能がどのように成長し、競合他社に優位に立つ可能性を高めているかを理解してください。

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

私たちのコンピューターは、ジャーナリングファイルシステムと呼ばれる組織化された方法ですべてのデータを保存します。これは、検索を押すとすぐにコンピューターがファイルを検索して表示できるようにする効率的な方法です。https://wethegeek.com/?p = 94116&preview = true

ビッグデータは人工知能をどのように変えていますか?

ビッグデータは人工知能をどのように変えていますか?

ビッグデータと人工知能は流行語ですが、それらがどのように相互に関連しているか知っていますか?さて、この記事を最後まで読んで、同じことを知ってください。

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartは、PHP、jQuery、およびHTML 5で記述された無料のオープンソースのショッピングカートプラットフォームです。シンプルで軽量、使いやすいeコマースソフトウォー

DebianでNFS共有をセットアップする

DebianでNFS共有をセットアップする

NFSはネットワークベースのファイルシステムであり、コンピューターはコンピューターネットワークを介してファイルにアクセスできます。このガイドでは、NFを介してフォルダーを公開する方法について説明します

Fedora 28にMatomo Analyticsをインストールする方法

Fedora 28にMatomo Analyticsをインストールする方法

別のシステムを使用していますか?Matomo(旧Piwik)は、Google Analyticsのオープンな代替手段であるオープンソースの分析プラットフォームです。Matomoのソースはoでホストされています

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

HTTPライブストリーミング(HLS)は、Apple Inc.によって実装された非常に堅牢なストリーミングビデオプロトコルです。HLSは、ファイアウォール、プロキシ、