AnsibleおよびTinc VPNを使用してサーバーインフラストラクチャを保護する方法

前書き

このチュートリアルでは、構成管理ツールである* Ansible を使用して、 Tinc *でメッシュVPNをセットアップし、UbuntuサーバーとCentOSサーバー間のネットワーク通信を保護する方法を示します。

メッシュVPNは、サーバーが共有ネットワークを使用している場合に特に役立ちます。これは、サーバーが真にプライベートなネットワーク上で隔離されているかのように通信できるようにするためです。 VPNの認証および暗号化機能によって提供される追加のセキュリティレイヤーは、プライベートサービス(データベース、Elasticsearchクラスターなど)のネットワーク通信を不正アクセスや攻撃から保護します。 DigitalOceanのhttps://www.digitalocean.com/community/tutorials/digitalocean-private-networking-faq [プライベートネットワーキング機能]を使用している場合、このチーム間で隔離されているセキュリティ機能は、同じチームのサーバーで既に有効になっています。同じ地域内のアカウント。 + image:https://assets.digitalocean.com/articles/tinc/ansible-tinc-mesh.png [Mesh VPN Diagram]

複数の構成およびキーファイルをすべてのVPNメンバーに配布する必要があるため、複数のサーバーにまたがってVPNを手動で構成および維持することは難しく、エラーが発生しやすくなります。 このため、ある時点でメンバーが変更される可能性のある実用的なメッシュVPNセットアップには、構成管理ツールを使用する必要があります。 任意の構成管理ツールを使用できますが、このチュートリアルでは一般的で使いやすいAnsibleを使用しています。 このチュートリアルで使用するAnsible Playbook、https://github.com/thisismitch/ansible-tinc [ansible-tinc]は、Ubuntu 14.04およびCentOS 7サーバーでテストされています。

バックグラウンドリーディング

付属のPlaybookがほとんどの作業を行うため、AnsibleやTincについてあまり知らなくても、このチュートリアルに従ってメッシュVPNをセットアップできるはずです。 ただし、設定する内容の詳細を理解できるように、ある時点でそれらがどのように機能するかを読みたい場合があります。

https://www.digitalocean.com/community/tutorials/how-to-install-tinc-and-set-up-a-basic-vpn-on-ubuntu-14-04 [このTinc VPNチュートリアル]では、 Tinc VPNを手動でインストールして設定します。 Ansibleを使用してプロセスを自動化すると、管理がはるかに簡単になります。

Ansibleをインストールおよび構成する方法は、 Ansibleの仕組みのレベルの紹介。 システム管理者のタスクを自動化するAnsible Playbookの作成を開始する場合は、https://www.digitalocean.com/community/tutorials/how-to-create-ansible-playbooks-to-automate-system-configuration-on-をご覧くださいubuntu [このチュートリアル]。

前提条件

ローカルマシン

ローカルマシンは、Ansible Playbookを実行する場所です。 これはローカルマシンである可能性があります(例: ラップトップ)またはサーバーの管理に使用する他のサーバー。 前述のように、各リモートサーバーに「+ root +」として接続できる必要があります。

ローカルマシンにAnsible 2.0+がインストールされている必要があります。 インストールプロセスはオペレーティングシステムまたはディストリビューションによって異なるため、インストールが必要な場合は、http://docs.ansible.com/ansible/intro_installation.html [公式のAnsibleインストールドキュメント]を参照してください。

ローカルマシンにもGitがインストールされている必要があるため、https://github.com/thisismitch/ansible-tinc [ansible-tinc] Playbookのコピーを簡単にダウンロードできます。 繰り返しますが、インストール手順はローカルマシンに依存するため、https://git-scm.com/book/en/v2/Getting-Started-Installing-Git [公式Gitインストールガイド]を参照してください。

リモートサーバー

リモートサーバーは、Tinc VPNを使用するように構成するホストです。 少なくとも2つから始める必要があります。 Ansible Playbookを使用するには、次の要件を満たす必要があります。

  • Ubuntu 14.04またはCentOS 7の実行

  • 「+ root +」ユーザー、https://www.digitalocean.com/community/tutorials/how-to-use-ssh-keys-with-digitalocean-droplets [with]を介してローカルマシン(Ansibleがインストールされている場所)にアクセス可能公開鍵認証]

`+ root `のパスワード認証をまだ無効にしていない場合は、 ` / etc / ssh / sshd_config `ファイルに ` PermitRootLogin without-password +`を追加してからSSHを再起動することで無効にできます。

同じデータセンター内にあるDigitalOcean Dropletsを使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [プライベートネットワークを有効にする]それらのすべてに。 これにより、暗号化されたVPN通信にプライベートネットワークインターフェイス「+ eth1 +」を使用できるようになります。 提供されているPlaybookでは、すべてのVPNノードが同じネットワークデバイス名を使用すると想定しています。

