---
# System prepended metadata

title: conpot+ELK

---

以下提供一個較完整的兩台機器協同運作流程，將 **Conpot** 所產生的日誌轉送到 **ELK** 環境中做分析。整體可分為 **Conpot 端的安裝、設定** 與 **ELK 端的安裝、設定**，最後再設定 **Conpot 端** 的日志轉發到 **ELK**（這裡示範以 **Filebeat** 方式轉發為例）。你可以依需求和環境微調。

---
# 整體步驟
## 一、Conpot 端 (Ubuntu #1)

### 1. 安裝 Docker

1. 更新套件並安裝必要套件
   ```bash
   sudo apt update
   sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
   ```
2. 安裝 Docker  
   可參考官方文件或使用指令：
   ```bash
   curl -fsSL https://get.docker.com | sudo bash
   ```
3. 啟動並檢查 Docker
   ```bash
   sudo systemctl start docker
   sudo systemctl enable docker
   sudo systemctl status docker
   ```

### 2. 拉取並啟動 Conpot

1. 下載 conpot 映像檔
```
docker pull honeynet/conpot
```
> 刪除映像檔 `docker rmi honeynet/conpot`



2. 若需要將 log 目錄掛載至主機 (方便 Filebeat 讀取或做後續分析)，可加上 `-v /home/bbrain/conpot_logs:/var/log/conpot` 等參數。範例： 


```
docker run -it -p 6230:6230 -p 8800:8800 -p 47808:47808 -p 10201:10201 -p 5020:5020 -p 16100:16100/udp -p 80:80 -v /home/bbrain/conpot_logs:/var/log/conpot --name conpot --network=bridge honeynet/conpot:latest /bin/sh
```
* logfile: `/var/log/conpot/conpot.log`

### 3. Conpot 基本設定


1. 進入容器
```
sudo docker exec -it conpot /bin/sh
```
2. 複製測試設定檔並命名為正式使用的設定檔
 
```
cp /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/testing.cfg /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/conpot.cfg
```
3.創建文件
```
mkdir /home/conpot/virtual/

mkdir /home/conpot/fs_url/
```
4. 修改conpot.cfg
* 檔案路徑:`/home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot`
* 編輯指令`vi conpot.cfg`
> 先按esc再按i編輯
> 先按esc再輸入:wq保存並退出
```
[virtual_file_system]

data_fs_url = /home/conpot/virtual/

fs_url = /home/conpot/fs_url/
```
5. 刪除 ftp 與 tftp 資料夾 (若不需要)
 
* 檔案路徑`/home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/templates/default`
* 刪除指令`mv ./ftp/ ../`and ` mv ./tftp/ ../
`
6. 測試 Conpot 執行

路徑:
```
cd /home/conpot/.local/bin/
```
指令
```
./conpot --template /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/templates/default/ --config /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/conpot.cfg
```

   使用 `Ctrl + C` 結束後退出容器，若測試正常可將此容器 commit 成新的映像檔：
   ```bash
   exit
   docker commit <container_id> my_conpot_image
   ```
6. 基於新的映像檔啟動容器
   ```bash
   docker run -d --user root \
     -p 5020:5020 -p 80:80 -p 8800:8800 \
     --network=bridge \
     --name conpot \
     my_conpot_image
   ```
   接著可進入容器再次啟動 Conpot:
   ```bash
   docker exec -it conpot /bin/sh
   cd /home/conpot/.local/bin/
   ./conpot --template /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/templates/default/ \
            --config /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/conpot.cfg
   ```

---

## 二、ELK 端 (Ubuntu #2)

### 1. 安裝 Docker

與 Conpot 端類似，安裝並啟動 Docker：
```bash
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://get.docker.com | sudo bash
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
```

### 2. 安裝並啟動 Elasticsearch

1. 建立 Docker 網路 (可自行選擇使用 `bridge` 或 `host`，也可不建立)
```
 docker network create elastic
```
> 查看network : `docker network ls`
> 刪除特定network : `docker network rm elastic
`
2. 拉取映像檔
```
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.15.3
```
3. 設置內核參數
```
sudo sysctl -w vm.max_map_count=262144
```
4. 啟動 Elasticsearch 容器
```
docker run --name es01 \
     --net elastic \
     -p 9200:9200 \
     -d -m 4GB \
     docker.elastic.co/elasticsearch/elasticsearch:8.15.3
```
5. 等待 Elasticsearch 完全啟動
```
sleep 30
```
6. 建立存放密碼與憑證的資料夾
```
 mkdir -p elk-server
```
7. 重置內建用戶 elastic 密碼
```
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -b \
     > elk-server/elasticsearch_user_pw.txt
```
8. 複製 CA 憑證
```
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt elk-server/
```

### 3. 安裝並啟動 Kibana

1. 建立 Kibana 目錄

```
 mkdir kibana_server
```
2. 下載映像檔

```
 docker pull docker.elastic.co/kibana/kibana:8.15.3
```
3. 啟動 Kibana 容器

```
docker run -d --name kib01 \
     --net elastic \
     -p 5601:5601 \
     docker.elastic.co/kibana/kibana:8.15.3
```
4. 產生 Enrollment Token 與 Verification Code (可視情況是否需要)

```
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana \
     > kibana_server/kibana_enrollment_token
```
```
docker exec -it kib01 /usr/share/kibana/bin/kibana-verification-code \
     > kibana_server/kibana-verification-code
```
5. 確認能透過瀏覽器存取 Kibana (http://<ELK機器IP>:5601)

---


## 二、LPG 端 (Ubuntu #2)


**步驟 1️⃣：在 Ubuntu #2（Loki 端） 安裝 Loki + Promtail + Grafana**
**1. 安裝 Docker**
```bash
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
```

**2. 安裝 Loki**
```bash
sudo docker run -d --name loki -p 3100:3100 grafana/loki
```
📌 **確認 Loki 運作**
```bash
curl -s http://localhost:3100/ready
```
回應應該是 `ready`

---

**3. 安裝 Promtail（類似 Filebeat）**
Promtail 用來收集日誌並發送到 Loki。

#### **下載 Promtail**
```bash
wget https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
chmod +x promtail-linux-amd64
```

#### **設定 `promtail-config.yaml`**
```bash
nano promtail-config.yaml
```
📌 **填入以下設定**
```yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
  - job_name: "conpot_logs"
    static_configs:
      - targets:
          - localhost
        labels:
          job: "conpot"
          __path__: /home/bbrain/conpot_logs/*.log
```

#### **手動啟動 Promtail**
```bash
./promtail-linux-amd64 -config.file=promtail-config.yaml &
```
📌 **確認 Promtail 是否成功運行**
```bash
curl -s http://localhost:9080/targets
```
應該會看到 `conpot_logs` 在 `active` 狀態


查看刪除進程
* 查看
```
sudo lsof -i :9080
```
* 刪除
```
sudo kill -9 <PID>
```

---

**4. 安裝 Grafana**
```bash
sudo docker run -d --name grafana -p 3000:3000 grafana/grafana
```
📌 **確認 Grafana 運作**
- 瀏覽器打開 `http://<ELK 機器 IP>:3000`
- **預設帳號密碼**：
  - **Username**: `admin`
  - **Password**: `admin`（第一次登入會要求修改）

---

**步驟 2️⃣：設定 Grafana 連接 Loki**
1. **打開 Grafana**
   - 進入 `http://<ELK 機器 IP>:3000`
   - 登入帳號（`admin`）

2. **確保Loki 與 Grafana在同一個 Network**
   - 檢查 Loki 的 Network `docker network ls`
    
   - 應該要有一個 Network，例如：
    ```
    NETWORK ID     NAME        DRIVER
    abcdef123456   loki_net    bridge
    ```
   - 如果 Grafana **找不到 Loki**，可以把它們加入同一個 Network：
    ```bash
    docker network create loki_net
    docker network connect loki_net loki
    docker network connect loki_net grafana
    ```
    - 然後在 Grafana 設定 Loki **URL 改為**：
    ```
    http://loki:3100
    ```

3. **新增 Loki 為數據來源**
   - **設定 → Data Sources**
   - 選擇 **Loki**
   - **URL** 填寫：`http://loki:3100`
   - **按 Save & Test**（成功後會顯示綠色訊息）

4. **新增 Dashboard 來查看 Conpot 日誌**
   - 進入 **Explore**
   - 選擇 **Loki**
   - 在 Log Browser 選擇 `job="conpot"`
   - 你應該會看到 Conpot 產生的日誌！

---

**步驟 3️⃣：驗證整個流程**
**🔹 測試 Conpot 是否產生日誌**
```bash
tail -f /home/bbrain/conpot_logs/conpot.log
```
應該會有日誌輸出

**🔹 測試 Promtail 是否收集日誌**
```bash
curl -s http://localhost:9080/targets
```
應該會看到 `active` 目標

**🔹 測試 Loki 是否接收日誌**
```bash
curl -s "http://localhost:3100/loki/api/v1/query?query={job=\"conpot\"}"
```
應該會看到 JSON 格式的日誌輸出

**🔹 測試 Grafana 是否顯示日誌**
- **打開 `http://<ELK 機器 IP>:3000`**
- **進入 Explore**
- **選擇 Loki，查詢 `job="conpot"`**
- 你應該能看到 Conpot 產生的日誌 🎉

---



## 三、在 Conpot 端安裝並設定 Filebeat (將 Logs 寫入 Elasticsearch)

最簡單的方式是 **在 Conpot 的主機（非容器內）安裝 Filebeat**，並讀取容器掛載出來的日誌，再傳送到遠端的 Elasticsearch。以下以 Ubuntu 上安裝 Filebeat 為例：

1. 在 Conpot 主機上安裝 Filebeat

   1) 下載 Elastic GPG Key：

```
curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
```

   2) 新增套件庫：
   
```
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/beats.list
sudo apt update
```

   3) 安裝 Filebeat：
```
sudo apt install filebeat
```

2. 設定 Filebeat 讀取 Conpot 容器中的日誌  
   *假設你的 Conpot 容器有掛載日誌到 `/home/bbrain/conpot_logs`*  
   在 `/etc/filebeat/filebeat.yml` 中新增或修改 input：
   ```yaml
   filebeat.inputs:
     - type: filestream
       enabled: true
       paths:
         - /home/bbrain/conpot_logs/*.log
         - /home/bbrain/conpot_logs/conpot.json  # 添加对conpot.json的读取

       fields:
         log_type: conpot
         fields_under_root: true
       json.keys_under_root: true #Filebeat 會將 JSON 物件的每個鍵提升到根級別
       json.add_error_key: true #如果解析 JSON 失敗，Filebeat 會新增一個 error 鍵到輸出事件中

   # Output to Elasticsearch
   output.elasticsearch:
     hosts: ["https://<ELK機器IP>:9200"]
     username: "elastic"
     password: "<對應的ES密碼>"
     ssl.verification_mode: "none" 
     
   ```
   *注意：* `certificate_authorities` 檔案可以先從 ELK 機器 copy 過來，也可以先關閉 SSL 驗證測試。若 ES 未設定 TLS，則可簡化設定。

3. 啟動並檢查 Filebeat

```
sudo systemctl enable filebeat
sudo systemctl start filebeat
sudo systemctl status filebeat
```
重啟
```
sudo systemctl restart filebeat
```
> 查看 Filebeat 日誌 `sudo /usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml
`
4. 在 Elasticsearch/Kibana 中檢查索引  
   打開 Kibana → Discover，查看是否有 Filebeat 相關索引以及 Conpot log 是否進來。

---
### 在Grafana的查詢語法
```
topk(10, sum by (src_ip) (
  count_over_time({job="legal_conpot"}[5m])
))
```
用途：顯示每分鐘 log 數量，觀察是否有突增
```
sum(rate({job="legal_conpot"}[5m]))
```
```
sum(rate({job="Attacker_log"}[5m]))
```
Event Type 分布
```
sum by (event_type) (count_over_time({job="legal_conpot"}[5m]))
```
Top 10 攻擊來源 IP
```
topk(10, sum by (src_ip) (count_over_time({job="legal_conpot"}[5m])))
```
來源Port 分布
```
sum by (src_port) (count_over_time({job="legal_conpot"}[10m]))
```
public_ip 分布
```
topk(10, sum by (public_ip) (count_over_time({job="legal_conpot"}[10m])))
```
計算日誌數量
```
count_over_time({job="legal_conpot"}[5m])
```
```
count_over_time({job="Attacker_log"}[5m])
```
讀取
```
{job="legal_conpot"} |= "03"
```
攻擊者修改
```
{job="Attacker_log"} |= "06"
```
## 四、驗證流程

1. **Conpot 端**  
   - 確認 Conpot 容器已經執行並產生日誌  
   - 確認 Filebeat 正在收集 `/home/bbrain/conpot_logs` 下的日誌並傳送到遠端 ELK
   - 测试 Filebeat 到 Elasticsearch 的连接是否成功 `sudo filebeat test output -c /etc/filebeat/filebeat.yml`
   - 檢查ELK索引 `curl -X GET "https://192.168.14.148:9200/_cat/indices?v" -u elastic:Lt+7*iQvfmPLqDT24B75 --insecure`

2. **ELK 端**  
   - 進入 `http://<ELK機器IP>:5601` (Kibana)  
   - 使用 elastic 帳號和剛重置的密碼登入  
   - 進入 Kibana → Discover  
   - 建立 Filebeat Index Pattern (若是使用 Filebeat 預設索引命名，通常是 `filebeat-*`)  
   - 檢查 Conpot 的日誌資料是否有送達
   

