メールプロトコルの診断

この記事では、メールプロトコルの診断方法について説明します。 これは、サーバーとクライアントの両方による承認の迅速なテスト/メールメッセージの送受信を行うツールについて詳しく知りたい初心者の管理者を対象としています。 ただし、経験豊富な管理者にとっては、それぞれのチームを思い出させるのにも役立ちます。



材料は次のように壊れています。



1.はじめに

2.セッションの例

3.サーバー(LOGIN、PLAIN、CRAM-MD5)、Base64での承認の検証

4. SSL / TLS暗号化検証

5. tsharkを使用したメールトラフィックの分析。 SSL / TLS復号化

6.資料へのリンク











1.はじめに



ネットワークには個々のポイントに十分な資料がありますが、すべてが異なる場所に散在しており、1つまたは別の操作を実行する必要が生じた場合、異なるリソースの認可の微妙な違い、base64での高速エンコードの方法、opensslおよびtsharkのキーを思い出す必要があります。 ここですべてがまとめられ、SSL / TLSトラフィックの復号化に関する情報が追加されました。



指定



$-通常のシェルでの招待、通常のユーザーから実行された後に指定されたコマンド



#-ルートシェルの招待、管理者権限で実行された後に指定されたコマンド



##-コメント行



電子メールセッションでのクライアントリクエストは太字で示しています。



メールポート



RFCを介したメールサーバーの操作で使用される主なポート(インターネットとその主要コンポーネントの操作を規制するドキュメント):



SMTP






Pop3






IMAP






ここにリストされているのは主なものだけで、それらに加えて、さまざまなサーバー実装が公式の目的、ユーザーおよび管理Webインターフェイス、クラスターノードの通信などに他のポートを使用できます。



使用済みおよび推奨されるユーティリティ



この記事では、telnet、openssl、tsharkを使用しています。 明確にするために、サーバーとクライアントの相互作用、プロトコルコマンドの使用。 定期的にいくつかのプロセスを自動化するために、これらすべての詳細を隠すユーティリティを使用できますが、スクリプトに含める方が簡単です。 これらのユーティリティのうち、perl smtp-cliスクリプト (http://www.logix.cz/michal/devel/smtp-cli/)をお勧めします。これは、SMTP認証の可能性を含む幅広い機能を備えています。 Icyプロトコルのテストに使用できるcyrus-clientsのimtestユーティリティもお勧めします。 smtp-sink 、メールサーバーをエミュレートするpostfixユーティリティ。 その助けを借りて、既存のメールサーバーへのアクセスがない場合や、クライアント設定に詳細なログを含める可能性がない場合に、メールクライアントの動作をデバッグできます。



nmapを使用すると、外部からポートにアクセスできるかどうか、つまりプログラムによってポートがリッスンされているかどうか、およびファイアウォールによって閉じられているかどうかをすばやく確認できます。



# nmap -v -p25,110,143,465,587,993,995 127.0.0.1 Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2014-10-31 15:59 MSK Initiating SYN Stealth Scan against localhost.localdomain (127.0.0.1) [7 ports] at 15:59 Discovered open port 25/tcp on 127.0.0.1 Discovered open port 465/tcp on 127.0.0.1 Discovered open port 143/tcp on 127.0.0.1 Discovered open port 993/tcp on 127.0.0.1 The SYN Stealth Scan took 0.00s to scan 7 total ports. Host localhost.localdomain (127.0.0.1) appears to be up ... good. Interesting ports on localhost.localdomain (127.0.0.1): PORT STATE SERVICE 25/tcp open smtp 110/tcp closed pop3 143/tcp open imap 465/tcp open smtps 587/tcp closed submission 993/tcp open imaps 995/tcp closed pop3s Nmap finished: 1 IP address (1 host up) scanned in 0.004 seconds Raw packets sent: 7 (308B) | Rcvd: 17 (724B)
      
      





この結論は、サーバーでSMTP / IMAPポートが使用可能であることを示していますが、

POP3プロトコル。



netstatを使用すると、多くの場合想定されるリスニングポートと使用済みポートだけでなく、これらのポートに関連付けられたプロセスも確認できます。 同じメールサーバーのnetstat出力を次に示します。



 # netstat -lnpvut ( -anpvut,       ) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 477/dovecot tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 477/dovecot tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 603/master tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 430/unbound tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 10042/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 603/master tcp 0 0 0.0.0.0:1025 0.0.0.0:* LISTEN 603/master tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 477/dovecot tcp 0 0 127.0.0.1:1953 0.0.0.0:* LISTEN 430/unbound tcp 0 0 127.0.0.1:1026 0.0.0.0:* LISTEN 603/master tcp 0 0 127.0.0.1:2025 0.0.0.0:* LISTEN 603/master tcp 0 0 :::22 :::* LISTEN 10042/sshd udp 0 0 127.0.0.1:53 0.0.0.0:* 430/unbound
      
      





この例では、IMAPとしてpostfixとdovecotがSMTPサーバーとして使用されます。 dovecot設定ではこのプロトコルは未使用として無効になっているため、POP3はリストにありません。



最新のディストリビューションでは、net-toolsパッケージはインストールされないことが多く、廃止されたと見なされます。 代わりにiprouteのssユーティリティが使用されます。 それはより狭く鋭く、その領域では、おそらくtcpdump / tsharkのようにフィルターを構成する機能を備えたより機能的なユーティリティです。 しかし、私は、彼女の情報出力がどのようにフォーマットされているのか気に入らないのです。 これを少し修正するには、sedを使用できます。



 # ss -lntp | sed -r 's/\t/ /g' Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 *:143 *:* users:(("dovecot",477,6),("imap-login",14400,4),("imap-login",15370,4),("imap-login",15372,4)) 0 0 *:2000 *:* users:(("dovecot",477,8),("managesieve-log",10229,4),("managesieve-log",10230,4),("managesieve-log",21149,4)) 0 0 *:465 *:* users:(("master",603,31)) 0 0 127.0.0.1:53 *:* users:(("unbound",430,4)) 0 0 *:22 *:* users:(("sshd",10042,4)) 0 0 *:25 *:* users:(("master",603,19)) 0 0 *:1025 *:* users:(("master",603,12)) 0 0 *:993 *:* users:(("dovecot",477,7),("imap-login",14400,5),("imap-login",15370,5),("imap-login",15372,5)) 0 0 127.0.0.1:1953 *:* users:(("unbound",430,5)) 0 0 127.0.0.1:1026 *:* users:(("master",603,16)) 0 0 127.0.0.1:2025 *:* users:(("master",603,28)) 0 0 :::22 :::* users:(("sshd",10042,3))
      
      





*)使いやすさのために、次のbash関数を〜/ .bashrcに入れることができます



 ss() { /sbin/ss $@ | sed -r 's/\t/ /g'; }
      
      







2.セッションの例



SMTP / IMAP / POP3プロトコルのサンプルセッションを次に示します。 接続には、telnetクライアントが使用されます。これは、システムにデフォルトでインストールされるか、リポジトリからインストールされます。



Debian / Ubuntu


 # apt-cache search telnet # apt-get install telnet
      
      





RHEL / CentOS / Fedora


 # yum search telnet # yum install telnet
      
      







テキストに入力されたコマンドは太字で示されています。



SMTP


 $ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mailserver at mail.server.net greets you. Make love not war!
      
      



 HELO localhost.localdomain
      
      



 250 mail.server.net
      
      



 MAIL FROM:<>
      
      



 250 2.1.0 Ok
      
      



 RCPT TO:<user@mail.server.net>
      
      



 250 2.1.5 Ok
      
      



 DATA
      
      



 354 End data with <CR><LF>.<CR><LF> FROM: root@localhost.localdomain TO: user@mail.server.net SUBJECT: test mail from test subject test body
      
      



 .
      
      



 250 2.0.0 Ok: queued as 1CF5FC0AAE QUIT 221 2.0.0 Bye Connection closed by foreign host.
      
      







IMAP


 $ telnet 127.0.0.1 143 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. * OK IMAP Server at mail.server.net ready
      
      



 001 LOGIN user@mail.server.net testpass
      
      



 001 OK completed
      
      



 002 CAPABILITY
      
      



 * CAPABILITY IMAP4 IMAP4REV1 ACL NAMESPACE UIDPLUS IDLE LITERAL+ QUOTA ID MULTIAPPEND LISTEXT CHILDREN BINARY LOGIN-REFERRALS STARTTLS AUTH=LOGIN AUTH=PLAIN AUTH=CRAM-MD5 AUTH=DIGEST-MD5 AUTH=MSN 002 OK completed
      
      



 003 SELECT Inbox
      
      



 * FLAGS (\Answered \Flagged \Deleted \Seen \Draft $MDNSent) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft $MDNSent)] limited * 7214 EXISTS * 0 RECENT * OK [UIDVALIDITY 306349424] UIDs valid * OK [UNSEEN 1] message 1 is first unseen 003 OK [READ-WRITE] SELECT completed
      
      



 004 FETCH 7214 body[header]
      
      



 * 7214 FETCH (BODY[header] {639} Return-Path: <> X-Antispam-passed: yes X-Antispam: yes X-Real-To: user@mail.server.net Received: from [127.0.0.1] (HELO mail.server.net) by mail.server.net ( SMTP 4.1.8) with ESMTP id 22561074 for user@mail.server.net; Sat, 01 Nov 2014 03:21:16 +0300 Received: from localhost.localdomain (localhost [127.0.0.1]) by mail.server.net (Postfix) with SMTP id 1CF5FC0AAE for <user@mail.server.net>; Sat, 1 Nov 2014 03:20:09 +0300 (MSK) FROM: root@localhost.localdomain TO: user@mail.server.net SUBJECT: test mail from test subject Message-Id: <20141101002009.1CF5FC0AAE@mail.server.net> Date: Sat, 1 Nov 2014 03:20:09 +0300 (MSK) FLAGS (\Seen)) 004 OK completed
      
      



 004 FETCH 7214 body
      
      



 * 7214 FETCH (BODY ("text" "plain" NIL NIL NIL "8bit" 13 2)) 004 OK completed 004 FETCH 7214 body[] * 7214 FETCH (BODY[] {652} Return-Path: <> X-Antispam-passed: yes X-Antispam: yes X-Real-To: user@mail.server.net Received: from [127.0.0.1] (HELO mail.server.net) by mail.server.net ( SMTP 4.1.8) with ESMTP id 22561074 for user@mail.server.net; Sat, 01 Nov 2014 03:21:16 +0300 Received: from localhost.localdomain (localhost [127.0.0.1]) by mail.server.net (Postfix) with SMTP id 1CF5FC0AAE for <user@mail.server.net>; Sat, 1 Nov 2014 03:20:09 +0300 (MSK) FROM: root@localhost.localdomain TO: user@mail.server.net SUBJECT: test mail from test subject Message-Id: <20141101002009.1CF5FC0AAE@mail.server.net> Date: Sat, 1 Nov 2014 03:20:09 +0300 (MSK) test body ) 004 OK completed
      
      



 005 LOGOUT
      
      



 * BYE IMAP closing connection 005 OK completed Connection closed by foreign host.
      
      







