You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

7.6 KiB

SeaweedFS Policy Evaluation Engine

This document describes the comprehensive policy evaluation engine that has been added to SeaweedFS, providing AWS S3-compatible policy support while maintaining full backward compatibility with existing identities.json configuration.

Overview

The policy engine provides:

  • Full AWS S3 policy compatibility - JSON policies with conditions, wildcards, and complex logic
  • Backward compatibility - Existing identities.json continues to work unchanged
  • Bucket policies - Per-bucket access control policies
  • IAM policies - User and group-level policies
  • Condition evaluation - IP restrictions, time-based access, SSL-only, etc.
  • AWS-compliant evaluation order - Explicit Deny > Explicit Allow > Default Deny

Architecture

Files Created

  1. policy_engine/types.go - Core policy data structures and validation
  2. policy_engine/conditions.go - Condition evaluators (StringEquals, IpAddress, etc.)
  3. policy_engine/engine.go - Main policy evaluation engine
  4. policy_engine/integration.go - Integration with existing IAM system
  5. policy_engine/engine_test.go - Comprehensive tests
  6. policy_engine/examples.go - Usage examples and documentation (excluded from builds)
  7. policy_engine/wildcard_matcher.go - Optimized wildcard pattern matching
  8. policy_engine/wildcard_matcher_test.go - Wildcard matching tests

Key Components

PolicyEngine
├── Bucket Policies (per-bucket JSON policies)
├── User Policies (converted from identities.json + new IAM policies)
├── Condition Evaluators (IP, time, string, numeric, etc.)
└── Evaluation Logic (AWS-compliant precedence)

Backward Compatibility

Existing identities.json (No Changes Required)

Your existing configuration continues to work exactly as before:

{
  "identities": [
    {
      "name": "readonly_user",
      "credentials": [{"accessKey": "key123", "secretKey": "secret123"}],
      "actions": ["Read:public-bucket/*", "List:public-bucket"]
    }
  ]
}

Legacy actions are automatically converted to AWS-style policies:

  • Read:bucket/*s3:GetObject on arn:aws:s3:::bucket/*
  • Write:buckets3:PutObject, s3:DeleteObject on arn:aws:s3:::bucket/*
  • Admins3:* on arn:aws:s3:::*

New Capabilities

1. Bucket Policies

Set bucket-level policies using standard S3 API:

# Set bucket policy
curl -X PUT "http://localhost:8333/bucket?policy" \
     -H "Authorization: AWS access_key:signature" \
     -d '{
       "Version": "2012-10-17",
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": "*",
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::bucket/*"
         }
       ]
     }'

# Get bucket policy
curl "http://localhost:8333/bucket?policy"

# Delete bucket policy
curl -X DELETE "http://localhost:8333/bucket?policy"

2. Advanced Conditions

Support for all AWS condition operators:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::secure-bucket/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": ["192.168.1.0/24", "10.0.0.0/8"]
        },
        "Bool": {
          "aws:SecureTransport": "true"
        },
        "DateGreaterThan": {
          "aws:CurrentTime": "2023-01-01T00:00:00Z"
        }
      }
    }
  ]
}

3. Supported Condition Operators

  • String: StringEquals, StringNotEquals, StringLike, StringNotLike
  • Numeric: NumericEquals, NumericLessThan, NumericGreaterThan, etc.
  • Date: DateEquals, DateLessThan, DateGreaterThan, etc.
  • IP: IpAddress, NotIpAddress (supports CIDR notation)
  • Boolean: Bool
  • ARN: ArnEquals, ArnLike
  • Null: Null

4. Condition Keys

Standard AWS condition keys are supported:

  • aws:CurrentTime - Current request time
  • aws:SourceIp - Client IP address
  • aws:SecureTransport - Whether HTTPS is used
  • aws:UserAgent - Client user agent
  • s3:x-amz-acl - Requested ACL
  • s3:VersionId - Object version ID
  • And many more...

Policy Evaluation

Evaluation Order (AWS-Compatible)

  1. Explicit Deny - If any policy explicitly denies access → DENY
  2. Explicit Allow - If any policy explicitly allows access → ALLOW
  3. Default Deny - If no policy matches → DENY

Policy Sources (Evaluated Together)

  1. Bucket Policies - Stored per-bucket, highest priority
  2. User Policies - Converted from identities.json + new IAM policies
  3. Legacy IAM - For backward compatibility (lowest priority)

Examples

Public Read Bucket

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicRead",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::public-bucket/*"
    }
  ]
}

IP-Restricted Bucket

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::secure-bucket/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "192.168.1.0/24"
        }
      }
    }
  ]
}

SSL-Only Access

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": ["arn:aws:s3:::ssl-bucket/*", "arn:aws:s3:::ssl-bucket"],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

Integration

For Existing SeaweedFS Users

  1. No changes required - Your existing setup continues to work
  2. Optional enhancement - Add bucket policies for fine-grained control
  3. Gradual migration - Move to full AWS policies over time

For New Users

  1. Start with either identities.json or AWS-style policies
  2. Use bucket policies for complex access patterns
  3. Full feature parity with AWS S3 policies

Testing

Run the policy engine tests:

# Core policy tests
go test -v -run TestPolicyEngine

# Condition evaluator tests  
go test -v -run TestConditionEvaluators

# Legacy compatibility tests
go test -v -run TestConvertIdentityToPolicy

# Validation tests
go test -v -run TestPolicyValidation

Performance

  • Compiled patterns - Regex patterns are pre-compiled for fast matching
  • Cached policies - Policies are cached in memory with TTL
  • Early termination - Evaluation stops on first explicit deny
  • Minimal overhead - Backward compatibility with minimal performance impact

Migration Path

Phase 1: Backward Compatible (Current)

  • Keep existing identities.json unchanged
  • Add bucket policies as needed
  • Legacy actions automatically converted to AWS policies

Phase 2: Enhanced (Optional)

  • Add advanced conditions to policies
  • Use full AWS S3 policy features
  • Maintain backward compatibility

Phase 3: Full Migration (Future)

  • Migrate to pure IAM policies
  • Use AWS CLI/SDK for policy management
  • Complete AWS S3 feature parity

Compatibility

  • Full backward compatibility with existing identities.json
  • AWS S3 API compatibility for bucket policies
  • Standard condition operators and keys
  • Proper evaluation precedence (Deny > Allow > Default Deny)
  • Performance optimized with caching and compiled patterns

The policy engine provides a seamless upgrade path from SeaweedFS's existing simple IAM system to full AWS S3-compatible policies, giving you the best of both worlds: simplicity for basic use cases and power for complex enterprise scenarios.