Ansible-Tinc Playbookをダウンロード

開始する準備ができたら、「+ git clone +」を使用してPlaybookのコピーをダウンロードします。 ホームディレクトリに複製します。

cd ~
git clone https://github.com/thisismitch/ansible-tinc

新しくダウンロードした `+ ansible-tinc +`ディレクトリに移動します:

cd ansible-tinc

次に、Playbookを使用してメッシュVPNを作成する方法を示します。 Ansibleに精通している場合は、Playbookの内容を参照するのに時間がかかることがあります。 基本的に、Tincを使用してメッシュVPNをインストールおよび構成し、各サーバーの `+ / etc / hosts +`に便利なエントリも追加します。

ホストインベントリファイルの作成

Playbookを実行する前に、Tinc VPNに含めたいサーバーに関する情報を含む `+ hosts +`ファイルを作成する必要があります。 ここで、hostsファイルの内容を確認します。

〜/ ansible-tinc / hostsの例

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

[removevpn]

最初の行、「+ [vpn] +」は、その直下のホストエントリが「vpn」グループの一部であることを指定します。 このグループのメンバーには、Tinc mesh VPNが構成されます。

  • 最初の列は、ホストのインベントリ名、例の最初の行の「node01」、Ansibleがホストを参照する方法を設定する場所です。 この値は、Tinc接続を設定し、 `+ / etc / hosts +`エントリを生成するために使用されます。 Tincはホスト名でハイフンをサポートしていないため、ここではハイフンを使用しないでください。

  • `+ vpn_ip +`は、ノードがVPNに使用するIPアドレスです。 これを、サーバーがVPN接続に使用するIPアドレスに割り当てます

  • `+ ansible_host +`は、ローカルマシンがノードに到達できる値に設定する必要があります(つまり、 実際のIPアドレスまたはホスト名)

したがって、この例では、次のようなメッシュVPNで構成する4つのホストがあります。

image:https://assets.digitalocean.com/articles/tinc/ansible-tinc-mesh-2.png [メッシュVPNダイアグラムの例]

`+ hosts `ファイルに、VPNに含めるすべてのサーバーが含まれたら、変更を保存します。 重複したエントリ(ホスト名、 ` vpn_ip `アドレス、または ` ansible_host +`値)が含まれていないことを確認してください。

この時点で、インベントリファイル内のすべてのホストにAnsibleが接続できることをテストする必要があります。

ansible all -m ping

全員が緑色の「成功」メッセージで応答する必要があります。 接続のいずれかが失敗した場合、hostsファイルでエラーをチェックし、問題のすべてのサーバーがhttps://www.digitalocean.com/community/tutorials/how-to-use-ansible-にリストされている要件を満たしていることを確認します先に進む前にand-tinc-vpn-to-secure-your-server-infrastructure#prerequisites [prerequisites section]

グループ変数を確認する

Playbookを実行する前に、 `+ / group_vars / all +`ファイルの内容を確認したい場合があります。

/ group_vars / all

---

netname:
physical_ip: "{{ ansible_.ipv4.address }}"

vpn_interface:

vpn_netmask:
vpn_subnet_cidr_netmask: 32

最も重要な2つの変数は、「+ physical_ip 」と「 vpn_netmask +」です。

  • + physical_ip +`は、tincをバインドするIPアドレスを指定します。 ここでは、_Ansible Fact_を活用して、「+ eth1 +」ネットワークデバイスのIPアドレスに設定しています。 DigitalOceanでは、 `+ eth1 +`はプライベートネットワークインターフェースです。そのため、値を `+ {{ansible_eth0.ipv4.address}}に変更してパブリックネットワークインターフェース + eth0 + `を使用する場合を除き、_Private Networking_を有効にする必要があります。 + `

  • `+ vpn_netmask `は、VPNインターフェースに適用されるネットマスクを指定します。 デフォルトでは、「 255.255.255.0+」に設定されています。つまり、各「+ vpn_ip 」は、同じサブネット内の他のホストとのみ通信できるクラスCアドレスです。 たとえば、「 vpn_netmask 」を「+255.255.0.0」などに変更してサブネットを拡大しない限り、「+ 10.0.0.x 」は「 10.0.1.x +」ホストと通信できません。 。

他の設定の説明は次のとおりです。

  • `+ netname `はtincネット名を指定します。 デフォルトでは「 nyc3 +」に設定されています。

  • `+ vpn_interface `は、tincが使用する仮想ネットワークインターフェイスの名前です。 デフォルトでは ` tun0 +`です。

  • `+ vpn_subnet_cidr_netmask +`は32に設定されます。これは、メッシュVPNを構成しているため、単一ホストサブネット(ポイントツーポイント)を示します。 この値を変更しないでください。

グループ変数の確認が完了したら、次のステップに進む準備ができているはずです。

Tinc VPNを展開する

