Verify inbound SigV4 presigned URLs (query-string auth) in resolve_identity
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 55/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- aws, rust
- Ambito
- api, authentication
Direzione di ricerca
Inizia da crates/core/src/auth/identity.rs::resolve_identity e crates/core/src/auth/sigv4.rs::verify_sigv4_signature, quindi leggi i vettori esistenti in crates/core/src/auth/tests.rs. Aggiungi la verifica delle query presigned con i controlli di scadenza e dei token temporanei ed estendi i test per includere richieste valide, manomesse, scadute e autenticate tramite token. Il completamento include anche la minor release richiesta per i consumer downstream.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Add support for verifying inbound SigV4 presigned URLs (signature carried in the query string) in the auth layer. Today resolve_identity only authenticates requests whose SigV4 material is in the Authorization header; presigned requests are treated as anonymous.
This unblocks presigned-URL support in the Source Cooperative data proxy — see downstream issue: source-cooperative/data.source.coop#136. The proxy wants to issue standard AWS SigV4 presigned GET URLs (generated with STS temp creds) that browser data-viewers can fetch directly, while the proxy still streams the bytes.
Current behavior (the gap)
crates/core/src/auth/identity.rs::resolve_identity:
- Returns
ResolvedIdentity::Anonymouswhenever there is noAuthorizationheader. - Reads the session token (
x-amz-security-token) and payload hash (x-amz-content-sha256) from headers.
For a presigned URL, all SigV4 material is in the query string (X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders, X-Amz-Security-Token, X-Amz-Signature), and the canonical request is constructed differently. So presigned requests currently fail to authenticate.
Much of the machinery already exists and is reusable: crates/core/src/auth/sigv4.rs::verify_sigv4_signature already takes a query_string and canonicalize_query_string already sorts it; the SigV4Auth struct, signing-key derivation, and constant_time_eq can all be shared.
Proposed change
In crates/core/src/auth/sigv4.rs + crates/core/src/auth/identity.rs:
- Detect presigned requests in
resolve_identity— if the query containsX-Amz-Algorithm=AWS4-HMAC-SHA256(orX-Amz-Signature), take a presigned branch before theAnonymousearly-return. - Parse SigV4 from the query — new
parse_sigv4_presigned(query)producing aSigV4Auth(reuse the existing credential-scope split) plusexpiresand the security token. PullX-Amz-Credential,X-Amz-SignedHeaders,X-Amz-Signature,X-Amz-Date,X-Amz-Expires,X-Amz-Security-Token. - Presigned canonical-request variant — either parameterize
verify_sigv4_signatureor add a sibling:- Canonical query = all query params except
X-Amz-Signature, sorted/encoded (strip it, thencanonicalize_query_string). - Payload hash = the literal string
UNSIGNED-PAYLOAD. string_to_signdate comes from theX-Amz-Datequery param (not thex-amz-dateheader).- Reuse the existing signing-key derivation and
constant_time_eq.
- Canonical query = all query params except
- Enforce expiry — reject when
X-Amz-Date + X-Amz-Expires < now(small clock-skew allowance). - Session token — resolve
X-Amz-Security-Tokenthrough the existingcredential_resolver(TemporaryCredentialResolver), keep the access-key↔token match check, and return the sameResolvedIdentity::Authenticated. Everything downstream (authorize → presign-backend → stream) is unchanged.
Tests
Add AWS SigV4 presigned test vectors alongside the existing header-auth vectors in crates/core/src/auth/tests.rs:
- A known presigned canonical request → expected signature (positive).
- Tampered query param → signature mismatch.
X-Amz-Date + X-Amz-Expiresin the past → expired/denied.- With
X-Amz-Security-Tokenresolved via a stubTemporaryCredentialResolver→Authenticated.
Release
Cut a minor release so downstream consumers (the data proxy, currently on 0.4.0) can bump.
Filed alongside source-cooperative/data.source.coop#136.
- Lingua principale
- Rust
- Stelle
- 20
- Fork
- 1
- Merge medio
- 1g 8h
- PR unite (30g)
- 10
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di developmentseed/multistore
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
developmentseed/multistore#160 ·
I maintainer di solito rispondono entro 1 giorno
-
List of a prefix 503s when a single object key contains an empty path segment (//)Forse già presa @alukach l’ha presa 99 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
developmentseed/multistore#116 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
developmentseed/multistore#89 ·
I maintainer di solito rispondono entro 1 giorno
-
oidc-provider: optional `oidc_session_name` backend-option to override RoleSessionName derivationAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
developmentseed/multistore#84 ·
I maintainer di solito rispondono entro 1 giorno
-
Credential cache key (role ARN) doesn't capture the full minted identity (subject + extra_claims)Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
developmentseed/multistore#81 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di developmentseed/multistore
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
swc-project/swc-next#1165 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
Alive24/shea-symphony#574 ·
-
bug tests Windows
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
documentation good first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
dev-five-git/devup-ui#879 ·
I maintainer di solito rispondono entro 11 giorni
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
farion1231/cc-switch#9038 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno