インサイダー専用のエンドツーエンド暗号化を備えたパーソナルIMメッセンジャー

この記事では、私はあなたのパラノイドのたまり場のためだけにあなた自身の安全なメッセンジャーを作る方法をあなたに話しました。



現在、エンドツーエンドの暗号化を備えた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メッセンジャーの興味深い代替手段です。これにより、既存のメールプロトコルを使用してメッセージを交換でき(将来的にはブロッキングについて心配する必要がなくなります)、メッセージの傍受に対する高い耐性、中央サーバーがないこと、サーバーに展開できるため、データが悪意のある人の手に渡る心配があります。










All Articles