Triển khai Velociraptor trên Linux: Hướng dẫn DFIR và Threat Hunting Endpoint theo thời gian thực

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

Bắt đầu nhanh (5 phút)

Velociraptor cho phép bạn truy vấn hàng nghìn endpoint Linux chỉ trong vài giây. Thay vì phải truyền hàng gigabyte log thô về một hệ thống SIEM tốn kém, bạn có thể thực thi các truy vấn có chủ đích trực tiếp trên các host đích. Dưới đây là cách dựng một server thử nghiệm và agent trên một máy Ubuntu 22.04 hoặc Debian 12 duy nhất trong khoảng 5 phút.

1. Tải về file thực thi tĩnh (static binary)

Velociraptor được phân phối dưới dạng một file binary Go độc lập, không phụ thuộc vào bất kỳ shared library ngoài nào. Hãy lấy bản phát hành ổn định mới nhất từ GitHub và cấp quyền thực thi cho nó:

# Lấy thẻ phiên bản mới nhất và tải về file binary AMD64
VER=$(curl -s https://api.github.com/repos/velocidex/velociraptor/releases/latest | grep tag_name | cut -d '"' -f 4)
wget -O velociraptor "https://github.com/velocidex/velociraptor/releases/download/${VER}/velociraptor-${VER}-linux-amd64"
chmod +x velociraptor
sudo mv velociraptor /usr/local/bin/
velociraptor version

2. Tạo file cấu hình cho server và client

Velociraptor xác thực từng thành phần bằng mutual TLS và các khóa mã hóa nhúng sẵn. Hãy tạo các file cấu hình bằng trình hướng dẫn tương tác (wizard):

sudo mkdir -p /etc/velociraptor
cd /etc/velociraptor
sudo velociraptor config generate -i

Trình hướng dẫn sẽ hỏi một số câu hỏi cấu hình. Hãy dùng các giá trị sau cho thiết lập cục bộ nhanh chóng:

  • Operating System: Linux
  • Path for datastore: /var/lib/velociraptor (dành ra ít nhất 15 GB dung lượng ổ đĩa để lưu trữ dữ liệu triage artifact)
  • Frontend URL: https://127.0.0.1:8000/ (trong môi trường production, hãy điền IP tĩnh của server hoặc bản ghi DNS như https://velociraptor.internal.corp:8000/)
  • GUI Bind Port: 8889
  • GUI Username: admin

Trình hướng dẫn sẽ tạo ra hai file trong thư mục hiện tại. Hãy bảo vệ cẩn thận file server.config.yaml trên server vì nó chứa khóa CA riêng tư (private CA key). Phân phối file client.config.yaml tới mọi endpoint mà bạn muốn giám sát.

3. Tạo người dùng quản trị và khởi động server

Tạo một tài khoản quản trị cục bộ trước khi khởi chạy daemon:

sudo velociraptor --config /etc/velociraptor/server.config.yaml user add admin --role administrator

Nhập mật khẩu mạnh khi được yêu cầu (ít nhất 16 ký tự). Tiếp theo, khởi động dịch vụ frontend ở chế độ chi tiết (verbose):

sudo velociraptor --config /etc/velociraptor/server.config.yaml frontend -v

Mở https://127.0.0.1:8889 trong trình duyệt của bạn. Bỏ qua cảnh báo chứng chỉ tự ký (self-signed certificate), sau đó đăng nhập bằng thông tin quản trị viên vừa tạo.

4. Kết nối endpoint client đầu tiên của bạn

Mở cửa sổ terminal thứ hai trên cùng máy đó để giả lập một endpoint. Khởi chạy tiến trình agent:

sudo velociraptor --config /etc/velociraptor/client.config.yaml client -v

Chuyển lại về giao diện web và nhấp vào biểu tượng kính lúp bên dưới Host Search. Nhập * vào ô tìm kiếm. Host của bạn sẽ xuất hiện ngay lập tức, hiển thị trạng thái telemetry màu xanh lá với chu kỳ check-in heartbeat 60 giây đang hoạt động.

Phân tích chuyên sâu

Các nền tảng EDR truyền thống thường chuyển tiếp một lượng telemetry khổng lồ về các cloud bucket trung tâm, làm hóa đơn băng thông tăng vọt. Velociraptor đảo ngược mô hình đó: nó đẩy việc tính toán ra trực tiếp ngoài endpoint bằng ngôn ngữ truy vấn Velociraptor Query Language (VQL). Server trung tâm chỉ gửi đi các chuỗi truy vấn gọn nhẹ. Endpoint sẽ đánh giá yêu cầu ngay trên bộ nhớ, lọc bỏ nhiễu cục bộ và chỉ truyền ngược lại các bản ghi khớp với điều kiện.

Tổng quan về kiến trúc

Nền tảng này dựa trên ba thành phần cốt lõi:

  • Frontend Server: Xử lý các kết nối mTLS từ các agent qua port 8000, quản lý thư viện artifact và phục vụ Web GUI trên port 8889. Một server chỉ với 4 core, 8 GB RAM có thể dễ dàng quản lý 10.000 endpoint đồng thời.
  • Client Agent: Một daemon chạy nền cực kỳ gọn nhẹ. Khi ở trạng thái rảnh (idle), nó chỉ chiếm khoảng 15 đến 25 MB RAM và lượng CPU không đáng kể. Khi có một chiến dịch săn tìm (hunt) kích hoạt, nó sẽ thực thi truy vấn VQL đã biên dịch trong một goroutine biệt lập rồi tải kết quả lên.
  • Velociraptor Query Language (VQL): Một biến thể SQL biểu cảm cao, được bổ sung các plugin chuyên dụng cho DFIR. Các plugin VQL có thể phân tích header ELF, duyệt /proc, đọc trực tiếp inode ext4 thô, phân tích log journald và quét bộ nhớ tiến trình bằng các luật YARA.

Truy vấn các endpoint trực tiếp bằng VQL

Bạn không cần phải dùng web console mới có thể chạy truy vấn. Giao diện CLI cho phép bạn thực thi VQL trực tiếp trên hệ thống đang chạy để phục vụ triage cục bộ tức thì. Dưới đây là cách liệt kê các listening port đang hoạt động cùng với tiến trình cha của chúng:

sudo velociraptor --config /etc/velociraptor/client.config.yaml query \
  'SELECT Pid, Name, CommandLine, Laddr.IP AS LocalIP, Laddr.Port AS LocalPort FROM netstat() WHERE Status = "LISTEN"'

Velociraptor bỏ qua các binary thông thường ở tầng userland như ss hay lsof. Thay vào đó, plugin netstat() đọc trực tiếp từ các pseudo-file của kernel trong /proc/net/tcp và ánh xạ các socket đang mở tới các file descriptor đang hoạt động trong /proc/[pid]/fd/. Nếu kẻ tấn công thay thế /bin/netstat bằng một rootkit để ẩn giấu reverse shell trên port 4444, Velociraptor vẫn sẽ phát hiện ra.

Kiểm tra hoạt động shell của người dùng qua các phiên

Kẻ tấn công thường chạy các lệnh bash one-liner ngay sau khi chiếm được quyền truy cập ban đầu. Thay vì phải tìm kiếm thủ công trong các file /home/*/.bash_history trên hàng chục hồ sơ người dùng, hãy thực thi artifact tích hợp sẵn Linux.Bash.History:

sudo velociraptor --config /etc/velociraptor/client.config.yaml query \
  'SELECT * FROM Artifact.Linux.Bash.History()'

Truy vấn này sẽ đọc /etc/passwd, tìm thư mục home của từng người dùng và phân tích lịch sử lệnh của họ kèm số dòng và timestamp dạng epoch thành một bảng có cấu trúc.

Sử dụng nâng cao

Khi những agent đầu tiên đã check-in ổn định, bạn có thể chuyển từ các truy vấn ad-hoc sang quy mô triển khai production và tự động hóa quy trình săn tìm mối đe dọa.

Triển khai các dịch vụ systemd chạy thường trực

Các shell tương tác sẽ dừng lại khi phiên SSH bị ngắt. Môi trường production đòi hỏi các service unit systemd ổn định, bền bỉ.

Trên máy chủ của bạn, tạo file /etc/systemd/system/velociraptor-server.service:

[Unit]
Description=Velociraptor DFIR Server
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/velociraptor --config /etc/velociraptor/server.config.yaml frontend
Restart=always
RestartSec=5s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Trên các client endpoint, cài đặt /etc/systemd/system/velociraptor-client.service. Thêm các ràng buộc tài nguyên cgroup để đảm bảo agent không bao giờ làm nghẽn tài nguyên của các workload production trong quá trình quét chuyên sâu:

[Unit]
Description=Velociraptor Endpoint Client
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/velociraptor --config /etc/velociraptor/client.config.yaml client
Restart=always
RestartSec=10s
CPUQuota=15%
MemoryMax=300M

[Install]
WantedBy=multi-user.target

Các chỉ thị CPUQuota=15% và MemoryMax=300M giúp quá trình quét endpoint luôn trong tầm kiểm soát. Nếu một truy vấn regex nặng vô tình làm tăng vọt mức sử dụng CPU, systemd sẽ tự động bóp nghẹt tài nguyên (throttle). Nếu bộ nhớ vượt quá 300 MB, OOM killer của kernel sẽ khởi động lại agent một cách an toàn.

sudo systemctl daemon-reload
sudo systemctl enable --now velociraptor-client.service

Viết artifact VQL tùy chỉnh để săn tìm cơ chế persistence

Mã độc Linux thường thiết lập cơ chế duy trì (persistence) thông qua lịch trình cron. Kẻ tấn công thường thả các script reverse shell vào /etc/cron.d/ hoặc sửa đổi crontab của người dùng trong /var/spool/cron/crontabs/.

Dưới đây là một artifact tùy chỉnh để quét các file cron nhằm tìm các công cụ mạng ra ngoài và script staging phổ biến. Lưu nó thành /etc/velociraptor/custom_artifacts/cron_hunt.yaml:

name: Custom.Linux.CronIntegrity
description: Tìm kiếm trong các thư mục cron các reverse shell, downloader và lệnh staging đáng ngờ.

sources:
  - query: |
      LET TargetFiles = SELECT OSPath, Size, Mtime
                        FROM glob(globs=["/etc/cron*/**", "/etc/crontab", "/var/spool/cron/crontabs/*"])
                        WHERE NOT IsDir AND Size < 1000000

      SELECT OSPath,
             Size,
             Mtime,
             upload(file=OSPath) AS UploadRef
      FROM TargetFiles
      WHERE read_file(filename=OSPath) =~ "(?i)(curl\s|wget\s|python3?\s+-c|bash\s+-i|sh\s+-i|nc\s+-e|/dev/tcp/)"

Hãy chú ý đến điều kiện WHERE read_file(...). Nó kiểm tra nội dung thực tế bên trong file để tìm các chuỗi lệnh đáng ngờ như /dev/tcp/ hoặc curl. Khi một endpoint có file khớp điều kiện, hàm upload(file=OSPath) sẽ tự động đẩy một bản sao của file cron khả nghi đó về kho lưu trữ bằng chứng (forensic vault) trên server của bạn.

Nạp artifact mới này vào server:

sudo velociraptor --config /etc/velociraptor/server.config.yaml artifacts load /etc/velociraptor/custom_artifacts/cron_hunt.yaml

Thực hiện chiến dịch threat hunt trên toàn bộ hạ tầng

Việc triển khai một đợt hunt chỉ mất bốn cú nhấp chuột. Từ Web GUI, chuyển đến Hunt Manager và nhấp vào nút + (New Hunt). Chọn Custom.Linux.CronIntegrity từ danh sách artifact. Đặt giới hạn tốc độ client (ví dụ: 50 host mỗi giây) và thời hạn hết hạn là 24 giờ, sau đó nhấp vào Launch.

Velociraptor sẽ phân phối tác vụ qua các kênh gRPC thường trực. Trên một hạ tầng gồm 5.000 máy chủ, kết quả ban đầu thường được trả về trong vòng chưa đầy 30 giây. Các file trùng khớp sẽ xuất hiện trong vault của server, sẵn sàng cho việc tra cứu mã băm (hash) hoặc dịch ngược phân tích (reverse engineering).

Lời khuyên thực tế

Gia cố an ninh cho pipeline điều tra số là việc tối quan trọng. Vì các agent Velociraptor thực thi mã với quyền root, nên server của bạn sẽ là mục tiêu có giá trị cao đối với những kẻ tấn công muốn thực hiện di chuyển ngang (lateral movement).

1. Siết chặt bảo mật cho management console

Web GUI hoạt động trên port 8889. Việc để lộ cổng này ra ngoài internet công cộng sẽ tạo cơ hội cho các cuộc tấn công brute-force thông tin xác thực. Hãy giữ nguyên GUI.bind_address là 127.0.0.1 trong file server.config.yaml. Truy cập vào dashboard thông qua một SSH tunnel đã mã hóa từ máy trạm của bạn:

# Chuyển tiếp cổng 8889 từ máy chủ từ xa về máy cục bộ của bạn
ssh -N -L 8889:127.0.0.1:8889 [email protected]

Mở https://127.0.0.1:8889 trên trình duyệt cục bộ. Các công cụ quét cổng từ bên ngoài sẽ thấy port 8889 ở trạng thái đóng (closed) hoặc bị lọc (filtered).

2. Cấu hình chứng chỉ Let’s Encrypt cho frontend

Mặc dù chứng chỉ tự ký hoạt động tốt cho giai đoạn thử nghiệm ban đầu, nhưng các agent trong môi trường production sẽ giao tiếp ổn định hơn nhiều với các chứng chỉ đáng tin cậy. Velociraptor đã tích hợp sẵn một ACME client. Trỏ bản ghi DNS A công khai về server của bạn, mở tạm thời cổng TCP 80 cho các thử thách HTTP-01 và chỉnh sửa file /etc/velociraptor/server.config.yaml:

Frontend:
  hostname: velociraptor.security.example.com
  certificate_provider: letsencrypt
  acme_email: [email protected]

3. Giới hạn băng thông mạng khi thu thập dữ liệu lớn

Việc trích xuất ảnh bộ nhớ trực tiếp (memory dump) bằng LiME hoặc kéo timeline phân vùng đĩa sẽ tạo ra các đợt tăng vọt băng thông đột ngột. Nếu 40 server đồng thời tải lên các bản dump RAM dung lượng 16 GB, bạn sẽ làm nghẽn đường truyền uplink 1 Gbps và gây gián đoạn lưu lượng vận hành của doanh nghiệp. Hãy bóp băng thông tải lên trực tiếp trong các tham số thu thập VQL:

# Giới hạn tốc độ truyền dữ liệu ở mức 5 MB/s (5.000.000 bytes/giây) cho mỗi host
sudo velociraptor --config /etc/velociraptor/client.config.yaml collect Linux.Memory.Lime \
  --args max_bandwidth=5000000

4. Xây dựng các đợt hunt baseline chủ động

Đừng bao giờ đợi đến khi có cảnh báo mức độ nghiêm trọng cao mới bắt đầu chạy những truy vấn đầu tiên. Hãy lên lịch các chiến dịch săn tìm baseline định kỳ hàng tuần để chụp ảnh trạng thái của toàn bộ máy chủ trong những khung giờ thấp điểm:

  • Binary SUID và SGID: Chạy Linux.Search.Suid để phát hiện các binary bất thường thuộc quyền root nhưng lại được bật cờ setuid (chmod u+s).
  • Kernel module: Chạy Linux.Sys.KernelModules để xác định các rootkit hoặc driver ẩn không được ghi nhận.
  • Dịch vụ mạng đang lắng nghe: So sánh các port TCP/UDP đang mở với danh mục tài sản trong CMDB để phát hiện các shadow service trái phép.

Việc có sẵn dữ liệu baseline từ thứ Ba tuần trước sẽ biến một quy trình triage sự cố kéo dài ba ngày đầy hỗn loạn thành một tác vụ phân tích chênh lệch (diff) chỉ mất vỏn vẹn năm phút.

Share: