Ngăn chặn BadUSB: 6 tháng kinh nghiệm bảo mật Linux với USBGuard

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Lỗ hổng bảo mật vật lý mà có thể bạn đang bỏ qua

Chúng ta chi hàng ngàn đô la cho các tường lửa cao cấp, tối ưu bảo mật SSH và WAF để bảo vệ lớp mạng. Tuy nhiên, trong một đợt kiểm tra bảo mật định kỳ các nút edge computing cách đây sáu tháng, tôi nhận ra các cổng vật lý của mình đang bị bỏ ngỏ. Một chiếc board Digispark giá 15 USD hoặc Hak5 Rubber Ducky có thể giả lập bàn phím và chèn một reverse shell với tốc độ hơn 1.000 từ mỗi phút. Nếu kẻ tấn công có 3 giây tiếp cận vật lý, các lớp mã hóa phần mềm sẽ không cứu được bạn.

Để lấp lỗ hổng này, tôi đã triển khai USBGuard trên toàn bộ môi trường production của mình. USBGuard là một khung phần mềm mạnh mẽ giúp bảo vệ hệ thống chống lại các thiết bị USB lạ bằng cách thực thi chính sách whitelist/blacklist nghiêm ngặt. Sau nửa năm quản lý các chính sách này và chặn được 42 nỗ lực kết nối trái phép, tôi đã tinh chỉnh được quy trình làm việc cần thiết để khóa chặt máy chủ mà không tự khóa chính mình bên ngoài.

Khóa hệ thống trong 5 phút

Bạn có thể thiết lập một lớp phòng thủ cơ bản chỉ trong vài phút. Cấu hình này sẽ chặn mọi thiết bị USB mới trong khi vẫn cho phép các thiết bị ngoại vi hiện tại—như bàn phím hoặc YubiKey—tiếp tục hoạt động.

1. Cài đặt

USBGuard có sẵn trong kho lưu trữ chuẩn của hầu hết các bản phân phối Linux lớn.

# Đối với Ubuntu/Debian
sudo apt update && sudo apt install usbguard

# Đối với CentOS/RHEL/Fedora
sudo dnf install usbguard

2. Tạo chính sách ban đầu

Đừng vội khởi động dịch vụ ngay. Nếu bạn làm vậy, chính sách mặc định có thể ngắt kết nối bàn phím của bạn ngay lập tức. Thay vào đó, hãy tạo một bộ quy tắc dựa trên những thiết bị hiện đang được cắm vào máy.

# Chụp lại cấu hình phần cứng hiện tại vào tệp policy
sudo usbguard generate-policy > /etc/usbguard/rules.conf

3. Khởi động Daemon

Sau khi đã lưu chính sách, hãy kích hoạt dịch vụ để đảm bảo nó vẫn hoạt động sau khi khởi động lại máy.

sudo systemctl enable --now usbguard

Từ thời điểm này, kernel sẽ bỏ qua bất kỳ thiết bị mới nào được cắm vào máy chủ cho đến khi bạn cho phép nó một cách thủ công.

Viết quy tắc thực sự hiệu quả

Tệp rules.conf chính là bộ não cho hệ thống phòng thủ của bạn. Trong tháng đầu tiên, tôi học được rằng một lệnh “allow” đơn giản là không đủ cho các khu vực bảo mật cao. Bạn cần cụ thể hơn để ngăn chặn các hình thức giả mạo tinh vi.

Phân tích cú pháp quy tắc

Một quy tắc cấp độ production sẽ trông như thế này:

allow id 0951:1666 serial "0014857749E5F831171E01D7" name "DataTraveler 3.0" hash "asdf..." with-interface 08:06:50
  • Target (Mục tiêu): Sử dụng allow cho thiết bị tin cậy, block để bỏ qua, hoặc reject để loại bỏ thiết bị khỏi cây thiết bị một cách logic.
  • ID: Đây là Vendor ID và Product ID. Mặc dù hữu ích, nhưng chúng dễ dàng bị giả mạo bởi các thiết bị BadUSB.
  • Serial (Số sê-ri): Luôn bao gồm số sê-ri. Nó thêm một lớp xác minh cần thiết cho các phần cứng quản trị cụ thể.
  • With-interface (Giao diện đi kèm): Đây là lớp phòng thủ tốt nhất của bạn. Nó giới hạn thiết bị ở một chức năng cụ thể. Ví dụ: bạn có thể cho phép giao diện âm thanh của tai nghe USB nhưng chặn tính năng giả lập bàn phím ẩn của nó.

Tại sao Hashing là bắt buộc

Đối với các máy chủ nhạy cảm nhất, tôi sử dụng thuộc tính hash. USBGuard tính toán mã băm của bộ mô tả nhị phân của thiết bị. Nếu kẻ tấn công sao chép ID và Serial của ổ flash quản trị viên nhưng sử dụng firmware nội bộ khác, mã băm sẽ không khớp. Thiết bị sẽ tiếp tục bị chặn.

Quản lý thiết bị trong thực tế

Trong môi trường đang vận hành, bạn không nên chỉnh sửa tệp cấu hình bằng tay. Hãy sử dụng CLI của usbguard để quản lý phần cứng tức thời. Khi một kỹ thuật viên trung tâm dữ liệu cần cắm ổ đĩa bảo trì, hãy làm theo quy trình ba bước sau:

1. Xác định thiết bị bị chặn

sudo usbguard list-devices

Tìm mục được đánh dấu là “blocked”. Nó sẽ cho bạn biết ID thiết bị (ví dụ: 5).

2. Truy cập tạm thời và vĩnh viễn

Để cấp quyền truy cập cho đến lần khởi động lại tiếp theo, hãy dùng:

sudo usbguard authorize-device 5

Để thêm vĩnh viễn vào whitelist, hãy sử dụng cờ -p:

sudo usbguard allow-device 5 -p

Bảo mật cấu hình của bạn

USBGuard chỉ mạnh khi chính cấu hình của nó được bảo mật. Kiểm tra /etc/usbguard/usbguard-daemon.conf để đảm bảo chỉ người dùng root hoặc một nhóm admin cụ thể mới có thể thay đổi quy tắc. Nếu bạn đang thiết lập mật khẩu quản trị cho các hệ thống này, hãy sử dụng một công cụ nội bộ như trình tạo mật khẩu tại toolcraft.app để đảm bảo không có thông tin đăng nhập nào bị rò rỉ trong quá trình thực hiện.

Những bài học đắt giá sau 6 tháng vận hành

Chuyển sang chính sách USB nghiêm ngặt không phải lúc nào cũng suôn sẻ. Bốn lời khuyên sau đây sẽ giúp bạn tránh được những chuyến đi đêm tới trung tâm dữ liệu.

1. Sự cố khóa bàn phím là có thật

Nếu bạn quản lý phần cứng vật lý, bàn phím của bạn là một thiết bị USB. Nếu bạn tạo chính sách khi bàn phím đang rút ra, bạn sẽ bị khóa khỏi console cục bộ ngay khi dịch vụ bắt đầu. Luôn kiểm tra kỹ tệp rules.conf để tìm các mục HID (Human Interface Device) trước khi nhấn enter.

2. Cẩn thận với USB Hub

USBGuard coi các hub là các thiết bị riêng biệt. Nếu bạn chặn một hub, mọi cổng trên hub đó đều vô dụng, bất kể bạn có quy tắc gì cho các thiết bị cắm vào nó. Tôi thường allow các hub nội bộ trên bo mạch chủ nhưng block tất cả các hub bên ngoài chưa được xác thực.

3. Tập trung hóa nhật ký kiểm tra (Audit Logs)

Một thiết bị USB bị chặn là một sự kiện bảo mật. Tôi chuyển nhật ký USBGuard vào hệ thống giám sát tập trung của mình. Điều này sẽ cảnh báo đội ngũ bảo mật ngay khi một thiết bị trái phép chạm vào máy chủ. Bạn có thể theo dõi các sự kiện này cục bộ bằng lệnh:

journalctl -u usbguard -f

4. Sử dụng ‘Reject’ để phòng thủ chủ động

Lệnh block chỉ đơn giản là khiến thiết bị không hoạt động. Lệnh reject yêu cầu kernel ngắt kết nối logic của nó. Điều này tốt hơn nhiều cho việc khắc phục sự cố vì nó gửi một tín hiệu rõ ràng đến hệ điều hành rằng thiết bị đã bị từ chối một cách có chủ đích.

Mẫu cấu hình bảo mật (Hardened Config)

Đây là thiết lập /etc/usbguard/usbguard-daemon.conf mà tôi sử dụng cho các môi trường production:

  • ImplicitPolicyTarget=block: Nếu không có quy tắc cho thiết bị đó, hãy chặn nó.
  • PresentDevicePolicy=keep: Không ngắt kết nối với bàn phím hiện tại khi dịch vụ khởi động lại.
  • IPCAllowedGroups=wheel: Chỉ các admin trong nhóm wheel mới có thể cấp quyền cho phần cứng mới.

USBGuard đã thu hẹp đáng kể bề mặt tấn công vật lý của chúng tôi. Nó có thể gây ra một chút bất tiện khi thêm phần cứng mới, nhưng lợi ích về bảo mật mang lại là cực kỳ lớn. Cuối cùng, bạn có thể ngừng lo lắng về việc ai có quyền tiếp cận vật lý vào tủ rack máy chủ của mình.

Share: