[ 
https://issues.apache.org/jira/browse/HDDS-16958?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Siyao Meng updated HDDS-16958:
------------------------------
    Attachment: 
CR-1-include-rotation-check-interval-in-delegation-token-guard.patch

> OM delegation token and secret key duration guard ignores 
> hdds.secret.key.rotate.check.duration
> -----------------------------------------------------------------------------------------------
>
>                 Key: HDDS-16958
>                 URL: https://issues.apache.org/jira/browse/HDDS-16958
>             Project: Apache Ozone
>          Issue Type: Bug
>            Reporter: Siyao Meng
>            Priority: Minor
>         Attachments: 
> CR-1-include-rotation-check-interval-in-delegation-token-guard.patch, 
> TestBugCR1TokenOutlivesSecretKey.java
>
>
> h3. Mechanism
> HDDS-13343 added a startup guard in 
> {{OzoneManager.createDelegationTokenSecretManager}}: OM refuses to start 
> unless {{hdds.secret.key.rotate.duration}} + 
> {{ozone.manager.delegation.token.max-lifetime}} + 
> {{ozone.manager.delegation.remover.scan.interval}} <= 
> {{hdds.secret.key.expiry.duration}}. The formula assumes that a secret key 
> signs tokens for exactly the rotate duration. It can sign for up to two 
> {{hdds.secret.key.rotate.check.duration}} longer:
> * SCM rotates only when {{SecretKeyManagerService}} runs, every rotation 
> check interval, so the rotation is up to one interval late.
> * {{DefaultSecretKeySignerClient}} on OM polls SCM for a new key at the 
> rotate duration of its current key and then every rotation check interval, so 
> OM keeps signing with the old key for up to one more interval.
> With R = rotate duration, C = rotation check duration, L = token max lifetime 
> and E = key expiry duration, the last token signed with a key can have a max 
> date of up to key creation + R + 2C + L, while SCM may remove the key at the 
> first rotation after key creation + E. If E < R + 2C + L, the key can be gone 
> before the token's max date. An OM that has not cached the key (after a 
> failover, or because it never verified a token of that key) then rejects the 
> token: {{verifySignature}} logs "Secret verify key ... not found" and the 
> client gets "Tampered/Invalid token.". An OM restarted after the removal 
> skips the token when it loads its tokens.
> h3. Trigger
> The guard already forces E >= R + L + remover scan interval, so this needs 
> both of the following:
> # The remover scan interval is shorter than two rotation check intervals.
> # The expiry duration is within two rotation check intervals of R + L.
> The default settings (R = 1d, C = 10m, E = 9d, L = 7d, scan interval 1h) are 
> not affected, and neither is any expiry duration that the guard accepts as 
> long as the rotation check interval is at most half of the remover scan 
> interval. The two conditions are necessary, not sufficient: SCM removes an 
> expired key only at a rotation, so whether a key is hit depends on how the 
> two timers line up. The check in the patch is the worst case bound. The 
> reproduction below uses a rotation check interval close to the rotate 
> duration.
> h3. Impact
> A delegation token signed shortly before OM switches to a new key is rejected 
> at most two rotation check intervals before its max date, on an OM that does 
> not have the key cached. Only configurations whose expiry duration is within 
> two rotation check intervals of R + L are affected, which the guard allows 
> only when the remover scan interval is shorter than two rotation check 
> intervals. Block and container tokens were not examined.
> h3. Reproduction
> PASS in about two minutes, unmodified source. 
> [^TestBugCR1TokenOutlivesSecretKey.java] ({{hadoop-ozone/integration-test}}) 
> starts a Kerberos secured SCM and OM with R = 18s, C = 15s, E = 89s, L = 70s 
> and a scan interval of 1s, which the guard accepts (18 + 70 + 1 = 89). It 
> requests tokens until OM has switched keys twice, keeps the last token of the 
> previous key and waits until SCM has removed that key. In the run SCM removed 
> the key 18.3s before the max date of the token, and the token was then 
> rejected with "Tampered/Invalid token." 18.2s before its max date, while a 
> token of the current key was accepted. A passing test means the defect is 
> present.
> h3. Patch
> [^CR-1-include-rotation-check-interval-in-delegation-token-guard.patch], 
> against 025266b52a6dcaf39508607cad736799c40907e8. It also applies to master 
> at a65a32e7c4b.
> The guard gets a second condition, R + L + 2C <= E, with its own message, and 
> the descriptions of {{ozone.manager.delegation.token.max-lifetime}} and 
> {{hdds.secret.key.expiry.duration}} in {{ozone-default.xml}} name it. The 
> existing condition is unchanged. The default settings and the compose and 
> test configurations in the tree pass, except {{TestSecretKeySnapshot}}, which 
> sits exactly on the old minimum (R = 30s, C = 1s, E = 61s, L = 30s, scan 
> interval 1s) and gets a token lifetime that is one check interval shorter.
> Compatibility: OM refuses to start on a configuration that violates the new 
> condition, like the HDDS-13343 check next to it. The configurations that 
> start today and are refused after the change are those with R + L + scan 
> interval <= E < R + L + 2C, for example the default settings with C = 1h and 
> E = 8d1h. The new condition is a worst case bound, sufficient but not 
> necessary, so it also refuses configurations in which the timers never line 
> up. Logging a warning instead of refusing to start is the alternative if 
> reviewers prefer it. Adding 2C to the existing sum (R + L + scan interval + 
> 2C <= E) was considered and not chosen, because it would also refuse 
> configurations in which no unexpired token can lose its key.
> Covered by a second case in the existing guard check of 
> {{TestSecureOzoneCluster.testSecureScmAndOmStartupAndAccessControl}}: E = 
> 8d1h with C = 1h passes the old condition and is now refused. Without the 
> change the test fails because OM starts. With it {{TestSecureOzoneCluster}} 
> (9 tests), {{TestSecretKeySnapshot}}, {{TestDelegationToken}} and 
> {{TestBlockTokens}} pass and checkstyle is clean. With the patch the 
> reproduction fails when it creates the OM, with the new message.
> Found by code review of the SCM secret key rotation and distribution paths, 
> as part of the TLA+ verification effort under HDDS-15926, on commit 
> 025266b52a6dcaf39508607cad736799c40907e8. Checked against HDDS issues and 
> apache/ozone pull requests for duplicates before filing. The attached patch 
> is a proposal for review. Generated with Specula (Claude Opus 5.5).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to