1. Tổng quan.
Elastiflow là một công cụ mã nguồn mở, mạnh mẽ được thiết kế để thu thập, phân tích và trực quan hóa lưu lượng mạng. Nó cung cấp một cái nhìn sâu sắc về những gì đang xảy ra trên mạng của bạn, từ việc xác định các ứng dụng đang sử dụng nhiều băng thông nhất đến việc phát hiện các hoạt động bất thường có thể báo hiệu một cuộc tấn công.
2. Các công nghệ liên quan.
Elastiflow dựa trên một số công nghệ cốt lõi, bao gồm:
- Netflow: Một giao thức xuất phát từ Cisco, cho phép các thiết bị mạng gửi các gói tin lưu lượng mạng đến một bộ thu tập.
- Elasticsearch: Một cơ sở dữ liệu NoSQL phân tán, được sử dụng để lưu trữ và phân tích dữ liệu lưu lượng mạng.
- Kibana: Một công cụ trực quan hóa dữ liệu, cho phép người dùng tạo các bảng điều khiển tùy chỉnh để hiển thị dữ liệu thu thập được từ Elasticsearch.
3. So sánh với các giải pháp tương tự.
Elastiflow có nhiều điểm tương đồng với các giải pháp giám sát lưu lượng mạng khác như sFlow, IPFIX, và các công cụ thương mại như Cisco NetFlow Analyzer. Tuy nhiên, Elastiflow nổi bật với tính linh hoạt, khả năng mở rộng và cộng đồng người dùng lớn.
4. Các lưu ý.
- Cài đặt và cấu hình: Việc cài đặt và cấu hình Elastiflow có thể phức tạp đối với người mới bắt đầu. Tuy nhiên, có rất nhiều tài liệu và hướng dẫn trực tuyến có sẵn.
- Hiệu suất: Elastiflow có thể tạo ra một lượng lớn dữ liệu. Để đảm bảo hiệu suất, cần cấu hình hệ thống phần cứng phù hợp và tối ưu hóa các tham số của Elasticsearch.
- Bảo mật: Khi thu thập và lưu trữ dữ liệu lưu lượng mạng, cần chú ý đến các vấn đề bảo mật. Đảm bảo rằng dữ liệu được mã hóa và chỉ những người có quyền hạn mới có thể truy cập.
5. Ví dụ triển khai.
5.1. Sơ đồ.
Một ví dụ điển hình về việc sử dụng Elastiflow là để xác định các ứng dụng đang tiêu thụ nhiều băng thông nhất trên mạng của một công ty. Bằng cách phân tích dữ liệu lưu lượng mạng, Elastiflow có thể tạo ra các biểu đồ và bảng thống kê chi tiết, giúp các quản trị viên mạng xác định các ứng dụng cần tối ưu hóa hoặc chặn.
Sơ đồ mạng này mô tả một mạng nội bộ điển hình, kết nối các máy tính cá nhân (PC) với một farm server thông qua các thiết bị mạng như firewall, core switch, access switch. Điểm nhấn chính của sơ đồ là việc sử dụng công cụ Elastiflow để thu thập và phân tích dữ liệu lưu lượng mạng.
5.2. Các thành phần chính và chức năng.
- Client: Đại diện cho các máy tính cá nhân của người dùng, nơi phát sinh các yêu cầu truy cập mạng.
- Firewall: Thiết bị bảo mật, có chức năng lọc và kiểm soát lưu lượng đi vào và đi ra khỏi mạng nội bộ, bảo vệ mạng khỏi các cuộc tấn công từ bên ngoài.
- Core Switch: Là trung tâm của mạng, kết nối các thiết bị mạng khác với nhau, đảm bảo việc chuyển tiếp dữ liệu giữa các thiết bị diễn ra một cách hiệu quả.
- Access Switch: Kết nối các máy tính cá nhân với core switch, cung cấp khả năng truy cập mạng cho các máy tính này.
- Server Farm: Nơi chứa các máy chủ phục vụ cho các dịch vụ khác nhau như web server, database server, mail server,…
- Elastiflow: Một công cụ mã nguồn mở, được sử dụng để thu thập, phân tích và trực quan hóa dữ liệu lưu lượng mạng. Nó kết hợp với bộ công cụ ELK (Elasticsearch, Logstash, Kibana) để cung cấp một giải pháp mạnh mẽ cho việc giám sát và phân tích mạng.
5.3. Cách thức hoạt động.
- Thu thập dữ liệu: Các thiết bị mạng (như core switch và access switch) sẽ gửi dữ liệu lưu lượng mạng (gói tin) đến Elastiflow.
- Phân tích dữ liệu: Elastiflow nhận dữ liệu, tiến hành phân tích và trích xuất các thông tin hữu ích như: địa chỉ IP nguồn và đích, cổng, giao thức, dung lượng dữ liệu,…
- Lưu trữ dữ liệu: Dữ liệu được phân tích sẽ được lưu trữ vào Elasticsearch, một cơ sở dữ liệu NoSQL, cho phép lưu trữ và tìm kiếm dữ liệu một cách linh hoạt.
- Trực quan hóa: Kibana, một công cụ trực quan hóa, sẽ sử dụng dữ liệu từ Elasticsearch để tạo ra các biểu đồ, bảng thống kê, giúp người quản trị mạng dễ dàng theo dõi và phân tích tình trạng của mạng.
5.4. Vai trò của Elastiflow.
- Giám sát lưu lượng mạng: Theo dõi các hoạt động trên mạng, phát hiện các bất thường và các vấn đề tiềm ẩn.
- Phân tích hiệu suất: Đánh giá hiệu suất của mạng, xác định các bottleneck và các ứng dụng tiêu thụ nhiều băng thông.
- Bảo mật: Phát hiện các hoạt động đáng ngờ, các cuộc tấn công và các mối đe dọa khác.
- Quản lý dung lượng: Dự báo và quản lý dung lượng mạng, đảm bảo mạng hoạt động ổn định và hiệu quả.
5.5. Ứng dụng thực tế.
Elastiflow có thể được sử dụng trong nhiều môi trường khác nhau, từ các mạng nhỏ đến các mạng doanh nghiệp lớn. Một số ứng dụng điển hình bao gồm:
- Xác định các ứng dụng tiêu thụ nhiều băng thông: Giúp tối ưu hóa việc sử dụng băng thông và giảm chi phí.
- Phát hiện các cuộc tấn công: Phân tích hành vi của người dùng và phát hiện các hoạt động bất thường có thể báo hiệu một cuộc tấn công.
- Giám sát hiệu suất của các ứng dụng: Đảm bảo các ứng dụng hoạt động ổn định và đáp ứng nhu cầu của người dùng.
- Phân tích xu hướng sử dụng mạng: Dự đoán nhu cầu sử dụng mạng trong tương lai và lên kế hoạch mở rộng mạng.
5.6. Quy trình cấu hình.
5.6.1. Clone dự án về server và triển khai nó.
Đầu tiên bạn hãy di chuyển đến thư mục sẽ clone dự án về.
cd /home/
Clone dự án.
git clone https://github.com/hoanghd164/elastiflow
Di chuyển vào thư mục chính của dự án.
cd /home/elastiflow
Tạo thư mục mount cho elastiflow-elasticsearch và phân quyền cho nó.
mkdir /var/lib/elastiflow_es
chown -R 1000:1000 /var/lib/elastiflow_es
Tham khảo file docker-compose.yml
trong dự án.
version: '3'
services:
elastiflow-elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.1
container_name: elastiflow-elasticsearch
restart: 'no'
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 131072
hard: 131072
nproc: 8192
fsize: -1
network_mode: host
volumes:
- /var/lib/elastiflow_es:/usr/share/elasticsearch/data
environment:
ES_JAVA_OPTS: '-Xms4g -Xmx4g'
cluster.name: elastiflow
bootstrap.memory_lock: 'true'
network.host: 0.0.0.0
http.port: 9200
discovery.type: 'single-node'
indices.query.bool.max_clause_count: 8192
search.max_buckets: 250000
action.destructive_requires_name: 'true'
elastiflow-kibana:
image: docker.elastic.co/kibana/kibana:7.8.1
container_name: elastiflow-kibana
restart: 'no'
depends_on:
- elastiflow-elasticsearch
network_mode: host
environment:
SERVER_HOST: 0.0.0.0
SERVER_PORT: 5601
SERVER_MAXPAYLOADBYTES: 8388608
ELASTICSEARCH_HOSTS: "http://127.0.0.1:9200"
ELASTICSEARCH_REQUESTTIMEOUT: 132000
ELASTICSEARCH_SHARDTIMEOUT: 120000
KIBANA_DEFAULTAPPID: "dashboard/653cf1e0-2fd2-11e7-99ed-49759aed30f5"
KIBANA_AUTOCOMPLETETIMEOUT: 3000
KIBANA_AUTOCOMPLETETERMINATEAFTER: 2500000
LOGGING_DEST: stdout
LOGGING_QUIET: 'false'
elastiflow-logstash:
image: robcowart/elastiflow-logstash:4.0.1
container_name: elastiflow-logstash
restart: 'no'
depends_on:
- elastiflow-elasticsearch
network_mode: host
environment:
LS_JAVA_OPTS: '-Xms4g -Xmx4g'
# ElastiFlow global configuration
ELASTIFLOW_AGENT_ID: elastiflow
ELASTIFLOW_GEOIP_CACHE_SIZE: 16384
ELASTIFLOW_GEOIP_LOOKUP: 'true'
ELASTIFLOW_ASN_LOOKUP: 'true'
ELASTIFLOW_OUI_LOOKUP: 'false'
ELASTIFLOW_POPULATE_LOGS: 'true'
ELASTIFLOW_KEEP_ORIG_DATA: 'true'
ELASTIFLOW_DEFAULT_APPID_SRCTYPE: '__UNKNOWN'
# Name resolution option
ELASTIFLOW_RESOLVE_IP2HOST: 'false'
ELASTIFLOW_NAMESERVER: '127.0.0.1'
ELASTIFLOW_DNS_HIT_CACHE_SIZE: 25000
ELASTIFLOW_DNS_HIT_CACHE_TTL: 900
ELASTIFLOW_DNS_FAILED_CACHE_SIZE: 75000
ELASTIFLOW_DNS_FAILED_CACHE_TTL: 3600
ELASTIFLOW_ES_HOST: '127.0.0.1:9200'
#ELASTIFLOW_ES_USER: 'elastic'
#ELASTIFLOW_ES_PASSWD: 'changeme'
ELASTIFLOW_NETFLOW_IPV4_PORT: 2055
ELASTIFLOW_NETFLOW_UDP_WORKERS: 2
ELASTIFLOW_NETFLOW_UDP_QUEUE_SIZE: 4096
ELASTIFLOW_NETFLOW_UDP_RCV_BUFF: 33554432
ELASTIFLOW_SFLOW_IPV4_PORT: 6343
ELASTIFLOW_SFLOW_UDP_WORKERS: 2
ELASTIFLOW_SFLOW_UDP_QUEUE_SIZE: 4096
ELASTIFLOW_SFLOW_UDP_RCV_BUFF: 33554432
ELASTIFLOW_IPFIX_UDP_IPV4_PORT: 4739
ELASTIFLOW_IPFIX_UDP_WORKERS: 2
ELASTIFLOW_IPFIX_UDP_QUEUE_SIZE: 4096
ELASTIFLOW_IPFIX_UDP_RCV_BUFF: 33554432
Nếu để mặc định như vậy, bạn cũng có thể chạy được rồi, hãy sử dụng lệnh docker-compose up -d
dể chạy stack này.
Và dưới đây là kết quả nếu bạn chạy thành công.
shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a7e1340679b robcowart/elastiflow-logstash:4.0.1 "/usr/local/bin/dock…" 47 hours ago Up 46 hours elastiflow-logstash
b0c9ab35cd9a docker.elastic.co/kibana/kibana:7.8.1 "/usr/local/bin/dumb…" 47 hours ago Up 44 hours elastiflow-kibana
3cdd9eeed46c docker.elastic.co/elasticsearch/elasticsearch:7.8.1 "/tini -- /usr/local…" 47 hours ago Up 46 hours elastiflow-elasticsearch
5.6.2. Cấu hình NetFlow và IPFix trên thiết bị Cisco.
Ví dụ của mình sử dụng Cisco 3850 để thu thập và xuất các thông tin về lưu lượng mạng đi qua thiết bị mạng của bạn. Dữ liệu này sẽ được gửi đến một thiết bị khác (ở đây là 192.168.100.253) để phân tích và giám sát.
- Các thành phần chính trong cấu hình.
- Flow Record (NF_RECORD_IN):
- Mô tả: Đây là một bản ghi xác định những thông tin cụ thể mà bạn muốn thu thập về mỗi luồng mạng.
- Thông tin thu thập: Bản ghi này sẽ thu thập các thông tin như địa chỉ IP nguồn, đích, protocol, số gói tin, thời gian bắt đầu và kết thúc của mỗi luồng, v.v.
- Mục đích: Giúp bạn hiểu rõ hơn về loại lưu lượng nào đang đi qua mạng, từ đâu đến và đến đâu.
- Flow Exporter (NF_FLOW_EXPORTER):
- Flow Record (NF_RECORD_IN):
- Mô tả: Đóng vai trò là người gửi dữ liệu. Nó xác định địa chỉ IP và cổng mà dữ liệu thu thập được sẽ được gửi đến.
- Địa chỉ đích: 192.168.100.253 là địa chỉ IP của thiết bị sẽ thu thập dữ liệu NetFlow.
- Mục đích: Gửi dữ liệu NetFlow đến một nơi tập trung để phân tích.
- Flow Monitor (NF_RECORD_IN_FLOW_MONITOR):
- Mô tả: Đóng vai trò là người giám sát kết nối bản ghi (flow record) với người gửi (flow exporter).
- Chức năng: Nó xác định các luồng mạng nào sẽ được theo dõi và gửi dữ liệu đi.
- Cài đặt thời gian: Các thông số về thời gian (cache timeout) giúp xác định thời gian lưu trữ thông tin trong bộ nhớ đệm trước khi được gửi đi hoặc xóa bỏ.
Cấu hình Flexible NetFlow cho hướng input.
flow record NF_RECORD_IN
description Input NetFlow Record
match ipv4 tos
match ipv4 ttl
match ipv4 protocol
match ipv4 source address
match ipv4 destination address
match transport source-port
match transport destination-port
match interface input
match flow direction
collect interface output
collect counter bytes long
collect counter packets long
collect timestamp absolute first
collect timestamp absolute last
collect transport tcp flags
flow exporter NF_FLOW_EXPORTER
description Flow Exporter to UDP duplicator
destination 192.168.100.253
source Vlan100
transport udp 2055
option interface-table timeout 15
flow monitor NF_RECORD_IN_FLOW_MONITOR
exporter NF_FLOW_EXPORTER
cache timeout inactive 1
cache timeout active 1
cache timeout update 1
record NF_RECORD_IN
Cấu hình IPFIX cho hướng output.
flow record IPFIX_RECORD_OUT
description Output IPFIX Record
match ipv4 tos
match ipv4 ttl
match ipv4 protocol
match ipv4 source address
match ipv4 destination address
match transport source-port
match transport destination-port
match interface output
match flow direction
collect counter bytes long
collect counter packets long
collect timestamp absolute first
collect timestamp absolute last
collect transport tcp flags
flow exporter IPFIX_FLOW_EXPORTER
description Flow Exporter to IPFIX collector
destination 192.168.100.253
source Vlan100
transport udp 4739
option interface-table timeout 15
flow monitor IPFIX_RECORD_OUT_FLOW_MONITOR
exporter IPFIX_FLOW_EXPORTER
cache timeout inactive 1
cache timeout active 1
cache timeout update 1
record IPFIX_RECORD_OUT
Áp dụng Flow Monitor vào interface Port-channel128.
interface Port-channel128
description Connect to Fortigate 200E
no switchport
ip flow monitor NF_RECORD_IN_FLOW_MONITOR input
ip flow monitor IPFIX_RECORD_OUT_FLOW_MONITOR output
ip address 192.168.123.2 255.255.255.252
5.6.3. Cài đặt thời gian.
Đối với Cisco 3850.
Để cấu hình múi giờ UTC+7 trên thiết bị Cisco, bạn cần thay đổi múi giờ và sau đó đặt lại thời gian hệ thống cho đúng với múi giờ này.
Bước 1: Cấu hình múi giờ.
Truy cập chế độ cấu hình toàn cục và cấu hình múi giờ.
configure terminal
clock timezone UTC +7 0
end
Bước 2: Đặt thời gian.
Sau khi cấu hình múi giờ, bạn có thể đặt lại thời gian hệ thống. Lưu ý rằng thời gian bạn đặt phải tương ứng với múi giờ đã cấu hình. Ví dụ, nếu bạn đặt thời gian 20:10:30 ngày 12 tháng 6 năm 2023 cho múi giờ UTC+7, bạn làm như sau:
clock set 20:10:30 12 Jun 2023
Tổng hợp các lệnh.
Dưới đây là tổng hợp các lệnh bạn cần thực hiện để cấu hình múi giờ và đặt thời gian:
configure terminal
clock timezone UTC +7 0
end
clock set 20:10:30 12 Jun 2023
Sau khi thực hiện các lệnh này, thiết bị Cisco của bạn sẽ được cấu hình với múi giờ UTC+7 và thời gian hệ thống sẽ được đặt tương ứng.
Đối với ELK.
Lưu ý định dạng thời gian nhé, stack đang chạy chuẩn với định dạng thời gian ISO8601. Định dạng YYYY-MM-DDTHH:mm:ss.SSSZ
là một định dạng thời gian của ISO8601 và thường được sử dụng trong các hệ thống để đảm bảo tính nhất quán và dễ dàng phân tích thời gian.
MMM D, YYYY @ HH:mm:ss.SSS
Ý nghĩa các thành phần như sau:
YYYY
: Năm (4 chữ số)MM
: Tháng (2 chữ số)DD
: Ngày (2 chữ số)T
: Ký tự phân cách giữa ngày và giờHH
: Giờ (2 chữ số, định dạng 24 giờ)mm
: Phút (2 chữ số)ss
: Giây (2 chữ số)SSS
: Phần nghìn giây (3 chữ số)Z
: Ký hiệu múi giờ UTC (Z là viết tắt của Zulu time, tức là UTC)
Ví dụ, một thời gian theo định dạng này có thể là: 2023-10-05T14:48:00.000Z
.
Sau khi chạy stack và cấu hình xong NetFlow trên CoreSW thì bạn hãy vào Kibaba với url http://192.168.100.253:5601
.
6. Cấu hình trên Kibana.
Hãy thêm Index patterns với regex là là elastiflow-* để lấy tất cả các index của elastiflow mà Logstash đã output vào Elasticsearch.
Kết quả, nhớ chọn filter là @timestamp nhé.
Và bạn có thể vào Index Management để xác minh index đã sẵn sàng.
7. Dashboard tham khảo.
Dưới đây là danh sách các dashboard bạn có thể sử dụng trong stack này.
Logs.
Logs filter.
SIEM.
Overview
Top-N
Flows.
Geo IP.
AS Traffic
Traffic Details.
Flow Records.
8. Tổng kết.
Elastiflow là một công cụ mạnh mẽ và linh hoạt cho việc giám sát lưu lượng mạng. Nó cung cấp một cái nhìn sâu sắc về hoạt động của mạng, giúp các quản trị viên mạng phát hiện và giải quyết các vấn đề một cách hiệu quả. Nếu bạn đang tìm kiếm một giải pháp mở rộng và tùy biến cao để giám sát lưu lượng mạng, Elastiflow là một lựa chọn đáng cân nhắc.