Skip to main content

Comprehensive self-hosted security platform for Python developers

Project description

secfn Python SDK

Comprehensive self-hosted security platform for Python developers

Python implementation of secfn providing secrets management, access control, rate limiting, security monitoring, and secret scanning.

Overview

secfn is a comprehensive security toolkit that provides:

  • Secrets Vault: Encrypted secret storage with AES-256-GCM, rotation, and access logging
  • Access Control (RBAC): Role-based permissions with wildcard matching and caching
  • Rate Limiting: Token bucket algorithm with per-user, per-IP, and per-endpoint limits
  • Security Monitoring: Event logging, metrics, and anomaly detection
  • Secret Scanning: Detect hardcoded secrets in code with pattern matching

Installation

pip install secfn

Quick Start

1. Create SecFn Instance

from secfn import create_secfn, SecFnConfig

secfn = create_secfn(
    SecFnConfig(
        master_key="your-secure-master-key",
        storage_path=".secfn",
    )
)

2. Secrets Vault

# Create vault
vault = secfn.create_secrets_vault()

# Store a secret
await vault.set("stripe_api_key", "sk_live_...", options={
    "tags": ["payment", "production"],
    "environment": "production",
    "rotateEvery": 90 * 24 * 60 * 60 * 1000,  # 90 days
})

# Retrieve secret
api_key = await vault.get("stripe_api_key")

# List secrets (without values)
secrets = await vault.list(filter={"environment": "production"})

# Rotate secret
await vault.rotate("stripe_api_key", "sk_live_new...")

# Get access log
log = await vault.get_access_log("stripe_api_key", limit=100)

3. Access Control (RBAC)

# Create access control
access = secfn.create_access_control()

# Create roles
admin_role_id = await access.create_role(
    name="admin",
    permissions=["*:*"],
    description="Full system access"
)

editor_role_id = await access.create_role(
    name="editor",
    permissions=["project:read", "project:write", "file:read", "file:write"],
    description="Can edit projects and files"
)

# Assign role to user
await access.assign_role(
    user_id="user_123",
    role_id=editor_role_id,
    resource_ids=["project_abc", "project_def"]
)

# Check permission
from secfn import AccessRequest

allowed = await access.check(AccessRequest(
    userId="user_123",
    action="project:write",
    resourceId="project_abc"
))

if allowed:
    print("Access granted!")

4. Rate Limiting

from secfn import RateLimitRule

# Create rate limiter
limiter = secfn.create_rate_limiter(
    rules={
        "global": RateLimitRule(requests=1000, window=60000),
        "perUser": RateLimitRule(requests=100, window=60000),
        "perIP": RateLimitRule(
            requests=50,
            window=60000,
            blockDuration=300000  # Block for 5 minutes
        ),
    }
)

# Check rate limit
try:
    result = await limiter.check(
        user_id="user_123",
        ip="192.168.1.1",
        endpoint="/api/search"
    )
    print(f"Allowed! Remaining: {result.remaining}")
except RateLimitExceededError as e:
    print(f"Rate limit exceeded: {e}")

5. Security Monitoring

from secfn import SecurityEventType, Severity

# Create monitor
monitor = secfn.create_monitoring()

# Log security event
event_id = await monitor.log_event(
    type=SecurityEventType.AUTH_FAILURE,
    severity=Severity.MEDIUM,
    ip="192.168.1.1",
    user_id="user_123",
    resource="/api/login",
    metadata={"reason": "invalid_password"}
)

# Query events
from secfn import EventQuery

events = await monitor.query_events(EventQuery(
    type=SecurityEventType.AUTH_FAILURE,
    severity=[Severity.HIGH, Severity.CRITICAL],
    startDate=int(time.time() * 1000) - 24 * 60 * 60 * 1000,
))

# Get metrics
import time
metrics = await monitor.get_metrics(
    start=int(time.time() * 1000) - 7 * 24 * 60 * 60 * 1000,
    end=int(time.time() * 1000)
)
print(f"Total events: {metrics.total_events}")
print(f"Events by type: {metrics.events_by_type}")

6. Secret Scanning

# Create scanner
scanner = secfn.create_secret_scanner(
    exclude_paths=["node_modules/**", "*.test.py"]
)

# Scan a file
results = await scanner.scan_file("./config.py")
for result in results:
    print(f"Found {result.pattern} at {result.file}:{result.line}")
    print(f"  Severity: {result.severity}")
    print(f"  Match: {result.redacted_match}")

# Scan directory
results = await scanner.scan_directory("./src", recursive=True)
critical = [r for r in results if r.severity == Severity.CRITICAL]
print(f"Found {len(critical)} critical secrets!")

Complete Example

import asyncio
from secfn import create_secfn, SecFnConfig, Severity, SecurityEventType

async def main():
    # Initialize secfn
    secfn = create_secfn(SecFnConfig(
        master_key="my-secure-master-key",
        storage_path=".secfn"
    ))

    # Create modules
    vault = secfn.create_secrets_vault()
    access = secfn.create_access_control()
    monitor = secfn.create_monitoring()

    # Store a secret
    await vault.set("database_url", "postgresql://user:pass@localhost/db")

    # Create admin role
    admin_role = await access.create_role(
        name="admin",
        permissions=["*:*"],
        description="Administrator"
    )

    # Assign role
    await access.assign_role("user_1", admin_role)

    # Log an event
    await monitor.log_event(
        type=SecurityEventType.SECRET_ACCESSED,
        severity=Severity.INFO,
        ip="127.0.0.1",
        user_id="user_1",
        resource="database_url"
    )

    print("✓ Secrets vault, access control, and monitoring configured!")

if __name__ == "__main__":
    asyncio.run(main())

API Reference

create_secfn(config: SecFnConfig) -> SecFn

Create a SecFn instance.

SecFn

Main class with factory methods:

  • create_secrets_vault() - Create encrypted secrets vault
  • create_access_control() - Create RBAC access control
  • create_rate_limiter(rules) - Create rate limiter
  • create_monitoring() - Create security monitor
  • create_secret_scanner() - Create secret scanner

SecretsVault

  • async set(key, value, options) - Store encrypted secret
  • async get(key, user_id) - Retrieve secret
  • async list(filter) - List secrets (without values)
  • async rotate(key, new_value, user_id) - Rotate secret
  • async delete(key, user_id) - Delete secret
  • async get_access_log(key, limit) - Get access log

AccessControl

  • async create_role(name, permissions, description) - Create role
  • async assign_role(user_id, role_id, resource_ids) - Assign role
  • async check(request) - Check permission
  • async get_user_permissions(user_id) - Get user permissions
  • async get_user_roles(user_id) - Get user roles

RateLimiter

  • async check(user_id, ip, endpoint) - Check rate limit

SecurityMonitor

  • async log_event(type, severity, ip, ...) - Log event
  • async query_events(query) - Query events
  • async get_metrics(start, end) - Get metrics
  • async resolve_event(event_id, resolved_by, notes) - Resolve event

SecretScanner

  • async scan_file(file_path) - Scan file
  • async scan_directory(directory, recursive) - Scan directory

Development

# Install dependencies
make install-dev

# Run tests
make test

# Type checking
make typecheck

# Linting
make lint

# Format code
make format

License

MIT

Repository

https://github.com/21nCo/super-functions

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

secfn-0.0.1.tar.gz (26.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

secfn-0.0.1-py3-none-any.whl (27.6 kB view details)

Uploaded Python 3

File details

Details for the file secfn-0.0.1.tar.gz.

File metadata

  • Download URL: secfn-0.0.1.tar.gz
  • Upload date:
  • Size: 26.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for secfn-0.0.1.tar.gz
Algorithm Hash digest
SHA256 58dd87aaa7de0caa90d709fc6167d6910b6e9ef88fc4dbce303791274428adbe
MD5 496c2914ddab107feef5ac9d34b5cd5c
BLAKE2b-256 654968001455f45a3c792d61cb2435c029e0e2ba5bdf79c4006fe30e143637c4

See more details on using hashes here.

File details

Details for the file secfn-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: secfn-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 27.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for secfn-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b663ed543d7fdab9d5e364eb5f9f021ac9881679684d5cc3c969599e9a70001a
MD5 503c95d9785e5226a35919595425fbb7
BLAKE2b-256 05564c62143ece3e9a5c136bf7b36d188fcaec99605897bcc4445ca88d111cc6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page