Stunnel

From ArchWiki
Jump to navigation Jump to search

stunnel (“Secure Tunnel”) とは:

普遍的な TLS/SSL トンネリングサービスを提供するマルチプラットフォームのアプリケーション。一種のプロキシとして、プログラムのコードに変更を加えることなく既存のクライアントとサーバーに TLS 暗号機能を追加します。セキュリティ・ポータビリティ・スケーラビリティ (ロードバランス含む) を考えて作られており、大規模なシステムでも使えます。OpenSSL を使用しており、ライセンスは GNU GPL バージョン 2 以降で OpenSSL だけ例外です。

トンネリングできるのは TCP パケットだけです。FAQ には UDP に関する記載があります。WireGuard は UDP もトンネリング可能です。

認証を使うことで許可したクライアントだけサーバーにアクセスできるようになります。

インストール

stunnel パッケージをインストールしてください。

使い方によってはユニットファイルを編集することで依存関係を適切に扱えます。システムの起動時に stunnel を立ち上げたい場合は有効化してください。

設定

メインの設定ファイルは /etc/stunnel/stunnel.conf です。ini 形式のファイルとなっています。グローバルセクションとそれぞれのサービスのセクションに分かれています。

クライアントは TLS で暗号化されていないデータを受け取ります。Stunnel は TLS でデータを暗号化して stunnel サーバーに接続します。stunnel サーバーは TLS で暗号化されたデータを受け取って解凍します。それから、データが送られるべきところに接続します。

デフォルトの debug 値は 5 ですが、出力が多すぎるかもしれません。設定に問題がないと確認できたら、設定ファイルで値を低くすると良いでしょう:

/etc/stunnel/stunnel.conf
debug = 3

セキュリティを高めるために、グローバルセクションとサービスごとのセクションで、root 以外の適切な uid と gid を明示的に設定することが推奨されます。setuidsetgid で設定することが可能です。

バイトオーダーマーク (BOM)

設定ファイルには UTF-8 バイトオーダーマーク (BOM) がファイルの冒頭に必要です。BOM はユニコード文字 U+FEFF です。UTF-8 表現は (16進数の) バイト順で 0xEF, 0xBB, 0xBF となります。以下のコマンドを実行することでこれらのバイトを書き込んでファイルを作成できます:

# echo -e '\xef\xbb\xbf; BOM composed of non printable characters. It is here, before the semicolon!' > /etc/stunnel/stunnel.conf

バイトオーダーマークを確認するには次のコマンドを実行:

% od --address-radix=n --format=x1c --read-bytes=8 /etc/stunnel/stunnel.conf
  ef  bb  bf  3b  20  42  4f  4d
 357 273 277   ;       B   O   M

cat を使ったりテキストエディタでファイルの中身を確認しても、基本的に BOM バイトは表示されません。そのため、上記の od コマンドなどで確認する必要があります。

認証

クライアントのサーバーのどちらか、あるいは両方を認証するようにしてください。事前共有鍵、もしくは鍵と証明書のペアを使うことができます。事前共有鍵は SCP と SFTP など他の方法を使って必要なマシンに転送してください。転送が可能な場合、事前共有鍵が最速です。事前共有鍵を使用する場合の設定例:

クライアント:/etc/stunnel/stunnel.conf
; BOM composed of non printable characters. It is here, before the semicolon!
setuid = stunnel
setgid = stunnel

[trivial client]
client     = yes
accept     = 127.0.0.1:<src_port>
connect    = <server_host>:<server_port>
debug      = 3
PSKsecrets = /etc/stunnel/psk.txt
setuid     = stunnel
setgid     = stunnel
サーバー:/etc/stunnel/stunnel.conf
; BOM composed of non printable characters. It is here, before the semicolon!
setuid = stunnel
setgid = stunnel

[trivial server]
accept     = <server_port>
connect    = <dst_port>
ciphers    = PSK
debug      = 3
PSKsecrets = /etc/stunnel/psk.txt
setuid     = stunnel
setgid     = stunnel

/etc/stunnel/psk.txt は以下のコマンドで作成できます:

# openssl rand -base64 -out /etc/stunnel/psk.txt 180
# sed --in-place '1s/^/psk:/' /etc/stunnel/psk.txt

どちらか片方のマシンで作成したら別のマシンにコピーしてください。psk.txt ファイルのパーミッションは適切に設定してください。sed コマンドの psk は例としてあげている適当な文字列です。stunnel(8) を読んでください。

ヒントとテクニック

DNS over TLS

BIND には問い合わせと回答を暗号化する機能が組み込まれていません。Bind のナレッジベースでは stunnel の使用が提案されています。https://kb.isc.org/docs/aa-01386 を見てください。ページの下部では Unbound について触れられています。クライアントとサーバーの両方でシェルアカウントしか持っていないユーザーで、リゾルバとネームサーバーが DNS over TLS をサポートしていなくても DNS 通信をトンネル化可能です。

Stunnel TLS で NFSv4 を暗号化

Encrypting NFSv4 with Stunnel TLS を見てください。

参照