SORACOM NapterのTLSオプションの暗号化をNginx TCPプロキシで解く

SORACOM NapterのTLS暗号化を、NginxのTCPプロキシで解く構成をご紹介します。
2019.12.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。ちょっと久しぶりにSORACOMネタを。

SORACOM Napterはオンデマンドリモートアクセスサービスとして、IoTデバイスへのセキュアなリモートアクセスを提供します。セキュアを謳っている理由は、設定が一時的であることや接続元グローバルIPアドレスが絞れることがあるのですが、もう一つ、インターネットを経由する部分をTLSで暗号化するオプションがあります。以下の図のような感じです。

例えば、IoTデバイスへのHTTP通信をインターネットを経由する部分だけHTTPSで扱えるようになっており、安全に通信するための一助とすることができます。

一方で、クライアントのアプリケーションがTLSを含んだプロトコルをサポートする必要があり、HTTP以外の一般的なプロトコルに適用するのはハードルが高いことがあります。そこで今回はNginxのTCPプロキシを用いて、TLSの暗号化をプロキシで解き、一般的なクライアントアプリケーションから通信する構成をご紹介します。

今回は動作確認のためにtelnetのリモートログインを試してみます。

動作確認環境

  • IoTデバイス
    • Raspberry Pi 3 B+, Raspbian Buster Lite
    • LTEドングル Huawei MS2372h-607
  • SORACOM IoT SIM
    • 特定地域向けSIM plan-D
  • クライアント
    • Macbook macOS Mojave 10.14.6
    • Homebrew 2.2.1

1. デバイスとNapterの構成

Raspbian Buster Liteにはデフォルトでtelnetdがインストールされていないため、インストールします。

$ sudo apt update
$ sudo apt install telnetd

続いてリモートからRaspberry Piのtelnetdにアクセスするために、デバイス側ポート 23番、TLSありでNapterを構成します。

これでOKです。表示されるIPアドレスの NapterのIPアドレス:ポート番号 をメモしておきましょう。

2. Nginxの構成

続いてクライアントPCにNginxをインストールし、TCPプロキシを構成します。今回はHomebrewを利用しました。

$ brew install nginx

HomebrewでインストールしたNginxの構成ファイルは/usr/local/etc/nginx/nginx.confなので、末尾に以下のTCPプロキシの設定を追加します。今回は待ち受けポート番号を18080にしてみました(任意のポート番号で構いません)。

nginx.conf

stream {
    error_log /usr/local/var/log/nginx/stream.log info;
    proxy_ssl  on;

    upstream napter {
        server <NapterのIPアドレス>:<Napterのポート番号>;
    }

    server {
        listen 18080;
        proxy_pass napter;
    }
}
  • 120行目 : NapterのTLS通信に対応するオプション
  • 123行目 : 手順1で表示されたIPアドレスとポート番号を設定

ファイルを保存したらNginxを実行します。

$ nginx

動作確認

では、おもむろにtelnetクライアントから接続してみます。

$ brew install telnet
$ telnet localhost 18080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Password:

Login incorrect
raspberrypi login: pi
Password:
Last login: Fri Dec 13 06:01:37 GMT 2019 from 100.127.10.16 on pts/0
Linux raspberrypi 4.19.50-v7+ #896 SMP Thu Jun 20 16:11:44 BST 2019 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $

初回の接続はユーザー名の入力がスキップされてしまうので、ログインを失敗させ再度ユーザー名/パスワードを入力してログインできます。

まとめ

SORACOM NapterのTLS暗号化を、NginxのTCPプロキシで解く構成をご紹介しました。今回はtelnetで試してみましたが、単一ポートを使用する一般的なTCP通信であれば汎用的に使えると思います。あんなプロトコルやこんなプロトコルをセキュアに接続してみてください!

参考URL