Cách sử dụng Ansible và Tinc VPN để bảo mật cơ sở hạ tầng server của bạn
Trong hướng dẫn này, ta sẽ trình bày cách sử dụng Ansible , một công cụ quản lý cấu hình, để cài đặt mạng VPN với Tinc nhằm bảo mật thông tin liên lạc mạng giữa server Ubuntu và CentOS của bạn. Mạng VPN đặc biệt hữu ích nếu các server của bạn đang sử dụng mạng chia sẻ, vì nó cho phép các server của bạn giao tiếp như thể chúng được cách ly trên một mạng riêng tư thực sự. Lớp bảo mật bổ sung được cung cấp bởi các tính năng xác thực và mã hóa của VPN sẽ bảo vệ giao tiếp mạng của các dịch vụ riêng tư của bạn — database , cụm Elasticsearch, v.v. — khỏi bị truy cập hoặc tấn công trái phép. Nếu bạn đang sử dụng tính năng mạng riêng tư của DigitalOcean, thì tính năng bị cô lập giữa tính năng bảo mật này sẽ được bật cho các server trong cùng một group hoặc account trong cùng một khu vực.
Việc cấu hình và duy trì VPN trên nhiều server theo cách thủ công là rất khó và dễ xảy ra lỗi, vì nhiều file cấu hình và file khóa cần được phân phối giữa tất cả các thành viên VPN. Vì lý do này, một công cụ quản lý cấu hình nên được sử dụng cho bất kỳ cài đặt VPN lưới thực tế nào mà các thành viên có thể thay đổi tại một số điểm. Có thể sử dụng bất kỳ công cụ quản lý cấu hình nào, nhưng hướng dẫn này sử dụng Ansible vì nó phổ biến và dễ sử dụng. Ansible Playbook mà hướng dẫn này sử dụng, ansible-tinc , đã được thử nghiệm trên server Ubuntu 14.04 và CentOS 7.
Đọc nền
Bạn có thể làm theo hướng dẫn này và cài đặt mạng VPN mà không cần biết quá nhiều về Ansible hoặc Tinc, vì Playbook đi kèm sẽ thực hiện hầu hết công việc cho bạn. Tuy nhiên, bạn có thể cần đọc về cách chúng hoạt động, tại một số điểm, để bạn hiểu chi tiết về những gì bạn đang cài đặt .
Hướng dẫn Tinc VPN này trình bày cách cài đặt và cấu hình Tinc VPN theo cách thủ công. Sử dụng Ansible để tự động hóa quy trình giúp quản lý dễ dàng hơn rất nhiều.
Cách cài đặt và cấu hình Ansible cung cấp phần giới thiệu rất cao về cách hoạt động của Ansible. Nếu bạn muốn bắt đầu viết Ansible Playbooks để tự động hóa các việc của administrator hệ thống, hãy xem hướng dẫn này .
Yêu cầu
Máy local
Máy local là nơi bạn sẽ thực thi Ansible Playbook. Đây có thể là máy local của bạn (ví dụ: notebook ) hoặc một số server khác mà bạn sử dụng để quản lý server của bạn . Như đã đề cập trước đó, nó cần có khả năng kết nối với từng server từ xa dưới dạng root
.
Máy local của bạn cần được cài đặt Ansible 2.0+. Tham khảo tài liệu cài đặt Ansible chính thức nếu bạn cần cài đặt nó, vì quá trình cài đặt khác nhau tùy thuộc vào hệ điều hành hoặc bản phân phối của bạn.
Máy local của bạn cũng cần được cài đặt Git để bạn có thể dễ dàng download bản sao của Playbook ansible-tinc . , vì hướng dẫn cài đặt phụ thuộc vào máy local của bạn, hãy tham khảo hướng dẫn cài đặt Git chính thức .
Server từ xa
Server từ xa là server mà bạn muốn cấu hình để sử dụng Tinc VPN. Bạn nên bắt đầu với ít nhất hai. Để làm việc với Ansible Playbook, chúng phải:
- Chạy Ubuntu 14.04 hoặc CentOS 7
- Có thể truy cập vào máy local (nơi Ansible được cài đặt) thông qua user
root
, với xác thực public key
Lưu ý: Không thể sử dụng user từ xa khác tại thời điểm này do lỗi với module Ansible Synchronize mà Playbook sử dụng.
Nếu bạn chưa tắt xác thực password cho root
, bạn có thể thực hiện bằng cách thêm PermitRootLogin without-password
vào file /etc/ssh/sshd_config
, sau đó khởi động lại SSH.
Nếu bạn đang sử dụng DigitalOcean Server nằm trong cùng một trung tâm dữ liệu, bạn nên bật Mạng riêng trên tất cả chúng. Điều này sẽ cho phép bạn sử dụng network interface riêng, eth1
, cho giao tiếp VPN được mã hóa. Playbook được cung cấp giả định mọi nút VPN sẽ sử dụng cùng một tên thiết bị mạng.
Download Ansible-Tinc Playbook
Khi đã sẵn sàng bắt đầu, hãy sử dụng git clone
để download bản sao của Playbook. Ta sẽ sao chép nó vào folder chính của ta :
- cd ~
- git clone https://github.com/thisismitch/ansible-tinc
Bây giờ hãy chuyển sang folder ansible-tinc
mới download :
- cd ansible-tinc
Lưu ý: Phần còn lại của hướng dẫn này giả định bạn đang ở trong folder ansible-tinc
, trên máy local của bạn. Tất cả các lệnh Ansible phải được thực thi từ folder này. Ngoài ra, tất cả các file được tham chiếu, ngoại trừ /etc/hosts
, đều liên quan đến đường dẫn này — ví dụ: hosts
tham chiếu đến ~/ansible-tinc/hosts
.
Tiếp theo, ta sẽ hướng dẫn bạn cách sử dụng Playbook để tạo VPN lưới của bạn. Nếu bạn đã quen với Ansible, bạn có thể cần dành chút thời gian để duyệt qua nội dung của Playbook. Về cơ bản, nó cài đặt và cấu hình một mạng VPN bằng Tinc và nó cũng thêm các mục nhập tiện lợi vào /etc/hosts
.
Tạo file kiểm kê server lưu trữ
Trước khi chạy Playbook, bạn phải tạo file hosts
chứa thông tin về server bạn muốn đưa vào VPN Tinc của bạn . Bây giờ ta sẽ xem xét nội dung của file server .
[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]
Dòng đầu tiên, [vpn]
, chỉ định rằng các mục nhập server ngay bên dưới nó là một phần của group “vpn”. Các thành viên của group này sẽ được cấu hình Tinc mesh VPN trên họ.
- Cột đầu tiên là nơi bạn đặt tên khoảng không quảng cáo của server , “node01” trong dòng đầu tiên của ví dụ, cách Ansible sẽ tham chiếu đến server . Giá trị này được sử dụng để cấu hình các kết nối Tinc và tạo các mục nhập
/etc/hosts
. Không sử dụng dấu gạch ngang ở đây, vì Tinc không hỗ trợ chúng trong tên server -
vpn_ip
là địa chỉ IP mà nút sẽ sử dụng cho VPN. Gán địa chỉ này cho địa chỉ IP mà bạn muốn server sử dụng cho các kết nối VPN của nó -
ansible_host
phải được đặt thành giá trị mà máy local của bạn có thể tiếp cận nút tại (tức là địa chỉ IP thực hoặc tên server )
Do đó, trong ví dụ, ta có bốn server mà ta muốn cấu hình trong một VPN lưới trông giống như sau:
Sau khi file hosts
của bạn chứa tất cả các server bạn muốn đưa vào VPN, hãy lưu các thay đổi . Hãy chắc chắn rằng nó không chứa các mục trùng lặp (hostname, vpn_ip
địa chỉ, hoặc ansible_host
giá trị).
Đến đây, bạn nên kiểm tra xem Ansible có thể kết nối với tất cả các server trong file khoảng không quảng cáo của bạn hay không:
- ansible all -m ping
Tất cả họ sẽ trả lời bằng một thông báo "THÀNH CÔNG" màu xanh lá cây. Nếu bất kỳ kết nối nào không thành công, hãy kiểm tra file server của bạn để tìm lỗi và đảm bảo tất cả các server được đề cập đều đáp ứng các yêu cầu được liệt kê trong phần yêu cầu trước khi tiếp tục.
Xem lại các biến group
Trước khi chạy Playbook, bạn có thể cần xem lại nội dung của /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
Hai biến quan trọng nhất là physical_ip
và vpn_netmask
:
-
physical_ip
chỉ định địa chỉ IP nào bạn muốn tinc liên kết với. Ở đây, ta đang tận dụng Sự thật chắc chắn để đặt nó thành địa chỉ IP của thiết bị mạngeth1
. Trên DigitalOcean,eth1
là network interface riêng tư, vì vậy Mạng riêng phải được bật trừ khi bạn muốn sử dụng network interface công cộng,eth0
, bằng cách thay đổi giá trị của nó thành{{ ansible_eth0.ipv4.address }}
-
vpn_netmask
chỉ định netmask sẽ được áp dụng cho giao diện VPN. Theo mặc định, nó được đặt thành255.255.255.0
, nghĩa là mỗivpn_ip
là một địa chỉ Lớp C chỉ có thể giao tiếp với các server khác trong cùng một mạng con. Ví dụ:10.0.0.x
sẽ không thể giao tiếp với server10.0.1.x
trừ khi mạng con được mở rộng bằng cách thay đổivpn_netmask
thành255.255.0.0
.
Lưu ý: Các lợi ích bảo mật của VPN có thể được mở rộng cho các server của bạn qua Internet công cộng, nhưng hãy nhớ rằng giao tiếp vẫn có độ trễ và giới hạn băng thông giống như kết nối không phải VPN.
Đây là giải thích về các cài đặt khác:
-
netname
chỉ định tên netname tinc. Nó được đặt thànhnyc3
theo mặc định. -
vpn_interface
là tên của network interface ảo mà tinc sẽ sử dụng. Nó làtun0
theo mặc định. -
vpn_subnet_cidr_netmask
được đặt thành 32, điều này cho biết mạng con một server (điểm-điểm) vì ta đang cấu hình mạng VPN. Không thay đổi giá trị này.
Sau khi xem xét xong các biến group , bạn nên sẵn sàng chuyển sang bước tiếp theo.
Triển khai Tinc VPN
Bây giờ đã tạo file lưu trữ khoảng không quảng cáo và xem xét các biến group , bạn đã sẵn sàng triển khai Tinc và cài đặt VPN trên các server của bạn bằng cách chạy Playbook.
Từ folder ansible-tinc
, hãy chạy lệnh này để chạy Playbook:
- ansible-playbook site.yml
Trong khi Playbook chạy, nó sẽ cung cấp kết quả kết quả của từng tác vụ được thực thi. Nếu mọi thứ được cấu hình chính xác, bạn sẽ thấy một số trạng thái ok
và changed
, và không có trạng thái 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
Nếu không có tác vụ thất bại nào, tất cả các server trong file kiểm kê sẽ có thể giao tiếp với nhau qua mạng VPN.
Kiểm tra VPN
Đăng nhập vào server đầu tiên của bạn và ping server thứ hai:
- ping 10.0.0.2
Vì Playbook tự động tạo các mục nhập /etc/hosts
trỏ tên server của khoảng không quảng cáo đến địa chỉ IP VPN của từng thành viên, bạn cũng có thể làm như vậy (giả sử một trong các server của bạn có tên là node02
trong file hosts
Ansible):
- ping node02
Dù bằng cách nào, bạn sẽ thấy các phản hồi ping hợp lệ:
[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 ...
Vui lòng kiểm tra kết nối VPN giữa các node khác.
Lưu ý: Tinc sử dụng cổng 655
. Nếu kiểm tra ping của bạn không hoạt động, hãy đảm bảo firewall của mỗi nút cho phép lưu lượng thích hợp qua thiết bị mạng thực mà VPN đang sử dụng.
Sau khi bạn hoàn thành thử nghiệm của bạn , VPN lưới của bạn đã sẵn sàng để sử dụng!
Cấu hình Dịch vụ và Ứng dụng
Bây giờ VPN lưới của bạn đã được cài đặt , bạn cần đảm bảo cấu hình các dịch vụ và ứng dụng backend của bạn để sử dụng nó (nếu thích hợp). Điều này nghĩa là bất kỳ dịch vụ nào được giao tiếp qua VPN đều cần sử dụng địa chỉ IP VPN thích hợp ( vpn_ip
) thay vì địa chỉ IP riêng thông thường.
Ví dụ: giả sử bạn đang chạy một LEMP với Nginx trên node01 và database MySQL trên node02 . MySQL phải được cấu hình để liên kết với địa chỉ IP VPN 10.0.0.2
, ứng dụng PHP phải kết nối với database tại 10.0.0.2
và Nginx sẽ lắng nghe trên 192.0.2.55
(địa chỉ IP công cộng của node01).
Ví dụ khác, nếu node01 , node02 và node03 là các node trong một cụm Elasticsearch, Elasticsearch phải được cấu hình để sử dụng 10.0.0.1
, 10.0.0.2
và 10.0.0.3
làm địa chỉ IP của nút. Tương tự như vậy, bất kỳ client nào kết nối với cụm cũng nên sử dụng địa chỉ VPN.
Cân nhắc về firewall
Bạn có thể cần cập nhật các luật firewall của bạn để cho phép lưu lượng truy cập trên thiết bị mạng VPN, “tun0” hoặc địa chỉ IP VPN.
Cách thêm hoặc xóa server
Thêm server mới
Tất cả các server được liệt kê trong group [vpn]
trong file hosts
sẽ là một phần của VPN. Để thêm thành viên VPN mới, chỉ cần thêm server mới vào group [vpn]
sau đó chạy lại Playbook:
- ansible-playbook site.yml
Xóa server
Để xóa các thành viên VPN, hãy di chuyển các mục nhập hosts
của các server mà bạn muốn xóa trong group [removevpn]
về phía cuối file .
Ví dụ: nếu ta muốn loại bỏ node04 , file hosts
sẽ trông như thế này:
[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
Lưu file server . Lưu ý vpn_ip
là tùy chọn và không được sử dụng cho các thành viên group [removevpn]
.
Sau đó chạy lại Playbook:
- ansible-playbook site.yml
Thao tác này sẽ dừng Tinc và xóa cấu hình Tinc và các file khóa lưu trữ khỏi các thành viên của group [removevpn]
, xóa chúng khỏi VPN.
Lưu ý việc xóa server khỏi VPN sẽ dẫn đến các file server tinc bị mồ côi và các mục nhập / etc / hosts trên các thành viên VPN còn lại. Điều này sẽ không ảnh hưởng đến bất kỳ điều gì trừ khi sau này bạn thêm server mới vào VPN nhưng sử dụng lại các tên đã ngừng hoạt động. Xóa các mục nhập /etc/hosts
thích hợp trên mỗi server , nếu đây là vấn đề với bạn.
Kết luận
Cơ sở hạ tầng server của bạn giờ đây sẽ được bảo mật bằng mạng VPN, bằng cách sử dụng Tinc và Ansible! Nếu bạn cần sửa đổi playbook để đáp ứng các nhu cầu cụ thể của bạn , vui lòng chia sẻ nó trên GitHub .
Chúc may mắn!
Các tin liên quan
Cách chạy server phân tích cú pháp trên Ubuntu 14.042016-02-03
Cách thiết lập server VNC trên Debian 8
2015-09-29
Cách cấu hình dịch vụ Linux để khởi động tự động sau khi gặp sự cố hoặc khởi động lại - Phần 2: Tham khảo
2015-09-04
Cách thiết lập server IRC trên Ubuntu 14.04 với InspIRCd 2.0 và Shaltúre
2015-08-26
Cách chuyển tiếp cổng thông qua cổng Linux với Iptables
2015-08-20
Cách cấu hình dịch vụ Linux để khởi động tự động sau khi gặp sự cố hoặc khởi động lại - Phần 1: Ví dụ thực tế
2015-08-19
Cách sử dụng Hệ thống kiểm toán Linux trên CentOS 7
2015-07-16
Cách sử dụng Hệ thống kiểm toán Linux trên CentOS 7
2015-07-16
Thiết lập ban đầu của server Fedora 22
2015-07-08
Cách thiết lập Shiny Server trên Ubuntu 14.04
2015-06-28