Cách thiết lập một Iptables Firewall để bảo vệ Traffic giữa các máy chủ của bạn

4 năm trước

Cách thiết lập một Iptables Firewall để bảo vệ Traffic giữa các máy chủ của bạn

Giới Thiệu 

Triển khai các thành phần rời rạc trong thiết lập ứng dụng của bạn lên các nút khác nhau là một cách phổ biến để giảm tải và bắt đầu chia tỉ lệ theo chiều ngang. Một ví dụ điển hình là cấu hình một cơ sở dữ liệu trên một máy chủ riêng biệt từ ứng dụng của bạn. Mặc dù có nhiều ưu điểm so với thiết lập này nhưng kết nối qua mạng liên quan đến một mối quan tâm về bảo mật mới.

Trong hướng dẫn này, chúng tôi sẽ giới thiệu cách thiết lập một firewall đơn giản trên mỗi máy chủ của bạn trong một thiết lập phân phối. Chúng ta sẽ định cấu hình chính sách cho phép traffic hợp pháp giữa các bộ phận trong khi từ chối traffic khác.

Trong hướng dẫn này, chúng ta sẽ sử dụng hai máy chủ Ubuntu 14.04. Một máy sẽ có WordPress phục vụ với Nginx và máy chủ còn lại sẽ lưu trữ cơ sở dữ liệu MySQL cho ứng dụng. Mặc dù  sẽ sử dụng thiết lập này làm mẫu, bạn sẽ có thể ngoại suy các kỹ thuật liên quan để phù hợp với yêu cầu của máy chủ của bạn.

Yêu Cầu 

Để bắt đầu, bạn sẽ phải có hai máy chủ Ubuntu 14.04 mới. Thêm tài khoản người dùng thông thường với đặc quyền sudo trên mỗi tài khoản. Để tìm hiểu cách thực hiện điều này một cách chính xác, hãy làm theo  Thiết lập ban đầu cho server dùng Ubuntu 16.04

Cài đặt ứng dụng chúng ta sẽ được bảo mật dựa trên hướng dẫn này.. Nếu bạn muốn làm theo, hãy thiết lập ứng dụng và máy chủ cơ sở dữ liệu của bạn như được chỉ dẫn bởi hướng dẫn đó.

 

Thiết lập một Firewall cơ bản

Chúng ta sẽ bắt đầu bằng cách triển khai cấu hình firewall cơ sở cho mỗi máy chủ. Chính sách mà chúng ta sẽ triển khai thực hiện theo cách tiếp cận bảo mật đầu tiên. Chúng ta sẽ khóa hầu như mọi thứ khác ngoài SSH traffic và sau đó tạo lỗ hổng trong firewall cho ứng dụng cụ thể của chúng ta.

 Firewall cung cấp những thiết lập cơ bản mà chúng ta cần. Cài đặt gói iptables-persistent và dán những nguyên tắc cơ bản vào tệp  /etc/iptables/rules.v4 :

sudo apt-get update
sudo apt-get install iptables-persistent
sudo nano /tec/iptables/rules.v4
/etc/iptables/rules.v4
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

Nếu bạn đang thực hiện điều này trong một môi trường trực tiếp không tải lại các quy tắc firewall của bạn. Việc tải bộ quy tắc cơ bản được nêu ở đây sẽ ngay lập tức xóa kết nối giữa ứng dụng của bạn và máy chủ cơ sở dữ liệu. Chúng ta sẽ cần phải điều chỉnh các quy tắc để phản ánh nhu cầu hoạt động của chúng ta trước khi tải lại.

Khám phá các cổng được sử dụng bởi dịch vụ của bạn

Để thêm các ngoại lệ cho phép giao tiếp giữa các bộ phận của chúng ta, chúng ta cần biết các cổng mạng đang được sử dụng. Chúng ta có thể tìm thấy các cổng mạng chính xác bằng cách kiểm tra các tập tin cấu hình , nhưng một phương pháp ứng dụng bất khả tri để tìm các cổng chính xác là chỉ kiểm tra dịch vụ nào đang lắng nghe các kết nối trên mỗi máy của chúng ta.

Chúng ta có thể sử dụng công cụ netstat để tìm kết quả này. Vì ứng dụng của chúng ta chỉ giao tiếp qua IPv4, chúng ta sẽ thêm đối số-4  nhưng bạn có thể loại bỏ điều đó nếu bạn đang sử dụng IPv6. Các đối số khác chúng ta cần để tìm các dịch vụ đang chạy của chúng ta là -plunt.  

Trên máy chủ web , chúng ta sẽ thấy một cái gì đó như thế này:

we_server$ sudo netstat -4plunt
Output
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 
tcp 0 0 0.0.0.0:22  0.0.0.0:* LISTEN 1058/sshd 
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4187/nginx
 

Bạn có thể đọc các cột này chính xác như nhau. Trong ví dụ trên, địa chỉ 192.0.2.30 biểu thị địa chỉ IP riêng của máy chủ cơ sở dữ liệu. Trong quá trình thiết lập ứng dụng, chúng ta đã khóa MySQL xuống giao diện riêng vì lý do bảo mật.

Lưu ý các giá trị bạn tìm thấy trong bước này. Đây là những chi tiết mạng mà chúng ta cần để điều chỉnh cấu hình firewall.

Trong trường hợp ví dụ của chúng ta,  lưu ý rằng trên máy chủ web , chúng ta cần đảm bảo rằng các cổng sau có thể truy cập được:

  • Cổng 80 trên tất cả các địa chỉ
  • Cổng 22 trên tất cả các địa chỉ (đã được tính trong các quy tắc firewall)

Máy chủ cơ sở dữ liệu của chúng ta sẽ phải đảm bảo rằng các cổng sau có thể truy cập được:

  • Cổng 3306 trên địa chỉ  192.0.2.30 (hoặc giao diện được liên kết với nó)
  • Cổng 22 trên tất cả các địa chỉ (đã được tính trong các quy tắc firewall)
 

Điều chỉnh quy tắc firewall máy chủ web

Bây giờ chúng ta có thông tin cổng cần thiết,  điều chỉnh bộ quy tắc firewall của máy chủ web của chúng ta. Mở tệp quy tắc trong trình chỉnh sửa của bạn với đặc quyền sudo:

web-server$ sudo nano /etc/iptables/rules.v4
  •  

Trên máy chủ web, chúng ta cần thêm cổng 80 vào danh sách traffic có thể chấp nhận của chúng ta. Vì máy chủ đang lắng nghe trên tất cả các địa chỉ có sẵn, chúng ta sẽ không hạn chế quy tắc theo giao diện hoặc địa chỉ đích.

Khách truy cập web của chúng ta sẽ sử dụng giao thức TCP để kết nối. Khung cơ bản đã có một chuỗi tùy chỉnh được gọi là TCP  cho các ngoại lệ của ứng dụng TCP. Chúng ta có thể thêm cổng 80 vào chuỗi đó, ngay bên dưới ngoại lệ cho cổng SSH của chúng ta:

/etc/iptables/rules.v4
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT-A TCP -p tcp --dport 80 -j ACCEPT. . .

Máy chủ web của chúng ta sẽ bắt đầu kết nối với máy chủ cơ sở dữ liệu. Traffic ra của chúng ta không bị hạn chế trong firewall và traffic đến được kết hợp với các kết nối đã thiết lập được cho phép, vì vậy không phải mở bất kỳ cổng bổ sung nào trên máy chủ này cho phép kết nối này.

Lưu và đóng tệp khi bạn hoàn tất. Máy chủ web của chúng ta hiện có chính sách firewall cho phép tất cả lưu lượng truy cập hợp pháp trong khi chặn mọi thứ khác.

Kiểm tra tệp quy tắc của bạn để biết lỗi cú pháp:

web_server$ sudo iptables-restore -t < /etc/iptables/rules.v4

Nếu không có lỗi cú pháp nào được hiển thị, hãy tải lại firewall để triển khai bộ quy tắc mới:

web_server$ sudo service iptables-persistent reload

Điều chỉnh các quy tắc firewall máy chủ cơ sở dữ liệu

Trên máy chủ cơ sở dữ liệu , chúng ta cần cho phép truy cập vào cổng 3306 trên địa chỉ IP riêng của máy chủ . Trong trường hợp của chúng ta, địa chỉ đó là 192.0.2.30. Chúng ta có thể giới hạn quyền truy cập được dành riêng cho địa chỉ này một cách cụ thể hoặc giới hạn quyền truy cập bằng cách khớp với giao diện được gán địa chỉ đó.

Để tìm giao diện mạng được liên kết với địa chỉ đó, gõ:

db_server$ ip -4 addr show scope global
 
Output
2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 
inet 203.0.113.5/24 brd 104.236.113.255 scope global eth0 
valid_lft forever preferred_lft forever 
3: eth1:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 
inet 192.0.2.30/24 brd 192.0.2.255 scope global eth1 
valid_lft forever preferred_lft forever
 

Các khu vực được đánh dấu cho thấy giao diện eth1 được liên kết với địa chỉ đó.

Tiếp theo, chúng ta sẽ điều chỉnh các quy tắc firewall trên máy chủ cơ sở dữ liệu. Mở tệp quy tắc có đặc quyền sudo trên máy chủ cơ sở dữ liệu của bạn:

db_server$ sudo nano /etc/iptables/rules.v4
  •  

Một lần nữa, chúng ta sẽ thêm một quy tắc vào chuỗi TCP của mình để tạo thành một ngoại lệ cho kết nối giữa máy chủ web và cơ sở dữ liệu của chúng ta.

Nếu bạn muốn hạn chế quyền truy cập dựa trên địa chỉ thực tế được đề cập, bạn thêm quy tắc như sau:

/etc/iptables/rules.v4
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT-A TCP -p tcp --dport 3306 -d 192.0.2.30 -j ACCEPT. . .

Nếu bạn muốn cho phép ngoại lệ dựa trên giao diện chứa địa chỉ đó, bạn có thể thêm quy tắc tương tự với quy tắc này thay thế:

/etc/iptables/rules.v4
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT-A TCP -p tcp --dport 3306 -i eth1 -j ACCEPT. . .

Lưu và đóng file khi hoàn thành.

Kiểm tra lỗi cú pháp bằng lệnh này:

db_server$ sudo iptables-restore -t < /etc/iptables/rules.v4

Khi bạn đã sẵn sàng, hãy tải lại các quy tắc firewall:

db_server$ sudo service iptables-persistent reload

Cả hai máy chủ của bạn bây giờ sẽ được bảo vệ mà không hạn chế dòng dữ liệu cần thiết giữa chúng.

 

Kết luận 

Việc triển khai firewall thích hợp phải luôn là một phần trong kế hoạch của bạn khi thiết lập một ứng dụng. Mặc dù đã chứng minh cấu hình này bằng cách sử dụng hai máy chủ chạy Nginx và MySQL để cung cấp một cá thể WordPress, các kỹ thuật được trình bày ở trên được áp dụng bất kể lựa chọn công nghệ cụ thể của bạn.

Tìm hiểu thêm những điều thú vị  tại ViCloud Community