Lê Gia Hoàng Thiện
Intern
1. Giới thiệu các thành phần chính
- Wazuh Manager (và Wazuh Agent): Wazuh là một nền tảng SIEM/XDR mã nguồn mở. Wazuh Agent (cài trên các máy chủ, thiết bị đầu cuối) có khả năng thu thập nhiều loại log và sự kiện bảo mật, rồi gửi về Wazuh Manager để phân tích và phát hiện mối đe dọa. Kiến trúc Wazuh truyền thống bao gồm Wazuh Agent, Wazuh Manager (server), một hệ thống lưu trữ chỉ mục (indexer) và giao diện dashboard để hiển thị cảnh báo.
- Fluentd: Fluentd là một hệ thống thu thập và tập trung log mã nguồn mở, được thiết kế để hợp nhất log từ nhiều nguồn khác nhau. Trong mô hình này, Fluentd đóng vai trò trung gian, nhận log/alert từ Wazuh Manager và xử lý, định dạng lại dữ liệu trước khi đẩy sang nơi lưu trữ cuối. Wazuh có tích hợp sẵn Fluentd forwarder module cho phép chuyển tiếp sự kiện (alert) sang máy chủ Fluentd một cách trực tiếp.
- OpenSearch: OpenSearch là một nền tảng tìm kiếm và phân tích dữ liệu phân tán, 100% mã nguồn mở (fork từ Elasticsearch). OpenSearch được sử dụng làm kho lưu trữ và truy vấn log quy mô lớn, cho phép tìm kiếm thời gian thực, phân tích và trực quan hóa dữ liệu log hiệu quả (thông qua giao diện như OpenSearch Dashboards). Trong kiến trúc này, OpenSearch tiếp nhận log đã được Fluentd xử lý, lưu trữ chúng thành các chỉ mục và cung cấp khả năng query cũng như xây dựng dashboard trực quan.
2. Vai trò của từng thành phần trong quy trình
Quy trình quản lý log trong mô hình tích hợp diễn ra theo các bước tuần tự qua ba thành phần chính:- Thu thập log (Wazuh Agent & Manager): Wazuh Agent trên các máy chủ và thiết bị được giám sát liên tục thu thập nhật ký hệ thống, sự kiện bảo mật, thông tin thay đổi file... và gửi chúng về Wazuh Manager. Tại Wazuh Manager, dữ liệu log được phân tích bởi engine của Wazuh nhằm phát hiện sự kiện bất thường, và các cảnh báo bảo mật (alerts) sẽ được tạo ra dựa trên luật đã định nghĩa. Wazuh Manager sau đó lưu các alert này vào file JSON nội bộ, đồng thời chuyển tiếp chúng sang Fluentd thông qua module forwarder tích hợp. Việc tận dụng Wazuh ở bước đầu giúp thu thập đầy đủ và tiền xử lý các log/sự kiện từ mọi endpoint một cách tập trung.
- Xử lý trung gian (Fluentd): Fluentd đóng vai trò làm trạm trung chuyển thông minh. Fluentd nhận luồng dữ liệu log/alert do Wazuh Manager gửi tới (qua giao thức forward), sau đó tiến hành các bước xử lý cần thiết như gán thẻ (tag), parse và định dạng lại log theo cấu trúc thống nhất (ví dụ JSON), lọc bỏ những trường không cần thiết, hoặc g enrichment nếu cần. Nhờ khả năng tùy biến cao của Fluentd, doanh nghiệp có thể chuẩn hóa log từ Wazuh cũng như hợp nhất thêm log từ các nguồn khác vào cùng pipeline một cách dễ dàng. Sau khi xử lý, Fluentd sử dụng plugin output tương ứng (ở đây là plugin out_opensearch) để đẩy dữ liệu sang OpenSearch bằng cơ chế ghi theo lô (bulk) rất hiệu quả. Việc tách biệt bước xử lý trung gian qua Fluentd giúp hệ thống linh hoạt hơn: có thể chỉnh sửa định dạng log, bổ sung thông tin, và đảm bảo dữ liệu đầu vào OpenSearch đã được tối ưu.
- Lưu trữ và truy vấn (OpenSearch): OpenSearch nhận dữ liệu log từ Fluentd và lưu trữ dưới dạng các chỉ mục (index). Nhờ khả năng scale-out của OpenSearch, khối lượng log lớn từ nhiều nguồn có thể được lưu trữ phân tán trên cụm máy chủ tìm kiếm một cách hiệu quả. OpenSearch cho phép truy vấn và phân tích log gần như thời gian thực bằng ngôn ngữ truy vấn mạnh mẽ, đồng thời tích hợp với các công cụ trực quan (như OpenSearch Dashboards hoặc Kibana fork) để tạo biểu đồ, dashboard phục vụ theo dõi và phân tích log. Toàn bộ log và alert bảo mật được tập trung tại OpenSearch giúp đội ngũ vận hành dễ dàng tra cứu sự kiện, xây dựng báo cáo, và phát hiện xu hướng trong dữ liệu log. Như vậy, OpenSearch đảm nhiệm vai trò kho dữ liệu SIEM trung tâm, nơi mà thông tin từ Wazuh (và các hệ thống khác) hội tụ để phục vụ nhu cầu giám sát và phản ứng nhanh.
3, Lợi ích của việc tích hợp Wazuh – Fluentd – OpenSearch
Mô hình kết hợp ba thành phần này mang lại nhiều lợi ích đáng kể cho hoạt động quản trị log và an ninh hệ thống:- Mở rộng quy mô linh hoạt: Kiến trúc được phân tầng rõ ràng giúp hệ thống dễ dàng mở rộng khi nhu cầu tăng. Các thành phần có thể scale độc lập: ví dụ, có thể triển khai nhiều Wazuh Agent/Manager cho các cụm máy khác nhau, thêm node Fluentd để chịu tải log lớn, hoặc mở rộng cụm OpenSearch khi dung lượng dữ liệu tăng. Nhờ Fluentd làm tầng đệm, việc ghi log vào OpenSearch được thực hiện theo lô tối ưu (bulk), giảm tải cho OpenSearch và tăng thông lượng. Kết quả là hệ thống xử lý được khối lượng log lớn một cách hiệu quả mà vẫn duy trì hiệu năng truy vấn tốt.
- Kiểm soát tập trung và linh hoạt: Wazuh cung cấp một điểm kiểm soát tập trung cho việc thu thập log trên toàn bộ hệ thống (từ máy chủ, endpoint đến thiết bị mạng), giúp người quản trị dễ dàng áp dụng chính sách chung và theo dõi mọi sự kiện bảo mật tại một nơi. Đồng thời, Fluentd cho phép hợp nhất nhiều luồng log khác nhau về chung định dạng và đẩy vào một kho lưu trữ duy nhất, tránh tình trạng phân mảnh dữ liệu log. Người quản trị có thể linh hoạt tùy chỉnh pipeline (thêm bớt parser, filter) mà không ảnh hưởng đến Wazuh hay OpenSearch. Tất cả log được tập trung giúp việc quản lý, đối chiếu và correlate giữa các sự kiện từ nhiều nguồn trở nên thuận tiện hơn.
- Trực quan hóa dữ liệu log hiệu quả: Khi log và dữ liệu sự kiện an ninh đã nằm trong OpenSearch, đội ngũ vận hành có thể khai thác tối đa năng lực phân tích và trực quan hóa. OpenSearch cho phép tạo các dashboard tùy biến hiển thị số lượng sự kiện, xu hướng theo thời gian, top sự cố bảo mật, v.v., hỗ trợ phát hiện nhanh các bất thường. Nhờ tích hợp Wazuh, các alert quan trọng được đưa vào hệ thống dashboard để giám sát real-time. Việc có một cái nhìn tập trung, trực quan trên dữ liệu log toàn hệ thống giúp ra quyết định nhanh chóng trong vận hành CNTT và ứng phó sự cố an ninh. Đặc biệt, giải pháp hoàn toàn mã nguồn mở nên các nhóm có thể tùy ý mở rộng tính năng trực quan hóa mà không lo chi phí bản quyền.
4. Kiến trúc tổng thể của giải pháp tích hợp
Mô hình kiến trúc tích hợp Wazuh – Fluentd – OpenSearch. Wazuh Agent trên các endpoint thu thập log và gửi về Wazuh Manager (Server) để phân tích, tạo alert. Wazuh Manager sau đó sử dụng mô-đun forwarder Fluentd để chuyển tiếp các alert dưới dạng JSON sang máy chủ Fluentd. Fluentd đóng vai trò bộ tập trung log, xử lý và định dạng lại dữ liệu, rồi đẩy log theo lô vào cụm OpenSearch thông qua plugin tương ứng. OpenSearch lưu trữ tập trung toàn bộ log đã được index, cho phép thực hiện truy vấn và xây dựng dashboard trực quan phục vụ giám sát.
Trong kiến trúc trên, các thành phần được kết nối theo luồng dữ liệu một chiều từ thu thập đến lưu trữ. Wazuh Manager triển khai mô-đun Fluentd forwarder (cấu hình trong file ossec.conf) để gửi log/alert đến Fluentd server thông qua giao thức Forward nội bộ của Fluentd. Fluentd thường lắng nghe trên cổng 24224 và 24225 (hoặc qua socket UNIX) để nhận dữ liệu từ Wazuh, sau đó áp dụng các filter/format và sử dụng output plugin OpenSearch (được cung cấp sẵn trong Fluentd) để ghi dữ liệu vào OpenSearch. OpenSearch có thể được triển khai phân cụm, sẵn sàng nhận dữ liệu qua cổng 9200 (giao thức HTTP(S)). Người quản trị có thể truy cập OpenSearch Dashboards (hoặc Kibana tương đương) để xem và tương tác với dữ liệu log đã thu thập. Toàn bộ quá trình từ lúc log phát sinh ở endpoint cho đến khi hiển thị trên dashboard đều được tự động hóa, đảm bảo dòng chảy dữ liệu mượt mà và nhất quán.
Điểm đáng chú ý là kiến trúc này tách biệt rõ vai trò của từng lớp: lớp thu thập/dò tìm (Wazuh) tách khỏi lớp xử lý log (Fluentd) và lớp lưu trữ/phân tích (OpenSearch). Nhờ đó, việc bảo trì hay thay thế một thành phần (vd. thay Fluentd bằng Logstash) sẽ không ảnh hưởng lớn đến các thành phần khác. Đồng thời, tận dụng Wazuh server integration (đẩy log trực tiếp từ server) giúp loại bỏ nhu cầu phải vận hành cụm Wazuh indexer riêng, tiết kiệm tài nguyên cho hệ thống lớn. Kiến trúc tổng thể này phù hợp với mô hình triển khai hiện đại, nơi dữ liệu log được coi là dòng chảy liên tục qua các dịch vụ chuyên trách trước khi vào “hồ dữ liệu” trung tâm.
5. Mô hình triển khai ban đầu.

6. Các bước triển khai.
6.1. Triển khai trên server
- Triển khai wazuh manager- Thay đổi file config
- Cài đặt wazuh managernodes:
server:
- name: manager
ip: "10.30.192.34"
- Triển khai hạ tầng fluentd và opensearchbash wazuh-install.sh --generate-config-files
bash wazuh-install.sh --wazuh-server manager
version: "3.9"
services:
opensearch-node1:
image: opensearchproject/opensearch:3
container_name: opensearch-node1
environment:
cluster.name: opensearch-cluster
node.name: opensearch-node1
discovery.seed_hosts: opensearch-node1,opensearch-node2
cluster.initial_cluster_manager_nodes: opensearch-node1,opensearch-node2
bootstrap.memory_lock: "true"
OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
OPENSEARCH_INITIAL_ADMIN_PASSWORD: Thien@123
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- opensearch-data1:/usr/share/opensearch/data
networks:
- opensearch-net
ports:
- "9200:9200"
- "9600:9600"
opensearch-node2:
image: opensearchproject/opensearch:3
container_name: opensearch-node2
environment:
cluster.name: opensearch-cluster
node.name: opensearch-node2
discovery.seed_hosts: opensearch-node1,opensearch-node2
cluster.initial_cluster_manager_nodes: opensearch-node1,opensearch-node2
bootstrap.memory_lock: "true"
OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
OPENSEARCH_INITIAL_ADMIN_PASSWORD: Thien@123
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- opensearch-data2:/usr/share/opensearch/data
networks:
- opensearch-net
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:3
container_name: opensearch-dashboards
depends_on:
- opensearch-node1
- opensearch-node2
environment:
OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]'
networks:
- opensearch-net
ports:
- "5601:5601"
expose:
- "5601"
fluentd:
image: fluentd:latest
container_name: fluentd
user: root
networks:
- opensearch-net
environment:
FLUENTD_CONF: fluent.conf
LINUX_AGENT_IDS: "002,003"
LINUX_AGENT_NAMES: "wazuhagent,wazuhgent10_30_192_35"
volumes:
- ./fluent.conf:/fluentd/etc/fluent.conf:ro
- /var/ossec/logs/archives:/var/ossec/logs/archives:ro
- ./fluentd/buffer:/var/log/td-agent/buffer
- ./fluentd/pos:/var/log/td-agent/pos\
- /var/webtravel-logs:/var/webtravel-logs:ro
ports:
- "24224:24224"
- "24225:24225"
- "24224:24224/udp"
- "24225:24225/udp"
expose:
- "24224"
- "24225"
command: >
sh -c "
gem install fluent-plugin-record-modifier &&
gem install fluent-plugin-opensearch &&
gem install fluent-plugin-rewrite-tag-filter &&
fluentd -c /fluentd/etc/fluent.conf
"
volumes:
opensearch-data1:
opensearch-data2:
networks:
opensearch-net:
6.2. Cài đặt agent linux.
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && chmod 644 /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee -a /etc/apt/sources.list.d/wazuh.list
apt-get update
WAZUH_MANAGER="10.30.192.34" apt-get install wazuh-agent
systemctl daemon-reload
systemctl enable wazuh-agent
systemctl start wazuh-agent
6.3. Cài đặt agent windows
wazuh-agent-4.12.0-1.msi /q WAZUH_MANAGER="10.30.192.34"
NET START Wazuh
6.4. Kiểm tra agent, kiểm tra group và add agent vào group
cd /var/ossec/bin/


6.5. Triển khai tường lửa Pfsense ( cài đặt kết nối đến fluentd )

Chọn remote logging cho phép gửi dữ liệu qua port 24224
6.6. Triển khai website trên dockercompose lấy dữ liệu trên các container
version: "3.8"
services:
server:
image: legiahoangthien/webtravel-backend:latest
restart: always
environment:
- ENV=${ENV}
- JWT_SECRET=${JWT_SECRET}
- JWT_ACCESS_TOKEN_EXPIRATION=${JWT_ACCESS_TOKEN_EXPIRATION}
- MONGO_URL=${MONGO_URL}
- URL_FRONTEND=${URL_FRONTEND}
- URL_BACKEND=${URL_BACKEND}
- PORT=${PORT}
- TOGETHER_API_KEY=${TOGETHER_API_KEY}
ports:
- "4000:4000"
labels:
- service=travel-server
logging:
driver: fluentd
options:
# Nếu Fluentd publish ra host
fluentd-address: "10.30.192.34:24225"
# Nếu dùng chung network với Fluentd thì đổi thành "fluentd:24224"
tag: "travel-server.{{.Name}}.{{.ID}}"
labels: "service"
env: "ENV"
client:
image: legiahoangthien/webtravel-frontend:latest
restart: always
environment:
- ENV=${ENV}
- NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}
- HOST=${HOST}
depends_on:
- server
ports:
- "3000:3000"
labels:
- service=travel-client
logging:
driver: fluentd
options:
fluentd-address: "10.30.192.34:24225"
tag: "travel-client.{{.Name}}.{{.ID}}"
labels: "service"
env: "ENV"
6.7. File fluent.conf nhận dữ liệu và gửi chúng đến opensearch
# =========================================================
# 1) WAZUH ARCHIVES.JSON --> OpenSearch (daily, tách WIN/LINUX/OTHERS)
# =========================================================
<source>
@type tail
@id in_wazuh_archives
path /var/ossec/logs/archives/archives.json
pos_file /var/log/td-agent/pos/wazuh-archives.pos
tag wazuh.archives
read_from_head true
<parse>
@type json
</parse>
</source>
# B1) Gắn field target_index dựa vào agent (WIN/LINUX/OTHERS)
<filter wazuh.archives>
@type record_transformer
enable_ruby true
<record>
target_index ${ g=(record['agent_groups']||'').to_s.downcase; aid=(record.dig('agent','id')||'').to_s; aname=(record.dig('agent','name')||'').to_s; aosplat=(record.dig('agent','os','platform')||'').to_s.downcase; has_win=(record.key?('win') || aosplat=='windows' || (aname =~ /\AWIN[-_]/i)); has_win=(has_win || ((record.dig('data','cmd')||'').to_s.include?(':\\'))); linux_ids=(ENV['LINUX_AGENT_IDS']||'').split(',').map{|x| x.strip}; linux_names=(ENV['LINUX_AGENT_NAMES']||'').split(',').map{|x| x.strip}; if (has_win || g.include?('windows-servers')) then 'wazuh_agent_win' elsif (g.include?('linux-servers') || linux_ids.include?(aid) || linux_names.include?(aname)) then 'wazuh_agent_linux' else 'wazuh_agent__others' end }
</record>
</filter>
# B2) Re-tag theo target_index -> tạo 3 tag riêng để route ra 3 output
# (yêu cầu plugin fluent-plugin-rewrite-tag-filter)
<match wazuh.archives>
@type rewrite_tag_filter
<rule>
key target_index
pattern ^wazuh_agent_win$
tag wazuh.archives.win
</rule>
<rule>
key target_index
pattern ^wazuh_agent_linux$
tag wazuh.archives.linux
</rule>
<rule>
key target_index
pattern ^wazuh_agent_others$
tag wazuh.archives.others
</rule>
# Fallback: nếu không khớp rule nào, giữ nguyên tag gốc để không làm mất log
</match>
# B3) Output cho Windows -> index: wazuh_agent_win-YYYY.MM.DD
<match wazuh.archives.win>
@type opensearch
@id out_os_wazuh_win
@log_level info
include_tag_key true
host opensearch-node1
port 9200
scheme https
ssl_verify false
ssl_version TLSv1_2
user admin
password Thien@123
logstash_format true
logstash_prefix wazuh_agent_win
include_timestamp true
time_key timestamp
time_key_format %Y-%m-%dT%H:%M:%S.%L%z
<buffer>
@type file
path /var/log/td-agent/buffer/wazuh_win
flush_mode interval
flush_interval 10s
chunk_limit_size 8M
total_limit_size 512M
retry_max_interval 30
retry_timeout 72h
retry_forever false
</buffer>
</match>
# B4) Output cho Linux -> index: wazuh_agent_linux-YYYY.MM.DD
<match wazuh.archives.linux>
@type opensearch
@id out_os_wazuh_linux
@log_level info
include_tag_key true
host opensearch-node1
port 9200
scheme https
ssl_verify false
ssl_version TLSv1_2
user admin
password Thien@123
logstash_format true
logstash_prefix wazuh_agent_linux
include_timestamp true
time_key timestamp
time_key_format %Y-%m-%dT%H:%M:%S.%L%z
<buffer>
@type file
path /var/log/td-agent/buffer/wazuh_linux
flush_mode interval
flush_interval 10s
chunk_limit_size 8M
total_limit_size 512M
retry_max_interval 30
retry_timeout 72h
retry_forever false
</buffer>
</match>
# B5) Output cho Others -> index: wazuh_agent_others-YYYY.MM.DD
<match wazuh.archives.others>
@type opensearch
@id out_os_wazuh_others
@log_level info
include_tag_key true
host opensearch-node1
port 9200
scheme https
ssl_verify false
ssl_version TLSv1_2
user admin
password Thien@123
logstash_format true
logstash_prefix wazuh_agent_others
include_timestamp true
time_key timestamp
time_key_format %Y-%m-%dT%H:%M:%S.%L%z
<buffer>
@type file
path /var/log/td-agent/buffer/wazuh_others
flush_mode interval
flush_interval 10s
chunk_limit_size 8M
total_limit_size 512M
retry_max_interval 30
retry_timeout 72h
retry_forever false
</buffer>
</match>
# (Tuỳ chọn) B6 Fallback nếu còn log giữ nguyên tag gốc
# -> đẩy tạm vào wazuh_agent_others để không mất log
<match wazuh.archives>
@type opensearch
@id out_os_wazuh_fallback
@log_level warn
include_tag_key true
host opensearch-node1
port 9200
scheme https
ssl_verify false
ssl_version TLSv1_2
user admin
password Thien@123
logstash_format true
logstash_prefix wazuh_agent_others
include_timestamp true
time_key timestamp
time_key_format %Y-%m-%dT%H:%M:%S.%L%z
<buffer>
@type file
path /var/log/td-agent/buffer/wazuh_fallback
flush_mode interval
flush_interval 10s
chunk_limit_size 8M
total_limit_size 256M
retry_max_interval 30
retry_timeout 24h
retry_forever false
</buffer>
</match>
# =========================================================
# 2) PFSENSE SYSLOG (UDP/24224) --> OpenSearch (daily)
# =========================================================
<source>
@type syslog
@id in_pfsense_syslog
bind 0.0.0.0
port 24224
protocol_type udp # dùng tham số này (không dùng 'transport')
message_length_limit 4096
tag pfsense.syslog
resolve_hostname false
</source>
# Thêm field dễ đọc
<filter pfsense.syslog**>
@type record_transformer
enable_ruby true
<record>
program ${record['ident'] || record['program'] || ''}
</record>
</filter>
# Ghi debug + đẩy OpenSearch (pfsense-YYYY.MM.DD)
<match pfsense.syslog**>
@type copy
@id out_copy_pfsense
# a) File debug để kiểm tra pipeline
<store>
@type file
@id out_file_pfsense_debug
path /var/log/fluentd/pfsense.debug
<buffer>
flush_mode interval
flush_interval 5s
</buffer>
</store>
# b) OpenSearch (daily)
<store>
@type opensearch
@id out_os_pfsense_daily
@log_level info
include_tag_key true
host opensearch-node1
port 9200
scheme https
ssl_verify false
ssl_version TLSv1_2
user admin
password Thien@123
logstash_format true
logstash_prefix pfsense
include_timestamp true
<buffer>
@type file
path /var/log/td-agent/buffer/pfsense
flush_mode interval
flush_interval 10s
chunk_limit_size 8M
total_limit_size 512M
retry_max_interval 30
retry_timeout 72h
retry_forever false
</buffer>
</store>
</match>
# =========================================================
# 3) DOCKER CONTAINERS via logging driver 'fluentd'
# travel-client / travel-server --> OpenSearch (daily)
# =========================================================
<source>
@type forward
@id in_docker_forward
port 24225
bind 0.0.0.0
# enable_ack_response true
</source>
<filter **>
@type record_transformer
enable_ruby true
<record>
# Docker fluentd driver thường gửi các trường như:
# log, container_id, container_name, source, labels, env, …
host ${hostname}
service ${ (record.dig('labels','service') || record['container_name'] || 'unknown').to_s }
env ${ (record.dig('env','ENV') || 'prod').to_s }
</record>
</filter>
<match **>
@type opensearch
@id out_os_docker_forward
@log_level info
hosts https://opensearch-node1:9200,https://opensearch-node2:9200
scheme https
ssl_verify false
user admin
password Thien@123
include_tag_key true
tag_key docker_tag
logstash_format true
logstash_prefix_key service
logstash_prefix docker
include_timestamp true
reconnect_on_error true
reload_on_failure true
request_timeout 30s
<buffer>
@type file
path /var/log/td-agent/buffer/docker
flush_mode interval
flush_interval 5s
chunk_limit_size 8M
total_limit_size 512M
retry_type exponential_backoff
retry_max_interval 60
retry_timeout 72h
retry_forever false
</buffer>
</match>
6.8. Kiểm tra kết quả trả về




Đính kèm
Bài viết liên quan
Được quan tâm
Bài viết mới