Stunnelおよびredis-cliを使用してTLS経由で管理対象Redisインスタンスに接続する方法

前書き

管理されたhttps://redis.io/[Redis]インスタンスは、高可用性や自動更新などの利点を提供できます。 ただし、リモートデータベースサーバーに接続するたびに、悪意のあるアクターhttps://en.wikipedia.org/wiki/Sniffing_attack[sniffing]に送信する機密情報のリスクがあります。

https://redis.io/topics/rediscli [+ redis-cli +](Redisコマンドラインインターフェイス)は、https://en.wikipedia.org/wiki/Transport_Layer_Security [TLS]を介した接続をネイティブにサポートしていません。ネットワークを介した安全な通信を可能にする暗号化プロトコル。 これは、追加の設定がなければ、 `+ redis-cli +`はリモートRedisサーバーに接続する安全な方法ではないことを意味します。 管理されたRedisインスタンスへの安全な接続を確立する1つの方法は、TLSプロトコルを使用するhttps://en.wikipedia.org/wiki/Tunneling_protocol[tunnel]を作成することです。

Stunnelは、安全なトンネルを作成するために使用されるオープンソースプロキシであり、TLSを介して他のマシンと通信できます。 このガイドでは、stunnelのインストールと設定を順を追って説明し、 `+ redis-cli +`を使用してTLS経由で管理対象Redisインスタンスに接続できるようにします。

前提条件

このガイドを完了するには、次のものが必要です。

  • Ubuntu 18.04サーバーへのアクセス。 このサーバーには、管理権限を持つ非rootユーザーと、「+ ufw +」で設定されたファイアウォールが必要です。 これを設定するには、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [Ubuntu 18.04の初期サーバーセットアップガイド]に従ってください。

  • 管理されたRedisデータベースインスタンス。 このチュートリアルで概説した手順は、DigitalOcean Managed Redis Databaseでテストされましたが、一般的にクラウドプロバイダーの管理されたデータベースで機能するはずです。 DigitalOcean Managed Redisデータベースをプロビジョニングするには、https://www.digitalocean.com/docs/databases/redis/how-to/create/ [Managed Redis製品ドキュメント]に従ってください。

ステップ1-Stunnelとredis-cliのインストール

Redisサーバーをインストールすると、通常は + redis-cli`にパッケージ化されます。 ただし、デフォルトのUbuntuリポジトリから `+ redis-tools`パッケージをインストールすることで、Redisサーバーなしで + redis-cli`をインストールできます。 `+ stunnel4 +`パッケージをダウンロードして、デフォルトのUbuntuリポジトリからstunnelをインストールすることもできます。

最初に、サーバーのパッケージインデックスを最近更新していない場合は更新します。

sudo apt update

次に、APTで `+ redis-tools `および ` stunnel4 +`パッケージをインストールします。

sudo apt install redis-tools stunnel4

プロンプトが表示されたら、 `+ ENTER +`を押して、パッケージをインストールすることを確認します。

次のコマンドを実行して、stunnelが正しくインストールされ、そのhttps://en.wikipedia.org/wiki/Systemd[systemd]サービスが機能しているかどうかを確認できます。

sudo systemctl status stunnel4
Output● stunnel4.service - LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)
  Loaded: loaded (/etc/init.d/stunnel4; generated)
  Active: active (exited) since Thu 2019-09-12 14:34:05 UTC; 8s ago
    Docs: man:systemd-sysv-generator(8)
   Tasks: 0 (limit: 2362)
  CGroup: /system.slice/stunnel4.service

Sep 12 14:34:05 stunnel systemd[1]: Starting LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)...
Sep 12 14:34:05 stunnel stunnel4[2034]: TLS tunnels disabled, see /etc/default/stunnel4
Sep 12 14:34:05 stunnel systemd[1]: Started LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons).

ここでは、プロセスはすぐに終了しましたが、stunnelサービスがアクティブであることがわかります。 これは、stunnelが実行されていることを示していますが、まだ構成していないため、実際には何もできません。

ステップ2-Stunnelの構成

最新のLinuxシステムは、サービスとデーモンの初期化と管理をsystemdに依存しています。 ただし、stunnelは、古いhttps://en.wikipedia.org/wiki/UNIX_System_V[UNIX System V] initシステムに基づくSysVスタイルのinitスクリプトを使用して起動します。 この初期化スクリプトを有効にするには、 `+ / etc / default / stunnel4 +`ファイルを変更する必要があります。

任意のテキストエディターでこのファイルを開きます。 ここでは、 `+ nano +`を使用します。

sudo nano /etc/default/stunnel4

ファイルの上部にある `+ ENABLED `オプションを見つけます。 デフォルトでは「+0」に設定されますが、これを「1」に変更して、起動時にstunnelを起動できるようにします。

/ etc / default / stunnel4

# /etc/default/stunnel
# Julien LEMOINE <[email protected]>
# September 2003

# Change to one to enable stunnel automatic startup
ENABLED=
. . .

ファイルを保存して閉じます。 ファイルの編集に「+ nano 」を使用した場合は、「 CTRL + X 」、「 Y 」、「 ENTER +」の順に押して編集します。

次に、stunnelの構成ファイルを作成して、プログラムにトラフィックをルーティングする必要がある場所を指示する必要があります。

`+ / etc / stunnel `ディレクトリの下にある ` stunnel.conf +`という新しいファイルを開きます:

sudo nano /etc/stunnel/stunnel.conf

このファイルに次のコンテンツを追加します。

/etc/stunnel/stunnel.conf

fips = no
setuid = nobody
setgid = nogroup
pid =
debug = 7
[redis-cli]
 client = yes
 accept = 127.0.0.1:8000
 connect = :

ファイルの最初の5行は_global options_です。つまり、このファイルに含めるすべてのサービスに適用されます。

  • + fips +:スタンネルのFIPS 140-2モードを有効または無効にします。 このモードでは、stunnelは接続がhttps://en.wikipedia.org/wiki/FIPS_140-2 [連邦情報処理標準]を満たしていることを検証します。 これを「+ no +」に設定すると、この機能が無効になります。 これを無効にすることは、それほど安全ではありませんが、それを有効にする(デフォルトで)には、追加の設定が必要になることに注意してください。

  • + setuid +:stunnelが実行されるUnixユーザーIDを定義します。 デフォルトでは、stunnelプロセスの所有者は* root ユーザーです。 ただし、https://www.stunnel.org/config_unix.html [stunnel documentation勧告]では、トンネルの開始後に管理者権限を落とすことをお勧めします。そうしないと、セキュリティ上のリスクが生じます。 `+ setuid `パラメータを ` nobody +`に設定すると、トンネルが確立されると、非特権ユーザーの nobody *がstunnelプロセスの所有権を取得します。

  • + setgid +:stunnelが実行されるUnixグループIDを定義します。 `+ setuid +`と同様に、この設定は潜在的なセキュリティ問題を回避するために、特別な特権のないグループ(* nogroup *)を指定します。

  • + pid +:stunnelがプロセスのhttps://en.wikipedia.org/wiki/Process_identifier[PID]を含むファイルの一種である `+ .pid `ファイルを作成するファイルの場所を定義します。 ` .pid `ファイルは、通常、実行中のプロセスのPIDを見つけるために他のプログラムによって使用されます。 デフォルトでは、stunnelは ` / var / run / stunnel4 / `ディレクトリに ` .pid `ファイルを作成します。 * nobody *ユーザーにはそのディレクトリへのアクセス許可がないため、トンネルが正しく開始されません。 この設定では、「 pid 」パラメータに引数を指定しないことで、この動作を無効にします。このチュートリアルでは、「。pid 」ファイルは必要ないためです。 ただし、ユースケースで ` .pid +`ファイルが必要な場合は、* nobody *が書き込み権限を持つファイルに設定してください。

  • + debug +:stunnelのデバッグレベルを設定します。これは、 `+ 0 `から ` 7 `の範囲です。 この例では、使用可能な最高レベルの「+7」に設定します。これにより、stunnelで問題が発生した場合に最も詳細な情報が提供されます。 任意のレベルに設定できますが、デフォルト設定は「5」です。

残りの行は_service-level options_であり、 `+ redis-cli +`用に作成するトンネルにのみ適用されます:

  • + [redis-cli] +:これは_サービス名_であり、次の行がクライアントプログラムの個々のサービス設定を表すことを指定します。 stunnel構成ファイルには複数のサービスを含めることができますが、それぞれを既存のクライアントアプリケーションに関連付ける必要があり、同じアプリケーションに2つのサービスを含めることはできません。

  • + client +:これを `+ yes +`に設定すると、stunnelはクライアントモードで実行するように指示されます。つまり、stunnelはTLSサーバーとして機能するのではなく、TLSサーバー(管理されたRedisインスタンス)に接続します。

  • + accept +:stunnelがクライアントからの接続を受け入れるホストとポートを定義します。 ここでは、IPアドレス「127.0.0.1」を指定します。これは、* localhost *とポート「8000」を表すために使用されるIPv4ループバックアドレスです。 これは、stunnelがポート `+ 8000 +`でUbuntuサーバーからの接続をリッスンし、それらを暗号化することを意味します。 ポートは、まだ使用されていない限り、任意のポート番号に設定できます。

  • + connect +:stunnelが接続するリモートアドレスとポートを定義します。 管理対象データベースのポートとホスト名またはIPアドレスに合わせて、このパラメーターを変更してください。

これはかなり最小限の構成であり、stunnelの多くのデフォルト設定はそのままです。 プログラムには、特定のニーズに合ったトンネルを作成するための多くのオプションがあります。 詳細については、https://www.stunnel.org/static/stunnel.html [公式ドキュメント]を参照してください。

このコンテンツを追加したら、ファイルを保存して閉じます。

次に、 `+ stunnel4 +`サービスを再起動して、stunnelが新しい構成ファイルを読み取るようにします。

sudo systemctl restart stunnel4

それに続いて、ネットワーク接続を表示するために使用されるコマンドラインユーティリティである `+ netstat `でstunnelが作成されたかどうかをテストできます。 次のコマンドを実行します。このコマンドは、「 netstat 」の出力を「 grep 」コマンドにパイプライン化し、「 stunnel +」のすべてのインスタンスを検索します。

sudo netstat -plunt | grep stunnel
Output tcp        0      0 127.0.0.1:8000         0.0.0.0:*               LISTEN      17868/stunnel

この出力は、stunnelがローカルポート「8000」で接続をリッスンしていることを示しています。

また、* nobody *ユーザーが、現在実行中のすべてのプロセスを表示するプログラムである `+ ps +`を使用して、stunnelプロセスの所有権を取得したことを確認できます。

ps aux | grep stunnel
Output nobody   15674  0.0  0.1 121912  3180 ?        Ssl  19:28   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
. . .

ここでは、* nobody *が実際にstunnelプロセスを引き継いでいることがわかります。

これで、Stunnelが完全に構成され、システムで実行されます。 管理対象のRedisインスタンスに接続し、トンネルが期待どおりに機能することをテストする準備ができました。

手順3-TLSを介した管理対象データベースへの接続

サーバーに「+ redis-cli +」をインストールし、stunnelを設定したので、TLS経由で管理対象データベースに接続する準備が整いました。

手順2で作成した構成ファイルで定義された設定に基づいて、次のコマンドを使用して管理対象データベースに接続します。

redis-cli -h localhost -p 8000

このコマンドには「+ -h 」フラグが含まれており、次の引数が接続先のホストになることを「 redis-cli 」に伝えます。 この場合、サーバー上でローカルに作成されたトンネルに接続しているため、「 localhost 」です。 その後に、「-p 」フラグがあります。これは、接続しているローカルトンネルのポートの前にあり、この場合はポート「+8000」です。

このコマンドを実行すると、管理対象のRedisサーバーに接続されます。 接続したことを反映してプロンプトが変わり、 `+ redis-cli`のインタラクティブモードになります。

Redisのインタラクティブモードから `+ ping +`コマンドを実行すると、トンネルが期待どおりに機能しているかどうかをテストできます。

ping

接続が生きている場合、 `+ PONG +`を返します:

Output PONG

ただし、stunnelがサーバーからRedisインスタンスにトラフィックを正しくトンネリングしていない場合、Redisから切断される前に次のようなエラーメッセージが表示される場合があります。

Output Error: Server closed the connection

このエラーまたは同様のエラーを受け取った場合は、Redisインスタンスのホスト名とポートを `+ stunnel.conf `ファイルに正しく入力したことを再確認してください。 同様に、 ` redis-cli +`コマンドで正しいポート番号を入力したことを確認してください。

トンネルが機能していることを確認したら、Redisインスタンスから切断します。

exit

stunnelの構成を変更した場合、stunnelが変更を認識できるように、 `+ stunnel4 +`サービスをリロードまたは再起動する必要があります。

sudo systemctl reload stunnel4

ただし、将来のいずれかの時点でTLSトンネルを閉じたい場合、 `+ systemctl `で閉じることはできません。 代わりに、 ` pkill +`コマンドでプロセスを強制終了する必要があります。

sudo pkill stunnel

トンネルが閉じられた後、サービスを再起動してトンネルを再度開くことができます。

sudo systemctl restart stunnel4

これで、stunnelが正常に構成されたので、 `+ redis-cli +`を使用して、マネージされたRedisインスタンスにデータを追加する準備が整いました。

結論

Stunnelは、TLSトンネルを作成し、リモートサーバーへの安全な接続を確立するための便利なツールです。 これは、リモートデータベースのように、マシン間の情報の安全な転送が重要な場合に特に役立ちます。

ここから、Redisの探索と、次のアプリケーションとの統合を開始できます。 Redisを使用するのが初めての場合は、https://www.digitalocean.com/community/tutorial_series/how-to-manage-a-redis-database [Redisデータベースの管理方法]で役立つシリーズをご覧ください。 。

Related