# 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)**

### 一、**建立 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 中的資料

# 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 --> 線索 --> 建立線索**

2. **選擇日誌事件**

3. **確認配置後 --> 建立線索**

### 二、 **建立 SQS**
1. **至 AWS 控制台 --> SQS --> 佇列 --> 建立佇列**

填寫名稱與修改Policy存取政策,其他功能可選用。
下拉至存取政策 --> 進階 修改為以下政策,配置完成後建立佇列。

> 📌 此 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>"
}
}
}
]
}
```

### 三、 **S3 配置**
1. **CloudTrail建立完成後會創建新的 S3 Bucket**

2. **進入該S3 Bucket 後,在屬性 --> 事件通知 --> 建立事件通知**

3. **填寫事件名稱、在 **事件類型** 中勾選:**
**✔ 所有物件建立事件(All object create events)**

4. **下滑設定,將目標傳送至 SQS,選擇剛剛建立的 SQS Queue ,儲存設定**


以上即完成 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 兩者可自定義時間

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。


## Kibana 基本應用
### 一、Discover
**本文以搜尋 AWS 中 ConsoleLogin 與 MFA驗證 事件為例**
1. **在左側選擇可用欄位**
觀察原始 Log 並篩選出需要的欄位以進行後續查詢。

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")
```

4. **儲存查詢條件**
可將常用查詢條件命名儲存,方便快速呼叫。


### 二、Dashboards
1. **將 Discover 數據匯入 Dashboards**
使用欄位建立可視化圖表,例如:地理位置、使用者裝置等。

2. **選擇圖表類型**
根據欄位特性選擇適合的圖表:長條圖、圓餅圖、地圖等。

3. **命名與儲存 Dashboards**
創建完所需圖表後,為 Dashboards 命名並儲存。
