現代のTelnetは暗号化できる
この記事はImaizumi Lab Advent Calendarの6日目です。
はじめに
「Telnetは暗号化しないからセキュリティ的に危険」と教わった人は多いでしょう。
ところが、特定の条件下だとTelnetでも暗号化する場合があります。
先日行われたjusのUNIX歴史講座で「今のtelnetは暗号化する」という話題が出て、Twitterの方で知らなかったと言ってる方がちらほらいらっしゃったので意外と知られていないのかと思い記事を書くことにしました。
(その話題は動画だと35:00ごろ)
関連するRFC
という関連したRFCが存在します。ざっと眺めたところ、暗号化の方式ごとに議論されているようです。
実装を調べる
man
BSD General Commands Manual、Ubuntu manpagesを見る限りだと、encryptオプションなるものが存在するようです。ただし、
とのことです。
現在のバージョンの telnet は、暗号化をサポートしていない点に注意すること。
という記述がmanページにあるケースとないケースがあったため、なければ対応しているのかも?
どちらにしてもデフォルトで暗号化されるというわけではなさそうです。
ソースを読む(BSD)
BSDでは少なくとも10年ほど前から暗号化がサポートされているようです。FreeBSDのtelnet.cの実装を見ると、encrypt.hというヘッダファイルを読み込んでいます。
以下特に関連しそうなソースです。
https://svnweb.freebsd.org/base/head/contrib/telnet/telnetd/telnetd.c?view=markup#l53
https://svnweb.freebsd.org/base/head/contrib/telnet/libtelnet/encrypt.h?view=markup
https://svnweb.freebsd.org/base/head/contrib/telnet/libtelnet/encrypt.c?view=markup
https://svnweb.freebsd.org/base/head/contrib/telnet/libtelnet/enc_des.c?view=markup
(BSDに関しては参考文献一つめの@bakamingさんの記事及び研究室の先生にご教示いただきました)
どうやらBSDの実装では共通鍵暗号方式(DES)を採用しているようです。
パッケージ
https://pkgs.org/search/?q=telnet
パッケージ検索で調べてみると、Ubuntuにtelnet-sslという実装があるようです。その名の通り、SSLをサポートしたTelnetのようです。
Dockerで試してみる
Ubuntuのtelnet-sslをDockerで試してみます。telnet-serverの方でtcpdumpを用いてパケットをキャプチャしてみます。
こちらのリポジトリに入っているので、すぐに試すことができます。*1
ちなみにUbuntu20.04からSSLのセキュリティレベルが上がった関係で、20.04ではうまく動かないようです。私は18.04で試しています。
詳しくはリポジトリのREADME.mdをご覧ください。
Wiresharkでキャプチャを開いてみる
暗号化した場合としなかった場合、それぞれのキャプチャファイルをWiresharkで開き、「分析>追跡>TCPストリーム」で見てみましょう。
普通のTelnetの方はログインユーザ、パスワードが全て書かれています。一方、暗号化されたTelnetの方はよく分からない文字列になっています。
おわりに
暗号化するTelnetは確かにRFCに記載があり、実装もあることがわかりました。また、暗号化されていることをWiresharkを使って確認することができました。
ただし「現代のTelnetは暗号化できる」だとちょっと語弊がありますね。厳密には「現代のTelnetは暗号化できる(こともある)」ってところでしょうか。
参考文献
docker間通信をtcpdumpしてpcapをいじる - やる
Dockerでたてたコンテナにtelnet-serverを入れて、telnetでコンテナ間通信ができるようにしてみた - 君は心理学者なのか?