feat(AUDIT-WP-0008): admit governed E2 probe ingress
Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a025c2-407a-7a32-b40a-f37a52f03f62
This commit is contained in:
parent
34f0077a9b
commit
5b5196eea7
4 changed files with 80 additions and 10 deletions
|
|
@ -37,6 +37,32 @@ spec:
|
||||||
---
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: NetworkPolicy
|
kind: NetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: audit-core-whitehat-ingress
|
||||||
|
namespace: audit-core
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: audit-core
|
||||||
|
policyTypes: [Ingress]
|
||||||
|
ingress:
|
||||||
|
# Governed E2 evidence plane. Both selectors belong to one peer and are
|
||||||
|
# therefore ANDed: only the registered audit-core probe in the dedicated
|
||||||
|
# whitehat namespace reaches this port. Application sender authentication
|
||||||
|
# and tenant scope remain the inner boundary.
|
||||||
|
- from:
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
kubernetes.io/metadata.name: whitehat
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
whitehat.security/plane: "true"
|
||||||
|
whitehat.security/target: audit-core
|
||||||
|
ports:
|
||||||
|
- {protocol: TCP, port: 8080}
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: NetworkPolicy
|
||||||
metadata:
|
metadata:
|
||||||
name: audit-core-operator-ingress
|
name: audit-core-operator-ingress
|
||||||
namespace: audit-core
|
namespace: audit-core
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,21 @@ custody defect: stop and investigate.
|
||||||
|
|
||||||
## Sender credential rotation
|
## Sender credential rotation
|
||||||
|
|
||||||
|
### Governed E2 evidence identities
|
||||||
|
|
||||||
|
The `whitehat` test plane has a dedicated ingress policy. It admits only pods
|
||||||
|
in namespace `whitehat` carrying both `whitehat.security/plane: "true"` and
|
||||||
|
`whitehat.security/target: audit-core`; bearer authentication and sender scope
|
||||||
|
still apply to every request. The policy is connectivity, not authorization.
|
||||||
|
|
||||||
|
A dated `live-e2` engagement may request exactly two temporary identities. Each
|
||||||
|
identity is bound to `source=whitehat-security`, one named synthetic tenant,
|
||||||
|
`may_write=true`, and `may_read=true`. Provision token values only through the
|
||||||
|
sanctioned sender-registry custody lane and the plane's mount-only credential
|
||||||
|
projection. Never reuse the production `user-engine` identity. Revoke both
|
||||||
|
identities and remove their registry entries when the plane lease ends; an
|
||||||
|
engagement is incomplete until that cleanup is evidenced.
|
||||||
|
|
||||||
OpenBao path `platform/workloads/audit-core/senders` is the authority for
|
OpenBao path `platform/workloads/audit-core/senders` is the authority for
|
||||||
ExternalSecret `audit-core-senders`. The initial in-cluster registry was
|
ExternalSecret `audit-core-senders`. The initial in-cluster registry was
|
||||||
wrap-migrated on 2026-08-14 without printing or staging its values; do not
|
wrap-migrated on 2026-08-14 without printing or staging its values; do not
|
||||||
|
|
|
||||||
26
tests/test_networkpolicies.py
Normal file
26
tests/test_networkpolicies.py
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_whitehat_ingress_is_bound_to_namespace_and_target_labels():
|
||||||
|
documents = (ROOT / "deploy" / "networkpolicies.yaml").read_text().split("\n---\n")
|
||||||
|
policy = next(
|
||||||
|
document
|
||||||
|
for document in documents
|
||||||
|
if "name: audit-core-whitehat-ingress" in document
|
||||||
|
)
|
||||||
|
|
||||||
|
# Both selectors must remain in the same `from` peer. Splitting them into
|
||||||
|
# two list items changes AND to OR and would admit every pod in either set.
|
||||||
|
expected_peer = """ - namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
kubernetes.io/metadata.name: whitehat
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
whitehat.security/plane: \"true\"
|
||||||
|
whitehat.security/target: audit-core"""
|
||||||
|
assert expected_peer in policy
|
||||||
|
assert policy.count(" - namespaceSelector:") == 1
|
||||||
|
assert " - {protocol: TCP, port: 8080}" in policy
|
||||||
|
|
@ -393,17 +393,20 @@ minute, and requires two temporary read-enabled identities each scoped to one
|
||||||
fixture tenant. The production `user-engine` identity remains unchanged and is
|
fixture tenant. The production `user-engine` identity remains unchanged and is
|
||||||
not a test credential.
|
not a test credential.
|
||||||
|
|
||||||
Whitehat supplied a production engagement record at `3770b41` and a bounded
|
Whitehat supplied and corrected a bounded adapter, including audit-core's
|
||||||
adapter at `7396fe7`. Target review found that the adapter omits audit-core's
|
required `Idempotency-Key` and deterministic retry payloads. The original
|
||||||
required `Idempotency-Key` header on POST, so it would abort fixture seeding
|
production engagement was then cancelled at the session cutoff with zero
|
||||||
with `idempotency_key_mismatch` and cannot yet produce evidence. Review reply
|
target requests and its identifier is terminal. Whitehat subsequently added
|
||||||
`74b815ea-341f-455d-8fdb-2333f5753f76` accepted the two-identity fixture shape
|
the governed test-plane contract and fail-closed admission at `95129d7`.
|
||||||
in principle and requested that fix plus corrected production-approval and
|
|
||||||
owner-acknowledgement provenance before formal acknowledgement.
|
|
||||||
|
|
||||||
This is progress, not evidence and not live authorization. T05 becomes `done`
|
Audit-core now declares a dedicated ingress peer for that plane: only a pod in
|
||||||
only when the corrected engagement is acknowledged, the bounded run completes,
|
namespace `whitehat` carrying both the plane and `target=audit-core` labels can
|
||||||
and its sanitized target report has been routed to `risk-nexus`.
|
reach port 8080 through it. Authentication and tenant scope remain mandatory.
|
||||||
|
The operator runbook records the exact two-identity fixture shape and cleanup
|
||||||
|
obligation. This is readiness, not evidence or live authorization. T05 becomes
|
||||||
|
`done` only after a new engagement is approved and owner-acknowledged, the
|
||||||
|
cluster plane and value-safe custody broker are provisioned, the bounded run
|
||||||
|
completes, and its sanitized target report reaches `risk-nexus`.
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: AUDIT-WP-0008-T06
|
id: AUDIT-WP-0008-T06
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue