Dùng usbrip điều tra lịch sử kết nối USB trên Linux: Phát hiện xâm nhập qua cổng vật lý

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

Bạn có bao giờ tự hỏi ai đã cắm USB vào máy chủ Linux trong lúc bạn không có mặt? Đây là câu hỏi mình từng bỏ qua — cho đến khi audit một server production và phát hiện ra có người kết nối thiết bị USB lạ lúc 2 giờ sáng mà không ai hay biết.

USB forensics thường bị bỏ qua trong security checklist, dù đây là vector tấn công cực kỳ nguy hiểm. BadUSB, HID injection, data exfiltration qua USB — tất cả đều để lại dấu vết trong kernel log nếu bạn biết cách đọc. Bài này mình sẽ so sánh các cách điều tra, rồi đi thẳng vào usbrip — công cụ chuyên dụng cho việc này.

Ba cách điều tra lịch sử kết nối USB trên Linux

Cách 1: Đọc trực tiếp system log

Linux ghi lại mọi sự kiện USB trong syslog hoặc journal. Bạn có thể grep thô:

# Với systemd journal
journalctl | grep -i usb

# Với syslog cổ điển
grep -i usb /var/log/syslog

# Xem dmesg ngay khi cắm USB
dmesg | grep -i usb | tail -50

Output điển hình trông như sau:

Jun 20 02:14:33 server kernel: usb 1-1.2: new high-speed USB device number 5 using xhci_hcd
Jun 20 02:14:33 server kernel: usb 1-1.2: New USB device found, idVendor=0930, idProduct=6545
Jun 20 02:14:33 server kernel: usb 1-1.2: Product: DataTraveler 3.0
Jun 20 02:14:33 server kernel: usb 1-1.2: SerialNumber: 001B12345678

Cách 2: Dùng udev rules kết hợp custom script

Tạo udev rule để tự động ghi log mỗi khi USB được kết nối:

sudo nano /etc/udev/rules.d/99-usb-log.rules
ACTION=="add", SUBSYSTEM=="usb", RUN+="/usr/local/bin/log-usb.sh"
#!/bin/bash
# /usr/local/bin/log-usb.sh
echo "$(date) | VID=$ID_VENDOR_ID | PID=$ID_MODEL_ID | Serial=$ID_SERIAL | Model=$ID_MODEL" \
  >> /var/log/usb-connections.log

Cách 3: Dùng usbrip — công cụ chuyên dụng

usbrip là Python tool được viết đặc biệt cho USB forensics. Nó parse kernel log, tổ chức thành structured data, hỗ trợ JSON/HTML output và có tính năng violation detection dựa trên whitelist — thứ mà hai cách kia không có sẵn.

# Xem lịch sử USB gọn gàng
usbrip events history

# So sánh với whitelist
usbrip events violations -a auth.json

Phân tích ưu nhược điểm từng cách

System log thô: Không cần cài gì, nhưng output lộn xộn, khó đọc khi cần điều tra nghiêm túc. Bạn sẽ mất hàng giờ parse text thuần, không có structured data, không có violation detection tự động.

udev + script: Tốt cho monitoring realtime từ thời điểm setup trở đi, nhưng không có dữ liệu lịch sử trước khi setup. Phải tự viết code phần detection — dễ có bug, khó maintain.

usbrip: Mất vài phút setup, nhưng sau đó mọi thứ đơn giản hơn nhiều. Quan trọng nhất là nó đọc được log cũ — rất cần thiết khi bạn điều tra sự cố đã xảy ra trước đó. Có sẵn export JSON/HTML cho báo cáo.

Nên chọn cách nào?

Mình thường dùng kết hợp: usbrip cho điều tra forensics, udev rule cho alert realtime.

  • Đang điều tra sự cố đã xảy ra → usbrip, vì nó đọc được log cũ
  • Muốn alert ngay khi USB lạ được cắm → udev + script
  • Chỉ cần check nhanh một lần → grep syslog là đủ

Sau khi audit security cho 10+ server, mình nhận thấy hầu hết đều có chung những lỗ hổng cơ bản — trong đó có việc không track thiết bị USB. Hầu hết sysadmin chỉ focus vào network, còn physical access thì bị bỏ ngỏ hoàn toàn. usbrip giải quyết được vấn đề này mà không tốn nhiều công sức.

Cài đặt và sử dụng usbrip

Cài đặt

usbrip yêu cầu Python 3.6+:

# Ubuntu/Debian
sudo apt install python3-pip

# Cài usbrip
sudo pip3 install usbrip

# Kiểm tra
usbrip --version

Hoặc cài từ source:

git clone https://github.com/snovvcrash/usbrip.git
cd usbrip
sudo pip3 install -r requirements.txt
sudo python3 setup.py install

