This is an automated email from the ASF dual-hosted git repository.

smengcl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new d067ba38e7a HDDS-16367. Update threat model with information about 
internal protocols (#11185)
d067ba38e7a is described below

commit d067ba38e7aea917db7efd290b4af53987ec985a
Author: Ethan Rose <[email protected]>
AuthorDate: Wed Oct 7 17:00:17 2026 -0400

    HDDS-16367. Update threat model with information about internal protocols 
(#11185)
    
    Co-authored-by: Siyao Meng <[email protected]>
---
 THREAT_MODEL.md | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/THREAT_MODEL.md b/THREAT_MODEL.md
index 69f3b9bef13..60709a2654d 100644
--- a/THREAT_MODEL.md
+++ b/THREAT_MODEL.md
@@ -176,6 +176,23 @@ stock install and must be explicitly enabled:
   `hdds.secret.key.rotate.check.duration=10m`, and `HmacSHA256`.
 - **gRPC TLS** is off by default (`hdds.grpc.tls.enabled=false`) and protects
   gRPC traffic when enabled.
+- **Hadoop RPC service-level authorization** is off by default
+  (`hadoop.security.authorization=false`). When enabled, protocols registered 
by
+  a service's `PolicyProvider` are gated by service ACLs, such as
+  `hdds.security.client.scm.block.protocol.acl`,
+  `hdds.security.client.scm.container.protocol.acl`, and
+  `ozone.om.security.client.protocol.acl`, each defaulting to `*`.
+  ACLs match Hadoop short user names and groups after
+  `hadoop.security.auth_to_local` mapping, not full `service/host@REALM`
+  principals or `_HOST` patterns.
+  For the SCM block protocol, OM calls `allocateBlock`/`deleteKeyBlocks`, SCM
+  peers call `addSCM` during bootstrap, and both call `getScmInfo`. If these
+  services map to `om` and `scm`, its ACL can be `om,scm`.
+  `ozone.om.security.client.protocol.acl` must admit ordinary OM clients;
+  `ozone.om.security.admin.protocol.acl` gates OM inter-service/admin RPCs.
+  *(documented — `SCMPolicyProvider`, `OMPolicyProvider`,
+  `SCMBlockProtocolServer`, `HAUtils`, `ozone-default.xml`,
+  Hadoop `AccessControlList`.)*
 - **TDE/KMS** is optional and protects data at rest only for encrypted buckets;
   it requires a configured KMS, for example via 
`hadoop.security.key.provider.path`.
 
@@ -265,6 +282,14 @@ Per-boundary input trust (grouped by family):
 - **It does not author your authorization policy.** Ozone enforces ACLs/Ranger
   *as configured*; an over-broad Ranger policy or world-readable ACL is an
   operator decision, not an Ozone flaw (§10).
+- **Internal RPC service ACLs require operator configuration.** Enable
+  `hadoop.security.authorization` and configure each internal protocol's ACL,
+  such as `hdds.security.client.scm.block.protocol.acl`.
+  These ACLs default to `*`; selecting allowed service accounts is an operator
+  responsibility (§10). The SCM block protocol's `deleteKeyBlocks` relies on
+  protocol-level authorization without a per-method admin check.
+  SCM upgrade finalization uses the client/container-location protocol, where
+  `SCMClientProtocolServer.finalizeScmUpgrade` calls `checkAdminAccess`.
 - **It does not protect its dependencies.** KDC/Ranger/KMS/SCM-CA-key/network
   security are the operator's (§3/§10).
 - **No defence against a Byzantine majority** of a Ratis ring, and **no full
@@ -287,6 +312,13 @@ Per-boundary input trust (grouped by family):
 - **Secure the dependencies:** harden/operate the KDC, author least-privilege
   Ranger/ACL policies, protect the **SCM CA private key**, manage KMS keys,
   network-isolate datanode/Ratis/admin ports.
+- **Configure Hadoop RPC service ACLs:** enable `hadoop.security.authorization`
+  and allow the intended users/groups for each protocol. Restrict internal
+  protocols to their service accounts (SCM block → OM **and** SCM), and 
preserve
+  legitimate client/admin access to user-facing protocols.
+  `ozone.om.security.client.protocol.acl` must allow ordinary OM clients.
+  Leaving the SCM block ACL at `*` allows any authenticated caller to invoke
+  operations such as `deleteKeyBlocks`.
 - **Protect tokens and secrets:** enable the relevant transport encryption
   (Hadoop RPC privacy, gRPC TLS, and/or HTTPS) so block/delegation tokens and 
S3
   secrets aren't sniffable; rotate S3 secrets; review token lifetimes for the
@@ -322,6 +354,14 @@ list. *(requested by jojochuang, 2026-06-25.)*
   scoped (§6/§8).
 - **Ranger policy too permissive** — operator policy decision, not Ozone code
   (§9/§10). `OUT-OF-MODEL: trusted-input`.
+- **Internal service RPC relies on a configurable service ACL** — the absence
+  of a per-method admin check is not by itself a finding when every caller
+  admitted by the ACL is intended to perform that operation
+  (e.g. SCM block `deleteKeyBlocks`). A permissive operator-configured ACL is
+  `OUT-OF-MODEL: trusted-input` (§9/§10). This does not exempt bypassing the
+  configured ACL or removing method-level checks from protocols shared by
+  callers with different privileges. User-facing entry points must enforce
+  the applicable authorization checks (§8). *(inferred, Q-svcacl.)*
 - **Findings in `ozone-thirdparty`, `integration-test-*`, `*TestImpl`** —
   `OUT-OF-MODEL: unsupported-component` (§3).
 - **KDC/KMS/Ranger/SCM-CA-key compromise scenarios** — out of layer (§3/§7).
@@ -343,7 +383,7 @@ list. *(requested by jojochuang, 2026-06-25.)*
 | --- | --- | --- |
 | `VALID` | A §8 property breaks in secure mode, via an in-scope actor. | §8, 
§6, §7 |
 | `VALID-HARDENING` | No §8 break, but a §11 misuse is too easy to fall into. 
| §11 |
-| `OUT-OF-MODEL: trusted-input` | Requires control of operator config 
(Ranger/ACL/keys). | §6/§10 |
+| `OUT-OF-MODEL: trusted-input` | Requires control of operator config 
(Ranger/object ACL, service-protocol ACLs, keys). | §6/§10 |
 | `OUT-OF-MODEL: adversary-not-in-scope` | Needs 
KDC/CA-key/Byzantine-majority. | §7 |
 | `OUT-OF-MODEL: non-default-build` | Only in non-secure mode (or a 
discouraged knob). | §5a |
 | `OUT-OF-MODEL: unsupported-component` | thirdparty / test / infra Ozone 
doesn't own. | §3 |
@@ -384,6 +424,10 @@ list. *(requested by jojochuang, 2026-06-25.)*
   Folded into §5a.)* (§8.)
 - **Q-token.** Block/delegation token lifetimes, signing-key rotation, and the
   bearer-token caveat in §9 — confirm. (§8/§9.)
+- **Q-svcacl.** Confirm the intended security contract for internal RPCs such 
as
+  SCM block `deleteKeyBlocks`: is a correctly configured service ACL sufficient
+  authorization for these operations, without a per-method admin check?
+  Document the confirmed scope in §9/§11a. (§5a/§9/§10/§11a.)
 - **Q-tde / Q-net / Q-infra.** TDE/KMS production expectations, the
   network-isolation assumptions, and which dependencies (KDC/Ranger/KMS) you 
want
   explicitly named as operator-owned in §3/§10. (§5/§3/§10.)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to