3. **網路連線**  
   - 確保兩台 Ubuntu (Conpot 與 ELK) 可以互相連線 (ping、telnet 9200 port 測試等)  
   - 若需要在防火牆或安全群組上放行 9200、5601 等連線埠

---

## 五、結論

上述流程整合了：

1. 在 **Conpot** 主機上透過 Docker 安裝、設定 Conpot  
2. 在 **ELK** 主機上透過 Docker 安裝、設定 Elasticsearch 與 Kibana  
3. 在 Conpot 主機安裝 **Filebeat**（或其他收集方式），用來將 Conpot 容器產生的日誌資料轉送到遠端的 Elasticsearch 進行分析  
4. 最終可透過 **Kibana** 介面查看與分析 Conpot 的監控與偵測資訊。

只要確保兩台主機之間網路互通、日誌收集與輸出的設定正確，即可達到將 **Conpot logs** 傳輸至 **ELK** 進行集中式分析的目的。


# 問題

一
---
**問題描述 :**
conpot啟動之後的log跟`cat /var/log/conpot/conpot.log`(容器內)和`/home/bbrain/conpot_logs/conpot.log`(本機)的不一致

conpot啟動的log紀錄的是當下時間，但是容器內的和本機的conpot.log都只能顯示幾天前的logs紀錄



**解決方法 :**

(一)確認時間設定和同步。 

    1.在容器內與本機輸入`date`查看時間是否一致
    2.若內器內時間是錯誤的，先以root的權限進入到容器的sh `sudo docker exec -it --user root af0b9eac2270 sh`
    3.更新並安裝時區資料包 `apk update && apk add tzdata`
    4.設定時區為 `ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime` 和 `echo "Asia/Shanghai" > /etc/timezone`




(二)conpot.cfg裡面json要設定
```
[json]
enabled = True
filename = /var/log/conpot/conpot.json
```
* 再加上原本的`-v /home/bbrain/conpot_logs:/var/log/conpot`，conpot產生的log會先到`conpot.json`裡面，而conpot.json因為在`/var/log/conpot`裡面，所以都會被映射到本機`/home/bbrain/conpot_logs`
* 遇到`conpot.json`權限問題，先以root權限進入sh `sudo docker exec -it --user root conpot sh`再修改文件權限`chmod 777 /var/log/conpot`
* 回到最初的問題描述，我們將log以json格式記錄起來，所以我們可以再`conpot.json`找到logs而非`conpot.log`



二
---
我們在ELK中discover裡面document部份看到的logs，跟conpot產生出來的logs是不一樣的東西

三
---


**問題描述**

1. **Kibana 無法正常啟動**  
   - 進入瀏覽器測試時，出現了 `Kibana server is not ready yet.`。
   - 代表 Kibana 連不上 Elasticsearch 或尚未初始化完成。

2. **檢查 Kibana 日誌 (`docker logs kib01`)**  
   - 日誌顯示：
     ```
     [ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. connect ECONNREFUSED 172.18.0.2:9200
     ```
   - 也就是說，**Kibana 嘗試連到 `172.18.0.2:9200`** 但遭到拒絕 (`ECONNREFUSED`)。

3. **檢查 Elasticsearch 容器 IP (`docker inspect es01 | grep "IPAddress"`)**  
   - 顯示：
     ```
     "IPAddress": "172.18.0.3"
     ```
   - 也就是 Elasticsearch 實際上在 `172.18.0.3`，而 **Kibana 設定裡寫的是 `172.18.0.2`**。  
   - 這造成 Kibana 連線錯誤，不斷出現 `Kibana server is not ready yet.`。

---

**解決方法**


**步驟 1：停止並刪除舊容器**

```bash
docker container stop kib01 es01
docker container rm kib01 es01
```

1. **為什麼要先停止並刪除？**  
   - 你之前的 `kib01`、`es01` 可能沒有在正確網路中，或者帶了錯誤設定（例如預設的 HTTPS 或錯誤的 IP 配置）。  
   - 在 Docker 裡，容器的參數（網路、環境變數等）是在「容器建立」的那一刻就固定了。  
   - 所以想要變更設定，最簡單的方式就是先停止並刪除舊容器，重新使用正確參數 `docker run` 來建立新的容器。

---

**步驟 2：重啟動 Elasticsearch 容器**

```bash
docker run -d \
  --name es01 \
  --network elastic \
  -p 9200:9200 \
  -e discovery.type=single-node \
  -e xpack.security.enabled=false \
  docker.elastic.co/elasticsearch/elasticsearch:8.15.3
```

1. **`--name es01`**  
   - 給容器命名為 `es01`。之後 Kibana 容器可以用這個名稱連線。  
2. **`--network elastic`**  
   - 指定把 `es01` 放進名為 `elastic` 的 Docker network；這樣之後 Kibana 只要同樣放在 `elastic` 網路，就能透過 `es01` 名稱找到 Elasticsearch。  
3. **`-p 9200:9200`**  
   - 對外映射 9200 埠，讓宿主機可以用 `http://localhost:9200` 存取 Elasticsearch。  
4. **`-e discovery.type=single-node`**  
   - 告訴 Elasticsearch 只要啟動「單節點模式」，避免集群檢查或多節點配置。  
5. **`-e xpack.security.enabled=false`**  
   - 關閉 8.x 版本預設開啟的安全機制（HTTPS + 認證）；這樣就能直接用 HTTP、無需帳密。

---

**步驟 3：驗證 Elasticsearch**

```bash
curl http://localhost:9200
```

1. **為什麼要做這個測試？**  
   - 檢查容器是否正確啟動，以及是否真的在 `9200` 埠提供 **HTTP** 服務。  
   - 如果你看到類似下面的 JSON，就代表 Elasticsearch 成功透過 HTTP 回應了：
     ```json
     {
       "name": "es01",
       "cluster_name": "docker-cluster",
       "cluster_uuid": "...",
       "version": { "number": "8.15.3", ... },
       "tagline": "You Know, for Search"
     }
     ```
   - 若成功，就表示目前配置（單節點 + 無安全機制）是生效的。

---

**步驟 4：重啟動 Kibana 容器**

```bash
docker run -d --name kib01 \
  --network elastic \
  -p 5601:5601 \
  -e xpack.security.enabled=false \
  -e ELASTICSEARCH_HOSTS="http://es01:9200" \
  docker.elastic.co/kibana/kibana:8.15.3
```

1. **`--name kib01`**  
   - 為容器命名 `kib01`。  
2. **`--network elastic`**  
   - 與 `es01` 相同的網路 `elastic`；這樣 Kibana 能直接用 `es01` 做 DNS 解析，連到 Elasticsearch。  
3. **`-p 5601:5601`**  
   - 對外映射 5601 埠，讓宿主機可用 `http://localhost:5601` 存取 Kibana。  
4. **`-e xpack.security.enabled=false`**  
   - Kibana 端同樣關閉預設安全機制，否則會要求 HTTPS 或帳密。  
5. **`-e ELASTICSEARCH_HOSTS="http://es01:9200"`**  
   - 告訴 Kibana 容器，它要連線的 ES 位址是 `http://es01:9200`；因為兩者都在 `elastic` 網路下，所以 `es01` 可以正確解析到 Elasticsearch 容器的 IP。

---

**步驟 5：在瀏覽器打開 Kibana**

```text
http://localhost:5601
```

1. **檢查是否能成功進入 Kibana UI**  
   - 如果 Kibana 容器已經順利連上 Elasticsearch，就會顯示 Kibana 首頁，而不再卡在 “Kibana server is not ready yet.”。  
   - 如果還是出現問題，就檢查 `docker logs kib01` 看是否有報錯。

---

**為什麼這樣做可以解決問題？**

1. **同一網路**  
   - 最關鍵在於 `--network elastic` 讓 `es01` 和 `kib01` 都在同一個 Docker network 內，這樣 Kibana 可以透過名稱 `es01` 進行 DNS 解析，不會再出現 `ENOTFOUND es01` 或 `EAI_AGAIN es01`。  
2. **關閉安全機制**  
   - Elasticsearch 8.x 預設啟用 HTTPS / Security。如果你只想用純 HTTP 連線，就要在容器啟動時加 `xpack.security.enabled=false`。否則 `curl http://localhost:9200` 會失敗或要求證書。  
3. **單節點模式**  
   - 避免 Elasticsearch 等叢集檢查問題，使本地測試更快就能啟動。  
4. **埠映射**  
   - 透過 `-p 9200:9200`、`-p 5601:5601`，讓宿主機可以直接用 `http://localhost:9200` 和 `http://localhost:5601` 存取 ES、Kibana，進行測試和使用。

---
四
---
錯誤訊息
```
[Errno 98] Address in use: ('0.0.0.0', 10201)
```
解決步驟
1.查看conpot進程
```
ps aux | grep conpot
```
2.刪除fake_shell.py
```
sudo kill -9 18470
```

---
# gmail告警功能

進入虛擬環境
```
source venv/bin/activate
```
啟動程式碼
```
sudo /home/bbrain/venv/bin/python /home/bbrain/gmail.py
```




---



---
