Added detailed debug logging to identify the root cause of JWT authentication
failures in S3 IAM integration tests.
### Debug Logging Added:
**1. IsActionAllowed method (iam_manager.go):**
- Session token validation progress
- Role name extraction from principal ARN
- Role definition lookup
- Policy evaluation steps and results
- Detailed error reporting at each step
**2. ValidateJWTWithClaims method (token_utils.go):**
- Token parsing and validation steps
- Signing method verification
- Claims structure validation
- Issuer validation
- Session ID validation
- Claims validation method results
**3. JWT Token Generation (s3_iam_framework.go):**
- Updated to use exact field names matching STSSessionClaims struct
- Added all required claims with proper JSON tags
- Ensured compatibility with STS service expectations
### Key Findings:
- Error changed from 403 AccessDenied to 501 NotImplemented after rebuild
- This suggests the issue may be AWS SDK header compatibility
- The 501 error matches the original GitHub Actions failure
- JWT authentication flow debugging infrastructure now in place
### Next Steps:
- Investigate the 501 NotImplemented error
- Check AWS SDK header compatibility with SeaweedFS S3 implementation
- The debug logs will help identify exactly where authentication fails
This provides comprehensive visibility into the JWT authentication flow
to identify and resolve the remaining authentication issues.
Fixed the critical issues identified in GitHub PR review that were causing
JWT authentication failures in S3 IAM integration tests.
### Problem Identified:
- evaluateStringCondition function was a stub that always returned shouldMatch
- Trust policy validation was doing basic checks instead of proper evaluation
- String conditions (StringEquals, StringNotEquals, StringLike) were ignored
- JWT authentication failing with errCode=1 (AccessDenied)
### Solution Implemented:
**1. Fixed evaluateStringCondition in policy engine:**
- Implemented proper string condition evaluation with context matching
- Added support for exact matching (StringEquals/StringNotEquals)
- Added wildcard support for StringLike conditions using filepath.Match
- Proper type conversion for condition values and context values
**2. Implemented comprehensive trust policy validation:**
- Added parseJWTTokenForTrustPolicy to extract claims from web identity tokens
- Created evaluateTrustPolicy method with proper Principal matching
- Added support for Federated principals (OIDC/SAML)
- Implemented trust policy condition evaluation
- Added proper context mapping (seaweed:FederatedProvider, etc.)
**3. Enhanced IAM manager with trust policy evaluation:**
- validateTrustPolicyForWebIdentity now uses proper policy evaluation
- Extracts JWT claims and maps them to evaluation context
- Supports StringEquals, StringNotEquals, StringLike conditions
- Proper Principal matching for Federated identity providers
### Technical Details:
- Added filepath import for wildcard matching
- Added base64, json imports for JWT parsing
- Trust policies now check Principal.Federated against token idp claim
- Context values properly mapped: idp → seaweed:FederatedProvider
- Condition evaluation follows AWS IAM policy semantics
### Addresses GitHub PR Review:
This directly fixes the issue mentioned in the PR review about
evaluateStringCondition being a stub that doesn't implement actual
logic for StringEquals, StringNotEquals, and StringLike conditions.
The trust policy validation now properly enforces policy conditions,
which should resolve the JWT authentication failures.
This change makes filer stores the default for all IAM components, requiring
explicit configuration only when different storage is needed.
### Changes Made:
#### Default Store Types Updated:
- STS Session Store: memory → filer (persistent sessions)
- Policy Engine: memory → filer (persistent policies)
- Role Store: memory → filer (persistent roles)
#### Code Updates:
- STSService: Default sessionStoreType now uses DefaultStoreType constant
- PolicyEngine: Default storeType changed to filer for persistence
- IAMManager: Default roleStore changed to filer for persistence
- Added DefaultStoreType constant for consistent configuration
#### Configuration Simplification:
- iam_config_distributed.json: Removed redundant filer specifications
- Only specify storeType when different from default (e.g. memory for testing)
### Benefits:
- Production-ready defaults with persistent storage
- Minimal configuration for standard deployments
- Clear intent: only specify when different from sensible defaults
- Backwards compatible: existing explicit configs continue to work
- Consistent with SeaweedFS distributed, persistent nature
This commit addresses the user feedback that configuration files should not
need to specify default paths when constants are available.
### Changes Made:
#### Configuration Simplification:
- Removed redundant basePath configurations from iam_config_distributed.json
- All stores now use constants for defaults:
* Sessions: /etc/iam/sessions (DefaultSessionBasePath)
* Policies: /etc/iam/policies (DefaultPolicyBasePath)
* Roles: /etc/iam/roles (DefaultRoleBasePath)
- Eliminated empty storeConfig objects entirely for cleaner JSON
#### Updated Store Implementations:
- FilerPolicyStore: Updated hardcoded path to use /etc/iam/policies
- FilerRoleStore: Updated hardcoded path to use /etc/iam/roles
- All stores consistently align with /etc/ filer convention
#### Runtime Filer Address Integration:
- Updated IAM manager methods to accept filerAddress parameter:
* AssumeRoleWithWebIdentity(ctx, filerAddress, request)
* AssumeRoleWithCredentials(ctx, filerAddress, request)
* IsActionAllowed(ctx, filerAddress, request)
* ExpireSessionForTesting(ctx, filerAddress, sessionToken)
- Enhanced S3IAMIntegration to store filerAddress from S3ApiServer
- Updated all test files to pass test filerAddress ('localhost:8888')
### Benefits:
- ✅ Cleaner, minimal configuration files
- ✅ Consistent use of well-defined constants for defaults
- ✅ No configuration needed for standard use cases
- ✅ Runtime filer address flexibility maintained
- ✅ Aligns with SeaweedFS /etc/ convention throughout
### Breaking Change:
- S3IAMIntegration constructor now requires filerAddress parameter
- All IAM manager methods now require filerAddress as second parameter
- Tests and middleware updated accordingly
MAJOR ENHANCEMENT: Complete FilerPolicyStore for Distributed Policy Storage
🏆 PRODUCTION-READY POLICY PERSISTENCE:
- Full SeaweedFS filer integration for distributed policy storage
- JSON serialization with pretty formatting for human readability
- Configurable filer address and base path (/seaweedfs/iam/policies)
- Graceful error handling with proper SeaweedFS client patterns
- File-level security with 0600 permissions (owner read/write only)
✅ COMPREHENSIVE POLICY OPERATIONS:
- StorePolicy: Serialize and store policy documents as JSON files
- GetPolicy: Retrieve and deserialize policies with validation
- DeletePolicy: Delete policies with not-found error tolerance
- ListPolicies: Batch listing with filename parsing and extraction
🚀 ENTERPRISE-GRADE FEATURES:
- Persistent policy storage survives server restarts and failures
- Distributed policy sharing across SeaweedFS cluster nodes
- Batch processing with pagination for efficient policy listing
- Automatic policy file naming (policy_[name].json) for organization
- Pretty-printed JSON for configuration management and debugging
🔧 SEAMLESS INTEGRATION PATTERNS:
- SetFilerClient: Dynamic filer connection configuration
- withFilerClient: Consistent error handling and connection management
- Compatible with existing SeaweedFS filer client conventions
- Follows pb.WithGrpcFilerClient patterns for reliability
- Proper gRPC dial options and server addressing
✅ ROBUST ERROR HANDLING & RELIABILITY:
- Graceful handling of 'not found' errors during deletion
- JSON validation and deserialization error recovery
- Connection failure tolerance with detailed error messages
- Batch listing with stream processing for large policy sets
- Automatic cleanup of malformed policy files
🎯 PRODUCTION USE CASES SUPPORTED:
- Multi-node SeaweedFS deployments with shared policy state
- Policy persistence across server restarts and maintenance
- Distributed IAM policy management for S3 API access
- Enterprise-grade policy templates and custom policies
- Scalable policy management for high-availability deployments
🔒 SECURITY & COMPLIANCE:
- File permissions set to owner-only access (0600)
- Policy data encrypted in transit via gRPC
- Secure policy file naming with structured prefixes
- Namespace isolation with configurable base paths
- Audit trail support through filer metadata
This enables enterprise IAM deployments with persistent, distributed
policy management using SeaweedFS's proven filer infrastructure!
All policy tests passing ✅ - Ready for production deployment
Supporting changes for full IAM integration:
✅ ENHANCED MOCK PROVIDERS:
- LDAP mock provider with complete authentication support
- OIDC mock provider with token compatibility improvements
- Better test data separation between mock and production code
✅ IMPROVED POLICY VALIDATION:
- Trust policy validation separate from resource policies
- Enhanced policy engine test coverage
- Better policy document structure validation
✅ REFINED STS SERVICE:
- Improved session management and validation
- Better error handling and edge cases
- Enhanced test coverage for complex scenarios
These changes provide the foundation for the integrated IAM system.