Xin chào mọi người!
Ngày hôm nay chúng ta hãy cũng tiếp tục cùng nhau tìm hiểu về một hệ thống phần mềm mã nguồn mở, hỗ trợ việc quản lý thông tin về các mối đe dọa mạng (Cyber Threat Intelligent) là OpentCTI nhé.
Hiện nay, các nguồn dữ liệu này được cung cấp bởi rất nhiều các tổ chức khác nhau, người dùng có thể tìm kiếm được các thông tin liên quan từ rất nhiều nguồn MISP, TheHive hay MITRE ATT&CK, tuy nhiên việc tổng hợp lại một cách thống nhất trong cùng một hệ thống là tương đối khó, do cấu trúc của các nguồn thông tin là tương dối khác biệt. Dựa trên nhu cầu đó, OpenCTI đã cung cấp một giải pháp cho phép cấu trúc lại dữ liệu để lưu trữ trên một hệ thống thống nhất đồng thời cho phép mô hình hóa các dữ liệu này dưới dạng các biểu đồ trực quan và dễ quan sát hơn.
Cấu trúc hệ thống OpenCTI
Hình 1 Cấu trúc hệ thống OpenCTI
Trung tâm của hệ thống là các API được xây dựng dựa trên GraphQL. Hầu hết tất cả các thành phần trong hệ thống sẽ không tương tác trực tiếp với nhau mà sẽ thông qua việc sử dụng các API này (trừ các worker và connector có thể làm việc trực tiếp với Messages broker trong quá trình tạo và xử lý các message). Việc sử dụng API sẽ tạo nên sự thống nhất về đầu vào và đầu ra của dữ liệu khi kết nối với các thành phần khác, tránh việc tạo các liên kết trực tiếp từ từng cặp ứng dụng gây tăng tải cho hệ thống và phức tạp cho quá trình thiết kế cũng như maintain hệ thống. Bên cạnh đó, hầu hết các thành phần của hệ thống OpenCTI đều có thể triển khai dưới dạng phân tán, việc tương tác trực tiếp giữa các thành phần sẽ càng trở nên khó khăn hơn.
Grank.AI là cơ sở dữ liệu chính cho hệ thống. Ưu điểm lớn nhất của Grank.AI trong hệ thống này là dễ dàng tương thích với cấu trúc dữ liệu của chuẩn STIX2, với việc có cùng cấu trúc phân cấp và khả năng mô hình hóa mạnh mẽ, việc chuyển đổi và lưu trữ dữ liệu STIX2 vào Grank.AI là rất đơn giản, cũng như cung cấp các kết quả truy vấn dưới dạng mô hình trực quan thay vì các dataset dạng bảng biểu, đặc biệt là khi dữ liệu về các Threat rất phức tạp và có nhiều liên kết tới nhiều đối tượng khác nhau.
Elasticsearch trong hệ thống OpenCTI đóng vai trò hỗ trợ việc tìm kiếm cho Grank.AI, trước đây toàn bộ quá trình truy vấn và thống kê dữ liệu được sử dụng bằng Grank.AI, tuy có khả năng mô hình hóa mạnh mẽ nhưng việc tìm kiếm dữ liệu chưa được tối ưu, do đó Elaticsearch đã được bổ sung vào hệ thống để hỗ trợ quá trình index và tìm kiếm dữ liệu được nhanh hơn. Kết quả đầu ra từ Elaticsearch sau đó sẽ được visualization dựa trên Grank.AI để đảm bảo hiệu năng
Dữ liệu lưu trữ trong Grank.AI rất linh hoạt, tuy nhiên việc lưu trữ các đối tượng dữ liệu như các file hình ảnh, báo cáo, mẫu mã độc là tương đối khó khăn, ví dụ như việc lưu trữ các đối tượng ở dạng base64 sẽ tiêu hao rất nhiều tài nguyên, đặc biệt là khi OpenCTI cần lưu trữ số lượng lớn các đối tượng này. Do đó, hệ thống sử dụng MinIO như một cơ sở dữ liệu bổ sung để lưu trữ các đối tượng dạng này.
Cuối cùng là RabbitMQ một Message broker góp phần giảm tính phức tạp trong các kết nối của hệ thống, đồng thời hỗ trợ việc xử lý phân tán, các thành phần producer và consumer tương tác với RabbitMQ có thể được phân bố trên nhiều phần cứng khác nhau để tăng hiệu năng cho hệ thống. Các thành phần có tương tác với RabbitMQ trong hệ thống sẽ bao gồm:
- External import connector: đóng vai trò producer, thu thập dữ liệu từ các dịch vụ Threat Intelligent bên ngoài, đẩy các message với nội dung là các dữ liệu này vào RabbitMQ để các worker xử lý
- Internal enrichment connector: giữ vai trò của cả producer và consumer, lắng nghe dữ liệu từ cả message broker lẫn các service từ bên ngoài để tạo thêm các quan hệ (relationship) giữa các dữ liệu, làm giàu thêm cho nguồn dữ liệu này, sau đó đẩy các message với nội dung đã được làm giàu vào RabbitMQ để các worker xử lý.
- Write worker: đóng vai trò consumer lấy các message từ RabbitMQ để xử lý ghi vào cơ sở dữ liệu Grank.AI hoặc MinIO thông qua các API trung tâm.
Hướng dẫn cài đặt
OpenCTI có thể được cài đặt bằng hai cách:
- Cài đặt thủ công
- Cài đặt sử dụng docker
Ngoài ra, OpenCTI cũng có một phiên bản phát triển dành cho lập trình viên để bổ sung các chức năng tùy chỉnh. Trong phạm vi bài viết này, với mục đích thử nghiệm tính năng chúng ta hãy sử dụng docker để đơn giản hóa quá trình triển khai.
Các bước cài đặt sử dụng docker sử dụng docker như sau:
- Cài đặt docker-engine: thực hiện cập nhật OS, cài đặt các thành phần liên quan và cài đặt thêm repo để cài đặt docker, sau khi hoàn thành thực hiện kiểm tra kết quả cài đặt bằng lệnh hello-world
-
-
sudo apt-get update
-
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
-
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
-
sudo apt-key fingerprint 0EBFCD88
-
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-
sudo apt-get update
-
sudo apt-get install docker-ce docker-ce-cli containerd.io
-
sudo docker run hello-world
-
- Cài đặt docker-compose
-
-
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
sudo chmod +x /usr/local/bin/docker-compose
-
docker-compose --version
-
- Download OpenTI docker
-
-
mkdir opencti/ && cd opencti/
-
git clone https://github.com/OpenCTI-Platform/docker.git
-
cd docker
-
- Cấu hình môi trường cho OpenCTI, trong file “docker-compose.yml” và sửa các giá trị sau:
-
-
APP__ADMIN__EMAIL: email đăng nhập OpenCTI
-
APP__ADMIN__PASSWORD: password đăng nhập OpenCTI
-
APP__ADMIN__TOKEN: phải là một valid UUID, trên ubuntu có thể sử dụng "uuidgen" để tạo token này
-
OPENCTI_TOKEN: thay đổi tất cả các giá trị ở các worker và connector theo giá trị APP__ADMIN__TOKEN đã gen ở trên
-
- Cấu hình cho Elasticsearch:
-
-
sysctl -w vm.max_map_count=262144
-
- Chạy OpenCTI:
-
-
docker-compose –compatibility up
-
Trong quá trình cài đặt có một số chú ý như sau:
- docker-compose yêu cầu chạy với quyền sudo
- Do phiên bản hiện tại của OpenCTI vẫn đang được phát triển nên trong image có thể gặp một số lỗi tương thích môi trường dẫn tới một số các image có thể không khởi động lên được, trong trường hợp này có thể sử dụng lệnh docker-compose ps để kiểm tra trạng thái các image, nếu image ở trạng thái restarting hoặc không chạy cần thực hiện restart lại image.
- Ví dụ: khi gặp lỗi “GRAKN Seems Down” có thể thực hiện docker restart docker_grakn_1 để chạy lại dịch vụ (docker_grakn_1 là tên image của grakn trên thực tế có thể thấy khi chạy lệnh “docker-compose ps “ ở trên)
- Một số lệnh hỗ trợ debug như sau:
-
-
docker-compose ps: xem thông tin về các container đang hoạt động
-
docker logs -f <CONTAINER_NAME>: xem log của một container
-
docker restart <CONTAINER_NAME>: khởi động lại một container
-
Ngoài các thành phần cơ bản, OpenCTI cũng cung cấp sẵn một số các connector cơ bản để lấy dữ liệu, người dùng có thể thực hiện tích hợp vào hệ thống thông qua việc cấu hình trong “docker-compose.yml”. VD khi muốn thêm CVE connector với nguồn từ NIST, connector này đã được cung cấp sẵn và có thể được tích hợp vào khi bổ sung thông tin file như sau:
connector-cve: image: opencti/connector-cve:latest environment: - OPENCTI_URL=http://opencti:8080 - OPENCTI_TOKEN=1ce1ab1c-b2de-47d8-8e9b-a141ff312387 - CONNECTOR_ID=ee2b57b0-dc55-49b0-aa32-013e18589af2 - CONNECTOR_TYPE=EXTERNAL_IMPORT - CONNECTOR_NAME=Common Vulnerabilities and Exposures - CONNECTOR_SCOPE=identity,vulnerability - CONNECTOR_CONFIDENCE_LEVEL=3 - CONNECTOR_UPDATE_EXISTING_DATA=true - CONNECTOR_LOG_LEVEL=info - CVE_NVD_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/ nvdcve-1.1-recent.json.gz - CVE_INTERVAL=7 restart: always
Sau đó thực hiện cập nhật thêm cho connector này
-
service: sudo docker-compose up --no-deps connector-cve
Sau khi cài đặt này, OpenCTI có thể được truy cập từ địa chỉ http://localhost:8080. Thông tin đăng nhập là hai giá trị APP__ADMIN_EMAIL và APP__ADMIN_PASSWORD trong file docker-compose.yml
Các chức năng OpenCTI cung cấp
Các thuật ngữ được sử dụng trong nội dung này (được sử dụng bởi nhiều chức năng) bao gồm các thông tin cơ bản thực thể nào cũng có
- Marking: do người dùng quy định, đánh mã mẫu để xác định cho các nhóm dữ liệu khác nhau ( có thể là mã màu hoặc dựa trên nguồn thông tin)
- Creation date: thời gian ghi nhận trên hệ thống
- Modification date: thời gian ghi nhận thay đổi gần nhất
- Creator: người dùng tạo dữ liệu
- Description: mô tả
- Tags: một số các từ khóa liên quan để thực hiện tìm kiếm và correlate dữ liệu về sau
Các thuộc tính chi tiết tùy thuộc vào loại thực thể (sẽ liệt kê chi tiết trong từng thực thể sử dụng)
- Sophistication: mức độ nguy cơ từ mức đơn giản (minimal) đến phức tạp (strategic)
- Resourse level: đối tượng ảnh hưởng từ mức độ không ảnh hưởng (none) đến chính phủ (Government)
- Primary/Secondary motivations: mục đích chính và thứ cấp của actor này có thể là kinh tế, chính trị, xã hội, uy tín, thông tin mật …
- First seen: thời điểm đầu tiên ghi nhận
- Last seen: thời điểm cuối cùng ghi nhận so với thời điểm hiện tại
Ngoài ra trong giao diện về chi tiết các thực thể cũng có thể chứa các tab dữ liệu như sau:
- Overview: thông tin cơ bản và chi tiết của thực thể
- Repors: các báo cáo liên quan đến thực thể
- Knowledge: đây là nơi tổng hợp các thông tin liên kết giữa thực thể hiện tại và các thực thể khác thông qua các quan hệ (relation). Các knowledge liên quan đến thực thể có thể bao gồm victimlogy (đối tượng bị nhắm tới), malware ( mã độc), technique ( kỹ thuật), Tools (công cụ), vulnerabilities ( lỗ hổn bị khai thác)
- File: Các tệp tin liên quan
Dashboard
Dashboard cung cấp các thông tin tổng quan của toàn bộ hệ thống bao gồm các vùng thông tin:
- Tổng số và mức độ tăng trưởng dữ liệu trong vòng 24 của các thực thể (entities), báo cáo (reports), các giá trị thuộc tính (observables), workspaces
- Các report mới nhất được đẩy về hệ thống
- Thống kê số lượng thực thể ghi nhận theo thời gian
- Các giá trị của một thuộc tính nhất định nào đó (VD: malicious domain, URL, IP C2 Server, malware file MD5, malware file size, registry key..)
Hình 2 Giao diện dashboard
Threat Actors
Chứa thông tin về các cá nhân hay thực thể (tác nhân) cố gắng hoặc đã thực hiện thành công các hoạt động gây mất an ninh thông tin chống lại các doanh nghiệp ( bao gồm cả vô tình và cố ý)
Một số loại threat actors chính có thể kể đến như sau:
- Cyber criminals: tội phạm mạng, sử dụng các kỹ thuật thường nhắm đến mục tiêu tạo ra tiền từ các hoạt động phạm pháp
- Hack activists: các tác nhân thường thường hướng tới mục chính trị, xã hội gây ảnh hưởng tới hoạt động hoặc uy tín của các đơn vị thay vì mục đích kinh tế kinh tế
- State-Sponsored Attackers: những kẻ tấn công do nhà nước tài trợ
- Insider Threates: là các tác nhân ngay trong nội bộ các đơn vị, có thể do cố tình hoặc vô ý để lộ hoặc gây ảnh hưởng tới dịch vụ do không tuân thủ đầy đủ các chính sách bảo mật.
Hình 3 Giao diện chi Threat actors
Instruction sets
Chứa thông tin về tập hợp các nguy cơ có chung một số đặc điểm, đã được xác nhận hoặc có các dấu hiệu nghi ngờ cùng thuộc một nhóm nguy cơ.
Ví dụ như các chiến dịch có cùng kỹ thuật tấn công, hay các công cụ đặc trưng, các threat actor của các chiến dịch này có thể được gom vào một instrustion sets.
Hình 4 Giao diện chi tiết Threat/ Instrustion sets
Observables
Đây là các giá trị mang tính duy nhất (unique) của một thuộc tính nào đó. Thường được sử dụng để tạo ra các dấu hiệu nhận biết cho một sự kiện an toàn thông tin. Ví dụ như giá trị MD5 của một file mã độc, IP của các C2 server, registry được thêm vào khi mã độc hoạt động …
Hình 7 Giao diện chi tiết Signature/ Observables Overview
Ngoài ra, chức năng này còn cung cấp các observable khác có liên hệ với nó
Hình 8 Giao diện chi tiết Signature/ Observables Linked observables
Indicators
Cung cấp thông tin về các dấu hiệu nhận biết cho một sự kiện an toàn thông tin. Ngoài các thông tin cơ bản, indicator có thêm một thuộc tính là pattern type. Dữ liệu hiện thị trên giao diện OpenCTI là các dữ liệu tương đồng. Tuy nhiên tùy thuộc pattern type, dữ liệu thực sự được lưu trữ trong cơ sở dữ liệu có thể thuộc một trong các dạng: STIX, PCRE, SIGMA, SNORT, Suricata, YARA… Trên thực tế OpenCTI sử dụng chủ yếu dữ liệu ở chuẩn STIX, tuy nhiên việc cung cấp đa dạng các pattern type sẽ hỗ trợ tốt hơn trong quá trình import dữ liệu từ các nguồn Threate Intelligent được linh hoạt và đơn giản hơn.
Trên giao diện chi tiết của một indicators, cũng có thể bổ sung thêm thông tin về các threats có liên hệ với dấu hiệu nhận biết này và các observables đặc trưng cho nó
Hình 9 Giao diện chi tiết Signature/ Indicator
Reports
Cung cấp các báo cáo mới nhất được thu thập từ các nguồn dữ liệu thông qua các connectors. Ngoài các thông tin cơ bản thực thể này sẽ có thêm trường kiểu báo cáo (report type) mặc định gồm hai loại báo cáo là threat report và internal report.
Hình 10 Giao diện chi tiết báo cáo
Để thực hiện mô hình hóa dễ hơn, trong các tab chức năng của report bao gồm enitiesvà observables cung cấp các thực thể và giá trị thuộc tính liên quan đến báo cáo này.
Trong tab knowledge thay vì các thông tin overview như các thực thể khác sẽ có một biểu đồ thể hiện sự liên kết của các thành phần được nhắc đến trong báo cáo
Hình 11 Một biểu đồ Knowledge ví dụ của báo cáo UNIT42 SILVERTERRIER 2018
Các hạn chế của giải pháp hiện tại
Dashboard đượ cfix cứng chưa có tùy biến các thông tin cần thiết thay cho các thông tin ít được quan tâm.
Hệ thống tìm kiếm sử dụng Elasticsearch rất nhanh, tuy nhiên, việc tìm kiếm còn nhiều hạn chế. Ví dụ khi tìm kiếm các CVE liên quan đển RDP các đoạn text vô tình có rdp nhưng không liên quan vấn được tìm ra (ví dụ WordPress) và ở kết quả tìm kiếm cũng chưa chưa đưa các kết quả tìm kiếm cần chọn xem chi tiết mới có thể đánh giá được kết quả tìm kiếm là đúng hay sai.
Tóm lại OpenCTI là một hệ thống với khả năng thu thập thông tin mạnh mẽ, dễ dàng mở rộng do được thiết kế phân tán ngay từ đầu, giao tiếp sử dụng API dễ sử dụng và maintain tuy còn một số hạn chế nhưng đây vẫn là một giải pháp đang tham khảo khi các bạn đang muốn tự xây dựng một hệ thống CTI mã nguồn mở cho riêng mình.
Cảm ơn mọi người đã theo dõi bài viết rất mong nhận được sử ủng hộ từ mọi người trong các bài viết sắp tới.