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

前書き

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

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

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

前提条件

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

  • Ubuntu 18.04サーバーへのアクセス。 このサーバーには、管理者権限を持つroot以外のユーザーと、ufwで構成されたファイアウォールが必要です。 これを設定するには、initial server setup guide for Ubuntu 18.04に従います。

  • 管理されたRedisデータベースインスタンス。 このチュートリアルで概説した手順は、DigitalOcean Managed Redis Databaseでテストされていますが、一般にクラウドプロバイダーの管理されたデータベースで機能するはずです。 DigitalOceanマネージドRedisデータベースをプロビジョニングするには、Managed Redis product documentationに従ってください。

[[step-1 -—- installing-stunnel-and-redis-cli]] ==ステップ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が正しくインストールされ、その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が実行されていることを示していますが、まだ構成していないため、実際には何もできません。

[[step-2 -—- configuring-stunnel]] ==ステップ2—Stunnelの構成

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

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

sudo nano /etc/default/stunnel4

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

/etc/default/stunnel4

# /etc/default/stunnel
# Julien LEMOINE 
# September 2003

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

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

次に、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 = managed_redis_hostname_or_ip:managed_redis_port

ファイルの最初の5行はglobal optionsです。これは、このファイルに含めるすべてのサービスに適用されることを意味します。

  • fips:stunnelのFIPS140-2モードを有効または無効にします。 このモードでは、stunnelは接続がFederal Information Processing Standardを満たしていることを検証します。 これをnoに設定すると、この機能が無効になります。 これを無効にすることは、それほど安全ではありませんが、それを有効にする(デフォルトで)には、追加の設定が必要になることに注意してください。

  • setuid:stunnelが実行されるUnixユーザーIDを定義します。 デフォルトでは、stunnelプロセスはrootユーザーが所有しています。 ただし、トンネルの開始後に管理者権限を削除するstunnel documentation recommendsは、そうしないとセキュリティリスクが発生するためです。 setuidパラメータをnobodyに設定すると、非特権ユーザーであるnobodyが、トンネルが確立されると、stunnelプロセスの所有権を取得します。

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

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

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

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

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

[。注意]##

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

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

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

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

次に、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インスタンスに接続し、トンネルが期待どおりに機能することをテストする準備ができました。

[[step-3 -—- connecting-to-your-managed-database-over-tls]] ==ステップ3—TLSを介した管理対象データベースへの接続

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

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

redis-cli -h localhost -p 8000

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

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

[。注意]##

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

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

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

auth password

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

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

ping

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

Output PONG

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

Output Error: Server closed the connection

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

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

exit

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

sudo systemctl reload stunnel4

ただし、将来的にTLSトンネルを閉じたい場合は、systemctlで閉じることができなくなります。 代わりに、pkillコマンドを使用してプロセスを強制終了する必要があります。

sudo pkill stunnel

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

sudo systemctl restart stunnel4

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

結論

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

ここから、Redisの探索を開始し、次のアプリケーションと統合することができます。 Redisを初めて使用する場合は、How To Manage a Redis Databaseに関するシリーズが役立つ場合があります。

Related