Pop3


 $ telnet 127.0.0.1 110 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. +OK POP3 Server 4.1.8 ready <137.1414802293@mail.server.net>
      
      



 USER test@mail.server.net
      
      



 +OK please send the PASS
      
      



 PASS testpass
      
      



 +OK 7214 messages (174404489 bytes)
      
      



 NOOP
      
      



 +OK cool
      
      



 TOP 7214
      
      



 +OK message follows Return-Path: <> X-Antispam-passed: yes X-Antispam: yes X-Real-To: test@mail.server.net Received: from [127.0.0.1] (HELO mail.server.net) by mail.server.net ( SMTP 4.1.8) with ESMTP id 22561074 for test@mail.server.net; Sat, 01 Nov 2014 03:21:16 +0300 Received: from localhost.localdomain (localhost [127.0.0.1]) by mail.server.net (Postfix) with SMTP id 1CF5FC0AAE for <test@mail.server.net>; Sat, 1 Nov 2014 03:20:09 +0300 (MSK) FROM: root@localhost.localdomain TO: test@mail.server.net SUBJECT: test mail from test subject Message-Id: <20141101002009.1CF5FC0AAE@mail.server.net> Date: Sat, 1 Nov 2014 03:20:09 +0300 (MSK) .
      
      



 RETR 7214
      
      



 +OK 652 bytes will follow Return-Path: <> X-Antispam-passed: yes X-Antispam: yes X-Real-To: test@mail.server.net Received: from [127.0.0.1] (HELO mail.server.net) by mail.server.net ( SMTP 4.1.8) with ESMTP id 22561074 for test@mail.server.net; Sat, 01 Nov 2014 03:21:16 +0300 Received: from localhost.localdomain (localhost [127.0.0.1]) by mail.server.net (Postfix) with SMTP id 1CF5FC0AAE for <test@mail.server.net>; Sat, 1 Nov 2014 03:20:09 +0300 (MSK) FROM: root@localhost.localdomain TO: test@mail.server.net SUBJECT: test mail from test subject Message-Id: <20141101002009.1CF5FC0AAE@mail.server.net> Date: Sat, 1 Nov 2014 03:20:09 +0300 (MSK) test body .
      
      



 DELE 7214
      
      



 +OK marked deleted
      
      



 QUIT
      
      



 +OK POP3 Server connection closed Connection closed by foreign host.
      
      









3.サーバーの認証を確認します



既存の認証方法:ログイン、プレーン、CRAM-MD5、DIGEST-MD5、GSSAPI、NTLM / MSN、外部。 リストはさらに広くなりますが、最も一般的なもの、つまりLOGIN、PLAIN、CRAM-MD5のみを検討します。



まず、サーバーでサポートされているメソッドのリストを見つける必要があります。 メールプロトコルごとに、使用可能なプロトコル拡張に関する他の情報とともにこのデータを取得できるコマンドがあります。 メールサーバーの設定によっては、SSL / TLSを介して暗号化を初期化しないと、データをクリアな形式で送信するLOGINおよびPLAINを使用できない場合があります。



したがって、利用可能な認証方法の結論:



SMTPプロトコル



EHLO domainnameコマンド


 $ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mailserver ESMTP ready.
      
      



 EHLO localhost.localdomain
      
      



 250-mal.server.net 250-PIPELINING 250-SIZE 104857600 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 250-ENHANCEDSTATUSCODES 250 8BITMIME ^] telnet> quit Connection closed.
      
      







IMAP



チーム001の能力


dovecotなど、一部のメールサーバーでは、この情報が「サーバーグリーティング」に表示される場合があります。



 $ telnet 127.0.0.1 143 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5] Dovecot ready.
      
      



 001 CAPABILITY
      
      



 * CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS XEXEC QUOTA STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5 001 OK Capability completed.
      
      



 002 LOGOUT
      
      



 * BYE Logging out 002 OK Logout completed. Connection closed by foreign host.
      
      







POP3プロトコル



AUTHまたはCAPAコマンド


 $ telnet pop.mail.ru 110 Trying 217.69.139.74... Connected to pop.mail.ru. Escape character is '^]'. +OK
      
      



 AUTH
      
      



 +OK methods supported: LOGIN PLAIN .
      
      



 CAPA
      
      



 +OK Capability list follows TOP USER LOGIN-DELAY 120 EXPIRE NEVER UIDL IMPLEMENTATION Mail.Ru SASL LOGIN PLAIN STLS .
      
      



 QUIT
      
      



 +OK POP3 server at signing off Connection closed by foreign host.
      
      







