以下提供一個較完整的兩台機器協同運作流程,將 **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 ``` --- ---