Model bezpieczeństwa#

vCLU traktuje bezpieczeństwo MCP poważnie - AI ma dostęp tylko do tego, na co jawnie pozwolisz.

Warstwy ochrony#

graph TD
    L1["1. Boty + Bearer Token<br/><i>kto może się połączyć</i>"]
    L2["2. Profile (Access Control)<br/><i>co widzi i czym steruje</i>"]
    L3["3. Lua readonly (expose)<br/><i>ograniczenia z kodu</i>"]
    L4["4. Activity Log (audyt)<br/><i>co zrobił</i>"]

    L1 --> L2 --> L3 --> L4

1. Uwierzytelnianie - Boty MCP#

Każdy klient AI to osobny bot z własnym kluczem API i zestawem profili dostępu.

Tworzenie bota#

W panelu vCLU > MCP > Bots > Add Bot:

  1. Podaj nazwę (np. “Claude Code”, “Home AI”)
  2. Przypisz profile dostępu (np. full-access, sensors-only)
  3. Klucz API wyświetla się jednorazowo - skopiuj go od razu

Jak działa klucz#

  • 32 losowe bajty, prefiks vclu_mcp_ + ciąg hex
  • W konfiguracji przechowywany jest tylko hash SHA-256 - sam klucz nie jest nigdzie zapisany
  • Walidacja przez porównanie constant-time (ochrona przed timing attacks)
  • Każdy bot ma własny klucz - możesz mieć wielu klientów AI z różnym dostępem

Rotacja klucza#

Regenerowanie klucza bota natychmiast unieważnia poprzedni. Nie trzeba restartować vCLU.

Bez klucza = brak dostępu#

Żądanie bez tokena:     → 401 Unauthorized
Żądanie z złym tokenem: → 401 Unauthorized
MCP wyłączony:          → 503 Service Unavailable

2. Access Control - profile#

Każdy bot ma przypisane profile dostępu. Profil to nazwany zestaw reguł z poziomem domyślnym i nadpisaniami per-obiekt.

Trzy poziomy dostępu#

PoziomWidzi?Steruje?Opis
fulltaktakPełny dostęp (domyślnie)
readonlytaknieAI widzi stan, ale nie może sterować
hiddennienieUrządzenie niewidoczne dla AI

Przykład konfiguracji#

# access_control.yaml
profiles:
  full-access:           # wbudowany
    default: full

  sensors-only:
    default: hidden
    objects:
      CLU.TEMP: readonly
      CLU.HUM: readonly

  lights:
    default: hidden
    objects:
      CLU.LED1: full
      CLU.LED2: full

Przypisywanie profili do botów#

// .vclu.json
{
  "mcp": {
    "bots": [
      {
        "name": "Claude Code",
        "profiles": ["full-access"]
      },
      {
        "name": "Home AI",
        "profiles": ["sensors-only", "lights"]
      }
    ]
  }
}

Bot “Claude Code” widzi wszystko. Bot “Home AI” widzi tylko czujniki (readonly) i światła (full). Reszta urządzeń jest ukryta.

Wiele profili = most permissive wins#

Gdy bot ma kilka profili, najwyższy poziom wygrywa (full > readonly > hidden):

Obiektsensors-onlylightsWynik dla “Home AI”
CLU.TEMPreadonlyhiddenreadonly
CLU.LED1hiddenfullfull
CLU.LOCKhiddenhiddenhidden

Profile są wspólne z innymi integracjami#

Ten sam profil może być przypisany do MQTT, HomeKit i botów MCP. Zarządzasz profilami w panelu vCLU > Access Control > Profiles.

3. Lua readonly#

Jeśli urządzenie jest wyeksponowane z flagą readonly w kodzie Lua:

expose(obj, "switch", {name = "Czujnik", readonly = true})

To MCP nigdy nie może go sterować - nawet jeśli Access Control ustawiony na full. Obie warstwy się sumują (bardziej restrykcyjna wygrywa).

Lua exposeAccess ControlWynik MCP
readonly: falsefullsteruje
readonly: falsereadonlytylko odczyt
readonly: truefulltylko odczyt
readonly: truereadonlytylko odczyt
-hiddenukryty

4. Activity Log - audyt#

Każde wywołanie narzędzia MCP jest rejestrowane:

PoleOpis
CzasKiedy wykonano
NarzędzieKtóre narzędzie (np. vclu_device_set)
ŚcieżkaNa jakim urządzeniu
StatusOK / ERR
LatencjaCzas wykonania (ms)
IPAdres klienta

Logi widoczne w panelu MCP > Activity Log. Ostatnie 50 wywołań z auto-odświeżaniem co 10 sekund.

Dobre praktyki#

Zasada minimalnych uprawnień - twórz osobne profile z ograniczonym dostępem zamiast dawać botom full-access. Zamki, alarmy i czujniki bezpieczeństwa powinny być hidden, chyba że masz konkretny powód.

Przykładowa konfiguracja bezpieczeństwa#

profiles:
  ai-lights:
    default: hidden
    objects:
      CLU_SALON.DOU0001: full
      CLU_KUCHNIA.DOU0001: full

  ai-covers:
    default: hidden
    objects:
      CLU_SALON.ROL0001: full

  ai-sensors:
    default: hidden
    objects:
      CLU_SALON.TEMP01: readonly
      CLU_WEJSCIE.MOTION01: readonly
// Bot "Home AI" - widzi światła, rolety i czujniki. Zamki ukryte.
{
  "name": "Home AI",
  "profiles": ["ai-lights", "ai-covers", "ai-sensors"]
}

Następny krok#

Dashboard MCP - monitoring i zarządzanie serwerem MCP