init: add docs
This commit is contained in:
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## Documentation
|
||||
|
||||
- Architecture decisions: `doc/architecture/`
|
||||
153
doc/architecture/adr-001-local-gateway.md
Normal file
153
doc/architecture/adr-001-local-gateway.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# Architectural Decision Record: Local Gateway + External Backend
|
||||
|
||||
## Status
|
||||
|
||||
Accepted
|
||||
|
||||
## Context
|
||||
|
||||
Initial design considered direct communication between IoT devices (ESP32) and a backend hosted on the internet.
|
||||
|
||||
Concerns identified:
|
||||
|
||||
* High volume of small messages from devices
|
||||
* Unnecessary exposure of raw telemetry to the internet
|
||||
* Increased complexity on constrained devices (TLS, crypto, reconnect logic)
|
||||
* Security overhead (encryption, signing on every message)
|
||||
|
||||
At the same time, the system does not require real-time global access to raw device data. Most data is only useful locally or in aggregated form.
|
||||
|
||||
## Decision
|
||||
|
||||
Adopt a **local gateway architecture**:
|
||||
|
||||
```
|
||||
ESP32 devices → Local Backend (LAN) → External Backend (Internet) → Mobile App
|
||||
```
|
||||
|
||||
### Key principles
|
||||
|
||||
1. **Devices communicate only within LAN**
|
||||
|
||||
* No direct internet access required
|
||||
* No inbound connections to devices
|
||||
* Devices initiate outbound connections only to local backend
|
||||
|
||||
2. **Local backend acts as a gateway**
|
||||
|
||||
* Maintains persistent secure connection (WebSocket over TLS) to external backend
|
||||
* Aggregates telemetry data
|
||||
* Translates and routes commands
|
||||
|
||||
3. **External backend is the only internet-facing component**
|
||||
|
||||
* Serves mobile applications
|
||||
* Sends commands to local backend
|
||||
* Receives aggregated data only
|
||||
|
||||
## Rationale
|
||||
|
||||
### 1. Reduced complexity on devices
|
||||
|
||||
ESP32 devices:
|
||||
|
||||
* Do not implement TLS
|
||||
* Do not handle complex cryptography
|
||||
* Maintain simple communication protocol
|
||||
|
||||
Result:
|
||||
|
||||
* Lower memory and CPU usage
|
||||
* Simpler firmware
|
||||
* Higher reliability
|
||||
|
||||
### 2. Network efficiency
|
||||
|
||||
Instead of many small messages:
|
||||
|
||||
* Local backend aggregates data
|
||||
* Sends fewer, larger messages
|
||||
|
||||
Result:
|
||||
|
||||
* Reduced bandwidth usage
|
||||
* Fewer connections
|
||||
|
||||
### 3. Clear trust boundary
|
||||
|
||||
* LAN is treated as a **controlled (conditionally trusted) environment**
|
||||
* Internet is treated as **untrusted**
|
||||
|
||||
Security measures are concentrated at the boundary:
|
||||
|
||||
* TLS on gateway ↔ external backend
|
||||
* Authentication and validation at gateway
|
||||
|
||||
### 4. Data control and privacy
|
||||
|
||||
* Raw telemetry remains in local network
|
||||
* Only aggregated/necessary data leaves the network
|
||||
* No dependency on third-party cloud for device data
|
||||
|
||||
## Security Model
|
||||
|
||||
### LAN (conditionally trusted)
|
||||
|
||||
Assumptions:
|
||||
|
||||
* Network is controlled
|
||||
* Unauthorized access is unlikely but possible
|
||||
|
||||
Mitigations:
|
||||
|
||||
* Device IP whitelist
|
||||
* Device identification (deviceId)
|
||||
* Simple authentication (pre-shared token)
|
||||
* Network segmentation (IoT VLAN)
|
||||
|
||||
No encryption required inside LAN.
|
||||
|
||||
### Internet (untrusted)
|
||||
|
||||
* All communication secured via TLS
|
||||
* Strong authentication required
|
||||
* Single controlled connection (gateway → backend)
|
||||
|
||||
## Command Flow
|
||||
|
||||
1. Mobile app → External backend
|
||||
2. External backend → Local backend (via secure WebSocket)
|
||||
3. Local backend → Device (LAN)
|
||||
|
||||
Local backend is responsible for:
|
||||
|
||||
* Validating commands
|
||||
* Ensuring they match device capabilities
|
||||
|
||||
## Consequences
|
||||
|
||||
### Positive
|
||||
|
||||
* Simpler device firmware
|
||||
* Reduced attack surface (no exposed devices)
|
||||
* Better performance and scalability
|
||||
* Full control over data
|
||||
|
||||
### Negative
|
||||
|
||||
* Requires always-on local backend
|
||||
* Adds one architectural component (gateway)
|
||||
* LAN cannot be treated as fully secure
|
||||
|
||||
## Notes
|
||||
|
||||
If LAN is compromised, impact is broader than IoT telemetry leakage and should be treated as a separate security incident class.
|
||||
|
||||
Therefore, the system does not attempt to provide full zero-trust security within LAN, but instead applies reasonable safeguards.
|
||||
|
||||
## Future Considerations
|
||||
|
||||
* Optional message signing inside LAN if threat model changes
|
||||
* Key rotation for device tokens
|
||||
* Device revocation mechanisms
|
||||
* Monitoring of gateway ↔ external connection
|
||||
Reference in New Issue
Block a user