|
39 | 39 | > Make Sentinel CP capable of configuring all core proxy features through the UI. |
40 | 40 | > Every competitor has these — they are table stakes. |
41 | 41 |
|
42 | | -### 8.1 TLS / Certificate Management — DONE (ACME/CA stretch goals remain) |
| 42 | +### 8.1 TLS / Certificate Management — DONE |
43 | 43 | - [x] Certificate CRUD (upload PEM/DER certs and private keys) — `certificate.ex` schema + `certificate_crypto.ex` AES-256-GCM encryption |
44 | 44 | - [x] Certificate-to-service binding (assign certs to virtual hosts / services) — `Service.certificate_id` FK |
45 | 45 | - [x] Certificate expiry tracking with dashboard warnings — `certificate_expiry_worker.ex` Oban worker, statuses: active/expiring_soon/expired/revoked |
46 | | -- [ ] Auto-renewal integration (Let's Encrypt / ACME) — `acme_config` field exists, no ACME client |
47 | | -- [ ] Internal CA for inter-node mTLS (inspired by nevisAdmin4 auto-PKI) |
48 | | -- [ ] Trust store management (CA bundles for upstream verification) |
| 46 | +- [x] Auto-renewal integration (Let's Encrypt / ACME) — `acme/client.ex`, `acme/renewal.ex`, `acme/crypto.ex`, `certificate_renewal_worker.ex` |
| 47 | +- [x] Internal CA for inter-node mTLS (inspired by nevisAdmin4 auto-PKI) — `internal_ca.ex`, `internal_ca_live/` |
| 48 | +- [x] Trust store management (CA bundles for upstream verification) — `trust_store.ex`, `trust_stores_live/` |
49 | 49 | - [x] KDL generation for TLS blocks — `kdl_generator.ex` `build_tls_certificates` + `build_tls_ref` |
50 | 50 |
|
51 | 51 | ### 8.2 Upstream Groups / Load Balancing — DONE |
|
91 | 91 |
|
92 | 92 | > Match enterprise expectations for proxy security and reliability features. |
93 | 93 |
|
94 | | -### 9.1 Circuit Breakers — DONE (health view status is a stretch goal) |
| 94 | +### 9.1 Circuit Breakers — DONE |
95 | 95 | - [x] Per-upstream circuit breaker configuration — `UpstreamGroup.circuit_breaker` map field |
96 | 96 | - [x] Configurable thresholds (failure_threshold, success_threshold, timeout, half_open_max_requests) |
97 | 97 | - [x] Half-open state with configurable probe interval |
98 | | -- [ ] Circuit breaker status in node/service health views — no dedicated health view |
| 98 | +- [x] Circuit breaker status in node/service health views — `circuit_breaker_status.ex`, upstream group show page |
99 | 99 | - [x] KDL generation for circuit breaker blocks — `build_nested_map_block` via upstream group |
100 | 100 |
|
101 | 101 | ### 9.2 Proxy-Level Authentication — DONE |
|
108 | 108 | - [x] Auth configuration UI + API — `auth_policies_live/`, `auth_policy_controller.ex` |
109 | 109 | - [x] KDL generation for auth blocks — `build_auth_block` |
110 | 110 |
|
111 | | -### 9.3 WAF / Request Security — DONE (anomaly detection / WAF dashboard are stretch goals) |
| 111 | +### 9.3 WAF / Request Security — DONE |
112 | 112 | - [x] Request size limits (max body, max headers, max URI length) — `security.max_body_size` |
113 | 113 | - [x] Content-type enforcement (whitelist allowed content types) |
114 | 114 | - [x] Common attack pattern detection (SQLi, XSS, path traversal, RFI) — `security.block_sqli`, `security.block_xss` |
115 | 115 | - [x] Custom WAF rules (regex-based block/allow) — via middleware system with custom type |
116 | | -- [ ] Request rate anomaly detection |
117 | | -- [ ] WAF event logging and dashboard |
| 116 | +- [x] Request rate anomaly detection — `waf_baseline.ex`, `waf_baseline_worker.ex`, `waf_anomaly.ex`, anomalies live view |
| 117 | +- [x] WAF event logging and dashboard — `waf_event.ex`, `waf_live/index.ex`, `waf_live/show.ex`, time-series chart |
118 | 118 | - [x] Per-service WAF policy (enable/disable, sensitivity level) — `Service.security` map |
119 | 119 | - [x] KDL generation for security blocks — `build_security_block`, `build_global_security` |
120 | 120 |
|
|
178 | 178 | - [x] Link spec to service for documentation — `Service.openapi_spec_id` FK + `Service.openapi_path` |
179 | 179 | - [x] Preview generated services before applying — dedicated preview endpoint |
180 | 180 |
|
181 | | -### 11.2 Service Discovery Integration — DONE (DNS/SRV; Consul/K8s are stretch goals) |
182 | | -- [ ] Consul service discovery (watch for backend changes, auto-update upstream groups) |
183 | | -- [ ] Kubernetes service discovery (watch Services/Endpoints) |
| 181 | +### 11.2 Service Discovery Integration — DONE |
| 182 | +- [x] Consul service discovery (watch for backend changes, auto-update upstream groups) — `consul_resolver.ex` |
| 183 | +- [x] Kubernetes service discovery (watch Services/Endpoints) — `k8s_resolver.ex` |
184 | 184 | - [x] DNS-based discovery (SRV records) — `discovery_source.ex`, `dns_resolver.ex`, `dns_resolver/inet.ex` |
185 | 185 | - [x] Manual refresh + auto-sync toggle — `discovery_sync_worker.ex` background worker |
186 | 186 | - [x] Discovery source status in UI — `last_synced_at`, `last_sync_status`, `last_sync_error`, `last_sync_targets_count` |
|
208 | 208 | - [x] Customizable portal branding — `portal_title`, `portal_custom_css`, `portal_logo_url` |
209 | 209 | - [x] Usage analytics per API consumer |
210 | 210 |
|
211 | | -### 11.6 Secrets Management — DONE (Vault integration is a stretch goal) |
| 211 | +### 11.6 Secrets Management — DONE |
212 | 212 | - [x] Secrets store (encrypted at rest, scoped to project or environment) — `secrets/secret.ex`, `secret_crypto.ex` AES-GCM |
213 | 213 | - [x] Secret references in service config (e.g., `${secrets.NAME}`) — `secrets.ex` reference pattern |
214 | 214 | - [x] Secret injection into KDL at compile time (never stored in bundles in plaintext) — `kdl_generator.ex` `maybe_resolve_secrets` |
215 | | -- [ ] Vault integration (HashiCorp Vault as external secrets backend) |
| 215 | +- [x] Vault integration (HashiCorp Vault as external secrets backend) — `vault_client.ex`, `vault_config.ex` |
216 | 216 | - [x] Secret rotation workflows — `secrets.ex` `rotate_secret`, `last_rotated_at` tracking |
217 | 217 | - [x] Audit logging for secret access — audit logs on create/update/rotate |
218 | 218 |
|
219 | 219 | --- |
220 | 220 |
|
221 | | -## Remaining Stretch Goals |
222 | | - |
223 | | -Items that are not yet implemented but would add value: |
224 | | - |
225 | | -| Feature | Phase | Effort | Impact | |
226 | | -|---------|-------|--------|--------| |
227 | | -| ACME / Let's Encrypt auto-renewal | 8.1 | Medium | High — eliminates manual cert rotation | |
228 | | -| Internal CA for mTLS | 8.1 | Large | Medium — enterprise mTLS use cases | |
229 | | -| Trust store management | 8.1 | Small | Medium — upstream TLS verification | |
230 | | -| Circuit breaker health view status | 9.1 | Small | Low — observability improvement | |
231 | | -| WAF anomaly detection | 9.3 | Large | Medium — advanced threat detection | |
232 | | -| WAF event logging dashboard | 9.3 | Medium | Medium — security visibility | |
233 | | -| Consul service discovery | 11.2 | Medium | Medium — HashiCorp ecosystem | |
234 | | -| Kubernetes service discovery | 11.2 | Medium | High — K8s is dominant deployment target | |
235 | | -| Vault integration for secrets | 11.6 | Medium | Medium — enterprise secrets management | |
| 221 | +## Completed Stretch Goals |
| 222 | + |
| 223 | +All originally-identified stretch goals have been implemented: |
| 224 | + |
| 225 | +| Feature | Phase | Status | |
| 226 | +|---------|-------|--------| |
| 227 | +| ACME / Let's Encrypt auto-renewal | 8.1 | Done — `acme/client.ex`, `acme/renewal.ex`, `certificate_renewal_worker.ex` | |
| 228 | +| Internal CA for mTLS | 8.1 | Done — `internal_ca.ex`, `internal_ca_live/` | |
| 229 | +| Trust store management | 8.1 | Done — `trust_store.ex`, `trust_stores_live/` | |
| 230 | +| Circuit breaker health view status | 9.1 | Done — `circuit_breaker_status.ex`, upstream group show page | |
| 231 | +| WAF anomaly detection | 9.3 | Done — `waf_baseline.ex`, `waf_baseline_worker.ex`, `waf_anomaly.ex` | |
| 232 | +| WAF event logging dashboard | 9.3 | Done — `waf_event.ex`, `waf_live/index.ex`, `waf_live/show.ex` | |
| 233 | +| Consul service discovery | 11.2 | Done — `consul_resolver.ex` | |
| 234 | +| Kubernetes service discovery | 11.2 | Done — `k8s_resolver.ex` | |
| 235 | +| Vault integration for secrets | 11.6 | Done — `vault_client.ex`, `vault_config.ex` | |
236 | 236 |
|
237 | 237 | --- |
238 | 238 |
|
|
0 commit comments