Thursday, November 21, 2024

Giải pháp giám sát lưu lượng mạng hiệu quả với Elastiflow

-

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):
  • 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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories