開発者ドキュメント

Ubuntu16.04でSpipedを使用してRedisへのトラフィックを暗号化する方法

序章

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 それは:

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

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

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. 構成後、クライアントマシンからこのキーにアクセスしようとします spiped.

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

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

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

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

各コンピューターにspipedをインストールする

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

  1. sudo apt-get install spiped

必要なソフトウェアがインストールされたので、次のような安全なキーを生成できます。 spiped 2台のマシン間のトラフィックを暗号化するために使用できます。

Redisサーバーで暗号化キーを生成する

次に、を作成します spiped 内の構成ディレクトリ /etc 暗号化のために生成するキーを保存するためにRedisサーバーに:

  1. sudo mkdir /etc/spiped

次のように入力して、安全なキーを生成します。

  1. sudo dd if=/dev/urandom of=/etc/spiped/redis.key bs=32 count=1

権限を調整して、生成されたキーファイルへのアクセスを制限します。

  1. sudo chmod 600 /etc/spiped/redis.key

これで、Redisサーバーで使用可能なキーができたので、セットアップできます。 spiped systemdユニットファイルを使用してサーバー上で。

Redisサーバー用のsystemdユニットファイルを作成する

The spiped ユーティリティは非常にシンプルで、構成ファイルの読み取りをサポートしていません。 各パイプは手動で構成する必要があるため、Ubuntuパッケージには、起動時にパイプを自動的に開始するためのinitスクリプトが付属していません。

これらの問題を解決するために、単純なsystemdユニットファイルを作成します。 で新しいユニットファイルを開きます /etc/systemd/system 開始するディレクトリ:

  1. sudo nano /etc/systemd/system/spiped-receive.service

内部で、を作成します [Unit] ユニットを説明し、ネットワークが利用可能になった後にこのユニットが開始されるように順序を確立するセクション:

/etc/systemd/system/spiped-receive.service
[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

次に、 [Service] 実行する実際のコマンドを定義するセクション。 次のオプションを使用します spiped:

これらのオプションはすべて1つになります ExecStart このセクションで必要な唯一の項目であるディレクティブ:

/etc/systemd/system/spiped-receive.service
[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に通知するセクション:

/etc/systemd/system/spiped-receive.service
[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 次のように入力して単位を入力します。

  1. sudo systemctl start spiped-receive.service
  2. sudo systemctl enable spiped-receive.service

Redisサーバーで接続をリッスンしているサービスを確認すると、次のように表示されます。 spiped パブリックインターフェイスのポート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/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へのすべてのトラフィックを許可するには、次のように入力します。

  1. sudo ufw allow 6379

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

暗号化キーをクライアントに転送する

暗号化キーをクライアントに転送するには、2つのサーバー間に安全な接続を確立する必要があります。 我々は使用するだろう ssh これにより、既存の構成を活用できるようになります。

キーベースの認証を使用している場合は、SSHキーをRedisサーバーに転送して接続を確立する必要があります。 これは、パスワードベースのシステムでは必要ありません。

キーベースの認証のための追加の手順

Redisサーバーから切断します。

  1. exit

次に、ローカルマシンで、SSHエージェントが実行されていることと、SSHエージェントに秘密鍵が追加されていることを確認します。

  1. eval `ssh-agent`
  2. ssh-add

次に、Redisサーバーに再接続して、 -A キーを転送するためのフラグ:

  1. ssh -A sammy@redis_server_public_IP

これで、以下の手順に進むことができます。

キーの転送

キーファイルにはローカルが必要なため、Redisサーバーからクライアントに接続します sudo アクセスする特権。 これでファイルを転送できます。以下のコマンドの最後にコロンが含まれていることを確認してください。

  1. sudo -E scp /etc/spiped/redis.key sammy@redis_client_public_IP:

scp クライアントマシン上のユーザーのホームディレクトリに書き込みます。

キーを転送した後、 /etc/spiped クライアントマシンのディレクトリ:

  1. sudo mkdir /etc/spiped

暗号化キーを新しいディレクトリに移動します。

  1. sudo mv ~/redis.key /etc/spiped

アクセスを制限するには、アクセス許可をロックダウンします。

  1. sudo chmod 600 /etc/spiped/redis.key

クライアントがサーバーの暗号化キーのコピーを持っているので、クライアント側を構成できます。 spiped 構成。

Redisクライアント用のsystemdユニットファイルを作成する

のsystemdユニットファイルを作成する必要があります spiped Redisサーバーで行ったのと同じようにクライアント側で。

次のように入力して、新しいsystemdユニットファイルを開きます。

  1. sudo nano /etc/systemd/system/spiped-send.service

内部で、 [Unit] サービスについて説明し、ネットワークの可用性に依存することを確認するセクション:

/etc/systemd/system/spiped-send.service
[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

次に、 [Service] 実行するセクション spiped 処理する。 ここで使用されるオプションは、Redisサーバーで使用されるオプションと非常に似ていますが、次の違いがあります。

これらは、を使用して設定されます ExecStart 再びディレクティブ:

/etc/systemd/system/spiped-send.service
[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] 有効にした場合にユニットがいつ起動するかを定義するセクション:

/etc/systemd/system/spiped-send.service
[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 クライアントでサービスを提供し、起動時に自動的に開始できるようにします。

  1. sudo systemctl start spiped-send.service
  2. sudo systemctl enable spiped-send.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 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インスタンスに接続できるようになります。

  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: Protocol error, got "\xac" as reply type byte

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

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

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

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

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

必要に応じて、各マシンに複数のクライアントユニットファイルを設定して、ローカルポートをリモートサーバーにマップできます。 このような場合は、送信ユニットファイルの送信元ソケット仕様で、必ず別の未使用のローカルポートを選択してください。

結論

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

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