使用される許可の例と形式



ログイン



SMTPプロトコル


 $ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.server.net ESMTP Server
      
      



 EHLO client.server.net
      
      



 250-mail.server.net Hello client.server.net 250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI 250-ENHANCEDSTATUSCODES 250 STARTTLS
      
      



 AUTH LOGIN
      
      



 334 VXNlcm5hbWU6
      
      



 dGVzdA==
      
      



 334 UGFzc3dvcmQ6
      
      



 dGVzdHBhc3M=
      
      



 235 2.7.0 Authentication successful
      
      



 QUIT
      
      



 221 2.0.0 Bye
      
      







「dGVzdA ==」はログイン、「dGVzdHBhc3M =」はbase64形式のパスワードです。 彼についてもう少し低い。 ユーザー名とパスワードの両方を改行なしでエンコードする必要があることに注意してください。



平野



SMTPプロトコル


 $ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.server.net ESMTP Server
      
      



 EHLO client.server.net
      
      



 250-mail.server.net Hello client.server.net 250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI 250-ENHANCEDSTATUSCODES 250 STARTTLS
      
      



 AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz
      
      



 235 2.7.0 Authentication successful
      
      



 QUIT
      
      



 221 2.0.0 Bye
      
      





「dGVzdAB0ZXN0AHRlc3RwYXNz」はbase64形式のログインパスワードです。 以下では、base64形式への変換とその逆の変換のオプションを検討します。



CRAM-MD5



以前のCRAM-MD5認証方法とは異なり、パスワードはクリアテキストで送信されず、代わりにハッシュ比較が使用されます。 いくつかの変換を実行する必要があり、コマンドを入力する時間が限られているため、この認証方法の手動検証は問題になる可能性があります。 プロセスを簡素化するために、以下はユーザー名、パスワード、および「コードワード」(サーバーによって発行される)を受け取り、それらをbase64形式の文字列に変換する単純なperlスクリプトです。



スクリプトには、追加のperlモジュール「Digest-HMAC」が必要です。 Debian / Ubuntuでは、次のように見つけてインストールできます。



 # apt-cache search perl | grep -i digest # apt-get install libdigest-hmac-perl
      
      





RHEL / CentOS / Fedoraの場合:



 # yum search perl | grep -i digest # yum install perl-Digest-HMAC
      
      





リポジトリにこのパッケージが含まれていないディストリビューション(これはほとんどありません)では、CPANからモジュールインストールを使用できます。



スクリプトとその使用例のセッション:



 #!/usr/bin/perl -W use strict; use MIME::Base64 qw(encode_base64 decode_base64); use Digest::HMAC_MD5; die "Usage: $0 username password ticket\n" unless $#ARGV == 2; my ($username, $password, $ticket64) = @ARGV; my $ticket = decode_base64($ticket64) or die ("Unable to decode Base64 encoded string '$ticket64'\n"); my $password_md5 = Digest::HMAC_MD5::hmac_md5_hex($ticket, $password); print encode_base64 ("$username $password_md5", "");
      
      







SMTPプロトコル


 $ telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.server.net ESMTP Server
      
      



 EHLO client.server.net
      
      



 250-mail.server.net Hello client.server.net 250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI 250-ENHANCEDSTATUSCODES 250 STARTTLS
      
      



 AUTH CRAM-MD5
      
      



 ##  ,  : PDMzMjE2NDkzMTA1OTExNDQuMTQxNDc5NTExOUBtYWlsLnNlcnZlci5uZXQ+
      
      



 dGVzdCAxNTU0YTQwNzA1NTgxZjUwZmI1MmNjZDhlZDhjM2EyYg==
      
      



 235 2.7.0 Authentication successful
      
      



 QUIT
      
      



 221 2.0.0 Bye # ./md5cram.pl test testpass PDMzMjE2NDkzMTA1OTExNDQuMTQxNDc5NTExOUBtYWlsLnNlcnZlci5uZXQ+ dGVzdCAxNTU0YTQwNzA1NTgxZjUwZmI1MmNjZDhlZDhjM2EyYg==
      
      







IMAP


 $ telnet 127.0.0.1 143 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5] Dovecot ready.
      
      



 01 AUTHENTICATE CRAM-MD5
      
      



 + PDgxOTAyMjA2NTYwNzcyMzEuMTQxNDc5NzA3MkBtYWlsLnNlcnZlci5uZXQ+
      
      



 dGVzdCA1YTZlNjYwMDlmZGJlZWNjYWRlNDY5M2FlMjU5YTA2ZQ==
      
      



 01 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS XEXEC QUOTA] Logged in
      
      



 02 LOGOUT
      
      



 * BYE Logging out 02 OK Logout completed. Connection closed by foreign host. # ./md5cram.pl test testpass PDgxOTAyMjA2NTYwNzcyMzEuMTQxNDc5NzA3MkBtYWlsLnNlcnZlci5uZXQ+ dGVzdCA1YTZlNjYwMDlmZGJlZWNjYWRlNDY5M2FlMjU5YTA2ZQ==
      
      







base64との間でテキストを変換する方法



承認には、base64エンコード文字列の交換が含まれます。 Linuxの場合、base64への変換およびその逆変換を行うためのユーティリティが多数あります。 実行方法など、いくつかを示します。 Windowsの場合、クロスプラットフォームのperl、python、phpを使用できます。また、サンプルも提供されます。



ユーティリティ(パッケージ)



base64(coreutils)



 $ printf 'test\0test\0testpass' | base64 dGVzdAB0ZXN0AHRlc3RwYXNz $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | base64 -d testtesttestpass
      
      





uueencode / uudecode(sharutils)



 $ printf 'test\0test\0testpass' | uuencode -m - begin-base64 644 - dGVzdAB0ZXN0AHRlc3RwYXNz ====
      
      





デコードするには、最初と最後の行を追加する必要があります。 これは、たとえば次の方法で実行できます。



 printf 'begin-base64 644 -\ndGVzdAB0ZXN0AHRlc3RwYXNz\n====' | uudecode
      
      





または



 $ uudecode<<EOF begin-base64 644 - dGVzdAB0ZXN0AHRlc3RwYXNz ==== EOF
      
      





mmencode(xemacs21-bin)



 $ printf 'test\0test\0testpass' | mmencode dGVzdAB0ZXN0AHRlc3RwYXNz $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | mmencode -u testtesttestpass
      
      





python(パイソン)



 $ printf 'test\0test\0testpass' | python -m base64 dGVzdAB0ZXN0AHRlc3RwYXNz $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | python -m base64 -d
      
      





php(php-cli)



 $ printf 'test\0test\0testpass' | php -r 'echo base64_encode(fgets(STDIN));' dGVzdAB0ZXN0AHRlc3RwYXNz $ php -r 'echo base64_decode($argv[1]);' dGVzdAB0ZXN0AHRlc3RwYXNz testtesttestpass
      
      





perl(perl)



MMIME :: Base64モジュールが標準で含まれています。



 $ perl -MMIME::Base64 -e 'print encode_base64("test\0test\0testpass")' dGVzdAB0ZXN0AHRlc3RwYXNz $ perl -MMIME::Base64 -e 'print decode_base64("dGVzdAB0ZXN0AHRlc3RwYXNz")' testtesttestpass
      
      







openssl(openssl)



 $ printf 'test\0test\0testpass' | openssl base64 dGVzdAB0ZXN0AHRlc3RwYXNz $ echo dGVzdAB0ZXN0AHRlc3RwYXNz | openssl base64 -d testtesttestpass
      
      









4. SSL / TLS暗号化を確認します。



SSL / TLSは、クライアントとサーバー間のメールプロトコルでトラフィックを暗号化する2つの方法で使用されます。 SSL / TLSのインストールが最初に実行され、その後通常のメールトラフィックが既にその上にある、接続時の特別なポートの使用。 ちなみに、この方法は、SMTPに関しては非推奨です。 2番目のオプション、より望ましいオプションは、サービスの通常のポートに接続し、STARTTLS拡張を使用してセッションを暗号化された形式に切り替えることです。



SSL / TLS上でメールサーバーの動作をテストするには、opensslユーティリティを使用して、telnet経由の通常のセッションのように進めます。



SMTP



 $ openssl s_client -starttls smtp -crlf -connect mail.truevds.ru:25 $ openssl s_client -starttls smtp -crlf -connect mail.truevds.ru:587 $ openssl s_client -crlf -connect mail.truevds.ru:465
      
      







Pop3



 $ openssl s_client -connect mail.truevds.ru:995 $ openssl s_client -starttls pop3 -crlf -connect mail.truevds.ru:110
      
      







IMAP



 $ openssl s_client -crlf -connect mail.truevds.ru:993 $ openssl s_client -starttls imap -crlf -connect mail.truevds.ru:143
      
      







暗号化に使用するもの、ssl3またはtls1、および特定のアルゴリズムを明示的に指定できます。



 $ openssl s_client -ssl3 -starttls smtp -crlf -connect mail.truevds.ru:25
      
      







opensslのバージョンでサポートされているプロトコルのリストを表示します。



 $ openssl ciphers -ssl3 $ openssl ciphers -tls1
      
      







以下のtsharkの章で、この機能は実用的な目的で使用されます。



5. tsharkを使用したメールトラフィックの分析。 SSL / TLS復号化



ログでサーバーまたはクライアントの問題に関する十分な情報が得られない場合、より複雑な診断が必要な場合は、tcpdump / wiresharkを使用して、クライアントとサーバー間のセッション自体を分析できます。 リアルタイムと、後で分析するためのダンプセッションの保存の両方。 すばやく分析するには、コンソールバージョンのwireshark-tsharkを使用すると便利です。 動作するにはルート権限が必要です。



Tsharkは理解しやすい方法で情報を提供し、非常に使いやすいです。



SMTP



 # tshark -i eth0 -f "port 25" -R smtp
      
      







IMAP



 # tshark -i eth0 -f "port 143" -R imap
      
      







Pop3



 # tshark -i eth0 -f "port 110" -R pop
      
      







tcpdumpを使用したさらなる分析のためのトラフィックの記録| dumpcapユーティリティ(wiresharkから):



 # tcpdump -s0 -nn -i eth0 -w smtps.pcap port 465 and host HOSTIP # dumpcap -s0 -i eth0 -w smtp.pcap -f 'port 25 and host HOSTIP'
      
      







ここで、HOSTIPは反対側のサーバーまたはクライアントのIPアドレスであり、分析するセッションです。 そしてその後の読書:



 # tshark -n -r smtp.pcap -R smtp
      
      







多くの場合、メールプロトコルでは暗号化が積極的に使用されており、この方法でセッションを確認することはできません。 それでも、この問題は全体として解決されています。 tsharkは、サーバーの秘密キーへのアクセスがある場合、「サーバー側から」SSL / TLSトラフィックを復号化できます(クライアントには、マスターキーを使用するオプションがあります。詳細はwiki.wireshark.org/SSL )。 幸いなことにまたは残念なことに、秘密鍵を使用するWiresharkは、使用されるすべてのアルゴリズムを復号化できない場合があります。 たとえば、DHE- * EXP-*、EDH- *は機能しません。 おそらく、これらのアルゴリズムの一部は、プログラムの以降のバージョンで追加されました。



テストプロセスでは、特定のアルゴリズムに接続するときに明示的に表示されたopensslユーティリティが使用されました。 トラフィックの復号化が成功した検証済みオプション:







