序章
RedisはオープンソースのKey-Valueデータストアであり、永続性のためにオプションのディスク書き込みを備えたメモリ内ストレージモデルを使用しています。 トランザクション、Pub / Subメッセージングパターン、自動フェイルオーバーなどの機能を備えています。 Redisには、ほとんどの言語で記述されたクライアントがあり、推奨される言語はそのWebサイトに掲載されています。
Redisは、独自の暗号化機能を提供していません。 信頼できる関係者のみがアクセスできる、分離されたプライベートネットワークに展開されていることを前提として動作します。 ご使用の環境がその仮定に一致しない場合は、Redisトラフィックを暗号化で個別にラップする必要があります。
このガイドでは、と呼ばれる安全な配管プログラムを使用してRedisトラフィックを暗号化する方法を示します。 spiped
. Redisクライアントとサーバー間のトラフィックは、専用のSSHトンネルと同様に、専用の暗号化されたトンネルを介してルーティングされます。 デモのために2台のUbuntu16.04サーバーを使用します。
前提条件
開始するには、root以外のユーザーが必要です。 sudo
各マシンで構成された特権。 さらに、このガイドでは、基本的なファイアウォールが設定されていることを前提としています。 Ubuntu 16.04初期サーバーセットアップガイドに従って、これらの要件を満たすことができます。
続行する準備ができたら、以下に従ってください。
何が吐き出されますか?
The spiped
ユーティリティはインストールが簡単で、2つのネットワークソケット(通常のネットワークポートまたはUnixソケット)間の安全な通信用に構成されています。 これは、2つのリモートサーバー間の暗号化された通信を構成するために使用できます。 クライアントはローカルポートに接続し、 spiped
リモートサーバーに転送する前に、暗号化でラップします。 サーバー側では、 spiped
設定されたポートでリッスンし、トラフィックを復号化してからローカルポート(この場合、Redisサーバーがリッスンするポート)に転送します。
使用のいくつかの利点 spiped
それは:
- Ubuntuは次のパッケージを維持しています
spiped
デフォルトのリポジトリにあります。 - Redisプロジェクトは現在を使用することを提案しています
spiped
トラフィックを暗号化します。 - 構成は簡単で直感的です。
- 目的ごとに新しいパイプが使用されます。 これは状況によっては不利になる場合がありますが、アクセスをきめ細かく制御できます。
いくつかの欠点は次のとおりです。
- クライアントは、デフォルト以外のローカルポートに接続することでリモートマシンに接続します。これは、最初は直感的ではない場合があります。
- レプリケーションまたはクラスタリングのために2つのRedisサーバーを接続する場合、サーバー間通信用に各マシンに2つのトンネルを構成する必要があります(1つはアウトバウンドトラフィック用、もう1つはインバウンドトラフィック用)。
- initスクリプトは含まれていないため、起動時に必要な接続を自動的に作成するには、initスクリプトを作成する必要があります。
これらの特性を念頭に置いて、始めましょう。
Redisサーバーとクライアントパッケージをインストールする
始める前に、一方のマシンにRedisサーバーをインストールし、もう一方のマシンでクライアントパッケージを利用できるようにする必要があります。 これらのいずれかまたは両方をすでに構成している場合は、スキップしてください。
注: Redisサーバーの命令は、後で接続をテストするために使用されるテストキーを設定します。 すでにRedisサーバーがインストールされている場合は、接続をテストするときに、このキーを設定するか、他の既知のキーを使用できます。
Redisサーバーのインストール
ChrisLeaのRedisサーバーPPAを使用して、最新バージョンのRedisをインストールします。 サードパーティのリポジトリを利用する場合は、常に注意してください。 この場合、Chris Leaは信頼できるパッケージャーであり、いくつかの人気のあるオープンソースプロジェクト向けに高品質で最新のパッケージを維持しています。
次のように入力して、PPAを追加し、Redisサーバーソフトウェアを最初のマシンにインストールします。
- sudo apt-add-repository ppa:chris-lea/redis-server
- sudo apt-get update
- sudo apt-get install redis-server
Enter と入力して、このプロセス中にプロンプトを受け入れます。
インストールが完了したら、次のように入力して、ローカルでRedisサービスに接続できることをテストします。
- redis-cli ping
ソフトウェアがインストールされて実行されている場合は、次のように表示されます。
Redis server outputPONG
後で使用できるキーを設定しましょう。
- redis-cli set test 'success'
testキーを値に設定しました success
. 構成後、クライアントマシンからこのキーにアクセスしようとします spiped
.
Redisクライアントのインストール
他のUbuntu16.04マシンはクライアントとして機能します。 必要なすべてのソフトウェアは、 redis-tools
デフォルトリポジトリのパッケージ:
- sudo apt-get update
- sudo apt-get install redis-tools
リモートRedisサーバーのデフォルト構成とファイアウォールがアクティブになっているため、現在、リモートRedisインスタンスに接続してテストすることはできません。
各コンピューターにspipedをインストールする
次に、インストールする必要があります spiped
サーバーとクライアントのそれぞれで。 前のセクションで何もインストールする必要がなかった場合は、必ず sudo apt-get update
インストールする前にパッケージインデックスを更新するコマンド:
- sudo apt-get install spiped
必要なソフトウェアがインストールされたので、次のような安全なキーを生成できます。 spiped
2台のマシン間のトラフィックを暗号化するために使用できます。
Redisサーバーで暗号化キーを生成する
次に、を作成します spiped
内の構成ディレクトリ /etc
暗号化のために生成するキーを保存するためにRedisサーバーに:
- sudo mkdir /etc/spiped
次のように入力して、安全なキーを生成します。
- sudo dd if=/dev/urandom of=/etc/spiped/redis.key bs=32 count=1
権限を調整して、生成されたキーファイルへのアクセスを制限します。
- sudo chmod 600 /etc/spiped/redis.key
これで、Redisサーバーで使用可能なキーができたので、セットアップできます。 spiped
systemdユニットファイルを使用してサーバー上で。
Redisサーバー用のsystemdユニットファイルを作成する
The spiped
ユーティリティは非常にシンプルで、構成ファイルの読み取りをサポートしていません。 各パイプは手動で構成する必要があるため、Ubuntuパッケージには、起動時にパイプを自動的に開始するためのinitスクリプトが付属していません。
これらの問題を解決するために、単純なsystemdユニットファイルを作成します。 で新しいユニットファイルを開きます /etc/systemd/system
開始するディレクトリ:
- sudo nano /etc/systemd/system/spiped-receive.service
内部で、を作成します [Unit]
ユニットを説明し、ネットワークが利用可能になった後にこのユニットが開始されるように順序を確立するセクション:
[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target
次に、 [Service]
実行する実際のコマンドを定義するセクション。 次のオプションを使用します spiped
:
-F
:フォアグラウンドで実行します。 systemd initシステムは、可能な場合にフォアグラウンドで実行されているサービスを管理するように設計されています。 フォアグラウンドで実行すると、必要な構成が簡素化されます。-d
:送信元ソケットからのトラフィックを復号化します。 これはspiped
ソースからのトラフィックを復号化し、ターゲットからのトラフィックを暗号化することを認識できるようにする暗号化の方向。-s
:これはソースソケットを定義します。 IPアドレスは、角括弧、コロン、ポートの順に入力する必要があります。 Redisサーバーの場合、これはパブリックIPアドレスとRedisポートに設定する必要があります。-t
:ターゲットソケット。 これは、復号化後にトラフィックが転送される場所です。 Redisはデフォルトでローカルホストのポート6379をリッスンするため、これを使用する必要があります。-k
:使用するキーファイルを指定します。 これは、前に生成した暗号化キーを指しているはずです。
これらのオプションはすべて1つになります ExecStart
このセクションで必要な唯一の項目であるディレクティブ:
[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/spiped -F -d -s [redis_server_public_IP]:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key
最後に、 [Install]
有効になっている場合にユニットを自動的に起動するタイミングをsystemdに通知するセクション:
[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/spiped -F -d -s [redis_server_public_IP]:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key
[Install]
WantedBy=multi-user.target
終了したら、ファイルを保存して閉じます。
spipedサービスを開始し、Redisサーバーでファイアウォールを調整します
新しいを開始して有効にします spiped
次のように入力して単位を入力します。
- sudo systemctl start spiped-receive.service
- sudo systemctl enable spiped-receive.service
Redisサーバーで接続をリッスンしているサービスを確認すると、次のように表示されます。 spiped
パブリックインターフェイスのポート6379でリッスンします。 また、Redisがローカルインターフェイスで同じポートをリッスンしていることも確認できます。
- sudo netstat -plunt
Redis server outputActive 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/spiped
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
それでも spiped
パブリックインターフェイスでリッスンしている場合、ファイアウォールはトラフィックを通過させるように構成されていない可能性があります。
ポート6379へのすべてのトラフィックを許可するには、次のように入力します。
- sudo ufw allow 6379
これにより、パブリックインターフェイスのポート6379へのアクセスが可能になります。 spiped
聞いています。 The spiped
ポートは暗号化されたトラフィックのみを受け入れます。
暗号化キーをクライアントに転送する
暗号化キーをクライアントに転送するには、2つのサーバー間に安全な接続を確立する必要があります。 我々は使用するだろう ssh
これにより、既存の構成を活用できるようになります。
キーベースの認証を使用している場合は、SSHキーをRedisサーバーに転送して接続を確立する必要があります。 これは、パスワードベースのシステムでは必要ありません。
キーベースの認証のための追加の手順
Redisサーバーから切断します。
- exit
次に、ローカルマシンで、SSHエージェントが実行されていることと、SSHエージェントに秘密鍵が追加されていることを確認します。
- eval `ssh-agent`
- ssh-add
次に、Redisサーバーに再接続して、 -A
キーを転送するためのフラグ:
- ssh -A sammy@redis_server_public_IP
これで、以下の手順に進むことができます。
キーの転送
キーファイルにはローカルが必要なため、Redisサーバーからクライアントに接続します sudo
アクセスする特権。 これでファイルを転送できます。以下のコマンドの最後にコロンが含まれていることを確認してください。
- sudo -E scp /etc/spiped/redis.key sammy@redis_client_public_IP:
scp
クライアントマシン上のユーザーのホームディレクトリに書き込みます。
キーを転送した後、 /etc/spiped
クライアントマシンのディレクトリ:
- sudo mkdir /etc/spiped
暗号化キーを新しいディレクトリに移動します。
- sudo mv ~/redis.key /etc/spiped
アクセスを制限するには、アクセス許可をロックダウンします。
- sudo chmod 600 /etc/spiped/redis.key
クライアントがサーバーの暗号化キーのコピーを持っているので、クライアント側を構成できます。 spiped
構成。
Redisクライアント用のsystemdユニットファイルを作成する
のsystemdユニットファイルを作成する必要があります spiped
Redisサーバーで行ったのと同じようにクライアント側で。
次のように入力して、新しいsystemdユニットファイルを開きます。
- sudo nano /etc/systemd/system/spiped-send.service
内部で、 [Unit]
サービスについて説明し、ネットワークの可用性に依存することを確認するセクション:
[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target
次に、 [Service]
実行するセクション spiped
処理する。 ここで使用されるオプションは、Redisサーバーで使用されるオプションと非常に似ていますが、次の違いがあります。
-e
:送信元ソケットに入るトラフィックを暗号化する必要があることを指定します。 これにより、ソースソケットとターゲットソケットの関係が確立されます。-s
:前と同じように、ソースソケットを定義します。 ただし、この場合、ソースは、ローカルRedisクライアントが接続できるローカルインターフェイス上の任意の使用可能なポートです。-t
:以前と同様に、ターゲットソケットを定義します。 クライアントの場合、これはリモートRedisサーバーのパブリックIPアドレスと開かれたポートになります。
これらは、を使用して設定されます ExecStart
再びディレクティブ:
[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t [redis_server_public_IP]:6379 -k /etc/spiped/redis.key
最後に、 [Install]
有効にした場合にユニットがいつ起動するかを定義するセクション:
[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t [redis_server_public_IP]:6379 -k /etc/spiped/redis.key
[Install]
WantedBy=multi-user.target
終了したら、ファイルを保存して閉じます。
クライアントでspipedサービスを開始し、接続をテストします
今、私たちは私たちを始めることができます spiped
クライアントでサービスを提供し、起動時に自動的に開始できるようにします。
- sudo systemctl start spiped-send.service
- sudo systemctl enable spiped-send.service
クライアントのトンネルが正しく設定されていることを確認します。
- sudo netstat -plunt
Redis client outputActive 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 3264/spiped
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1705/sshd
tcp6 0 0 :::22 :::* LISTEN 1705/sshd
ご覧のように、 spiped
はローカルポート8000で接続をリッスンしています。
これで、クライアントをローカルインターフェイスのポート8000にポイントすることで、リモートRedisインスタンスに接続できるようになります。
- redis-cli -p 8000 ping
Redis client outputPONG
このガイドの冒頭で設定したテストキーをクエリします。
- redis-cli -p 8000 get test
Redis client output"success"
これにより、リモートデータベースに正常にアクセスできることが確認されます。
トンネルを使用せずにリモートRedisサーバーと通信できない不可能であることを確認するために、リモートポートへの直接接続を試みることができます。
- redis-cli -h redis_server_public_IP -p 6379 ping
Redis client outputError: Protocol error, got "\xac" as reply type byte
ご覧のとおり、トラフィックは、トンネルを介して正しく暗号化されている場合にのみ、リモートRedisポートで受け入れられます。
マルチクライアントおよびサーバー間通信のための上記の例の拡張
上で概説した例では、単一のRedisサーバーと単一のクライアントの簡単な例を使用しました。 ただし、これらの同じ方法は、より複雑な相互作用に適用できます。
この例を拡張して複数のクライアントを処理するのは簡単です。 上記のアクションを実行する必要があります。
- Redisクライアントソフトウェアをインストールし、
spiped
新しいクライアントのパッケージ - 暗号化キーを新しいクライアントに転送します
- をコピーします
spiped
新しいクライアントマシンへのsystemdユニットファイル - を開始します
spiped
サービスを提供し、起動時に開始できるようにします
安全なサーバー間通信をセットアップするには(たとえば、レプリケーションまたはクラスタリング用)、2つの並列トンネルをセットアップする必要があります。
-
新しいサーバーに、Redisサーバーパッケージをインストールし、
spiped
-
新しいRedisサーバーの新しい暗号化キーを生成します(ファイルに一意の名前を使用します)
-
暗号化キーを一方のサーバーからもう一方のサーバーにコピーします
/etc/spiped
ディレクトリ -
作成する
spiped
各サーバー(既存のサーバーを含む)上のsystemdユニットファイル。各サーバーには、各役割を果たすファイルがあります。- 外部ポートをローカルRedisにマッピングする受信ユニットファイル
- ローカルポートをリモートサーバーの公開ポートにマッピングする送信ユニットファイル
-
新しいRedisサーバーのファイアウォールで外部ポートを開きます
-
Redis構成ファイルを調整して、ローカルにマップされたポートに接続してリモートサーバーにアクセスするように各Redisインスタンスを構成します(必要なディレクティブはサーバーの関係によって異なります)。 詳細については、Redisのドキュメントを参照してください)。
必要に応じて、各マシンに複数のクライアントユニットファイルを設定して、ローカルポートをリモートサーバーにマップできます。 このような場合は、送信ユニットファイルの送信元ソケット仕様で、必ず別の未使用のローカルポートを選択してください。
結論
Redisは、多くのデプロイメントにとって非常に貴重な強力で柔軟なツールです。 ただし、安全でない環境でRedisを操作することは、サーバーとデータを攻撃や盗難に対して脆弱なままにする大きな責任です。 信頼できる関係者だけがネットワークを構築していない場合は、他の手段でトラフィックを保護することが不可欠です。 このガイドで概説されている方法は、Redisパーティ間の通信を保護するための1つの方法にすぎません。 その他のオプションには、stunnelによるトンネリングまたはVPNのセットアップが含まれます。