インベントリホストファイルを作成し、グループ変数を確認したら、Playbookを実行してTincを展開し、サーバー全体にVPNをセットアップする準備ができました。

`+ ansible-tinc +`ディレクトリから、次のコマンドを実行してPlaybookを実行します。

ansible-playbook site.yml

Playbookの実行中、実行される各タスクの出力を提供する必要があります。 すべてが正しく構成されている場合、いくつかの `+ ok `および ` changed `ステータスが表示され、ゼロの ` failed +`ステータスが表示されます。

PLAY RECAP *********************************************************************node01                     : ok=18   changed=15   unreachable=0    failed=0
node02                     : ok=18   changed=15   unreachable=0    failed=0
node03                     : ok=21   changed=19   unreachable=0    failed=0
node04                     : ok=21   changed=19   unreachable=0    failed=0

失敗したタスクがない場合、インベントリファイル内のすべてのホストは、VPNネットワークを介して相互に通信できる必要があります。

VPNをテストする

最初のホストにログインし、2番目のホストにpingを実行します。

ping 10.0.0.2

Playbookは各ホストのVPN IPアドレスをインベントリのホスト名にポイントする「+ / etc / hosts 」エントリを自動的に作成するため、次のようにすることもできます(Ansibleでホストの1つに「 node02 + + hosts + `ファイル):

ping node02

いずれにしても、有効なping応答が表示されるはずです。

[secondary_label Output:
PING node02 (10.0.0.2) 56(84) bytes of data.
64 bytes from node02 (10.0.0.2): icmp_seq=1 ttl=64 time=1.42 ms
64 bytes from node02 (10.0.0.2): icmp_seq=2 ttl=64 time=1.03 ms
...

他のノード間のVPN接続を自由にテストしてください。

テストが完了すると、メッシュVPNを使用する準備が整います。

サービスとアプリケーションを構成する

メッシュVPNがセットアップされたので、それを使用するようにバックエンドサービスとアプリケーションを構成する必要があります(適切な場合)。 つまり、VPNを介して通信する必要があるサービスは、通常のプライベートIPアドレスではなく、適切なVPN IPアドレス( + vpn_ip +)を使用する必要があります。

たとえば、* node01 でNginxを使用し、 node02 *でMySQLデータベースを使用してLEMPスタックを実行しているとします。 MySQLはVPN IPアドレス「10.0.0.2」にバインドするように設定し、PHPアプリケーションは「10.0.0.2」のデータベースに接続し、Nginxは「+192.0.2.55 +」(node01のパブリックIPアドレス)。

別の例では、* node01 node02 、および node03 *がElasticsearchクラスターのノードである場合、Elasticsearchは「10.0.0.1 +」、「 10.0.0.2+」、および「+10.0」を使用するように設定する必要がありますノードのIPアドレスとして.0.3 + `。 同様に、クラスターに接続するクライアントもVPNアドレスを使用する必要があります。

ファイアウォールの考慮事項

VPNネットワークデバイス、「tun0」、またはVPN IPアドレスのトラフィックを許可するには、ファイアウォールルールを更新する必要がある場合があります。

サーバーを追加または削除する方法

新しいサーバーを追加

`+ hosts `ファイルの ` [vpn] `グループにリストされているすべてのサーバーは、VPNの一部になります。 新しいVPNメンバーを追加するには、新しいサーバーを ` [vpn] +`グループに追加し、Playbookを再実行します。

ansible-playbook site.yml

サーバーを削除する

VPNメンバーを削除するには、削除するサーバーの「+ hosts 」エントリを「 [removevpn] +」グループの下のファイルの下部に移動します。

たとえば、* node04 *を削除する場合、 `+ hosts +`ファイルは次のようになります。

ホスト-VPNからnode04を削除します

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4

[removevpn]
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

hostsファイルを保存します。 `+ vrem_ip `はオプションであり、 ` [removevpn] +`グループメンバーには使用されないことに注意してください。

次に、Playbookを再実行します。

ansible-playbook site.yml

これにより、Tincが停止し、Tinc設定とホストキーファイルが `+ [removevpn] +`グループのメンバーから削除され、VPNから削除されます。

VPNからホストを削除すると、孤立したtinc hostsファイルと残りのVPNメンバーの/ etc / hostsエントリが作成されることに注意してください。 後で新しいサーバーをVPNに追加するが、廃止された名前を再利用しない限り、これは何にも影響しないはずです。 これが問題になる場合は、各サーバーで適切な「+ / etc / hosts +」エントリを削除します。

結論

TincとAnsibleを使用して、サーバーインフラストラクチャをメッシュVPNで保護する必要があります。 特定のニーズに合わせてプレイブックを変更する必要がある場合は、https://github.com/thisismitch/ansible-tinc [GitHubでfork]までお気軽にご連絡ください。

がんばろう!

Related