開発者ドキュメント

Stunnelとredis-cliを使用してTLS経由でマネージドRedisインスタンスに接続する方法

序章

マネージドRedisインスタンスは、高可用性や自動更新などの利点を提供できます。 ただし、リモートデータベースサーバーに接続するときはいつでも、悪意のある攻撃者が送信した機密情報をスニッフィングするリスクがあります。

Redisコマンドラインインターフェイスであるredis-cliは、ネットワークを介した安全な通信を可能にする暗号化プロトコルであるTLSを介した接続をネイティブにサポートしていません。 つまり、追加の設定がないと、redis-cliはリモートRedisサーバーに接続するための安全な方法ではありません。 マネージドRedisインスタンスへの安全な接続を確立する1つの方法は、TLSプロトコルを使用するトンネルを作成することです。

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

前提条件

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

ステップ1—Stunnelとredis-cliをインストールする

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

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

  1. sudo apt update

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

  1. sudo apt install redis-tools stunnel4

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

次のコマンドを実行すると、stunnelが正しくインストールされ、そのsystemdサービスが機能しているかどうかを確認できます。

  1. 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は、起動に古い UNIX System Vinitシステムに基づくSysVスタイルのinitスクリプトを使用します。 この初期化スクリプトを有効にするには、/etc/default/stunnel4ファイルを変更する必要があります。

お好みのテキストエディタでこのファイルを開きます。 ここでは、nanoを使用します。

  1. sudo nano /etc/default/stunnel4

ファイルの先頭近くにあるENABLEDオプションを見つけます。 デフォルトでは0に設定されますが、これを1に変更して、起動時にstunnelを開始できるようにします。

/ etc / default / stunnel4
# /etc/default/stunnel
# Julien LEMOINE <speedblue@debian.org>
# September 2003

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

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

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

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

  1. sudo nano /etc/stunnel/stunnel.conf

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

/etc/stunnel/stunnel.conf
fips = no
setuid = nobody
setgid = nogroup
pid = /home/sammy/pids/stunnel.pid
debug = 7
delay = yes
[redis-cli]
  client = yes
  accept = 127.0.0.1:8000
  connect = managed_redis_hostname_or_ip:managed_redis_port

ファイルの最初の5行はグローバルオプションです。これは、このファイルに含めるすべてのサービスに適用されることを意味します。

残りの行はサービスレベルオプションであり、redis-cli用に作成するトンネルにのみ適用されます。

注: connectディレクティブで指定する必要があるホスト名またはIPアドレスとポートは、独自のマネージドRedisデータベースに固有のものになります。 これらは通常、Redisインスタンスをプロビジョニングしたクラウドプロバイダーのデータベース管理ユーザーインターフェイスにあります。

DigitalOcean Managed Redisデータベースを使用している場合は、コントロールパネルに移動し、左側のサイドバーメニューのデータベースをクリックすると、この情報を見つけることができます。 次に、接続するRedisインスタンスの名前をクリックし、接続の詳細セクションまでスクロールします。 そこには、データベースのホストポートを説明するフィールドがあります。

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

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

次に、Ubuntuユーザーのホームディレクトリにいることを確認します。

  1. cd

次に、stunnel.pidファイルを保持するpidsディレクトリを作成します。

  1. mkdir pids

stunnelプロセスはstunnel.pidファイルを自動的に作成するため、自分でファイルを作成する必要はありません。 ただし、pidsディレクトリの所有権をnobodyユーザーとnogroupグループに変更する必要があります。

  1. sudo chown -R nobody:nogroup pids/

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

  1. sudo systemctl restart stunnel4

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

  1. sudo netstat -plunt | grep stunnel
[secondary_label Output] 
tcp        0      0 127.0.0.1:8000         0.0.0.0:*               LISTEN      17868/stunnel 

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

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

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

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

これで、Stunnelが完全に構成され、システムで実行されます。 これで、マネージドRedisインスタンスに接続し、トンネルが期待どおりに機能していることをテストする準備が整いました。

ステップ3—TLSを介した管理対象データベースへの接続

サーバーにredis-cliをインストールし、stunnelを構成したので、TLSを介して管理対象データベースに接続する準備が整いました。

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

  1. redis-cli -h localhost -p 8000

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

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

注:多くの場合、管理対象データベースは、ユーザーが接続するときにパスワードによる認証を要求するように構成されています。 管理対象のRedisインスタンスにパスワードが必要な場合は、-aフラグをredis-cliコマンドに含め、その後にパスワードを含めることができます。

  1. redis-cli -h localhost -p 8000 -a password

または、接続を確立した後、authコマンドに続けてパスワードを実行して認証することもできます。

  1. auth password

DigitalOceanマネージドデータベースを使用している場合、Redisインスタンスのパスワードは、ホスト名とポートを見つけたのと同じ場所にあります。 コントロールパネルで、左側のサイドバーメニューのデータベースをクリックします。 次に、接続したRedisインスタンスの名前をクリックします。 接続の詳細セクションまで下にスクロールすると、パスワードというラベルの付いたフィールドがあります。 show ボタンをクリックしてパスワードを表示し、それをコピーしてこれらのコマンドのいずれかに貼り付け、passwordを置き換えて認証します。

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

  1. ping

接続が有効な場合は、PONGが返されます。

[secondary_label Output] 
PONG

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

[secondary_label Output] 
Error: Server closed the connection

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

クラスターの構成をスケールアップするときに発生する可能性があるように、マネージドRedisインスタンスが開いている接続をリセットするときにもこのエラーが発生する可能性があります。 このような場合、再認証が必要になりますが、Redisから切断されない場合があります。

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

  1. exit

stunnelの構成を変更した場合は、stunnel4サービスをリロードまたは再起動して、stunnelが変更に気付くようにする必要があります。

  1. sudo systemctl reload stunnel4

将来、TLSトンネルを閉じたい場合は、systemctlを使用して閉じることもできます。

  1. sudo systemctl stop stunnel4

トンネルが閉じられた後、サービスを再開することでトンネルを再開できます。

  1. sudo systemctl start stunnel4

stunnelの構成が正常に完了したので、redis-cliを使用してマネージドRedisインスタンスへのデータの追加を開始する準備が整いました。

結論

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

ここから、Redisの探索を開始し、次のアプリケーションと統合することができます。 Redisを初めて使用する場合は、Redisデータベースの管理方法に関するシリーズが役立つ場合があります。

モバイルバージョンを終了