1 changed files with 0 additions and 96 deletions
@ -1,96 +0,0 @@ |
|||||
# Fix for GitHub Issue #7941: AWS SDK Signature V4 with STS Credentials |
|
||||
|
|
||||
## Problem |
|
||||
|
|
||||
AWS SDK clients were failing with `InvalidAccessKeyId` when using temporary credentials obtained from `AssumeRoleWithWebIdentity`. The issue occurred because: |
|
||||
|
|
||||
1. SeaweedFS STS service correctly returns temporary credentials (AccessKeyId, SecretAccessKey, SessionToken) |
|
||||
2. AWS SDKs send requests with these credentials using AWS Signature V4: |
|
||||
- Authorization header contains the temporary AccessKeyId |
|
||||
- X-Amz-Security-Token header contains the JWT session token |
|
||||
3. SeaweedFS was only checking the `accessKeyIdent` map for the AccessKeyId, which doesn't contain temporary STS credentials (they're stateless, stored in JWT tokens) |
|
||||
4. This caused the lookup to fail with `InvalidAccessKeyId` error |
|
||||
|
|
||||
## Root Cause |
|
||||
|
|
||||
The authentication flow in `auth_signature_v4.go` was: |
|
||||
``` |
|
||||
getRequestAuthType() → authTypeSigned |
|
||||
reqSignatureV4Verify() → verifyV4Signature() |
|
||||
verifyV4Signature() → lookupByAccessKey(accessKey) → FAILS |
|
||||
``` |
|
||||
|
|
||||
The code never checked for the `X-Amz-Security-Token` header, which is required for STS temporary credentials. |
|
||||
|
|
||||
## Solution |
|
||||
|
|
||||
Modified `verifyV4Signature()` in `weed/s3api/auth_signature_v4.go` to: |
|
||||
|
|
||||
1. Check for `X-Amz-Security-Token` header (or query parameter for presigned URLs) |
|
||||
2. If present, validate the session token using the STS service |
|
||||
3. Extract the temporary credentials from the JWT session token |
|
||||
4. Use those credentials for signature verification |
|
||||
5. If no session token, fall back to normal access key lookup |
|
||||
|
|
||||
Added new function `validateSTSSessionToken()` that: |
|
||||
- Validates the JWT session token using the STS service |
|
||||
- Extracts AccessKeyId and SecretAccessKey from the session |
|
||||
- Verifies the access key in the request matches the one in the token |
|
||||
- Checks session expiration |
|
||||
- Returns an Identity and Credential for use in signature verification |
|
||||
|
|
||||
## Files Modified |
|
||||
|
|
||||
1. **weed/s3api/auth_signature_v4.go** |
|
||||
- Modified `verifyV4Signature()` to check for X-Amz-Security-Token |
|
||||
- Added `validateSTSSessionToken()` function |
|
||||
|
|
||||
2. **weed/s3api/auth_sts_session_token_test.go** (new file) |
|
||||
- Added tests to verify X-Amz-Security-Token header detection |
|
||||
- Tests for both standard requests and presigned URLs |
|
||||
- Tests for requests with and without session tokens |
|
||||
|
|
||||
## Testing |
|
||||
|
|
||||
All existing tests pass, including: |
|
||||
- Signature V4 tests |
|
||||
- Authentication tests |
|
||||
- Presigned URL tests |
|
||||
|
|
||||
New tests added specifically for STS session token handling: |
|
||||
- `TestSTSSessionTokenHeaderDetection`: Verifies session token extraction |
|
||||
- `TestXAmzSecurityTokenInCanonicalRequest`: Verifies token handling in signature verification |
|
||||
|
|
||||
## AWS SDK Compatibility |
|
||||
|
|
||||
This fix enables full AWS SDK compatibility with STS temporary credentials: |
|
||||
|
|
||||
```python |
|
||||
import boto3 |
|
||||
|
|
||||
# Get temporary credentials from AssumeRoleWithWebIdentity |
|
||||
# (this already worked) |
|
||||
|
|
||||
# Use credentials with AWS SDK (this now works!) |
|
||||
client = boto3.client('s3', |
|
||||
aws_access_key_id='AKIA593f0bfac081db46', |
|
||||
aws_secret_access_key='...', |
|
||||
aws_session_token='eyJhbGciOiJIUzI1NiIs...', # Now properly handled! |
|
||||
endpoint_url='http://seaweedfs:8333/' |
|
||||
) |
|
||||
|
|
||||
client.list_buckets() # ✅ Works! |
|
||||
``` |
|
||||
|
|
||||
## Implementation Notes |
|
||||
|
|
||||
- The fix maintains backward compatibility - requests without session tokens continue to work as before |
|
||||
- Session token validation leverages the existing STS service infrastructure |
|
||||
- The solution is stateless - no session storage required, all info is in the JWT |
|
||||
- Supports both header-based and query-parameter-based session tokens (for presigned URLs) |
|
||||
|
|
||||
## References |
|
||||
|
|
||||
- GitHub Issue: https://github.com/seaweedfs/seaweedfs/issues/7941 |
|
||||
- AWS STS AssumeRoleWithWebIdentity: https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html |
|
||||
- AWS Signature V4 with session tokens: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue