Gia cố đường truyền: Hướng dẫn thực hành MACsec trên Linux (IEEE 802.1AE)

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Tại sao bảo mật Layer 2 là tuyến phòng thủ cuối cùng của bạn

Các đội ngũ bảo mật thường tập trung tối đa vào TLS cho lưu lượng web hoặc IPsec cho các kết nối VPN site-to-site. Mặc dù chúng rất quan trọng, nhưng chúng lại để ngỏ các lớp thấp nhất trong hạ tầng của bạn. Nếu một kẻ xâm nhập có được quyền truy cập vật lý vào switch hoặc nghe lén đường truyền cáp quang giữa các rack, họ có thể đánh chặn mọi gói tin, thực hiện tấn công ARP spoofing hoặc chèn các frame độc hại. MACsec (IEEE 802.1AE) sẽ giúp lấp đầy lỗ hổng này.

Không giống như IPsec hoạt động ở Layer 3, MACsec mã hóa mọi thứ nằm phía trên Ethernet header. Các VLAN tag, IP header và TCP/UDP payload đều trở nên vô hình trước những con mắt tò mò. Theo kinh nghiệm của tôi khi triển khai trong các cụm máy chủ production, lớp bảo vệ này rất minh bạch; nó bảo mật liên kết mà không yêu cầu thay đổi bất kỳ dòng mã nguồn ứng dụng nào.

Các trung tâm dữ liệu hiện đại thường triển khai MACsec giữa máy chủ và switch hoặc cho các kết nối chéo tốc độ cao giữa các node. Khi được triển khai bằng phần cứng, độ trễ phát sinh gần như không đáng kể—thường dưới 2 micro giây. Ngay cả trên các hệ thống Linux dựa vào triển khai phần mềm trong kernel, các tập lệnh AES-NI trên CPU hiện đại vẫn giữ cho tác động hiệu năng ở mức thấp đáng kinh ngạc.

Chuẩn bị hệ thống

Linux đã hỗ trợ MACsec từ phiên bản kernel 4.6, nhưng bạn sẽ cần một gói iproute2 hiện đại để xử lý cấu hình. Hầu hết các bản phân phối hiện nay như Ubuntu 22.04, Debian 12 hoặc RHEL 9 đều đã sẵn sàng ngay khi cài đặt.

Bắt đầu bằng việc xác minh xem module kernel đã có sẵn chưa:

sudo modprobe macsec
lsmod | grep macsec

Nếu lệnh thứ hai trả về một dòng cho macsec, bạn đã có thể bắt đầu. Nếu không, hãy kiểm tra log của kernel để xem có vấn đề tương thích nào không. Bạn cũng sẽ cần lệnh ip, công cụ tiêu chuẩn để quản lý giao diện mạng trong môi trường Linux hiện đại.

Cấu tạo của các khóa MACsec

MACsec dựa vào hai thành phần chính để thiết lập một liên kết an toàn:

  • Connectivity Association Key (CAK): Đây là khóa bí mật chính (master secret key) của bạn.
  • Connectivity Association Key Name (CKN): Một mã định danh hex duy nhất cho CAK.

Chúng ta sẽ sử dụng các khóa tĩnh (static keys) cho hướng dẫn này. Trong khi các triển khai doanh nghiệp quy mô lớn thường sử dụng 802.1X (MKA) để xoay vòng khóa động, khóa tĩnh dễ quản lý và khắc phục sự cố hơn đáng kể đối với các liên kết máy chủ với máy chủ hoặc các cụm máy chủ nhỏ, riêng tư.

Cấu hình từng bước

Hãy tưởng tượng hai máy chủ được kết nối qua giao diện eth1. Chúng ta sẽ xây dựng một giao diện ảo bảo mật có tên là macsec0 trên liên kết vật lý đó.

1. Tạo các chuỗi bí mật

Đối với AES-128, bạn cần một chuỗi hex 32 ký tự cho cả CKN và CAK. OpenSSL giúp việc này trở nên dễ dàng:

# Tạo ngẫu nhiên chuỗi hex CKN 32 ký tự
openssl rand -hex 16
# Tạo ngẫu nhiên chuỗi hex CAK 32 ký tự
openssl rand -hex 16

Hãy giữ các giá trị này an toàn. Cả hai đầu của liên kết phải sử dụng CKN và CAK giống hệt nhau để có thể giao tiếp.

2. Khởi tạo giao diện MACsec

Trên Server A, chúng ta định nghĩa thiết bị ảo. Chúng ta phải chỉ định một “Secure Channel Identifier” (SCI). Đây thường là địa chỉ MAC của giao diện vật lý cộng với số cổng bốn chữ số (ví dụ: 0001).

# Đặt biến để tránh lỗi đánh máy
PHYS_DEV="eth1"
MACSEC_DEV="macsec0"
CKN="6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435"
CAK="0123456789abcdef0123456789abcdef"

# Tạo giao diện ảo
sudo ip link add link $PHYS_DEV name $MACSEC_DEV type macsec sci $(cat /sys/class/net/$PHYS_DEV/address | tr -d ':')0001 encrypt on

3. Thiết lập Transmit Security Association

Bây giờ, hãy cho giao diện biết khóa nào cần sử dụng khi gửi dữ liệu. Chúng ta sẽ sử dụng 0 làm số hiệp hội (AN).

sudo ip macsec add $MACSEC_DEV tx sa 0 pn 1 on key 01 $CKN $CAK

4. Cấu hình đường nhận dữ liệu

Server A cần biết cách xử lý lưu lượng truy cập đến từ Server B. Bạn sẽ cần địa chỉ MAC của Server B cho bước này. Nếu MAC của Server B là aa:bb:cc:dd:ee:ff, cấu hình sẽ như sau:

SERVER_B_MAC="aabbccddeeff"
sudo ip macsec add $MACSEC_DEV rx sci ${SERVER_B_MAC}0001 on
sudo ip macsec add $MACSEC_DEV rx sci ${SERVER_B_MAC}0001 sa 0 pn 1 on key 01 $CKN $CAK

5. Kích hoạt liên kết

Gán một địa chỉ IP cho giao diện macsec0. Giao diện vật lý eth1 bên dưới phải đang hoạt động, nhưng nó không cần địa chỉ IP riêng.

sudo ip addr add 10.0.0.1/24 dev $MACSEC_DEV
sudo ip link set $MACSEC_DEV up
sudo ip link set $PHYS_DEV up

Lặp lại các bước này trên Server B, chỉ cần hoán đổi các giá trị SCI sao cho cấu hình rx của Server B sử dụng địa chỉ MAC của Server A.

Kiểm tra và Giám sát

Thời điểm quyết định là thực hiện một lệnh ping đơn giản giữa hai địa chỉ IP MACsec. Nếu các gói tin được truyền đi, việc mã hóa của bạn có khả năng đã hoạt động. Để xác minh trạng thái liên kết, hãy chạy:

ip macsec show

Theo dõi bộ đếm out_pkts_encrypted. Nếu nó tăng lên khi bạn gửi lưu lượng, dữ liệu của bạn đang được đóng gói trong các frame 802.1AE.

Xác thực với tcpdump

Để xác nhận lưu lượng thực sự không thể đọc được, hãy chạy tcpdump trên giao diện vật lý (eth1). Đừng nghe lén giao diện macsec0, vì kernel sẽ hiển thị cho bạn dữ liệu đã được giải mã tại đó.

sudo tcpdump -i eth1 -nn -e

Tìm kiếm EtherType 0x88e5. Nếu bạn thấy nó, payload đã được mã hóa. Nếu bạn thấy các IP hoặc TCP header tiêu chuẩn trên eth1, lưu lượng của bạn đang bị rò rỉ và việc mã hóa không hoạt động.

Thực tế về hiệu năng

Trên phần cứng hiện đại, tác động đến hiệu năng là rất nhỏ. Một lõi đơn trên CPU Xeon tầm trung thường có thể xử lý hơn 10Gbps MACsec phần mềm với mức sử dụng CPU khoảng 15%. Tuy nhiên, đối với các liên kết 40Gbps hoặc 100Gbps, việc xử lý bằng phần mềm sẽ gặp khó khăn. Trong những kịch bản băng thông cao đó, tôi khuyên bạn nên sử dụng các card mạng (NIC) có hỗ trợ hardware offload, chẳng hạn như dòng Intel X710 hoặc Mellanox ConnectX, để chuyển toàn bộ công việc mã hóa khỏi CPU.

Lưu cấu hình vĩnh viễn

Các lệnh thủ công sẽ biến mất sau khi khởi động lại. Để làm cho liên kết MACsec của bạn tồn tại vĩnh viễn, hãy sử dụng systemd-networkd. Nó cho phép bạn định nghĩa các tệp .netdev.network để tự động khởi tạo ngăn xếp MACsec khi khởi động. Ngoài ra, một dịch vụ systemd đơn giản kích hoạt script cấu hình của bạn cũng là một cách đáng tin cậy để đảm bảo các liên kết luôn an toàn qua các chu kỳ bảo trì.

MACsec là một công cụ mạnh mẽ ở lớp thấp mà nhiều quản trị viên thường bỏ qua. Bằng cách triển khai nó, bạn không chỉ đang hoàn thành các tiêu chuẩn tuân thủ; bạn đang thực sự gia cố lớp vỏ vật lý cho mạng của mình trước các hình thức xâm nhập trực tiếp nhất.

Share: