AnsibleおよびTincVPNを使用してサーバーインフラストラクチャを保護する方法
序章
このチュートリアルでは、構成管理ツールである Ansible を使用して、 Tinc でメッシュVPNをセットアップし、UbuntuサーバーとCentOSサーバー間のネットワーク通信を保護する方法を示します。
メッシュVPNは、サーバーが共有ネットワークを使用している場合に特に役立ちます。これにより、サーバーは、真にプライベートなネットワーク上で分離されているかのように通信できるようになります。 VPNの認証および暗号化機能によって提供される追加のセキュリティ層は、プライベートサービス(データベース、Elasticsearchクラスターなど)のネットワーク通信を不正アクセスや攻撃から保護します。 DigitalOceanのプライベートネットワーキング機能を使用している場合、このセキュリティ機能は、同じ地域内の同じチームまたはアカウントのサーバーですでに有効になっています。
複数の構成およびキーファイルをすべてのVPNメンバーに分散させる必要があるため、複数のサーバー間でVPNを手動で構成および保守することは困難であり、エラーが発生しやすくなります。 このため、ある時点でメンバーが変更される可能性のある実用的なメッシュVPNセットアップには、構成管理ツールを使用する必要があります。 任意の構成管理ツールを使用できますが、このチュートリアルでは、人気があり使いやすいため、Ansibleを使用しています。 このチュートリアルで使用するAnsiblePlaybook 、 ansible-tinc は、Ubuntu14.04およびCentOS7サーバーでテストされています。
背景の読書
付属のPlaybookがほとんどの作業を行うので、AnsibleやTincについてあまり知らなくても、このチュートリアルに従ってメッシュVPNをセットアップできるはずです。 ただし、設定内容の詳細を理解できるように、ある時点でそれらがどのように機能するかを確認することをお勧めします。
このTincVPNチュートリアルでは、TincVPNを手動でインストールおよび構成する方法について説明します。 Ansibleを使用してプロセスを自動化すると、管理がはるかに簡単になります。
Ansibleのインストールと構成の方法は、Ansibleがどのように機能するかについての非常に高レベルの紹介を提供します。 システム管理者のタスクを自動化するためにAnsiblePlaybookの作成を開始する場合は、このチュートリアルを確認してください。
前提条件
ローカルマシン
ローカルマシンは、AnsiblePlaybookを実行する場所です。 これはローカルマシンである可能性があります(例: ラップトップ)またはサーバーの管理に使用するその他のサーバー。 前述のように、各リモートサーバーに次のように接続できる必要があります。 root
.
ローカルマシンにはAnsible2.0以降がインストールされている必要があります。 インストールプロセスはオペレーティングシステムまたはディストリビューションによって異なるため、インストールする必要がある場合は、公式のAnsibleインストールドキュメントを参照してください。
ローカルマシンにもGitがインストールされている必要があるため、ansible-tincプレイブックのコピーを簡単にダウンロードできます。 繰り返しになりますが、インストール手順はローカルマシンによって異なるため、公式Gitインストールガイドを参照してください。
リモートサーバー
リモートサーバーは、TincVPNを使用するように構成するホストです。 少なくとも2つから始める必要があります。 Ansible Playbookを使用するには、次の条件を満たしている必要があります。
- Ubuntu14.04またはCentOS7を実行している
- ローカルマシン(Ansibleがインストールされている場所)にアクセスするには、
root
ユーザー、公開鍵認証付き
注: Playbookが使用するAnsibleSynchronizeモジュールのバグのため、現時点では別のリモートユーザーを使用することはできません。
のパスワード認証をまだ無効にしていない場合 root
、追加することでそうすることができます PermitRootLogin without-password
あなたに /etc/ssh/sshd_config
ファイルを作成してから、SSHを再起動します。
同じデータセンター内にあるDigitalOceanドロップレットを使用している場合は、それらすべてでプライベートネットワーキングを有効にする必要があります。 これにより、プライベートネットワークインターフェイスを使用できるようになります。 eth1
、暗号化されたVPN通信用。 提供されているPlaybookは、すべてのVPNノードが同じネットワークデバイス名を使用することを前提としています。
Ansible-TincPlaybookをダウンロードする
始める準備ができたら、 git clone
Playbookのコピーをダウンロードします。 ホームディレクトリにクローンを作成します。
- cd ~
- git clone https://github.com/thisismitch/ansible-tinc
次に、新しくダウンロードしたものに変更します ansible-tinc
ディレクトリ:
- cd ansible-tinc
注:このチュートリアルの残りの部分では、 ansible-tinc
ローカルマシン上のディレクトリ。 すべてのAnsibleコマンドは、このディレクトリから実行する必要があります。 また、参照されるすべてのファイルは、 /etc/hosts
、はこのパスに関連しています。例: hosts
を指します ~/ansible-tinc/hosts
.
次に、Playbookを使用してメッシュVPNを作成する方法を示します。 Ansibleに精通している場合は、Playbookの内容を参照するのに少し時間がかかる場合があります。 基本的に、Tincを使用してメッシュVPNをインストールおよび構成し、各サーバーに便利なエントリを追加します。 /etc/hosts
.
ホストインベントリファイルの作成
Playbookを実行する前に、 hosts
TincVPNに含めるサーバーに関する情報を含むファイル。 ここで、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メッシュVPNが構成されています。
- 最初の列は、ホストのインベントリ名「node01」を設定する場所です。例の最初の行では、Ansibleがホストを参照する方法を示しています。 この値は、Tinc接続を構成し、生成するために使用されます
/etc/hosts
エントリ。 Tincはホスト名でハイフンをサポートしていないため、ここではハイフンを使用しないでください vpn_ip
ノードがVPNに使用するIPアドレスです。 これを、サーバーがVPN接続に使用するIPアドレスに割り当てますansible_host
ローカルマシンがノードに到達できる値に設定する必要があります(つまり、 実際のIPアドレスまたはホスト名)
したがって、この例では、次のようなメッシュVPNで構成する4つのホストがあります。
一度あなたの hosts
ファイルには、VPNに含めたいすべてのサーバーが含まれており、変更を保存します。 重複するエントリ(ホスト名、 vpn_ip
アドレス、または ansible_host
値)。
この時点で、Ansibleがインベントリファイル内のすべてのホストに接続できることをテストする必要があります。
- ansible all -m ping
それらはすべて、緑色の「SUCCESS」メッセージで応答する必要があります。 いずれかの接続が失敗した場合は、hostsファイルでエラーをチェックし、問題のサーバーがすべて前提条件セクションにリストされている要件を満たしていることを確認してから次に進んでください。
グループ変数を確認する
Playbookを実行する前に、 /group_vars/all
ファイル:
- ---
-
- netname: nyc3
- physical_ip: "{{ ansible_eth1.ipv4.address }}"
-
- vpn_interface: tun0
-
- vpn_netmask: 255.255.255.0
- vpn_subnet_cidr_netmask: 32
2つの最も重要な変数は physical_ip
と vpn_netmask
:
physical_ip
tincがバインドするIPアドレスを指定します。 ここでは、 Ansible Fact を利用して、のIPアドレスに設定しています。eth1
ネットワークデバイス。 DigitalOceanでは、eth1
はプライベートネットワークインターフェイスであるため、パブリックネットワークインターフェイスを使用する場合を除き、プライベートネットワークを有効にする必要があります。eth0
、その値をに変更することによって{{ ansible_eth0.ipv4.address }}
vpn_netmask
VPNインターフェースに適用されるネットマスクを指定します。 デフォルトでは、255.255.255.0
、つまりそれぞれvpn_ip
は、同じサブネット内の他のホストとのみ通信できるクラスCアドレスです。 たとえば、10.0.0.x
と通信することはできなくなります10.0.1.x
サブネットを変更して拡大しない限り、ホストvpn_netmask
のようなものに255.255.0.0
.
注: VPNのセキュリティ上の利点は、パブリックインターネットを介してサーバーに拡張できますが、通信には、非VPN接続と同じ遅延と帯域幅の制限があることに注意してください。
その他の設定の説明は次のとおりです。
netname
tincネット名を指定します。 に設定されていますnyc3
デフォルトでは。vpn_interface
tincが使用する仮想ネットワークインターフェイスの名前です。 ですtun0
デフォルトでは。vpn_subnet_cidr_netmask
は32に設定されています。これは、メッシュVPNを構成しているため、シングルホストサブネット(ポイントツーポイント)を示します。 この値は変更しないでください。
グループ変数の確認が完了したら、次のステップに進む準備ができているはずです。
TincVPNを導入する
インベントリホストファイルを作成し、グループ変数を確認したので、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が自動的に作成するため /etc/hosts
インベントリのホスト名を各メンバーのVPNIPアドレスにポイントするエントリでは、次のようなこともできます(ホストの1つに名前が付けられていると仮定します) node02
Ansibleで 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接続を自由にテストしてください。
注:Tincはポートを使用します 655
. pingテストが機能しない場合は、各ノードのファイアウォールが、VPNが使用している実際のネットワークデバイスを介した適切なトラフィックを許可していることを確認してください。
テストが完了すると、メッシュVPNを使用できるようになります。
サービスとアプリケーションの構成
メッシュVPNがセットアップされたので、それを使用するようにバックエンドサービスとアプリケーションを構成する必要があります(適切な場合)。 これは、VPNを介して通信する必要があるサービスは、適切なVPN IPアドレスを使用する必要があることを意味します(vpn_ip
)通常のプライベートIPアドレスの代わりに。
たとえば、 node01 でNginxを使用し、node02でMySQLデータベースを使用してLEMPスタックを実行しているとします。 MySQLはVPNIPアドレスにバインドするように構成する必要があります 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.0.3
ノードのIPアドレスとして。 同様に、クラスターに接続するすべてのクライアントもVPNアドレスを使用する必要があります。
ファイアウォールに関する考慮事項
VPNネットワークデバイス「tun0」またはVPNIPアドレスでのトラフィックを許可するには、ファイアウォールルールを更新する必要がある場合があります。
サーバーを追加または削除する方法
新しいサーバーを追加する
にリストされているすべてのサーバー [vpn]
のグループ hosts
ファイルはVPNの一部になります。 新しいVPNメンバーを追加するには、新しいサーバーをに追加するだけです。 [vpn]
次に、グループでPlaybookを再実行します。
- ansible-playbook site.yml
サーバーを削除する
VPNメンバーを削除するには、移動します hosts
削除するサーバーのエントリ [removevpn]
ファイルの下部に向かってグループ化します。
たとえば、 node04 を削除する場合、 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
[removevpn]
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36
ホストファイルを保存します。 に注意してください vpn_ip
オプションで、未使用です [removevpn]
グループの人(仲間)たち。
次に、Playbookを再実行します。
- ansible-playbook site.yml
これにより、Tincが停止し、Tinc構成とホストキーファイルがメンバーから削除されます。 [removevpn]
グループ、VPNからそれらを削除します。
VPNからホストを削除すると、残りのVPNメンバーに孤立したtinchostsファイルと/etc/hostsエントリが生じることに注意してください。 後でVPNに新しいサーバーを追加して、廃止された名前を再利用しない限り、これは何にも影響しません。 適切なものを削除します /etc/hosts
これが問題になる場合は、各サーバーのエントリ。
結論
これで、サーバーインフラストラクチャは、TincとAnsibleを使用して、メッシュVPNによって保護されます。 特定のニーズに合わせてプレイブックを変更する必要がある場合は、GitHubでフォークしてください。
幸運を!