Xem lịch sử kết nối USB

# Xem toàn bộ lịch sử
usbrip events history

# Lọc theo ngày cụ thể
usbrip events history --date 2026-06-20

# Xuất ra JSON để phân tích thêm
usbrip events history -q --json /tmp/usb-history.json

Output được hiển thị dạng bảng có màu, rõ ràng hơn rất nhiều so với grep syslog:

Connected     | Host     | VID  | PID  | Manufact | Product       | Serial
--------------+----------+------+------+----------+---------------+------------------
2026-06-20    | server01 | 0930 | 6545 | Kingston | DataTraveler  | 001B12345678
02:14:33      |          |      |      |          | 3.0           |

Tạo whitelist thiết bị được phép

Đây là bước quan trọng nhất cho violation detection. Bạn định nghĩa những USB nào được phép kết nối:

# Tạo auth list tự động từ lịch sử hiện tại
sudo usbrip events gen_auth /etc/usbrip/auth.json

# Hoặc tạo thủ công
mkdir -p /etc/usbrip
cat > /etc/usbrip/auth.json << 'EOF'
{
  "authorized": [
    {
      "vid": "0930",
      "pid": "6545",
      "prod": "DataTraveler 3.0",
      "manufact": "Kingston",
      "serial": "001B12345678"
    },
    {
      "vid": "046d",
      "pid": "c52b",
      "prod": "USB Receiver",
      "manufact": "Logitech",
      "serial": null
    }
  ]
}
EOF

Để serial: null cho chuột, bàn phím — những thiết bị thường không có serial number.

Phát hiện thiết bị không được phép

# Check violations so với whitelist
usbrip events violations -a /etc/usbrip/auth.json

# Verbose output — thêm thông tin chi tiết
usbrip events violations -a /etc/usbrip/auth.json -v

# Xuất violations ra file JSON
usbrip events violations -a /etc/usbrip/auth.json -q --json /tmp/violations.json

Nếu có thiết bị lạ, usbrip sẽ highlight đỏ và hiển thị đầy đủ thông tin: thời gian kết nối, VID/PID, tên thiết bị, serial number.

Tự động hóa: chạy định kỳ và gửi alert

Để có giá trị thực sự trong production, nên tự động hóa bằng crontab:

#!/bin/bash
# /usr/local/bin/usb-check.sh

AUTH_FILE="/etc/usbrip/auth.json"
REPORT="/tmp/usb-violations-$(date +%Y%m%d).json"
EMAIL="[email protected]"

usbrip events violations -a "$AUTH_FILE" -q --json "$REPORT" 2>/dev/null

# Gửi email nếu có violations
if [ -s "$REPORT" ]; then
  echo "CANH BAO: Phat hien thiet bi USB la tren $(hostname)" | \
  mail -s "[SECURITY ALERT] USB Violation" -A "$REPORT" "$EMAIL"
fi
# Thêm vào crontab — chạy hàng ngày lúc 8 giờ sáng
sudo crontab -e

# Thêm dòng này:
0 8 * * * /usr/local/bin/usb-check.sh

Lưu trữ history độc lập với system log

Đây là tính năng hay của usbrip mà nhiều người bỏ qua. System log bị rotate sau 7-30 ngày, nhưng usbrip storage thì không:

# Tạo storage từ log hiện tại
sudo usbrip storage create history

# Cập nhật storage với events mới
sudo usbrip storage update history

# Đọc từ storage (nhanh hơn parse log)
usbrip storage open history

Một vài lưu ý khi triển khai thực tế

Log rotation là kẻ thù số một: Trên nhiều server, syslog bị rotate sau 7 ngày. Nếu sự cố xảy ra 2 tuần trước, bạn mất dấu vết. Tăng retention của journald để giữ log lâu hơn:

sudo nano /etc/systemd/journald.conf
# Thêm hoặc sửa:
MaxRetentionSec=90day
SystemMaxUse=500M

sudo systemctl restart systemd-journald

usbrip không phải SIEM: Nó chỉ track USB events. Để biết USB đó được dùng để làm gì — mount ở đâu, copy file gì — bạn cần kết hợp với auditd. usbrip cho bạn biết thiết bị nào đã kết nối lúc mấy giờ, còn auditd cho bạn biết sau đó có chuyện gì xảy ra.

Root cần thiết cho một số lệnh: gen_authstorage create cần sudo. Các lệnh đọc thông thường chạy bình thường với user thường nếu bạn có quyền đọc log.

USB forensics không phải thứ bạn cần đến hàng ngày, nhưng khi cần thì cần gấp. Cài usbrip ngay bây giờ, tạo whitelist, set up crontab — mất chưa đến 30 phút. Đến lúc thực sự cần điều tra, bạn sẽ không phải bắt đầu từ con số 0.

Share: