序章

RedisはオープンソースのKey-Valueデータストアであり、永続性のためにオプションのディスク書き込みを備えたメモリ内ストレージモデルを使用しています。 トランザクション、Pub / Subメッセージングパターン、自動フェイルオーバーなどの機能を備えています。 Redisには、ほとんどの言語で記述されたクライアントがあり、推奨される言語はそのWebサイトに掲載されています。

Redisは、独自の暗号化機能を提供していません。 信頼できる関係者のみがアクセスできる、分離されたプライベートネットワークに展開されていることを前提として動作します。 ご使用の環境がその仮定に一致しない場合は、Redisトラフィックを暗号化で個別にラップする必要があります。

このガイドでは、と呼ばれる安全なトンネリングプログラムを使用してRedisトラフィックを暗号化する方法を示します。 stunnel. Redisクライアントとサーバー間のトラフィックは、専用のSSL暗号化トンネルを介してルーティングされます。 デモのために2台のUbuntu16.04サーバーを使用します。

前提条件

開始するには、root以外のユーザーが必要です。 sudo 各マシンで構成された特権。 さらに、このガイドでは、基本的なファイアウォールが設定されていることを前提としています。 Ubuntu 16.04初期サーバーセットアップガイドに従って、これらの要件を満たすことができます。

続行する準備ができたら、以下に従ってください。

stunnelとは何ですか?

基本的な暗号化通信の場合、 stunnel ユーティリティはインストールと設定が簡単です。 2台のマシン間の暗号化された転送を可能にします。 クライアントはローカルポートに接続し、 stunnel リモートサーバーに転送する前に、暗号化でラップします。 サーバー側では、 stunnel 設定されたポートでリッスンし、トラフィックを復号化してからローカルポート(この場合、Redisサーバーがリッスンするポート)に転送します。

使用のいくつかの利点 stunnel それは:

  • Ubuntuは次のパッケージを維持しています stunnel デフォルトのリポジトリで
  • Ubuntuには、起動時にプロセスを自動的に開始するinitスクリプトが含まれています
  • 構成は簡単で直感的です
  • 目的ごとに新しいトンネルが使用されます。 これは状況によっては不利になる場合がありますが、アクセスをきめ細かく制御できます。

いくつかの欠点は次のとおりです。

  • クライアントは、デフォルト以外のローカルポートに接続することでリモートマシンに接続します。これは、最初は直感的ではない場合があります。
  • レプリケーションまたはクラスタリングのために2つのRedisサーバーを接続する場合、サーバー間通信用に各マシンに2つのトンネルを構成する必要があります(1つはアウトバウンドトラフィック用、もう1つはインバウンドトラフィック用)。

これらの特性を念頭に置いて、始めましょう。

Redisサーバーとクライアントパッケージをインストールする

始める前に、一方のマシンにRedisサーバーをインストールし、もう一方のマシンでクライアントパッケージを利用できるようにする必要があります。 これらのいずれかまたは両方をすでに構成している場合は、スキップしてください。

注: Redisサーバーの命令は、後で接続をテストするために使用されるテストキーを設定します。 すでにRedisサーバーがインストールされている場合は、接続をテストするときに、このキーを設定するか、他の既知のキーを使用できます。

Redisサーバーのインストール

ChrisLeaのRedisサーバーPPAを使用して、最新バージョンのRedisをインストールします。 サードパーティのリポジトリを利用する場合は、常に注意してください。 この場合、Chris Leaは信頼できるパッケージャーであり、いくつかの人気のあるオープンソースプロジェクト向けに高品質で最新のパッケージを維持しています。

次のように入力して、PPAを追加し、Redisサーバーソフトウェアを最初のマシンにインストールします。

  1. sudo apt-add-repository ppa:chris-lea/redis-server
  2. sudo apt-get update
  3. sudo apt-get install redis-server

Enter と入力して、このプロセス中にプロンプトを受け入れます。

インストールが完了したら、次のように入力して、ローカルでRedisサービスに接続できることをテストします。

  1. redis-cli ping

ソフトウェアがインストールされて実行されている場合は、次のように表示されます。

Redis server output
PONG

後で使用できるキーを設定しましょう。

  1. redis-cli set test 'success'

testキーを値に設定しました success. 構成後、クライアントマシンからこのキーにアクセスしようとします stunnel.

Redisクライアントのインストール

他のUbuntu16.04マシンはクライアントとして機能します。 必要なすべてのソフトウェアは、 redis-tools デフォルトリポジトリのパッケージ:

  1. sudo apt-get update
  2. sudo apt-get install redis-tools

リモートRedisサーバーのデフォルト構成とファイアウォールがアクティブになっているため、現在、リモートRedisインスタンスに接続してテストすることはできません。

各コンピューターにstunnelをインストールして有効にする

次に、インストールする必要があります stunnel サーバーとクライアントのそれぞれで。 Ubuntuには、バージョン4のユーティリティが含まれています。 stunnel4 デフォルトのリポジトリにあります。 前のセクションで何もインストールする必要がなかった場合は、必ず sudo apt-get update インストールする前にパッケージインデックスを更新するコマンド:

  1. # sudo apt-get update
  2. sudo apt-get install stunnel4

The stunnel Ubuntuのサービスは、systemdで管理できる古いSysVinitスクリプトを起動に使用します。 ネイティブのsystemdメソッドを使用するのではなく、起動時に開始するようにサービスを構成するには、 /etc/default/stunnel4 ファイル:

  1. sudo nano /etc/default/stunnel4

を設定して、起動時にサービスを開始できるようにします ENABLED 「1」のオプション:

/ etc / default / stunnel4
. . .
ENABLED=1
. . .

各サーバーでファイルを保存して閉じます。

次に、通信の暗号化に使用される自己署名SSL証明書とキーを作成します。

Redisサーバーで自己署名SSL証明書とキーを作成する

Redisサーバーで、自己署名SSL証明書を作成し、 /etc/stunnel ディレクトリ。 これは、次の2つのインスタンス間の接続を暗号化するために使用されます。 stunnel. 名前を使用します redis-server 証明書とキーファイルを参照するには:

  1. sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/stunnel/redis-server.key -out /etc/stunnel/redis-server.crt

作成している証明書に関する情報の入力を求められます。 これは内部でのみ使用されるため、値はそれほど重要ではありません。必要に応じて入力してください。 以下の例を見ることができます:

Redis server output
. . . ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []:Community Common Name (e.g. server FQDN or YOUR name) []:redis-server Email Address []:[email protected]

生成されたものへのアクセスを制限する .key 次のように入力してファイルを作成します。

  1. sudo chmod 600 /etc/stunnel/redis-server.key

SSL証明書とキーができたので、Redisサーバーを作成できます。 stunnel 構成ファイル。

Redisサーバーのstunnel構成ファイルを作成する

で終わるファイルを開く .conf 以内 /etc/stunnel 開始するには、Redisサーバー上のディレクトリ:

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

内部で、メインセクションでPIDファイルを書き込む場所を指定します。 The /run ディレクトリはこれらのタイプのファイルを保存するように設計されているため、次のものを使用します。

/etc/stunnel/redis.conf
pid = /run/stunnel-redis.pid

次に、Redisサービスへのアクセスを構成するセクションを作成します。 あなたはこれを好きなように呼ぶことができます(私たちはそれを呼びます redis-server). このセクションでは、この構成を、後日このマシンで構成する必要がある可能性のある他のトンネルから分離します。

を使用して、Redisサーバー自体の証明書とキーの場所を指定する必要があります。 certkey それぞれディレクティブ。

ここでは、着信データのトンネルも定義します。 したい accept Redisサーバーの外部IPアドレスのデフォルトのRedisポート(ポート6379)への暗号化されたトラフィック。 次に、 connect そのトラフィックをlocalインターフェースのデフォルトのRedisポートに送信して、復号化されたトラフィックをデポジットします。 これは、Redisサービスが実際にリッスンしている場所です。

/etc/stunnel/redis.conf
pid = /run/stunnel-redis.pid

[redis-server]
cert = /etc/stunnel/redis-server.crt
key = /etc/stunnel/redis-server.key
accept = redis_servers_public_IP:6379
connect = 127.0.0.1:6379

終了したら、ファイルを保存して閉じます。

stunnelを再起動し、ファイアウォールを構成します

stunnel がRedisサーバーで構成されている場合、次のように入力してサービスを再起動できます。

  1. sudo systemctl restart stunnel4.service

Redisサーバーで接続をリッスンしているサービスを確認すると、次のように表示されます。 stunnel パブリックインターフェイスのポート6379でリッスンします。 また、Redisがローカルインターフェイスで同じポートをリッスンしていることも確認できます。

  1. sudo netstat -plunt
Redis server output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 public_IP:6379 0.0.0.0:* LISTEN 4292/stunnel4 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2679/redis-server 1 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1720/sshd tcp6 0 0 :::22 :::* LISTEN 1720/sshd

それでも stunnel パブリックインターフェイスでリッスンしている場合、ファイアウォールはトラフィックを通過させるように構成されていない可能性があります。

ポート6379へのすべてのトラフィックを許可するには、次のように入力します。

  1. sudo ufw allow 6379

これにより、パブリックインターフェイスのポート6379へのアクセスが可能になります。 stunnel 聞いています。 The stunnel ポートは暗号化されたトラフィックのみを受け入れます。

証明書をクライアントに配布する

各Redisクライアントには、Redisサーバーの証明書ファイルのコピーが必要です。 配布する最も簡単な方法 .crt ファイルとは、ファイルの内容をサーバーに出力し、その内容をコネクションマシン上の対応するファイルにコピーすることです。

の内容を出力します .crt 次のように入力して、Redisサーバー上のファイルを作成します。

  1. cat /etc/stunnel/redis-server.crt
Redis server output
-----BEGIN CERTIFICATE----- MIIEGTCCAwGgAwIBAgIJALUdz8P8q8UPMA0GCSqGSIb3DQEBCwUAMIGiMQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp . . . Tq7WJk77tk4nPI8iGv1WuK8xTAm5aOncxP16VoMpsDMV+GB1p3nBkMQ/GKF8pPXU fn6BnDWKmeZqAlBM+MGYAfkbZWdBslrWasCJzs+tehTqL0LLJ6d3Gi9biBPb -----END CERTIFICATE-----

BEGINCERTIFICATEおよびENDCERTIFICATEとマークされた行を含む表示された証明書をクリップボードにコピーします。

クライアントマシンで、同じ名前のファイルを /etc/stunnel ディレクトリ:

  1. sudo nano /etc/stunnel/redis-server.crt

Redisサーバーからコピーしたコンテンツを貼り付けます。 終了したら、ファイルを保存して閉じます。

Redisクライアントのstunnel構成ファイルを作成する

クライアントがサーバーの証明書のコピーを持っているので、クライアント側を構成できます。 stunnel 構成。

で終わるファイルを開く .conf の中に /etc/stunnel クライアントマシン上のディレクトリ。 ファイルを呼び出します redis.conf また:

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

内部で、サービスがプロセスIDを再度保存するPIDファイルを指定します。

/etc/stunnel/redis.conf
pid = /run/stunnel-redis.pid

次に、アウトバウンドデータ用のトンネルを構成するセクションを追加します。 これには好きな名前を付けることができます(これを呼びます) redis-client). このセクションでは、この構成を、後日このマシンで構成する必要がある可能性のある他のトンネルから分離します。

このセクションをクライアント構成として明示的にマークする必要があります client 指令。 をセットする accept ローカルインターフェイスの未使用のポートをリッスンして、ローカルRedisクライアントからの接続を処理するディレクティブ(この例ではポート8000を使用します)。 をセットする connect RedisサーバーのパブリックIPアドレスと開いたポートへのディレクティブ。

次に、 CAfile Redisサーバーの証明書のコピーを指すようにします。 また、設定する必要があります verify 4になります。 stunnel 証明書チェーンに関係なく、証明書のみを確認してください(証明書に自己署名したため)。

/etc/stunnel/redis.conf
pid = /run/stunnel-redis.pid

[redis-client]
client = yes
accept = 127.0.0.1:8000
connect = remote_server_IP_address:6379
CAfile = /etc/stunnel/redis-server.crt
verify = 4

終了したら、ファイルを保存して閉じます。

クライアントサービスの再起動と接続のテスト

再起動します stunnel 変更を実装するためのクライアント上のサービス:

  1. sudo systemctl restart stunnel4.service

クライアントのトンネルが正しく設定されていることを確認します。

  1. sudo netstat -plunt
Redis client output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 3809/stunnel4 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1714/sshd tcp6 0 0 :::22 :::* LISTEN 1714/sshd

ご覧のように、 stunnel はローカルポート8000で接続をリッスンしています。

これで、クライアントをローカルインターフェイスのポート8000にポイントすることで、リモートRedisインスタンスに接続できるようになります。

  1. redis-cli -p 8000 ping
Redis client output
PONG

このガイドの冒頭で設定したテストキーをクエリします。

  1. redis-cli -p 8000 get test
Redis client output
"success"

これにより、リモートデータベースに正常にアクセスできることが確認されます。

トンネルを使用せずにリモートRedisサーバーと通信できない不可能であることを確認するために、リモートポートへの直接接続を試みることができます。

  1. redis-cli -h redis_server_public_IP -p 6379 ping
Redis client output
Error: Connection reset by peer

ご覧のとおり、トラフィックは、トンネルを介して正しく暗号化されている場合にのみ、リモートRedisポートで受け入れられます。

マルチクライアントおよびサーバー間通信のための上記の例の拡張

上で概説した例では、単一のRedisサーバーと単一のクライアントの簡単な例を使用しました。 ただし、これらの同じ方法は、より複雑な相互作用に適用できます。

この例を拡張して複数のクライアントを処理するのは簡単です。 上記のアクションを実行する必要があります。

  • Redisクライアントソフトウェアをインストールし、 stunnel 新しいクライアントのパッケージ
  • を有効にする stunnel 起動時に起動するソフトウェア
  • サーバーの証明書ファイルをにコピーします /etc/stunnel ディレクトリ
  • をコピーします stunnel 新しいクライアントマシンへのクライアント構成ファイル
  • 再起動します stunnel サービス

安全なサーバー間通信をセットアップするには(たとえば、レプリケーションまたはクラスタリング用)、2つの並列トンネルをセットアップする必要があります。

  • 新しいサーバーに、Redisサーバーパッケージをインストールし、 stunnel
  • を有効にする stunnel 起動時に起動するソフトウェア
  • 新しいRedisサーバーの新しい証明書とキーファイルを生成します(ファイルには一意の名前を使用します)
  • 各証明書ファイルを1つのサーバーから別のサーバーにコピーします。 /etc/stunnel ディレクトリ
  • 編集または作成 stunnel 各サーバー(既存のサーバーを含む)の構成ファイルには、次のものが含まれます。
    • 外部ポートをローカルRedisにマッピングするサーバーセクション
    • ローカルポートをリモートサーバーの公開ポートにマッピングするクライアントセクション
  • 新しいRedisサーバーのファイアウォールで外部ポートを開きます
  • Redis構成ファイルを調整して、ローカルにマップされたポートに接続してリモートサーバーにアクセスするように各Redisインスタンスを構成します(必要なディレクティブはサーバーの関係によって異なります)。 詳細については、Redisのドキュメントを参照してください)。

The stunnel 両方のサーバーの構成ファイルは次のようになります。

サーバー間通信用のstunnel構成ファイル
pid = /run/stunnel-redis.pid

[redis-server]
cert = /etc/stunnel/this_servers_certificate.crt
key = /etc/stunnel/this_servers_key.key
accept = this_servers_public_IP:6379
connect = 127.0.0.1:6379

[redis-client]
client = yes
accept = 127.0.0.1:arbitrary_local_port
connect = remote_servers_public_IP:6379
CAfile = /etc/stunnel/remote_servers_certificate.crt
verify = 4

必要に応じて、各マシンに複数のクライアントセクションを構成して、ローカルポートをリモートサーバーにマップできます。 このような場合は、必ず別の未使用のローカルポートを選択してください。 accept 各リモートサーバーのディレクティブ。

結論

Redisは、多くのデプロイメントにとって非常に貴重な強力で柔軟なツールです。 ただし、安全でない環境でRedisを操作することは、サーバーとデータを攻撃や盗難に対して脆弱なままにする大きな責任です。 信頼できる関係者だけがネットワークを構築していない場合は、他の手段でトラフィックを保護することが不可欠です。 このガイドで概説されている方法は、Redisパーティ間の通信を保護するための1つの方法にすぎません。 その他のオプションには、spipedによるトンネリングまたはVPNのセットアップが含まれます。