現在、エンドツーエンドの暗号化を備えたIMメッセンジャーは数多くありますが、サーバーにすばやく展開できるオプションははるかに少なくなっています。
オプションを検討しているときに、Habréですでに言及されているDelta Chatに目を向けました。これは、集中型サーバーインフラストラクチャのないメッセンジャーであり、メールサーバーを使用してメッセージを配信します。これにより、たとえば、ホームサーバーにデプロイして、インターネットアクセス付き。
このアプローチの利点は次のとおりです。
- 暗号化キーなどの情報を自分で管理します。
- あなたは誰にもあなたのアドレス帳を与えません。
- 登録に電話番号を使用する必要はありません。
- すべての一般的なシステムのクライアント:Windows、Linux、Android、MacOS、iPhone。
- メールサーバーによって提供されるメッセージ送信用の追加のSTARTTLS / SSL暗号化。
- デバイスからの古いメッセージの削除(消えるメッセージ)を構成する機能。
- 受信時にサーバーからのメッセージの削除を構成する機能。
- IMAPプッシュのおかげで短納期。
- グループで保護されたチャット。
- ファイル、写真、ビデオの転送のサポート。
- サーバーとクライアントはどちらもオープンソースであり、完全に無料です。
考えられる欠点:
- ネイティブの音声およびビデオ会議を作成する方法はありません。
- 複数のデバイスで1つのアカウントを設定するには、暗号化キーをエクスポート/インポートする必要があります。
興味深い事実:Roskomnadzorは、Delta Chatの開発者がユーザーデータ、暗号化キーへのアクセスを提供し、DeltaChatが拒否したプロバイダーの州登録簿に登録することをすでに要求していました。独自のサーバーがなく、暗号化キーにアクセスできません。
エンドツーエンドの暗号化
Delta Chatは、サーバーへのStartTLSまたはSSL接続を使用してサーバーに接続できます。デフォルトでは、最初のメッセージが交換された後、メッセージはAutocryptレベル1標準に従って暗号化され ます(暗号化されていない形式で送信されます)。したがって、あるサーバーのユーザー間で通信が行われている場合、情報は他のサーバーに送信されず、サーバーとユーザーのデバイスのみがメッセージの送信でビジーになります。
サーバーのチューニング
Delta Chat用のサーバーのセットアップは、StartTLS / SSLが構成されたPostfix + Dovecotのインストールと、ドメインレコードのセットアップに帰着します。
サーバーを構成するには、CentOS 8を使用します。他のディストリビューションでは、わずかな違いがある場合があります。 タスクに適切なサーバーパラメータを選択します。
DNSで、2つのレコードを作成しました。第3レベルのドメインは、メールドメインとメールサーバーの名前の両方になります。
secureim.example.com A <ip> secureim MX secureim.example.com
hostname
postfix、dovecot、nginxを設定してインストールしましょう (nginx-証明書を暗号化しましょう、wget-certbot-auto、nano-エディターをインストールします):
hostnamectl set-hostname secureim.example.com
dnf install postfix dovecot nginx wget nano -y
Postfixが外部からメールを受信できるようにして、サーバーのホスト名、ドメイン、発信元を構成しましょう。メールドメインとサーバーアドレスは同じであるため、ドメインはどこでも同じになります。
postconf -e "inet_interfaces = all"
postconf -e "myhostname = secureim.example.com"
postconf -e "mydomain = secureim.example.com"
postconf -e "myorigin = secureim.example.com"
Delta Chatをインターネットから接続できるようにするには、ポート80、143、443、465、587、993を開く必要があります。また、ポート80、443を開いて証明書を暗号化し、将来更新する必要があります。他のメールサーバーからの手紙を受け取る予定がある場合は、ポート25も開く必要があります(私の場合、他のサーバーを使用して接続する予定はないため、25番目のポートを指定しません)。また、サーバーをローカルネットワークで使用する場合は、ルーターにポート転送80、143、443、465、587、993を追加する必要がある場合があります。
ファイアウォールでポート80、143、443、465、587、993を開きましょう。
firewall-cmd --permanent --add-service={http,https,smtps,smtp-submission,imap,imaps} systemctl reload firewalld
certbot-autoを使用して証明書を暗号化するために、ドメイン名のサイト設定を作成しましょう
nano /etc/nginx/conf.d/secureim.example.com.conf server { listen 80; listen [::]:80; server_name secureim.example.com; root /usr/share/nginx/html/; } }
nginxを有効にして実行しましょう:
systemctl enable nginx
systemctl start nginx
certbot-autoをインストールします。
cd ~
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
yes | certbot-auto --install-only
サイトの証明書を生成しましょう(将来的には、サーバーへの接続のTLS暗号化に使用します)。
certbot-auto certonly -a nginx --agree-tos --staple-ocsp --email my_mail@example.com -d secureim.example.com
証明書が作成され、その場所もコンソールに表示されます。
# /etc/letsencrypt/live/secureim.example.com/fullchain.pem
# /etc/letsencrypt/live/secureim.example.com/privkey.pem
Postfix構成ファイルを修正して、ポート465および587でメッセージを受信できるようにします。
nano /etc/postfix/master.cf submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=no -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth
コマンドを実行して、TLS証明書とサーバーの秘密鍵の場所を指定してみましょう。
postconf "smtpd_tls_cert_file = /etc/letsencrypt/live/secureim.example.com/fullchain.pem"
postconf "smtpd_tls_key_file = /etc/letsencrypt/live/secureim.example.com/privkey.pem"
必要に応じて、TLS接続のロギングを有効にできます。
postconf "smtpd_tls_loglevel = 1"
postconf "smtp_tls_loglevel = 1"
Postfix構成ファイルの最後にTLS1.2以上のプロトコルを使用するための要件を追加します。
nano /etc/postfix/main.cf smtp_tls_mandatory_protocols = >=TLSv1.2 smtp_tls_protocols = >=TLSv1.2
#Postfixを有効にして実行します。
systemctl start postfix
systemctl enable postfix
Dovecotをインストール、有効化、実行します。
dnf install dovecot -y
systemctl start dovecot
systemctl enable dovecot
Dovecot構成ファイルを変更して、imapプロトコルを有効にします。
nano /etc/dovecot/dovecot.conf protocols = imap
メッセージがユーザーフォルダに保存されるようにメールストレージを構成しましょう。
nano /etc/dovecot/conf.d/10-mail.conf mail_location = maildir:~/Maildir mail_privileged_group = mail
Dovecotが受信メッセージを読み取れるように、メールグループにDovecotを追加します。
gpasswd -a dovecot mail
TLS暗号化なしで許可を拒否します。
nano /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = yes
承認中にドメインの自動置換を追加します(ユーザー名のみ):
auth_username_format = %n
証明書の場所、キー、Diffie-Hellmanキーファイルの場所、TLS 1.2の最小バージョン、およびクライアントよりもサーバー暗号化プロトコルを選択するための設定を変更してみましょう。
nano /etc/dovecot/conf.d/10-ssl.conf ssl_cert = </etc/letsencrypt/live/secureim.example.com/fullchain.pem ssl_key = </etc/letsencrypt/live/secureim.example.com/privkey.pem ssl_dh = </etc/dovecot/dh.pem ssl_min_protocol = TLSv1.2 ssl_prefer_server_ciphers = yes
Diffie-Hellmanキーを生成しましょう。キーの生成には長い時間がかかる場合があります。
openssl dhparam -out /etc/dovecot/dh.pem 4096
PostfixがDovecot認証サーバーに接続できるように、サービス認証セクションを変更してみましょう。
nano /etc/dovecot/conf.d/10-master.conf service auth { unix_listener /var/spool/postfix/private/auth { mode = 0600 user = postfix group = postfix } }
メールフォルダセクションにauto = create行を追加して、システムメールフォルダの自動作成を有効にしましょう(通常のメールにもサーバーを使用する場合)。
nano /etc/dovecot/conf.d/15-mailboxes.conf
mailbox Drafts {
auto = create
special_use = \Drafts
}
mailbox Junk {
auto = create
special_use = \Junk
}
mailbox Trash {
auto = create
special_use = \Trash
}
mailbox Sent {
auto = create
special_use = \Sent
}
mailbox "Sent Messages" {
auto = create
special_use = \Sent
}
lmtpパラメーターを追加して、構成済みのストレージにメッセージを配信するようにDovecotを構成しましょう。
nano /etc/dovecot/dovecot.conf protocols = imap lmtp
LMTPサービスを次のように構成しましょう。
nano /etc/dovecot/conf.d/10-master.conf service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } }
次の設定をファイルの最後に追加して、DovecotLMTPサービスを介してローカルストレージにメールを配信するようにPostfixに指示します。Dovecot LMTPはこの拡張機能をサポートしていないため、SMTPUTF8も無効にします。
nano /etc/postfix/main.cf mailbox_transport = lmtp:unix:private/dovecot-lmtp smtputf8_enable = no
システムに対応するエントリを作成し、smtpsおよびimapsを介した認証に使用されるパスワードを指定して、サーバーを使用するユーザーを作成しましょう。
adduser user1 passwd user1
#DovecotとPostfixを再起動します。
systemctl restart dovecot systemctl restart postfix
/ etc / crontabにタスクを追加して、証明書を自動的に更新します。
nano /etc/crontab
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"
この段階で、サーバーはメールサーバーとして機能する必要があります。メールクライアントに接続して、このサーバーの他のメールボックスにレターを送受信するか、上記のポート25を開いている場合は、他のメールサーバーにレターを送受信することができます。
それでは、PCとAndroidスマートフォンでDeltaChatクライアントをセットアップしましょう。
接続するには、サーバーで以前に作成したメールアドレスとパスワードを入力するだけで十分です。DeltaChatが使用できるポートを決定し、その後、有効なメールアドレスを使用してメールアドレスに新しい連絡先を追加できるようになります。
最初のメッセージは暗号化されずに送信されます。この段階で、キー交換が進行中です。さらに、データ送信に使用されるTLS、エンドツーエンド暗号化Autocryptレベル1
に加えて、メッセージが暗号化されます。 グループ検証済みチャットを作成することもできます。すべてのメッセージがエンドツーエンド暗号化で暗号化され、参加者はQRコードで招待状をスキャンして参加できます。このように、すべての参加者は、アクティブなネットワーク攻撃またはプロバイダー攻撃に対する暗号の一貫性を保証する一連の招待によって相互にリンクされます。
私がチェックしたかった最も興味深いことの1つは、サーバーストアでメッセージがどのように表示されるかを確認することでした。これを行うために、非アクティブなアカウントにメッセージを送信しました。この場合、メッセージはサーバー上の受信者を待機し、サーバーにアクセスできるユーザーはそれを表示できます。
メッセージの内容
Return-Path: <user2@secureim.example.com>
Delivered-To: user1@secureim.example.com
Received: from secureim.example.com
by secureim.example.com with LMTP
id g/geNIUWzl+yBQAADOhLJw
(envelope-from <user2@secureim.example.com>)
for <user1@secureim.example.com>; Mon, 07 Dec 2020 14:48:21 +0300
Received: from [127.0.0.1] (unknown [192.87.129.58])
by secureim.example.com (Postfix) with ESMTPSA id AA72A3193E11
for <user1@secureim.example.com>; Mon, 7 Dec 2020 11:48:21 +0000 (UTC)
MIME-Version: 1.0
References: <Mr.DoII3_YQLLv.2m_e6hIHc0e@secureim.example.com>
<Mr.YwnXrWVn2Ai.FAQ-abJC0kt@secureim.example.com>
In-Reply-To: <Mr.YwnXrWVn2Ai.FAQ-abJC0kt@secureim.example.com>
Date: Mon, 07 Dec 2020 11:48:20 +0000
Chat-Version: 1.0
Autocrypt: addr=user2@secureim.example.com; prefer-encrypt=mutual;
keydata=xjMEX83vexYJKwYBBAHaRw8BAQdAYgkiTiHDlJtzQqLCFxiVpma/X5OtALu8kJmjeTG3yo
7NIDx1c2VyMkBzZWN1cmVpbS5zYW1vaWxvdi5vbmxpbmU+wosEEBYIADMCGQEFAl/N73sCGwMECwkI
BwYVCAkKCwIDFgIBFiEEkuezqLPdoDjlA2dxYQc97rElXXgACgkQYQc97rElXXgLNQEA17LrpEA2vF
1FMyN0ah5tpM6w/6iKoB+FVUJFAUALxk4A/RpQ/o6D7CuacuFPifVZgz7DOSQElPAMP4AHDyzcRxwJ
zjgEX83vexIKKwYBBAGXVQEFAQEHQJ7AQXbN5K6EUuwUbaLtFpEOdjd5E8hozmHkeeDJ0HcbAwEIB8
J4BBgWCAAgBQJfze97AhsMFiEEkuezqLPdoDjlA2dxYQc97rElXXgACgkQYQc97rElXXhYJgEA+RUa
RlnJjv86yVJthgv7w9LajPAgUGCVhbjFmccPQ4gA/iiX+nk+TrS2q2oD5vuyD3FLgpja1dGmqECYg1
ekyogL
Message-ID: <Mr.qg4Mj0zMVZw.lT9nBnZMoKs@secureim.example.com>
To: <user1@secureim.example.com>
From: <user2@secureim.example.com>
Subject:…
Content-Type: multipart/encrypted; protocol=«application/pgp-encrypted»;
boundary=«OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP»
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP
Content-Type: application/pgp-encrypted
Content-Description: PGP/MIME version identification
Version: 1
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP
Content-Type: application/octet-stream; name=«encrypted.asc»
Content-Description: OpenPGP encrypted message
Content-Disposition: inline; filename=«encrypted.asc»;
-----BEGIN PGP MESSAGE-----
wU4DKm2PBWHuz1cSAQdA4krEbgJjac78SUKlWKfVyfWt2drZf41dIjTH01J52HIg
aY/ZzCn/ch8LNGv3vuJbJS8RLHK7XyxZ4Z1STAtTDQPBTgNyNpRoJqRwSxIBB0AC
OVrbhsjNPbpojrm/zGWkE5berNF7sNnGQpHolcd+WyCdpqQAk3CaiQjxsm7jdO0A
gMtmXABw/TWcpTU/qOfW/9LBVwFZ/RPCKxCENfC0wau4TI+PMKrF0HODyWfBkEuw
e3WlQpN/t0eSUPKMiMhm7QM0Ffs52fPz0G6dfVJ2M6ucRRyU4Gpz+ZdlLeTLe3g2
PkKbb6xb9AQjdj/YtARCmhCNI48sv7dgU1ivh15r37FWLQvWgkY93L3XbiEaN/X9
EWBQxKql/sWP01Kf67PzbtL5uAHl8VnwInCIfezQsiAsPS2qiCb1sN3yBcNlRwsR
yTs2CPJTIi7xTSpM1S/ZHM5XXGnOmj6wDw69MHaHh9c9w3Yvv7q1rCMvudfm+OyS
/ai4GWyVJfM848kKWTCnalHdR4rZ3mubsqfuCOwjnZvodSlJFts9j5RUT87+j1DM
mQa4tEW8U5MxxoirFfbBnFXGUcU/3nicXI5Yy6wPP8ulBXopmt5vHsd68635KVRJ
2GMy7sMHcjyzujNCAmegIQgKqTLO5NUOtxW7v1OXL23pKx32OGcy8PtEJp7FBQYm
bUNAaz+rkmC971S2FOU0ZGV8LNp8ULioAbL629/JpPHhBOBJCsVnsXDIh6UBPbuM
06dU7VP6l8PNM87X/X1E3m2R1BCNkZghStQrt16fEoA+jm9F6PNtcap2S5rP9llO
klo/ojeciqWl0QoNaJMlMru70TT8a9sf6jYzp3Cf7qFHntNFYG1EcEy9YqaXNS7o
8UOVMfZuRIgNqI9j4g8wKf57/GIjtXCQn/c=
=bzUz
-----END PGP MESSAGE-----
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP--
ご覧のとおり、文字は暗号化された形式でサーバーに保存されており、サーバーが関係者に押収された場合でも、メッセージが危険にさらされることはありません。
信頼性を高めるために、サーバーとクライアントが実行されているデバイスのフルディスク暗号化を使用できます。また、キーを使用してssh経由でサーバーに接続し、メールアカウントに強力で複雑なパスワードを使用できます。
結論
Delta Chatは、セルフホストIMメッセンジャーの興味深い代替手段です。これにより、既存のメールプロトコルを使用してメッセージを交換でき(将来的にはブロッキングについて心配する必要がなくなります)、メッセージの傍受に対する高い耐性、中央サーバーがないこと、サーバーに展開できるため、データが悪意のある人の手に渡る心配があります。