Ubuntu 16.04でPeerVPNを使用してRedisへのトラフィックを暗号化する方法

前書き

Redisはオープンソースのキーと値のデータストアであり、永続化のためにオプションのディスク書き込みを伴うメモリ内ストレージモデルを使用します。 トランザクション、pub / subメッセージングパターン、および他の機能の中での自動フェールオーバーを備えています。 Redisには、ほとんどの言語で記述されたクライアントがあり、推奨されるクライアントはtheir websiteで紹介されています。

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

このガイドでは、PeerVPNと呼ばれる単純なVPNプログラムを介してルーティングすることにより、Redisトラフィックを暗号化する方法を示します。 サーバー間のすべてのトラフィックは、VPNを介して安全にルーティングできます。 一部のソリューションとは異なり、これは特定のポートまたはサービスにバインドされていない一般的なサーバー間通信のための柔軟なソリューションを提供します。 ただし、このガイドでは、Redisトラフィックを保護するためにPeerVPNの構成に焦点を当てます。 2台のUbuntu 16.04サーバーを使用してデモを行います。

前提条件

開始するには、各マシンでsudo特権が構成されたroot以外のユーザーが必要です。 さらに、このガイドでは、基本的なファイアウォールが設定されていることを前提としています。 これらの要件を満たすために、Ubuntu 16.04 initial server setup guideをたどることができます。

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

PeerVPNとは何ですか?

PeerVPNは、メッシュトポロジを確立する非常にシンプルなVPNテクノロジーです。 これは、ノード間の通信を調停するために常に使用可能でなければならない中央サーバーがないことを意味します。 これは、既存のホストで何も再構成せずに、関係者間に信頼できる環境を確立したい状況に最適です。 ノード間のすべてのトラフィックはVPNを介して暗号化でき、VPNインターフェイスでのみトラフィックを受け入れるようにサービスとファイアウォールの両方を構成できます。

PeerVPNを使用する利点は次のとおりです。

  • シンプルで直感的な構成。 多くのVPNとは異なり、PeerVPNはごくわずかな作業でセットアップでき、中央サーバーを必要としません。

  • 暗号化されたネットワーク通信のための汎用ソリューション。 一部のトンネリングオプションとは異なり、VPNはanyトラフィックに安全なネットワークを提供します。 暗号化通信は一度設定するだけで、すべてのサービスで使用できます。

  • サーバー間通信に必要な接続は1つだけです。 トンネリングソリューションとは異なり、2つのRedisサーバーが通信するために必要な構成は1つだけです。

欠点は次のとおりです。

  • 現在、UbuntuのデフォルトリポジトリにはPeerVPN用のパッケージはありません。

  • 含まれているinitスクリプトはないため、ブート時に必要な接続を自動的に作成するには、initスクリプトを作成する必要があります。

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

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

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

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

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

Chris Lea’s Redis server 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に設定しました。 PeerVPNを構成した後、クライアントマシンからこのキーにアクセスしようとします。

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

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

sudo apt-get update
sudo apt-get install redis-tools

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

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

次に、各サーバーとクライアントにPeerVPNをインストールする必要があります。 前述のように、Ubuntuのリポジトリには現在PeerVPNパッケージが含まれていません。

幸い、project’s websiteには、Downloadセクションの下にLinux用にコンパイルされたバイナリが含まれています。 そのページで静的にリンクされたLinuxバイナリのリンクを右クリックしてコピーし、最新バージョンを使用していることを確認します。

各マシンで、/tmpディレクトリに移動し、curlを使用してコピーしたリンクをダウンロードします。

cd /tmp
curl -LO https://peervpn.net/files/peervpn-0-044-linux-x86.tar.gz

次のように入力して、ダウンロードしたtarballを抽出します。

tar xzvf peervpn*

バイナリを/usr/local/binディレクトリにコピーし、設定例ファイルを/etcディレクトリにコピーします。

sudo cp /tmp/peervpn*/peervpn /usr/local/bin
sudo cp /tmp/peervpn*/peervpn.conf /etc

これでPeerVPNがシステムにインストールされ、すぐに使用できます。

PeerVPNネットワークを構成する

実行可能ファイルと構成ファイルを適切な場所に配置すると、各マシンでPeerVPNを構成できます。

安全な秘密鍵の生成

PeerVPNは、最大512文字の共有シークレットを使用して、正当なマシンをネットワークに対して認証します。 ネットワークトラフィックの整合性を保護するために、強力な値を使用することが重要です。 これは共有シークレットであるため、ネットワークに対して1つの値を生成するだけで済みます(これにはRedisサーバーマシンを使用しますが、どちらを選択してもかまいません)。

最大長の強力な秘密を生成する簡単な方法の1つは、OpenSSLを使用することです。 wcで512文字以下の出力を生成していることを確認します(このコマンドで382を調整して、出力の長さに影響を与えることができます)。

openssl rand -base64 382 | tr -d '\n' | wc
Redis server output      0       1     512

長さが正しい場合は、wcを削除して、高エントロピーシークレットを生成します。 最後にechoを追加して、最後の改行を入れます。

openssl rand -base64 382 | tr -d '\n' && echo

次のようなものが表示されます:(do not copy the below value!)

Redis server outputajHpYYMJYtv+m0K6yZbYmk8npPujlcv9QDozQZ06ucV2gsHoMGqyfd50X8OnY6hicj5iFNjDN/9QVTB3nhMOV2ufU/kfWCbtskUuk1zHWYZsvy71KnLRhA8W8dnu+NEKdIh28H2qUsiay7On5kOZPcrONvv/pHHYbxmFI2G9TyYT+CZWIAxUV/vUWl41VycjASmZYaSI6lWgYONopncNfDF5Z6oznPH8ge6sQsszbe1ZjNqLRUrx/jgL3fy7SXSLCIrsSuifBv/pb36d9/y+YPZEbxsMInoK5QEWrpIf/xjbMFlndtGc20olhh05h66qz/GiimLMivrN8g+PibVaBRUmWav/pngUvKYsEEPSc0wrr5ZuvpvBGTTKqPdR+soCnd/iWPzmwRBW56vBGxed3GNbkgmjDpTSnvNEN+gKPt07drHSbGqfFbdMdsKbjE+IWiqiVO1aviJsNpMhBO/o9uIcKxPmuze6loZKTh7/qjJuY62E//SsgFzDHDhP2w==

生成された出力をコピーして、PeerVPN構成で使用できるようにします。

PeerVPN構成の定義

PeerVPNを構成するには、各サーバーで/etc/peervpn.confファイルを開きます。

sudo nano /etc/peervpn.conf

内部には、各構成オプションを説明するコメントがあります。 これらを読んで、利用可能な設定に慣れてください。 構成は非常に簡単です。 構成行をファイルの先頭に追加するか、ファイル全体のコメントで適切な行を見つけてコメント解除し、定義できます。

まず、networknamepskを設定します。これらは両方とも、VPN内の各マシンで同じである必要があります。 ネットワーク名はこの特定のネットワークの任意の識別子ですが、pskは前述の共有シークレットです。

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

次に、ファイアウォールを簡単に調整できるように、PeerVPNがピアへの接続に使用できるportを明示的に設定します(このガイドでは7000を使用します)。 このマシンがネットワークのアクティブな部分になるようにenabletunnelingを設定します。 ipifconfigなどのツールに表示されるネットワークinterfaceの名前を設定します。

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

VPNネットワークサイズを選択し、ifconfig4ディレクティブを使用して各サーバーに一意のVPNIPアドレスを割り当てる必要があります。 これはCIDR notationを使用して行われます。 VPNネットワークを10.8.0.0/24として定義します。 これにより、10.8.0から始まる254の潜在的なアドレス(必要以上)が得られます。 各アドレスは一意である必要があるため、次を使用します。

  • Redisサーバーの10.8.0.1/24

  • クライアントサーバーの10.8.0.2/24

最後に、initpeersを使用して、ネットワーク内にある他のサーバーを指定します。 PeerVPNは集中管理サーバーを使用しないため、これらのホストは初期化中にVPNネットワークに参加するために接続されます。 接続後、サーバーはネットワーク上の追加ピアに関する情報を自動的に受信します。

ピアは、パブリックIPアドレス(notはPeerVPN構成内で割り当てられたVPN IPアドレス)とPeerVPNリスニングポートを使用して指定する必要があります。 追加のピアを同じ行に指定し、スペースで区切ることもできます(例については、ファイル内のコメントを参照してください)。

/etc/peervpn.conf

networkname RedisNet<^>
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

# Increment the IP address below for each additional server
# For example, the second node on the network could be 10.8.0.2/24
ifconfig4 10.8.0.1/24
initpeers other_server_public_IP 7000

完了したら、ファイルを保存して閉じます。 両方のマシンには、ifconfig4initpeersの値のみが異なる、非常に類似した構成ファイルが必要です。

PeerVPN用のsystemdユニットファイルを作成する

PeerVPNをサービスとして管理し、起動時にネットワークを開始するために、systemdユニットファイルを作成します。 開始するには、各マシンの/etc/systemd/systemディレクトリにある新しいユニットファイルを開きます。

sudo nano /etc/systemd/system/peervpn.service

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

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

次に、[Service]セクションを開いて、実行する実際のコマンドを定義します。 ここでは、ExecStartを使用してpeervpnバイナリを呼び出し、作成した構成ファイルを指す必要があります。

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

最後に、[Install]セクションを含めて、有効になっている場合にユニットを自動的に起動するタイミングをsystemdに通知します。

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

[Install]
WantedBy=multi-user.target

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

PeerVPNサービスを開始し、ファイアウォールを調整します

次のように入力して、両方のマシンで新しいpeervpnユニットを起動して有効にします。

sudo systemctl start peervpn.service
sudo systemctl enable peervpn.service

サーバー上の接続をリッスンしているサービスを確認すると、IPv4とIPv6の両方のインターフェイス(利用可能な場合)のポート7000でリッスンしているPeerVPNが表示されます。

sudo netstat -plunt
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:6379          0.0.0.0:*               LISTEN      2662/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1724/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1724/sshd
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           4609/peervpn
udp6       0      0 :::7000                 :::*                                4609/peervpn

PeerVPNはパブリックインターフェイスでリッスンしていますが、ファイアウォールはトラフィックを通過させるようにまだ構成されていない可能性があります。 PeerVPNが接続をリッスンしているポート7000へのトラフィックと、10.8.0.0 / 24ネットワーク自体からのトラフィックを許可する必要があります。

sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24

これにより、PeerVPNがリッスンしているパブリックインターフェイスのポート7000へのアクセスが開かれます。 また、トラフィックがVPNから自由に流れるようにします。

VPN IPアドレスを使用して他のサーバーにアクセスできるかどうかを確認します。 たとえば、Redisサーバーから次のように入力できます。

ping 10.8.0.2

問題なく接続できるはずです。

Redisサーバー設定の調整

VPNがセットアップされたので、Redisがリッスンしているインターフェイスを調整する必要があります。 デフォルトでは、Redisはローカルインターフェースにのみバインドします。

RedisサーバーでRedis構成ファイルを開きます。

sudo nano /etc/redis/redis.conf

内部で、bindディレクティブを検索します。これは現在127.0.0.1に設定されているはずです。 RedisサーバーのVPN IPアドレスを最後に追加します。

/etc/redis/redis.conf

. . .
bind 127.0.0.1 10.8.0.1
. . .

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

次のように入力して、Redisサービスを再起動します。

sudo systemctl restart redis-server.service

これで、RedisサービスがVPNピアからの接続に使用できるようになります。 これは、リスニングポートを再確認することで確認できます。

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 10.8.0.1:6379           0.0.0.0:*               LISTEN      4767/redis-server 1
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      4767/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1724/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1724/sshd
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           4609/peervpn
udp6       0      0 :::7000                 :::*                                4609/peervpn

この例の一番上の行で、RedisがVPNインターフェースをリッスンしていることがわかります。

Redisクライアントからの接続をテストする

VPNを実行し、RedisがVPNネットワークでリッスンしている場合、RedisクライアントマシンがRedisサーバーにアクセスできることをテストして確認できます。

これを行うには、-hオプションを使用して、クライアントをRedisサーバーのVPNIPアドレスに向けます。

redis-cli -h 10.8.0.1 ping
Redis client outputPONG

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

redis-cli -h 10.8.0.1 get test
Redis client output"success"

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

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

上記で概説した例では、単一のRedisサーバーと単一のクライアントの簡単な例を使用しました。 ただし、これはより複雑な相互作用に対応するために簡単に拡張できます。

PeerVPNはメッシュネットワークを使用するため、クライアントまたはサーバーを追加するのは簡単です。 新しいピアは次の手順を完了する必要があります。

  • tarballをダウンロードし、ファイルを抽出して配布してPeerVPNをインストールします

  • 他のサーバーからPeerVPN構成をコピーし、これらのディレクティブを調整します。

    • ifconfig4は、VPNネットワーク内の未使用のIPアドレスに設定する必要があります

    • initpeersは、少なくとも1つ、できれば既存のすべてのピアを指す必要があります

  • PeerVPN systemdユニットファイルを新しいクライアントマシンにコピーします

  • PeerVPNサービスを開始し、起動時に開始できるようにします

  • ファイアウォールで外部ポートとVPNネットワークを開きます

  • (Redisサーバーのみ)新しいVPNインターフェースにバインドするようにRedis設定を調整します

結論

Redisは強力で柔軟なツールであり、多くの展開にとって非常に貴重です。 ただし、Redisを安全でない環境で運用することは、サーバーやデータを攻撃や盗難に対して脆弱なままにする大きな問題です。 信頼できる関係者のみが存在する分離されたネットワークがない場合は、他の手段でトラフィックを保護することが不可欠です。 このガイドで概説されている方法は、Redisパーティ間の通信を保護するための1つの方法にすぎません。 その他のオプションには、stunnelまたはspipedを使用した暗号化トンネルの構成が含まれます。

Related