opensslのバージョンでサポートされているプロトコルのリストを表示します。



 # openssl ciphers -ssl3 # openssl ciphers -tls1
      
      







実際のセッションを分析するために、メールサーバーの構成で無効にすることができます(テスト時間のみ)。明らかに動作しているアルゴリズムを除くすべてのアルゴリズム。



Tsharkは、キーがあるサーバー、およびローカルコンピューター上のopensslクライアントで実行されます。 しかし、もちろん、これは必要ではありません。別のコンソールのクライアントでtsharkを実行できます。秘密キーをローカルコンピューターにコピーするだけです。 また、opensslは、tsharkに隣接するウィンドウの画面で実行できます。



だから実行:



 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,25,smtp,/etc/pki/tls/private/server.key" -R smtp $ printf "EHLO RC4-MD5\nEXIT" | openssl s_client -starttls smtp -crlf -tls1 -cipher RC4-MD5 -connect mail.truevds.ru:25 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,465,smtp,/etc/pki/tls/private/server.key" -R smtp $ printf "EHLO RC4-MD5\nEXIT" | openssl s_client -ssl3 -cipher RC4-SHA -connect mail.truevds.ru:465 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,143,imap,/etc/pki/tls/private/server.key" -R imap $ printf "* CAPABILITY\nLOGOUT" | openssl s_client -starttls imap -crlf -tls1 -cipher RC4-MD5 -connect mail.truevds.ru:143 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,993,imap,/etc/pki/tls/private/server.key" -R imap $ printf "* CAPABILITY\nLOGOUT" | openssl s_client -crlf -ssl3 -cipher RC4-MD5 -connect mail.truevds.ru:993 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,110,pop,/etc/pki/tls/private/server.key" -R pop $ printf "USER RC4-MD5\nEXIT" | openssl s_client -starttls pop -crlf -tls1 -cipher RC4-MD5 -connect mail.truevds.ru:110 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,995,pop,/etc/pki/tls/private/server.key" -R pop $ printf "USER RC4-MD5\nEXIT" | openssl s_client -crlf -ssl3 -cipher RC4-MD5 -connect mail.truevds.ru:995
      
      







ここで、 94.127.66.53



はクライアントが接続しているサーバーのIPアドレスです/etc/pki/tls/private/server.key



はサーバーの秘密キーへのパスです。 秘密鍵は通常、サーバーに応じて/etc/pki



または/etc/ssl



にあります。 この情報は、メールサーバー自体の設定で表示できます。



後置の例:



 $ grep key_file /etc/postfix/main.cf smtpd_tls_key_file = /etc/pki/tls/private/server.key smtp_tls_key_file = /etc/pki/tls/private/server.key
      
      







ポートの代わりにstarttlsが使用されるポートの場合、公式ドキュメントではstart_tlsの使用が推奨されています。 たとえば、 ssl.keys_list:94.127.66.53,start_tls,smtp,/etc/pki/tls/private/server.key



代わりにssl.keys_list:94.127.66.53,25,smtp,/etc/pki/tls/private/server.key



しかし、このオプションは機能しませんでした。暗号化が初期化されるまでトラフィックは表示されませんでした。



SSL / TLS復号化プロセスをデバッグするには、 -o "ssl.debug_file: /tmp/debug.log"



オプション-o "ssl.debug_file: /tmp/debug.log"



使用します



復号化されたトラフィックの出力例:



 # tshark -i eth0 -n -o "ssl.keys_list:94.127.66.53,25,smtp,/etc/pki/tls/private/server.key" -R "smtp" Running as user "root" and group "root". This could be dangerous. Capturing on eth0 0.178964 94.127.66.21 -> 94.127.66.53 SMTP C: EHLO RC4-MD5 | EXIT 0.179357 94.127.66.53 -> 94.127.66.21 SMTP 250-mail.truevds.ru | 250-PIPELINING | 250-SIZE 104857600 | 250-ETRN |
      
      









6.資料へのリンク





メールの問題を解決するために頑張ってください!










All Articles