# ELK 基礎部署 ## Docker 套件安裝 ### 本範例底層環境使用Rocky Linux 9.5 1. **安裝套件** ``` #sudo dnf update -y #sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 ``` 2. **加入官方源** ``` #sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ``` 3. **安裝Docker** ``` #sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` 4. **啟動並開機自起** ``` #sudo systemctl start docker #sudo systemctl enable docker ``` 5. **確認版本** ``` #docker --version ``` 6. **安裝Docker Compose** ``` #sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose ``` 7. **賦予Docker-Compose執行權限** ``` #sudo chmod +x /usr/local/bin/docker-compose ``` 8. **確認版本** ``` #docker-compose --version ``` 9. **建立資料夾** ``` #mkdir elk && cd elk ``` ## ELK Stack 部署(Docker Compose) **透過 docker-compose 快速部署 Elasticsearch + Logstash + Kibana(ELK)** ![image](https://hackmd.io/_uploads/S1oBCyjZlg.png) ### 一、**建立 docker-compose.yml** ``` version: '3.7' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.13.4 container_name: elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false ports: - "9200:9200" volumes: - esdata:/usr/share/elasticsearch/data logstash: image: docker.elastic.co/logstash/logstash:8.13.4 container_name: logstash volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf ports: - "5044:5044" - "9600:9600" kibana: image: docker.elastic.co/kibana/kibana:8.13.4 container_name: kibana environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - "5601:5601" dns: - 8.8.8.8 volumes: - ./kibana.yml:/usr/share/kibana/config/kibana.yml volumes: esdata: ``` ### 二、**建立 kibana.yml (選用)** 保持英文版本可不設定中文語言包,設定server.host以允許外部連線 ``` i18n.locale: "zh-CN" server.host: "0.0.0.0" ``` ### 三、**建立 logstash.conf** 建立 logstash.conf,接收來自 Filebeat 的資料並轉發至 Elasticsearch ``` input { beats { port => 5044 } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["http://elasticsearch:9200"] } } ``` ### 四、 **啟動docker-compose** ``` #docker compose up -d ``` ## **ELK 元件簡介與存取方式** ELK Stack 加上 Filebeat,可構成完整的日誌收集與分析流程。 以下為各元件的功能與對應存取方式: | 元件名稱 | 預設網址 / Port | 功能說明 | |------------------|-------------------------------------------|------------------------------------------------| | **Filebeat** | 無 Web 介面,預設送出至 Logstash `5044` | 輕量型 Agent,安裝在伺服器上負責收集並傳送日誌 | | **Logstash** | `Port 5044`(接收 Filebeat 傳送資料) | 資料處理與轉換,將日誌格式化後送至 Elasticsearch | | **Elasticsearch** | [http://localhost:9200](http://localhost:9200) | 搜索與儲存引擎,集中存放與查詢結構化後的日誌資料 | | **Kibana** | [http://localhost:5601](http://localhost:5601) | 圖形化介面,用來查詢與視覺化 Elasticsearch 中的資料 | > 🔄 **工作流程**: > `Filebeat → Logstash → Elasticsearch → Kibana` > 💡 **說明:** > - **Filebeat**:安裝於資料來源主機上,收集本地或雲端產生的日誌 > - **Logstash**:負責格式轉換、過濾與處理,讓資料結構化 > - **Elasticsearch**:集中儲存並支援全文搜尋 > - **Kibana**:Web 介面,可視覺化查詢 Elasticsearch 中的資料 ![image](https://hackmd.io/_uploads/r1Z414Eflg.png) # AWS CloudTrail 日誌收集 本範例將 AWS CloudTrail 的日誌收集、處理並導入到 ELK Stack 中,進行統一查詢與視覺化分析。 ## 🔍 說明 | 元件 | 功能說明 | |----------------|----------| | **CloudTrail** | 記錄 AWS API 呼叫事件(登入、資源建立、IAM 操作等) | | **S3 Bucket** | 儲存 CloudTrail 產生的 JSON 日誌檔案 | | **SQS Queue** | 每當有新日誌上傳至 S3 時通知 Filebeat | | **Filebeat** | 使用 AWS 模組,透過 SQS 輪詢 S3 並收取 CloudTrail 日誌 | | **Logstash** | 將日誌進行轉換處理,例如補全欄位、過濾雜訊 | | **Elasticsearch** | 儲存結構化後的日誌資料,支援快速查詢與索引 | | **Kibana** | 提供圖形介面查詢日誌、建立 Dashboard | ## CloudTrail 資源配置 ### 一、 **建立CloudTrail** 1. **至 AWS 控制台 --> CloudTrail --> 線索 --> 建立線索** ![image](https://hackmd.io/_uploads/SJXmA_BGgx.png) 2. **選擇日誌事件** ![image](https://hackmd.io/_uploads/SJwNxEEzeg.png) 3. **確認配置後 --> 建立線索** ![image](https://hackmd.io/_uploads/HJyrA_HGgx.png) ### 二、 **建立 SQS** 1. **至 AWS 控制台 --> SQS --> 佇列 --> 建立佇列** ![image](https://hackmd.io/_uploads/Sky_7E4Gee.png) 填寫名稱與修改Policy存取政策,其他功能可選用。 下拉至存取政策 --> 進階 修改為以下政策,配置完成後建立佇列。 ![image](https://hackmd.io/_uploads/B1l_0Orzxx.png) > 📌 此 Policy 為允許: > - S3 服務在新日誌上傳後,透過 SQS 通知 Filebeat 收集 > - 帳號擁有者對該 Queue 擁有完整操作權限 > > 請根據實際設定替換: > `<ACCOUNT_ID>`、`<REGION>`、`<QUEUE_NAME>`、`<S3_BUCKET_NAME>` ``` { "Version": "2012-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__owner_statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<ACCOUNT_ID>:root" }, "Action": "SQS:*", "Resource": "arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>" }, { "Sid": "AllowS3SendMessage", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::<S3_BUCKET_NAME>" } } } ] } ``` ![image](https://hackmd.io/_uploads/H1pnFVNzxx.png) ### 三、 **S3 配置** 1. **CloudTrail建立完成後會創建新的 S3 Bucket** ![image](https://hackmd.io/_uploads/HJMjZNNfex.png) 2. **進入該S3 Bucket 後,在屬性 --> 事件通知 --> 建立事件通知** ![image](https://hackmd.io/_uploads/ryOwzVNGeg.png) 3. **填寫事件名稱、在 **事件類型** 中勾選:** **✔ 所有物件建立事件(All object create events)** ![image](https://hackmd.io/_uploads/ByeCBVNMle.png) 4. **下滑設定,將目標傳送至 SQS,選擇剛剛建立的 SQS Queue ,儲存設定** ![image](https://hackmd.io/_uploads/rJkVtV4Gxl.png) ![image](https://hackmd.io/_uploads/rJJl54EGge.png) 以上即完成 AWS CloudTrail 日誌收集與傳送設定,接下來至ELK主機安裝Filebeat,接收來自CloudTrail的日誌資料。 ## 安裝Filebeat (RPM 版本) 1. **下載安裝檔** ``` #curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.13.4-x86_64.rpm ``` 2. **安裝Filebeat套件** ``` #sudo rpm -vi filebeat-8.13.4-x86_64.rpm ``` 3. **版本確認** ``` #filebeat version ``` 4. **編輯 filebeat aws 模組** ``` sudo vi /etc/filebeat/modules.d/aws.yml ``` 5. **在 filebeat aws 中新增以下信息** Filebeat 就會透過 SQS 知道有新檔案,自動去對應的 S3 Bucket 將 Log 傳送到 Elasticsearch。 ``` - module: aws cloudtrail: enabled: true var.queue_url: https://sqs.<REGION>.amazonaws.com/<ACCOUNT_ID>/<QUEUE_NAME> var.access_key_id: <YOUR_AWS_ACCESS_KEY> var.secret_access_key: <YOUR_AWS_SECRET_KEY> var.region_name: <REGION> var.visibility_timeout: 300 var.api_timeout: 120s ``` var.visibility_timeout 、 var.api_timeout 兩者可自定義時間 ![image](https://hackmd.io/_uploads/H1pPhNVMgx.png) 6. **編輯 Filebeat 設定檔** 啟用模組機制以載入模組設定檔(如 aws.yml、nginx.yml)來收集特定格式的 log,連接 Kibana 以自動建立 index pattern 與 dashboard,指定資料輸出到 Elasticsearch,以及設定 Filebeat 自身 log 的儲存位置與格式。 ``` #vi /etc/filebeat/filebeat.yml ``` ``` filebeat.modules: - path: ${path.config}/modules.d/*.yml reload.enabled: false setup.kibana: host: "http://localhost:5601" output.elasticsearch: hosts: ["http://localhost:9200"] username: "elastic" password: "changeme" # ⚠️ 請視你的 elastic 是否開啟 security 或為空 logging.level: info logging.to_files: true logging.files: path: /var/log/filebeat name: filebeat keepfiles: 7 permissions: 0644 ``` 7. **啟動 Filebeat** ``` #sudo filebeat modules enable aws #sudo systemctl enable filebeat #sudo systemctl start filebeat ``` 8. **將資料傳送到dashboards** ``` #sudo filebeat setup --dashboards ``` 9. **至 Web 介面中 Analytics --> Discover** 左上角下拉式選單選擇 **filebeat-*** 即可看到透過 Filebeat 導出的 CloudTrail Log。 ![image](https://hackmd.io/_uploads/Bk31WPHzxl.png) ![image](https://hackmd.io/_uploads/Byk9-PrMex.png) ## Kibana 基本應用 ### 一、Discover **本文以搜尋 AWS 中 ConsoleLogin 與 MFA驗證 事件為例** 1. **在左側選擇可用欄位** 觀察原始 Log 並篩選出需要的欄位以進行後續查詢。 ![image](https://hackmd.io/_uploads/HkvEH_Hzlg.png) 2. **欄位選擇範例**: ``` @timestamp user.name event.action event.outcome source.geo.country_name source.ip traefik.access.user_agent.name user_agent.device.name ``` 3. **查詢事件:ConsoleLogin 與 MFA 驗證** 在搜尋列輸入以下語法: ``` event.provider: "signin.amazonaws.com" and event.action: ("ConsoleLogin" or "CheckMfa") ``` ![image](https://hackmd.io/_uploads/SyY4V_BGlg.png) 4. **儲存查詢條件** 可將常用查詢條件命名儲存,方便快速呼叫。 ![image](https://hackmd.io/_uploads/rkCyKOrGgg.png) ![image](https://hackmd.io/_uploads/BkqZFOSzle.png) ### 二、Dashboards 1. **將 Discover 數據匯入 Dashboards** 使用欄位建立可視化圖表,例如:地理位置、使用者裝置等。 ![image](https://hackmd.io/_uploads/ByBjFuSGlx.png) 2. **選擇圖表類型** 根據欄位特性選擇適合的圖表:長條圖、圓餅圖、地圖等。 ![image](https://hackmd.io/_uploads/SkZeoOBzge.png) 3. **命名與儲存 Dashboards** 創建完所需圖表後,為 Dashboards 命名並儲存。 ![image](https://hackmd.io/_uploads/BkdKo_HGel.png)