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

前書き

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

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

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

前提条件

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

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

PeerVPNとは何ですか?

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

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

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

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

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

欠点は次のとおりです。

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

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

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

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

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

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パッケージが含まれていません。

幸い、https://peervpn.net/ [プロジェクトのウェブサイト]の[ダウンロード]セクションにLinux用のコンパイル済みバイナリが含まれています。 そのページで静的にリンクされたLinuxバイナリのリンクを右クリックしてコピーし、最新バージョンを使用していることを確認します。

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

cd /tmp
curl -LO https://peervpn.net/files/

次のように入力して、ダウンロードした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

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

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

次のようなものが表示されるはずです*(以下の値をコピーしないでください!)*:

Redis server output

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

PeerVPN構成の定義

PeerVPNを設定するには、各サーバーで `+ / etc / peervpn.conf +`ファイルを開きます:

sudo nano /etc/peervpn.conf

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

`+ networkname `と ` psk `を設定することから始めます。これらは両方とも、VPN内の各マシンで同じでなければなりません。 ネットワーク名はこの特定のネットワークの任意の識別子ですが、「 psk +」は前述の共有秘密です:

/etc/peervpn.conf

networkname
psk

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

/etc/peervpn.conf

networkname
psk

port 7000
enabletunneling yes
interface peervpn0

VPNネットワークサイズを選択し、 `+ ifconfig4 +`ディレクティブを使用して各サーバーに一意のVPN IPアドレスを割り当てる必要があります。 これは、https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking [CIDR notation]を使用して行われます。 VPNネットワークを10.8.0.0/24として定義します。 これにより、10.8.0から始まる254の潜在的なアドレス(必要以上)が得られます。 各アドレスは一意である必要があるため、次を使用します。

  • * 10.8.0.1 / 24 * Redisサーバーの場合

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

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

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

/etc/peervpn.conf

networkname RedisNet<^>
psk

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
initpeers  7000

完了したら、ファイルを保存して閉じます。 どちらのマシンにも非常によく似た設定ファイルがあり、 `+ ifconfig4 `と ` initpeers +`の値のみが異なります。

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

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

/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

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

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
. . .

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

次のように入力して、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サーバーのVPN IPアドレスにクライアントを向けます:

redis-cli -h  ping
Redis client outputPONG

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

redis-cli -h  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つの方法にすぎません。 その他のオプションには、https://www.digitalocean.com/community/tutorials/how-to-encrypt-traffic-to-redis-with-stunnel-on-ubuntu-16-04 [stunnel]またはhttpsを使用した暗号化トンネルの構成が含まれます。 ://www.digitalocean.com/community/tutorials/how-to-encrypt-traffic-to-redis-with-spiped-on-ubuntu-16-04 [spiped]。

前の投稿:ExternalDNSを使用してDigitalOcean KubernetesからDNSレコードを自動的に管理する方法
次の投稿:GoでFlagパッケージを使用する方法