Thứ năm, 20/08/2015 | 00:00 GMT+7

Cách thiết lập firewall Iptables để bảo vệ lưu lượng truy cập giữa các server của bạn

Triển khai các thành phần rời rạc trong cài đặt ứng dụng của bạn trên các node khác nhau là cách phổ biến để giảm tải và bắt đầu mở rộng quy mô theo chiều ngang. Ví dụ điển hình là cấu hình database trên một server riêng biệt từ ứng dụng của bạn. Mặc dù có rất nhiều lợi ích với cài đặt này, việc kết nối qua mạng liên quan đến một loạt các mối quan tâm mới về bảo mật.

Trong hướng dẫn này, ta sẽ trình bày cách cài đặt firewall đơn giản trên mỗi server của bạn trong một cài đặt phân tán. Ta sẽ cấu hình policy của bạn để cho phép lưu lượng hợp lệ giữa các thành phần của ta trong khi từ chối lưu lượng truy cập khác.

Đối với phần trình diễn trong hướng dẫn này, ta sẽ sử dụng hai server Ubuntu 14.04. Một sẽ có một version WordPress được phục vụ với Nginx và một cái khác sẽ lưu trữ database MySQL cho ứng dụng. Mặc dù ta sẽ sử dụng cài đặt này làm ví dụ, bạn có thể ngoại suy các kỹ thuật liên quan để phù hợp với yêu cầu server của bạn .

Yêu cầu

Để bắt đầu, bạn sẽ phải có hai server Ubuntu 14.04 mới. Thêm một account regular user với các quyền sudo trên mỗi account . Để tìm hiểu cách thực hiện việc này một cách chính xác, hãy làm theo hướng dẫn cài đặt server ban đầu Ubuntu 14.04 của ta .

Việc cài đặt ứng dụng mà ta sẽ 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 cài đặt ứng dụng và server database của bạn như được chỉ ra trong hướng dẫn đó.

Cài đặt firewall cơ bản

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

Tường lửa trong hướng dẫn này cung cấp cài đặt cơ bản mà ta cần. Cài đặt gói iptables-persistent và dán các luật cơ bản vào file /etc/iptables/rules.v4 :

  • sudo apt-get update
  • sudo apt-get install iptables-persistent
  • sudo nano /etc/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 triển khai điều này trong môi trường trực tiếp, đừng reload các luật firewall của bạn . Việc tải luật cơ bản được nêu ở đây sẽ ngay lập tức hủy kết nối giữa ứng dụng và server database của bạn. Ta cần điều chỉnh các luật để phản ánh nhu cầu hoạt động của bạn trước khi reload .

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

Để thêm các ngoại lệ cho phép giao tiếp giữa các thành phần của ta , ta cần biết các cổng mạng đang được sử dụ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 file cấu hình của bạn , nhưng một phương pháp tìm cổng chính xác không phù hợp với ứng dụng 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 ta .

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

Trên web server của bạn, ta sẽ thấy thông tin như thế này:

  • 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

Cột được đánh dấu đầu tiên hiển thị địa chỉ IP và cổng mà dịch vụ được đánh dấu ở cuối dòng đang nghe. Địa chỉ 0.0.0.0 đặc biệt nghĩa là dịch vụ được đề cập đang lắng nghe trên tất cả các địa chỉ có sẵn.

Trên server database của ta , ta sẽ thấy thông tin như thế này:

  • 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 1097/sshd tcp 0 0 192.0.2.30:3306 0.0.0.0:* LISTEN 3112/mysqld

Bạn có thể đọc các cột này giống hệt nhau. Trong ví dụ trên, địa chỉ 192.0.2.30 đại diện cho địa chỉ IP riêng của server database . Trong phần cài đặt ứng dụng, ta đã khóa MySQL xuống giao diện riêng tư vì lý do bảo mật.

Ghi lại 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à ta cần để điều chỉnh cấu hình firewall của bạn .

Trong trường hợp ví dụ của ta , ta có thể lưu ý trên web server của bạn , ta cần đảm bảo 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 đến trong các luật firewall )

Server database của ta sẽ phải đảm bảo 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 đến trong các luật firewall )

Điều chỉnh luật firewall của web server

Bây giờ ta đã có thông tin cổng cần thiết, ta sẽ điều chỉnh bộ luật firewall của web server . Mở file luật trong editor với các quyền sudo :

  • sudo nano /etc/iptables/rules.v4

Trên web server , ta cần thêm cổng 80 vào danh sách truy cập được chấp nhận. Vì server đang lắng nghe tất cả các địa chỉ có sẵn, ta sẽ không giới hạn luật theo giao diện hoặc địa chỉ đích.

Khách truy cập web của ta sẽ sử dụng giao thức TCP để kết nối. Khung cơ bản của ta đã 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. 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 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  . . . 

Web server của ta sẽ bắt đầu kết nối với server database của ta . Lưu lượng đi của ta không bị hạn chế trong firewall của ta và lưu lượng đến được liên kết với các kết nối đã cài đặt được cho phép, vì vậy ta không phải mở bất kỳ cổng bổ sung nào trên server cho phép kết nối này.

Lưu file khi bạn hoàn tất. Web server của ta hiện có policy firewall sẽ cho phép tất cả lưu lượng truy cập hợp lệ trong khi chặn mọi thứ khác.

Kiểm tra file luật của bạn để tìm lỗi cú pháp:

  • 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 cập nhật firewall để triển khai bộ luật mới:

  • sudo service iptables-persistent reload

Điều chỉnh luật firewall của server database

Trên server database của ta , ta cần cho phép truy cập vào cổng 3306 trên địa chỉ IP riêng của server của ta . Trong trường hợp của ta , địa chỉ đó là 192.0.2.30 . Ta có thể giới hạn quyền truy cập dành riêng cho địa chỉ này hoặc ta có thể giới hạn quyền truy cập bằng cách đối sánh với giao diện được gán địa chỉ đó.

Để tìm network interface được liên kết với địa chỉ đó, hãy nhập:

  • ip -4 addr show scope global
Output
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 rằng giao diện eth1 được liên kết với địa chỉ đó.

Tiếp theo, ta sẽ điều chỉnh các luật firewall trên server database . Mở file luật với quyền sudo trên server database của bạn:

  • sudo nano /etc/iptables/rules.v4

, ta sẽ thêm một luật vào chuỗi TCP mình để tạo thành một ngoại lệ cho kết nối giữa web server và database của ta .

Nếu bạn muốn hạn chế quyền truy cập dựa trên địa chỉ thực được đề cập, bạn sẽ thêm luật 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 luật tương tự như luật 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 file khi bạn hoàn tất.

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

  • sudo iptables-restore -t < /etc/iptables/rules.v4

Khi đã sẵn sàng , hãy reload các luật firewall :

  • sudo service iptables-persistent reload

Cả hai server của bạn bây giờ sẽ được bảo vệ mà không hạn chế stream 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 nằm trong kế hoạch triển khai của bạn khi cài đặt một ứng dụng. Mặc dù ta đã trình diễn cấu hình này bằng cách sử dụng hai server chạy Nginx và MySQL để cung cấp version WordPress, nhưng các kỹ thuật được trình bày ở trên có thể áp dụng dù lựa chọn công nghệ cụ thể của bạn.

Để tìm hiểu thêm về firewall và iptables cụ thể, hãy xem các hướng dẫn sau:


Tags:

Các tin liên quan

Tìm hiểu sâu về kiến trúc Iptables và Netfilter
2015-08-20
Cách triển khai mẫu firewall cơ bản với Iptables trên Ubuntu 14.04
2015-08-20
Cách di chuyển từ FirewallD sang Iptables trên CentOS 7
2015-08-20
Cách liệt kê và xóa các quy tắc firewall Iptables
2015-08-14
Iptables Essentials: Các quy tắc và lệnh firewall chung
2015-08-10
Cách cô lập server trong mạng riêng bằng Iptables
2014-06-04
Cách thiết lập firewall bằng Iptables trên Ubuntu 14.04
2014-05-06
Cách thức hoạt động của firewall Iptables
2014-05-02
Cách thiết lập firewall Iptables cơ bản trên Centos 6
2013-04-16
Cách thiết lập firewall Iptables cơ bản trên Centos 6
2013-04-16