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を実行している
root
ユーザー、、公開鍵認証を介して、ローカルマシン(Ansibleがインストールされている場合)にアクセスできます。
注: Playbookが使用するAnsibleSynchronizeモジュールのバグのため、現時点では別のリモートユーザーを使用することはできません。
root
のパスワード認証をまだ無効にしていない場合は、PermitRootLogin without-password
を/etc/ssh/sshd_config
ファイルに追加してから、SSHを再起動することで無効にできます。
同じデータセンター内にあるDigitalOceanドロップレットを使用している場合は、それらすべてでプライベートネットワークを有効にする必要があります。 これにより、暗号化されたVPN通信にプライベートネットワークインターフェイスeth1
を使用できるようになります。 提供されている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を実行する前に、TincVPNに含めるサーバーに関する情報を含むhosts
ファイルを作成する必要があります。 ここで、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 を利用して、eth1
ネットワークデバイスのIPアドレスに設定しています。 DigitalOceanでは、eth1
はプライベートネットワークインターフェイスであるため、パブリックネットワークインターフェイスeth0
を使用する場合を除き、プライベートネットワークを有効にして値を[ X202X]