feat: adopt security zones and explicit workload refs
Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a0291a-1e87-7151-9934-fcbfe3f65eb1
This commit is contained in:
parent
12c637cbf2
commit
7ce58ae638
52 changed files with 1547 additions and 658 deletions
|
|
@ -27,6 +27,17 @@ def _spec(pubkey_path: Path) -> CertSpec:
|
|||
)
|
||||
|
||||
|
||||
def _zone_registry(tmp_path: Path, zone: str) -> Path:
|
||||
path = tmp_path / "registry.json"
|
||||
path.write_text(
|
||||
'{"resource_manifests":[{"resources":[{"id":'
|
||||
'"ssh-cert:actor/agt-state-hub-bridge","attributes":{'
|
||||
f'"security_zone":"{zone}","security_zone_admission":"satisfied"'
|
||||
'}}]}]}'
|
||||
)
|
||||
return path
|
||||
|
||||
|
||||
def test_pubkey_fingerprint(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA test\n")
|
||||
|
|
@ -35,26 +46,32 @@ def test_pubkey_fingerprint(tmp_path):
|
|||
assert len(fp) == 7 + 64
|
||||
|
||||
|
||||
def test_disabled_returns_none(tmp_path):
|
||||
def test_unconfigured_evaluator_uses_unknown_fail_open_profile(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=False)
|
||||
assert check_sign_policy(cfg, _spec(pubkey)) is None
|
||||
cfg = PolicyConfig()
|
||||
spec = _spec(pubkey)
|
||||
assert check_sign_policy(cfg, spec) is None
|
||||
assert spec.policy_zone == "unknown"
|
||||
assert spec.policy_failure_mode == "fail_open"
|
||||
assert spec.policy_outcome == "fail_open"
|
||||
|
||||
|
||||
def test_allow_returns_decision_id(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=True, flex_auth_url="http://flex-auth.test")
|
||||
cfg = PolicyConfig(flex_auth_url="http://flex-auth.test")
|
||||
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {"effect": "allow", "id": "dec-123"}
|
||||
mock_response.raise_for_status = MagicMock()
|
||||
|
||||
spec = _spec(pubkey)
|
||||
with patch("warden.policy.httpx.post", return_value=mock_response) as post:
|
||||
result = check_sign_policy(cfg, _spec(pubkey))
|
||||
result = check_sign_policy(cfg, spec)
|
||||
|
||||
assert result == "dec-123"
|
||||
assert spec.policy_outcome == "allow"
|
||||
post.assert_called_once()
|
||||
call_kwargs = post.call_args
|
||||
assert call_kwargs[0][0] == "http://flex-auth.test/v1/check"
|
||||
|
|
@ -67,7 +84,7 @@ def test_allow_returns_decision_id(tmp_path):
|
|||
def test_deny_raises_ca_error(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=True)
|
||||
cfg = PolicyConfig(flex_auth_url="http://flex-auth.test")
|
||||
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {
|
||||
|
|
@ -84,7 +101,10 @@ def test_deny_raises_ca_error(tmp_path):
|
|||
def test_unreachable_fail_closed_raises(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=True, fail_closed=True)
|
||||
cfg = PolicyConfig(
|
||||
flex_auth_url="http://flex-auth.test",
|
||||
zone_registry_path=_zone_registry(tmp_path, "z3-critical"),
|
||||
)
|
||||
|
||||
with patch(
|
||||
"warden.policy.httpx.post",
|
||||
|
|
@ -97,7 +117,7 @@ def test_unreachable_fail_closed_raises(tmp_path):
|
|||
def test_unreachable_fail_open_returns_none(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=True, fail_closed=False)
|
||||
cfg = PolicyConfig(flex_auth_url="http://flex-auth.test")
|
||||
|
||||
with patch(
|
||||
"warden.policy.httpx.post",
|
||||
|
|
@ -109,7 +129,10 @@ def test_unreachable_fail_open_returns_none(tmp_path):
|
|||
def test_http_error_fail_closed_raises(tmp_path):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=True, fail_closed=True)
|
||||
cfg = PolicyConfig(
|
||||
flex_auth_url="http://flex-auth.test",
|
||||
zone_registry_path=_zone_registry(tmp_path, "z3-critical"),
|
||||
)
|
||||
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 403
|
||||
|
|
@ -123,7 +146,7 @@ def test_http_error_fail_closed_raises(tmp_path):
|
|||
|
||||
|
||||
def test_missing_pubkey_raises(tmp_path):
|
||||
cfg = PolicyConfig(enabled=True)
|
||||
cfg = PolicyConfig(flex_auth_url="http://flex-auth.test")
|
||||
spec = _spec(tmp_path / "missing.pub")
|
||||
with pytest.raises(CAError, match="Public key not found"):
|
||||
check_sign_policy(cfg, spec)
|
||||
|
|
@ -132,7 +155,10 @@ def test_missing_pubkey_raises(tmp_path):
|
|||
def test_subject_from_env(tmp_path, monkeypatch):
|
||||
pubkey = tmp_path / "key.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA\n")
|
||||
cfg = PolicyConfig(enabled=True, subject_env="WARDEN_POLICY_SUBJECT")
|
||||
cfg = PolicyConfig(
|
||||
flex_auth_url="http://flex-auth.test",
|
||||
subject_env="WARDEN_POLICY_SUBJECT",
|
||||
)
|
||||
monkeypatch.setenv("WARDEN_POLICY_SUBJECT", "iam:bernd")
|
||||
|
||||
mock_response = MagicMock()
|
||||
|
|
@ -212,7 +238,7 @@ def test_sign_policy_sends_authorization_header(tmp_path, monkeypatch):
|
|||
pubkey.write_text("ssh-ed25519 AAAA test\n")
|
||||
|
||||
cfg = PolicyConfig(
|
||||
enabled=True,
|
||||
flex_auth_url="http://flex-auth.test",
|
||||
caller_auth=CallerAuthConfig(mode="file", token_path=token_file),
|
||||
)
|
||||
spec = CertSpec(
|
||||
|
|
@ -250,8 +276,8 @@ def test_sign_policy_fail_closed_when_caller_token_unavailable(tmp_path):
|
|||
pubkey = tmp_path / "id.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA test\n")
|
||||
cfg = PolicyConfig(
|
||||
enabled=True,
|
||||
fail_closed=True,
|
||||
flex_auth_url="http://flex-auth.test",
|
||||
zone_registry_path=_zone_registry(tmp_path, "z3-critical"),
|
||||
caller_auth=CallerAuthConfig(mode="file", token_path=tmp_path / "absent"),
|
||||
)
|
||||
spec = CertSpec(
|
||||
|
|
@ -263,3 +289,21 @@ def test_sign_policy_fail_closed_when_caller_token_unavailable(tmp_path):
|
|||
)
|
||||
with pytest.raises(CAError, match="caller identity unavailable"):
|
||||
policy_mod.check_sign_policy(cfg, spec)
|
||||
|
||||
|
||||
def test_advisory_decision_is_recorded_and_does_not_block(tmp_path):
|
||||
pubkey = tmp_path / "id.pub"
|
||||
pubkey.write_text("ssh-ed25519 AAAA test\n")
|
||||
cfg = PolicyConfig(flex_auth_url="http://flex-auth.test")
|
||||
response = MagicMock()
|
||||
response.json.return_value = {
|
||||
"effect": "audit_only",
|
||||
"reason": "advisory_would_deny_disallowed_principal",
|
||||
"id": "decision:advisory",
|
||||
}
|
||||
response.raise_for_status = MagicMock()
|
||||
spec = _spec(pubkey)
|
||||
with patch("warden.policy.httpx.post", return_value=response):
|
||||
assert check_sign_policy(cfg, spec) == "decision:advisory"
|
||||
assert spec.policy_zone == "unknown"
|
||||
assert spec.policy_outcome == "audit_only"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue