前書き
管理された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+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 = 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セクションまでスクロールダウンします。 そこには、データベースのhostとport。
を説明するフィールドがあります。
これはかなり最小限の構成であり、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に関するシリーズが役立つ場合があります。