Bài 9: Thiết lập hệ thống tường lửa FirewallD trên CentOS 7

Tiếp theo bài trước về cài đặt ClamAV trên CentOS 7. Trong bài viết này, chúng ta sẽ cùng nhau thiết lập và quản lý hệ thống tường lửa FirewallD cho server của bạn. Tường lửa FirewallD là giải pháp tường lửa mạnh mẽ, toàn diện được cài đặt mặc định trên CentOS 7. Tường lửa Firewalld là một giải pháp quản lý tường lửa có sẵn cho nhiều bản phân phối Linux hoạt động như một giao diện người dùng do hạt nhân Linux cung cấp. Trong hướng dẫn này, chúng tôi sẽ giới thiệu cách thiết lập tường lửa cho máy chủ của bạn và cho bạn thấy những điều cơ bản về quản lý tường lửa bằng firewall-cmd công cụ quản trị của nó.

Tường lửa FirewallD trên CentOS 7 được thay thế cho Iptables trên CentOS 6 với những khác biệt cơ bản:

  • FirewallD sử dụng “zones” và “services” thay vì “chain” và “rules” trong Iptables.
  • FirewallD quản lý các quy tắc được thiết lập tự động, có tác dụng ngay lập tức mà không làm mất đi các kết nối và session hiện có.

1. Các khái niệm cơ bản của tường lửa FirewallD

Trước khi làm việc với tường lửa FirewallD, bạn hãy cùng làm quen với các khái niệm cơ bản: Zone (vùng) và thời gian hiệu lực của các quy tắc.

1.1. Khái niệm Zone (vùng)

Trong tường lửa FirewallD, zone là một nhóm các quy tắc áp đặt lên những luồng dữ liệu được cho phép, dựa trên mức độ tin tưởng của điểm xuất phát luồng dữ liệu đó trong hệ thống mạng. Để sử dụng, bạn có thể lựa chọn zone mặc đinh, thiết lập các quy tắc trong zone hay chỉ định giao diện mạng (Network Interface) để quy định hành vi được cho phép.

Đối với các máy tính có thể di chuyển giữa các mạng thường xuyên (như máy tính xách tay) cần có sự linh hoạt thì zone cung cấp một phương pháp tốt để thay đổi các quy tắc tùy thuộc vào môi trường của bạn. Ví dụ: bạn có thể có các quy tắc nghiêm ngặt tại chỗ cấm hầu hết lưu lượng truy cập khi hoạt động trên mạng WiFi công cộng, ngược lại cho phép thoải mái hơn khi kết nối với mạng gia đình của bạn. Như vậy publichome là 2 zone chứa các quy tắc kiểm duyệt khác nhau tương ứng với từng vùng.

1.2. Mức độ tin cậy của các zone mặc định

Các zone được xác định trước theo mức độ tin cậy sau đây:

  • drop: ít tin cậy nhất – toàn bộ các kết nối đến sẽ bị từ chối mà không phản hồi, chỉ cho phép duy nhất kết nối đi ra.
  • block: tương tự như drop nhưng các kết nối đến bị từ chối và phản hồi bằng tin nhắn từ icmp-host-prohibited (hoặc icmp6-adm-prohibited).
  • public: đại diện cho mạng công cộng, không đáng tin cậy. Các máy tính/services khác không được tin tưởng trong hệ thống nhưng vẫn cho phép các kết nối đến trên cơ sở chọn từng trường hợp cụ thể.
  • external: hệ thống mạng bên ngoài trong trường hợp bạn sử dụng tường lửa làm gateway, được cấu hình giả lập NAT để giữ bảo mật mạng nội bộ mà vẫn có thể truy cập.
  • internal: đối lập với external zone, sử dụng cho phần nội bộ của gateway. Các máy tính/services thuộc zone này thì khá đáng tin cậy.
  • dmz: sử dụng cho các máy tính/service trong khu vực DMZ(Demilitarized) – cách ly không cho phép truy cập vào phần còn lại của hệ thống mạng, chỉ cho phép một số kết nối đến nhất định.
  • work: sử dụng trong công việc, tin tưởng hầu hết các máy tính và một vài services được cho phép hoạt động.
  • home: môi trường gia đình – tin tưởng hầu hết các máy tính khác và thêm một vài services được cho phép hoạt động.
  • trusted: đáng tin cậy nhất – tin tưởng toàn bộ thiết bị trong hệ thống.

Khi sử dụng tường lửa firewalld, nếu cần nhiều hơn các thiết lập mặc đinh chúng ta có thể tạo các quy tắc và thay đổi các thuộc tính của các vùng của chúng ta và sau đó gán các giao diện mạng của chúng ta cho bất kỳ vùng nào thích hợp nhất.

1.3. Thời hiệu của các quy tắc

Với tường lửa FirewallD, các quy tắc được cấu hình thời gian hiệu lực Runtime hoặc Permanent.

  • Runtime(mặc định): có tác dụng ngay lập tức nhưng mất hiệu lực khi reboot hệ thống.
  • Permanent: không áp dụng cho hệ thống đang chạy, cần reload mới có hiệu lực, tác dụng vĩnh viễn cả khi reboot hệ thống.

Ví dụ, thêm quy tắc cho cả thiết lập Runtime và Permanent:

Việc Restart/Reload sẽ hủy bộ các thiết lập Runtime đồng thời áp dụng thiết lập Permanent mà không hề phá vỡ các kết nối và session hiện tại. Điều này giúp kiểm tra hoạt động của các quy tắc trên tường lửa và dễ dàng khởi động lại nếu có vấn đề xảy ra.
Lưu ý: Các ví dụ thiết lập trong bài sử dụng cả Runtime và Permanent.

2. Cài đặt tường lửa FirewallD

FirewallD được cài đặt mặc định trên CentOS 7. Cài đặt nếu chưa có:

Khởi động FirewallD:

Sau khi bạn cài đặt firewalld, bạn có thể bật dịch vụ và khởi động lại máy chủ của mình. Hãy nhớ rằng việc bật tường lửa và cho phép khởi động cùng hệ thống sẽ làm cho tường lửa firewalld hoạt động khi máy tính khởi động. Cách tốt nhất là tạo quy tắc tường lửa của bạn và tận dụng cơ hội để kiểm tra cẩn thận chúng trước khi cho phép tường lửa firewalld hoạt động cùng hệ thống. Điều này nhằm tránh các vấn đề tiềm ẩn, thậm chí chính bạn bị chặn không truy cập được vào hệ thống.

Lệnh cho phép tường lửa firewalld hoạt động cùng hệ thống:

Kiểm tra lại :

enabled

Kiểm tra tình trạng hoạt động của tường lửa firewalld:

Kết quả màn hình (trên máy của bạn có thể khác chút):

tường lửa firewalld hoạt động
Kiểm tra tường lửa firewalld có đang chạy hay không:

running

Khởi động lại hệ thống tường lửa firewalld:

Lệnh dừng tường lửa FirewallD

Lệnh cấm tường lửa hoạt động:

3. Cấu hình tường lửa FirewallD

3.1. Thiết lập các Zone

Liệt kê tất cả các zone đang có trong hệ thống

block dmz drop external home internal public trusted work
Kiểm tra zone mặc định

public
Kiểm tra zone active (được sử dụng bởi giao diện mạng)
Vì FirewallD chưa được thiết lập bất kỳ quy tắc nào nên zone mặc định cũng đồng thời là zone duy nhất được kích hoạt, điều khiển mọi luồng dữ liệu.

public
interfaces: eth0

Lệnh thay đổi zone mặc định: (ví dụ zone mặc định đang là public giờ đổi thành work:

success

3.2. Thiết lập các quy tắc

Việc thiết lập các quy tắc chủ yếu để áp dụng cho các dịch vụ (services) và các cổng (port). Ta hiểu rằng vùng (zone) chứa các bộ quy tắc kiểm đuyệt ra vào được định trước. Cần thiết đặt bộ các quy tắc lên dịch vụ hay cổng nào ta chỉ việc đưa dịch vụ hay cổng đó vào vùng (zone) tương ứng chứa bộ quy tắc đó mà không cần ngồi thiết lập lại từng quy tắc cho dich vụ hay cổng nữa. Service hay port được add vào zone sẽ chịu ảnh hưởng từ các quy tắc đã có trong zone.

Liệt kê toàn bộ các quy tắc của các zones:

Liệt kê toàn bộ các quy tắc trong zone đang mặc định và active

public (active)

target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Kết quả trên cho thấy public là zone mặc định đang được kích hoạt (active). Nó liên kết với card mạng eth0 và cho phép SSH và DHCP.

Muốn xem toàn bộ các quy tắc trong một zone cụ thể bạn viết lệnh có dạng:

Ví dụ xem quy tắc trong zone home:

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh mdns samba-client dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Như trên đang cho phépcác dịch vụ: ssh mdns samba-client dhcpv6-client

Liệt kê danh sách services được cho phép trong zone:

a. Thêm service vào zone

Xem các dịch vụ hệ thống:

Có thể xem các services có sẵn trên hệ thống với tùy chọn --get-services:

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

Thêm dịch vụ vào vùng

Bây giờ muốn thêm service nào bạn lấy đúng tên service đó, chỉ định zone, gắn cờ thời hiệu cho nó. Cú pháp lệnh chung là:

Sử dụng tham số --add-service= đểt thêm dịch vụ cho một vùng.
Sử dụng tham số --zone=  để chỉ định vùng sẽ thêm dịch vụ vào.
Sử dụng tham số  --permanent để chỉ định hiệu lực vĩnh viễn.
Ví dụ: để thêm dịch vụ http vào vùng public và có hiệu lực vĩnh viễn không bị mất khi khởi động lại máy:

Nếu tham số nào đang là mặc định (ví dụ tham số vùng public) thì có thể bỏ qua cho lệnh bớt dài.

Vùng public của bạn giờ đây sẽ cho phép lưu lượng truy cập web HTTP trên cổng 80. Nếu máy chủ web của bạn được định cấu hình để sử dụng SSL / TLS, bạn cũng sẽ phải bổ sung thêm dịch vụ https vào zone.

Các dịch vụ có sẵn trong cài đặt tường lửa firewalld là những yêu cầu phổ biến nhất cho các ứng dụng thường thấy trên máy chủ. Tuy nhiên, có thể sẽ có các tình huống mà các dịch vụ này không phù hợp với yêu cầu của bạn. Điều gì xảy ra khi bạn không có dịch vụ phù hợp? Để giải quyết tình huống này a có 2 phương án: hoặc là mở cổng mới hoặc là định nghĩa một dịch vụ mới cho phù hợp với yêu cầu của bạn.

b. Thêm port vào zone

Tình huống cụ thể: Tôi sử dụng dịch vụ SSH để truy cập và điều khiển máy chủ từ xa. Vì lý do bảo mật, tôi đổi SSH từ cổng mặc định 22 sang cổng mới 2234. Khi đó SSH có sẵn trên dịch vụ tường lửa firewalld của tôi nhưng nó lại cấp phép truy cập ở port mặc định 22 và hiển nhiên là nó chặn port 2234. Bây giờ phải mở port 2234 cho dịch vụ SSH. Ta sử dụng tham số –add-port=   . Các giao thức có thể là TCP hoặc UDP

Kiểm tra lại add-port đã thành công hay chưa:

2234/tcp

Nếu muốn hủy bỏ port vừa được thêm vào zone hãy sử dụng tham số –remove-port

Thêm một dãy các cổng liên tiếp: Phân cách cổng đầu và cổng cuối bằng dấu gạch ngang (VD mở dãy 10 cổng từ 4990 đến 4999 dùng giao thức udp):

4. Tạo zone và service riêng trong tường lửa firewalld

Khi đã cơ bản nắm được các vấn đề của tường lửa firewalld, bạn hoàn toàn có thể tạo “sân chơi” riêng của mình. Định nghĩa các service riêng, tạo zone riêng với các bộ quy tắc của chính bạn đặt ra giúp bạn dễ dàng làm chủ firewall trong các tình huống.

4.1 Tạo zone riêng

Sử dụng tham số –new-zone= để tạo zone mới. Giả thiết tôi có 1 máy chủ chạy các website, tôi sẽ tạo zone riêng với tên là webserver để tiện quản lý:

success

Load lại tường lửa để lệnh tạo zone có hiệu lực

Kiểm tra lại danh sách các zone:

block dmz drop external home internal public trusted webserver work

Bây giờ ta có thể cấu hình cho zone mới thêm như các zone thông thường: đặt làm zone mặc định; gán các dịch vụ, các cổng.

Ví dụ: đặt zone mặc định, thêm các dịch vụ SSH, HTTP và HTTPS:

Reload lại tường lửa firewalld và xem kết quả:

webserver (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Như trên là các dịch vụ ssh, http, https đã được thêm vào zone. và chạy trên card mạng eth0. Giả thiết máy chủ có vài card mạng, giờ bạn muốn card eth1 hoạt động ở zone mới còn eth0 dành sử dụng vào mạng nội bộ. Vậy bạn có thể gán card mạng eth1 vào zone vừa tạo bằng tham số –change-interface=

Đến đây bạn đã tạo xong zone của riêng mình với các dịch vụ, các port hay card mạng do chính bạn chỉ định.

4.2 Định nghĩa các service riêng

Bạn thấy mở các cổng trên tường lửa firewalld khá dễ dàng, tuy nhiên các port là những con số. Một thời gian ngắn bạn sẽ quên mất đã mở cổng nào, cho dịch vụ nào, add vào zone nào…

Có cách khác dễ nhớ hơn đó là tự định nghĩa dịch vụ trên firewall. Trở lại ví dụ đổi cổng SSH từ 22 sang 2234 đã nói ở trên: ta sẽ tự định nghĩa dịch vụ và gán cổng mới cho dịch vụ đó:

Tạo định nghĩa riêng myssh bằng copy file chuẩn ban đầu và sửa lại:

Mở vi để chỉnh sửa để định nghĩa servies myssh trên FirewallD

 

Bạn sửa lại thành

Nhấn :wq để lưu lại

Nạp lại tường lửa firewalld

Ok. Bây giờ bạn kiểm tra lại danh sác các dịch vụ xem có dịch vụ bạn đã định nghĩa chưa:

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability myssh http https imap imaps

Như trên là MySH đã được thêo vào danh sách các service của tường lửa. Giờ bạn có thể áp tất cả các lệnh làm việc với MySSH như các service thông thường: gắn service lên zone mặc định; cho phép hoặc chặn dịch vụ…

Ví dụ:

5. Tổng kết:

Đọc đến đây hẳn bạn đã thấy sử dụng tường lửa FirewallD trên CentOS 7 không quá khó khăn. Tóm lược lại là:

  • Firewalld sử dụng zone để thiết lập và quản lý các quy tắc kiểm duyệt.
  • Có thể gán một dịch vụ vào zone, khi đó dịch vụ chịu sự kiểm duyệt bởi các quy tắc trong zone.
  • Có thể thêm 1 cổng hay 1 dải các cổng liên tiếp nhau vào zone.
  • Có thể tự định nghĩa các zone mới, service mới theo nhu cầu sử dụng.

Vậy là bạn đã có lượng kiến thức và kinh nghiệm “đủ dùng” để thiết lập và quản trị hệ thống tường lửa FirewallD thông thường. Các vấn đề nâng cao mời bạn tham khảo từ trang chủ FirewallD

Chúc các bạn thành công