---
title: 'RPI OpnenCanary HoneyPot to HomeAssistant'
url: 'https://duckd.cz/en/home/rpi-opnencanary-honeypot-to-homeassistant'
markdown: 'https://duckd.cz/en/home/rpi-opnencanary-honeypot-to-homeassistant.md'
lang: en
date: '2026-09-17'
description: 'Tok Dat OpenCanary ↓ webhook Home Assistant ├─ CSV log ├─ Event sensor ├─ Risk score per IP ├─ Detekce kompromitace └─ Dashboard (tabulky + grafy) RPI nastavení apt install iptables python3 python3-pip python3-venv git -y mkdir ~/opencanary cd ~/opencanary python3 -m venv venv source ve…'
taxonomy:
  category:
    - linux
    - home-assistant
    - security
  tag:
    - opencanary
    - raspberry-pi
    - honeypot
  author:
    - josef-kubat
---

Documentation

# RPI OpnenCanary HoneyPot to HomeAssistant

 [› Obsah stránky](#content) [› Zpět](https://duckd.cz/en) [› Nahoru](#top) 

# Tok Dat

```sh
OpenCanary
  ↓ webhook
Home Assistant
  ├─ CSV log
  ├─ Event sensor
  ├─ Risk score per IP
  ├─ Detekce kompromitace
  └─ Dashboard (tabulky + grafy)
```

## RPI nastavení

```sh
apt install iptables python3 python3-pip python3-venv git -y
mkdir ~/opencanary
cd ~/opencanary
python3 -m venv venv
source venv/bin/activate
pip install opencanary
apt install -y build-essential libffi-dev pkg-config python3-dev libssl-dev libpcap-dev
pip install --upgrade pip setuptools wheel
pip install cffi
pip install opencanary
nano /etc/systemd/system/opencanary.service
systemctl daemon-reload
systemctl enable opencanary
systemctl start opencanary
systemctl status opencanary
systemctl status opencanary
nano ~/.opencanary.conf
opencanaryd --copyconfig

tail -f /var/log/opencanary.log
nano /etc/systemd/system/opencanary.service
nano /opt/opencanary/venv/bin/opencanaryd
nano /opt/opencanary/venv/bin/opencanaryd
nano /etc/opencanaryd/opencanary.conf
systemctl daemon-reload && systemctl restart opencanary && systemctl status opencanary
nano /etc/opencanaryd/opencanary.conf
nano /etc/systemd/system/opencanary.service
systemctl daemon-reload && systemctl restart opencanary && systemctl status opencanary
/opt/opencanary/venv/bin/opencanaryd --start
rm -rf /root/opencanary
mkdir -p /root/opencanary
cd /root/opencanary
python3 -m venv venv
/root/opencanary/venv/bin/python -m pip install --upgrade pip setuptools wheel
/root/opencanary/venv/bin/python -m pip install opencanary
ls -l /root/opencanary/venv/bin/opencanaryd
ls -l /root/opencanary/venv/bin/twistd
nano /etc/opencanaryd/opencanary.conf
nano /etc/systemd/system/opencanary.service
systemctl daemon-reload && systemctl restart opencanary && systemctl status opencanary
tail -f /var/log/opencanary.log
ss -tulnp
netstat -tulnp
python -m json.tool /etc/opencanaryd/opencanary.conf > /dev/null && systemctl daemon-reload && systemctl restart opencanary && systemctl status opencanary && journalctl -u opencanary -n 50
```

### /etc/opencanaryd/opencanary.conf

```sh
"logger": {
  "class": "PyLogger",
  "kwargs": {
    "formatters": {
      "plain": {
        "format": "%(message)s"
      }
    },
    "handlers": {
      "file": {
        "class": "logging.FileHandler",
        "filename": "/var/log/opencanary.log"
      },
      "ha-webhook": {
        "class": "opencanary.logger.WebhookHandler",
        "url": "http://192.168.1.123:8123/api/webhook/opencanary",
        "method": "POST",
        "data": "%(message)s",
        "headers": {
          "Content-Type": "application/json"
        },
        "status_code": 200
      }
    }
  }
}
```

### /etc/systemd/system/opencanary.service

```sh
[Unit]
Description=OpenCanary Honeypot Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/opencanary
# Spouštíme přímo Twisted server s TAC souborem
ExecStart=/root/opencanary/venv/bin/twistd -n -y /root/opencanary/venv/bin/opencanary.tac
Restart=always

[Install]
WantedBy=multi-user.target
```

## Načti novou službu

```sh
systemctl daemon-reload
```

## Nastav automatický start

```sh
systemctl enable opencanary.service
```

### /homeassistant/configuration.yaml

```yaml
# ===============================
# ZÁKLADNÍ NASTAVENÍ HOME ASSISTANTU
# ===============================
homeassistant:
  name: Domov
  latitude: 0
  longitude: 0
  elevation: 0
  unit_system: metric
  time_zone: Europe/Prague
  allowlist_external_dirs:
    - "/media"
    - "/media/opencanary"

default_config:

# Zápis do souboru
shell_command:
  opencanary_zapis: '/config/opencanary_append.sh "{{ radek }}"'

# Čtení ze souboru (pro zobrazení v HA)
command_line:
  - sensor:
      name: "OpenCanary Last Events"
      command: "tail -n 20 /media/opencanary/opencanary.csv"
      scan_interval: 30

  - sensor:
      name: "OpenCanary Events"
      unique_id: opencanary_events
      command: "python3 /config/opencanary_reader.py"
      scan_interval: 30
      value_template: "{{ value_json.events | length }}"
      json_attributes:
        - events

# Pomocná entita pro dashboard
input_text:
  opencanary_last_event:
    name: "OpenCanary Last Event"
    max: 255

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
```

## /homeassistant/automations.yaml

```yaml
- id: opencanary_webhook
  alias: "OpenCanary – webhook handler"
  mode: queued
  max: 50

  trigger:
    - platform: webhook
      webhook_id: opencanary
      allowed_methods: [POST]
      local_only: false

  variables:
    # Sjednocené parsování dat z OpenCanary
    oc: >-
      {% if trigger.json is mapping %}
        {{ trigger.json }}
      {% elif trigger.json is defined and trigger.json.message is defined %}
        {{ trigger.json.message | from_json }}
      {% else %}
        {{ {} }}
      {% endif %}
    ts: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
    src_ip: "{{ oc.get('src_host', 'N/A') }}"
    dst_port: "{{ oc.get('dst_port', 'N/A') }}"
    logtype: "{{ oc.get('logtype', 'N/A') }}"

  action:
    - service: system_log.write
      data:
        level: info
        logger: custom_webhook_debug
        message: >-
          {% set p = trigger.json if trigger.json is mapping else trigger.json | from_json %}
          Zdroj: {{ p.src_host | default('N/A') }}:{{ p.src_port | default('N/A') }}
          → Cíl: {{ p.dst_host | default('N/A') }}:{{ p.dst_port | default('N/A') }}
          Typ: {{ p.logtype | default('N/A') }}

    # 1. Zápis do CSV
    - service: shell_command.opencanary_zapis
      data:
        #radek: "{{ ts }};{{ src_ip }};{{ dst_port }};{{ logtype }}"
        radek: >
          {% set payload = trigger.json if trigger.json is mapping else trigger.json | from_json %}
          {{ payload.local_time_adjusted }};{{ payload.dst_port }};{{ payload.src_host }};{{ payload.src_port }};{{ payload.logdata.USERNAME }};{{ payload.logdata.PASSWORD }}        

    # 2. Aktualizace stavu (dashboard)
    - service: input_text.set_value
      target:
        entity_id: input_text.opencanary_last_event
      data:
        value: >-
          {% set p = trigger.json if trigger.json is mapping else trigger.json | from_json %}
          {{ now().strftime('%Y-%m-%d %H:%M:%S') }} | IP: {{ p.src_host | default('N/A') }} | Port: {{ p.dst_port | default('N/A') }}

    # 3. Notifikace do HA lišty
    - service: persistent_notification.create
      data:
        title: "OpenCanary Logged"
        message: >-
          {% set p = trigger.json if trigger.json is mapping else trigger.json | from_json %}
          Zdroj: {{ p.src_host | default('N/A') }}:{{ p.src_port | default('N/A') }}
          → Cíl: {{ p.dst_host | default('N/A') }}:{{ p.dst_port | default('N/A') }}
          Typ: {{ p.logtype | default('N/A') }}
```

## Zapisování do logu

/config/opencanary\_append.sh chmod +x /config/opencanary\_append.sh

```sh
#!/bin/sh
# 1. argument = celý řádek
printf '%s\n' "$1" >> /media/opencanary/opencanary.csv
```

## Čtení z logu

/config/opencanary\_reader.py

```py
import json
import os

path = "/media/opencanary/opencanary.csv"

events = []
if os.path.exists(path):
    with open(path, "r", encoding="utf-8", errors="replace") as f:
        for line in f:
            line = line.strip()
            if not line:
                continue

            parts = line.split(";")
            # bezpečně doplníme na 6 položek
            while len(parts) < 6:
                parts.append("")

            ts, dst_port, src_ip, src_port, user_or_pass, extra = parts[:6]

            events.append({
                "ts": ts,
                "dst_port": dst_port,
                "src_ip": src_ip,
                "src_port": src_port,
                "val1": user_or_pass,
                "val2": extra,
                "raw": line,
            })

print(json.dumps({"events": events}, ensure_ascii=False))
```

## Nastavení karty Flex Table

```yaml
type: custom:flex-table-card
title: OpenCanary (poslední události)
entities:
  include:
    - sensor.opencanary_events
max_rows: 50
columns:
  - name: Čas
    data: events
    modify: x.ts
  - name: Dst port
    data: events
    modify: x.dst_port
  - name: Src IP
    data: events
    modify: x.src_ip
  - name: Src port
    data: events
    modify: x.src_port
  - name: Val1
    data: events
    modify: x.val1
  - name: Val2
    data: events
    modify: x.val2
```

## Problémy

Zkontroluj zda z RPI je odesíláno na Home assistenta

```sh
tcpdump -ni any host 192.168.x.x and port 8123
```

```yaml

```

```yaml

```

```yaml

```

```yaml

```

```yaml

```

```yaml

```

© www.duckd.cz

`Grav + Twig` • `atedo-quark` • `2026-09-25`

---

## Navigation

- Parent: [Home](https://duckd.cz/en/index.md)
- Next: [Home assistant - install addons](https://duckd.cz/en/home/home-assistant.md)
