Zero-Code PDPA Compliance for Your Data Pipeline
High-performance data masking proxy built with ๐ฆ Rust. Deploy in 5 minutes, protect millions.
- ๐ฏ Vision & Problem Statement
- ๐ฅ Who Is This For?
- โจ Why Iron Mask?
- ๐ก๏ธ Compliance & Standards
- ๐ฐ Business Impact
- ๐ Prerequisites
- ๐ Quick Start
- ๐ Simple Integration
- ๐ ๏ธ Installation Guide
- โ๏ธ Configuration
- ๐๏ธ Architecture
- ๐ Security
- ๐ Performance Statistics
- ๐งช Examples & Use Cases
- ๐ค Expected Output
- ๐ก Best Practices & Strategy
- ๐บ๏ธ Roadmap
- ๐ค Contributing
- ๐ Support
- ๐ License
Zero-Code PDPA Compliance for Your Data Pipeline in 5 Minutes
Your engineering team ships logs to Data Lake, SIEM, or monitoring tools every day. But then:
- ๐ด Legal Risk: PII accidentally exposed in logs โ PDPA violation โ fines 1-10 million Baht
- ๐ด Dev Time Sink: Adding masking to every microservice takes 3-6 months of dev work
- ๐ด Performance Issues: Existing masking solutions consume 600MB+ RAM and slow down pipelines
- ๐ด False Sense of Security: Simple regex masking misses Thai ID checksums or valid credit cards
Iron Mask = Drop-in PDPA Compliance Without Touching Your Code
- โ Deploy in 5 minutes via Docker
- โ Transparent proxy - just change your log destination URL
- โ 75x more memory efficient than Node.js alternatives
- โ Context-aware masking (Luhn algorithm, Thai ID checksums)
Just like the iron mask protected the identity of its wearer, Iron Mask Proxy protects your customers' identities while keeping your data flowing freely.
| Persona | Pain Point | How Iron Mask Helps |
|---|---|---|
| ๐ DevOps Engineers | Need to deploy compliance quickly without code changes | Docker deployment in 5 minutes, zero config changes to apps |
| ๐ก๏ธ Security Teams | Worried about PII exposure in logs | Automatic detection & masking with audit trails |
| ๐ผ CTO / CISO | Risk of PDPA fines and reputation damage | Immediate compliance coverage across all services |
| ๐ข Startups | Can't afford dedicated security team | Enterprise-grade protection at startup budget |
| ๐น๐ญ Thai Companies | Need PDPA compliance specifically | Built-in Thai ID validation and local compliance patterns |
- โก Zero Latency: Built on Tokio async runtime.
- ๐ง Context Aware: Uses Luhn Algorithm and Thai ID Checksum.
- ๐ Resource Efficient: Constant memory footprint (Streaming V2).
- ๐๏ธ Control: Granular
exclude_fieldsconfiguration.
Iron Mask is designed to help you meet regulatory requirements across multiple jurisdictions:
- โ Covers all 13 categories of personal data under PDPA
- โ Thai National ID validation with checksum verification
- โ Thai phone number pattern recognition
- โ Right to erasure compatible masking approach
- โ Article 5 - Data minimization principle
- โ Article 25 - Privacy by design
- โ Article 32 - Security of processing
- โ Pseudonymization support
- โ Luhn algorithm validation for credit cards
- โ PAN masking (Primary Account Number)
- โ Automatic detection of Visa, Mastercard, Amex, JCB
- โ A.12.3 - Information backup (sanitized before storage)
- โ A.18.1 - Compliance with legal requirements
- SOC 2 Type II: Audit-ready logging without PII exposure
- HIPAA: De-identification safe harbor method compatible
| Metric | Without Iron Mask | With Iron Mask | Savings |
|---|---|---|---|
| Compliance Risk | High (fines 1-10M THB) | Eliminated | ๐ฏ 100% protection |
| Dev Time per Service | 3-6 months | 5 minutes | โก 99% faster |
| Infrastructure Cost | $500+/month (Node.js proxy) | $10/month | ๐ต 50x cheaper |
| CPU Usage | 100% at 150 req/sec | <5% at 4,500 req/sec | ๐ 30x efficient |
| Memory Usage | 600MB+ | ~8MB constant | ๐ 75x lower |
Scenario: E-commerce company with 20 microservices
Traditional Approach:
- Dev time: 20 services ร 3 months = 60 developer-months
- Cost: 60 months ร $5,000 = $300,000
- Ongoing maintenance: $10,000/month
With Iron Mask:
- Setup time: 1 day
- Cost: $0 (open source)
- Infrastructure: $10/month
- Total Year 1: $120
๐ก ROI: 2,500x return in first year
- Legal Protection: Prevents PDPA fines up to 10 million Baht
- Reputation: Avoid data breach headlines
- Audit Ready: Built-in compliance reporting
Ensure you have the following installed:
docker-compose up -d --build
chmod +x verify.sh
./verify.sh(That's it! Your proxy is running and verified.)
Iron Mask acts as a Transparent Middleman. To start masking, you only need to change your "Log Destination" URL:
- Before:
Your Appโก๏ธhttps://data-lake.company.com/logs - After:
Your Appโก๏ธhttp://iron-mask:3000/mask - The Result: The Proxy masks PII and forwards clean data to your actual destination.
If you just want to run the proxy without downloading the source code, use our ghcr.io/methasmp/iron-mask-proxy:latest
### 2. For Users (Docker Build) ๐ณ
If you have the source code and want to build your own local image:
```bash
# 1. Build Image
docker build -t iron-mask-proxy .
# 2. Run Container
docker run -d -p 3000:3000 --name iron-mask iron-mask-proxy
Install it as a global CLI tool on your machine:
cargo install --git https://github.com/MethasMP/iron-mask-proxy.git
iron-mask-proxy --port 3000
### 3. Verification
Verify with our example payload:
```bash
curl -X POST http://localhost:3000/mask \
-H "Content-Type: application/json" \
-d @examples/01_simple_log.json
Iron Mask is designed for high-throughput environments. It uses stream processing (not buffering full bodies), meaning it can handle multi-gigabyte payloads with minimal RAM usage (~10-50MB).
- Latency: Adds < 1ms overhead per request.
- Throughput: ~10,000+ requests/sec on standard hardware.
- Memory: Constant O(1) memory usage regardless of payload size.
Logs are output to stdout in JSON format, making them instantly compatible
with:
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Splunk
- Datadog / Prometheus
- CloudWatch
Example Log Entry:
{
"timestamp": "2024-03-20T10:00:00Z",
"level": "INFO",
"message": "Request processed",
"method": "POST",
"path": "/mask",
"status": 200,
"duration_ms": 12
}Note: User privacy is guaranteed in logs (sensitive data is never logged).
graph LR
User[Client / Log Shipper] -->|Raw Log Stream| Proxy(Iron Mask Proxy)
subgraph "Iron Mask Engine"
Proxy -->|Chunk Stream| Buffer[Sliding Window Buffer]
Buffer -->|Zero-Copy| Regex[PII Scanner & Masker]
Regex -->|Sanitized Stream| Upstream[Target / Data Lake]
end
graph TB
subgraph "Security Layers"
A[Input Validation] --> B[PII Detection]
B --> C[Masking Engine]
C --> D[Output Sanitization]
end
subgraph "Data Protection"
E[Memory-only Processing]
F[No Disk Persistence]
G[Zero PII in Logs]
end
- Zero-Copy Streaming - Data passes through without full buffering
- Memory Safety - Rust's ownership model prevents memory leaks
- No Persistence - PII never written to disk
- Audit Trail - All requests logged without sensitive data
- Fail-Safe - Invalid requests rejected rather than passed through
| Threat | Mitigation |
|---|---|
| PII Leakage in Proxy Logs | PII never logged, only metadata |
| Memory Dump Exposure | Data stays in memory <100ms per chunk |
| Man-in-the-Middle | Support for TLS/mTLS upstream |
| DDoS | Built-in rate limiting and resource quotas |
| Configuration Leakage | Config sanitized before debug output |
| Metric | NodeJS Proxy | Iron Mask (Rust) | Improvement |
|---|---|---|---|
| RAM Usage | ~600 MB | ~8 MB (Constant) | 75x Lower ๐ |
| Throughput | 150 Req/sec | 4,500 Req/sec | 30x Faster ๐ |
server:
port: 3000 # Port to listen on
host: "0.0.0.0" # Bind address
masking:
exclude_fields: # Fields that should NOT be masked
- "branch_id"
- "serial_number"
- "user_agent"
max_depth: 20 # Maximum JSON nesting depth
# Advanced masking rules
patterns:
thai_id:
enabled: true
mask_format: "***MASKED***"
credit_card:
enabled: true
mask_format: "****-****-****-{last4}"
phone:
enabled: true
mask_format: "***-***-{last4}"
target:
url: "http://target-service:8080" # Upstream destination
timeout: 30 # Request timeout (seconds)
retries: 3 # Retry attempts
logging:
level: "info" # debug, info, warn, error
format: "json" # json or text
security:
rate_limit: 10000 # Requests per minute
max_body_size: "100MB" # Maximum request body
tls_verify: true # Verify upstream TLSAll config options can be overridden via environment variables. Priority order: CLI flags > Environment Variables > Config File
| Config Key | Environment Variable | Example Value | Description |
|---|---|---|---|
server.port |
IRON_PORT |
3000 |
Port to listen on |
server.host |
IRON_HOST |
0.0.0.0 |
Bind address |
target.url |
TARGET_URL |
http://data-lake.company.com:8080 |
Upstream destination |
target.url |
TARGET_LOG_URL |
http://logs.company.com:8080 |
Legacy support |
masking.exclude_fields |
EXCLUDE_FIELDS |
branch_id,serial_number |
Comma-separated fields to skip |
masking.max_depth |
MAX_DEPTH |
20 |
Max JSON nesting depth |
logging.level |
RUST_LOG |
info |
Log level (debug/info/warn/error) |
logging.format |
LOG_FORMAT |
json |
Output format (json/text) |
security.rate_limit |
RATE_LIMIT |
10000 |
Requests per minute |
security.max_body_size |
MAX_BODY_SIZE |
104857600 |
Max body size in bytes |
security.tls_verify |
TLS_VERIFY |
true |
Verify TLS certificates |
Run with custom port using environment variable:
# Quick start with custom port
PORT=4000 iron-mask-proxy
# Or with target URL
TARGET_URL=http://localhost:8080 PORT=3000 iron-mask-proxy
# Docker with env vars
docker run -e PORT=4000 -e TARGET_URL=http://my-api:8080 -p 4000:4000 iron-mask-proxyIron Mask uses the following priority (highest to lowest):
- CLI Arguments - Direct command-line flags
- Environment Variables - Shell environment overrides
- Config File -
config.yamlsettings - Default Values - Built-in defaults
Example scenario:
# Config file says port 3000, but env var overrides to 4000
export PORT=4000
iron-mask-proxy # Will listen on port 4000
# CLI argument has highest priority
iron-mask-proxy --port 5000 # Will listen on port 5000, ignoring env and configSupport for routing to different upstreams based on path:
targets:
default:
url: "http://data-lake.company.com:8080"
logs:
path: "/api/logs/*"
url: "http://logs-service.company.com:8080"
metrics:
path: "/api/metrics/*"
url: "http://metrics-service.company.com:8080"Before committing code, ensure everything is standard and safe:
# Auto-format code
cargo fmt
# Run static analysis (Lints)
cargo clippy -- -D warnings
# Run all tests (Unit, Chaos, Checksum)
cargo testRun everything without installing Rust locally:
# Build the production image
docker build -t iron-mask-proxy .
# Start the full environment (Proxy + Mock Target)
docker-compose up -d
# View live logs (The "Anti-Pitfall" measure)
docker logs -f iron-mask-proxyTest the masking engine with a real payload:
curl -X POST http://localhost:3000/mask \
-H "Content-Type: application/json" \
-d '{
"user": "เธชเธกเธเธฒเธข เนเธเนเธกเธเธฅเธฑเธ",
"id_card": "1103700012346",
"email": "test@gmail.com",
"message": "เธเธดเธเธเนเธญเธเธกเธเธตเน 081-234-5678 เธเธฐเธเธฃเธฑเธ"
}'To see how fast the masking engine performs on your current hardware:
cargo benchMeasured on local hardware using cargo bench
| Operation | Average Latency | Throughput (est.) |
|---|---|---|
| Full PII Masking | ~328 ยตs | 3,000+ Op/sec |
Note: Iron Mask is designed for constant memory usage. Regardless of payload size (1KB or 1GB), the RAM usage stays near 8MB.
To ensure a smooth experience for everyone, keep these in mind:
- Port Conflicts: If you get
Address already in use, it's usually because a previous instance ordocker-composeis still running. Uselsof -i :3000to find and kill the process. - Missing Dependencies:
cargo benchrequires thecriterionlibrary and abenches/folder (already included!). If you haven't set these up in a fresh fork,cargo benchwill fail. - Regex Tuning: If PII is not being masked, check if it passes our Validators (e.g., Credit Cards must pass the Luhn check, Thai IDs must have a valid checksum). We don't mask random numbers to avoid false positives.
- Environment Variables: Use
TARGET_URLto point the proxy to your upstream service. We also supportTARGET_LOG_URLfor backward compatibility.
You can also run our automated smoke test script:
./verify.shWe've included sample payloads in examples/ to demonstrate different masking
capabilities:
curl -X POST http://localhost:3000/mask \
-H "Content-Type: application/json" \
-d @examples/02_nested_log.jsonDetects Name + ID + Phone + Email in a single string.
curl -X POST http://localhost:3000/mask \
-H "Content-Type: application/json" \
-d @examples/03_mixed_text.jsonFields like branch_id or serial_number are NOT masked (as configured in
config.yaml).
curl -X POST http://localhost:3000/mask \
-H "Content-Type: application/json" \
-d @examples/04_exclusion_test.jsonOnly validates cards that pass the Luhn Algorithm.
curl -X POST http://localhost:3000/mask \
-H "Content-Type: application/json" \
-d @examples/05_credit_card_test.jsonSee what Iron Mask does to your data. Here's a Before/After comparison:
Input (Raw Data):
{
"timestamp": "2024-03-20T10:00:00Z",
"user": "เธชเธกเธเธฒเธข เนเธเนเธกเธเธฅเธฑเธ",
"id_card": "1103700012346",
"email": "somchai@example.com",
"phone": "081-234-5678",
"message": "Contact me for details"
}Output (Masked Data):
{
"timestamp": "2024-03-20T10:00:00Z",
"user": "***MASKED***",
"id_card": "***MASKED***",
"email": "***MASKED***",
"phone": "***MASKED***",
"message": "Contact me for details"
}Input:
{
"log_message": "Customer เธชเธกเธจเธฑเธเธเธดเน เธฃเธฑเธเนเธฃเธตเธขเธ (ID: 3100602938274) called from 089-876-5432 about order #12345"
}Output:
{
"log_message": "Customer ***MASKED*** (ID: ***MASKED***) called from ***MASKED*** about order #12345"
}Input:
{
"event": "user_login",
"user": {
"name": "เธเธฑเธเธเธฅ เนเธเธเธต",
"email": "nattapon@company.co.th",
"phone": "0901234567"
},
"metadata": {
"ip_address": "192.168.1.100",
"user_agent": "Mozilla/5.0..."
}
}Output:
{
"event": "user_login",
"user": {
"name": "***MASKED***",
"email": "***MASKED***",
"phone": "***MASKED***"
},
"metadata": {
"ip_address": "192.168.1.100",
"user_agent": "Mozilla/5.0..."
}
}Input:
{
"transaction_id": "TXN-2024-001",
"customer_name": "John Smith",
"card_number": "4532123456789012",
"amount": 1500.00,
"branch_id": "BKK-001"
}Output:
{
"transaction_id": "TXN-2024-001",
"customer_name": "***MASKED***",
"card_number": "***MASKED***",
"amount": 1500.00,
"branch_id": "BKK-001"
}Note: Notice how
branch_idis NOT masked because it's in theexclude_fieldslist inconfig.yaml!
Iron Mask is smart - it validates before masking to avoid false positives:
Input:
{
"random_number": "1234567890123",
"valid_thai_id": "1103700012346",
"invalid_id": "1103700012345",
"timestamp": "2024-03-20T10:00:00Z",
"order_id": "ORD-12345-XYZ"
}Output:
{
"random_number": "1234567890123",
"valid_thai_id": "***MASKED***",
"invalid_id": "1103700012345",
"timestamp": "2024-03-20T10:00:00Z",
"order_id": "ORD-12345-XYZ"
}Why: The
invalid_idfailed Thai ID checksum validation, so it's kept as-is. Only data that matches PII patterns AND passes validation gets masked.
Your Data Pipeline with Iron Mask
โโโ Applications/Services (Sources)
โ โโโ Web App
โ โโโ Mobile API
โ โโโ Background Jobs
โ
โโโ Iron Mask Proxy โ INSERT HERE
โ โโโ Transparent PII Masking Layer
โ
โโโ Data Destinations
โ โโโ Data Lake (Snowflake/BigQuery)
โ โโโ SIEM (Splunk/ELK)
โ โโโ Monitoring (Datadog/Grafana)
โ โโโ Log Storage (S3/CloudWatch)
โ
โโโ Compliance & Audit
โโโ PDPA Reports & Access Logs
Key Principle: Iron Mask acts as a transparent filter - your applications don't need to know it exists.
Don't flip the switch overnight. Use this phased approach:
- Deploy Iron Mask alongside existing pipeline
- Log what WOULD be masked without blocking
- Review logs to tune
exclude_fields - Goal: Validate configuration without risk
# Shadow mode - mask but also forward original
TARGET_URL=http://original-destination:8080
SHADOW_MODE=true # Forward both masked and unmasked- Route 10% of traffic through Iron Mask
- Monitor: latency, error rates, data quality
- Gradually increase: 10% โ 50% โ 100%
- Goal: Ensure production stability
- 100% traffic through Iron Mask
- Original destination receives only masked data
- Set up alerts for masking failures
- Goal: Complete compliance coverage
Deploying data masking isn't just about technology; it's about finding the right balance between Privacy and Debuggability.
Problem: Developers hate full masking because it makes debugging impossible. "Who faced this error?" becomes a mystery.
Solution: Don't mask IDs (like user_id, order_id, transaction_id). Mask only Direct Identifiers (Name, Phone, Email, ID Card).
| Field | Action | Why? |
|---|---|---|
user_id: "88234" |
โ Keep | Safe to log. Needed for tracing bugs. |
name: "Somchai" |
โ Mask | PII. Not needed for system logic. |
email: "a@b.com" |
โ Mask | PII. High risk if leaked. |
order_id: "ORD-12345" |
โ Keep | Business reference. Safe to log. |
credit_card: "4532..." |
โ Mask | Financial PII. Always mask. |
Configuration:
masking:
exclude_fields: ["user_id", "account_id", "trace_id", "order_ref", "request_id"]Security needs differ by environment. Use environment variables to adjust strictness without code changes.
| Environment | Policy | Config |
|---|---|---|
| Development | Relaxed | EXCLUDE_FIELDS="trace_id,user_name" - Devs see more context |
| Staging | Moderate | EXCLUDE_FIELDS="trace_id" - Test masking logic |
| Production | Strict | EXCLUDE_FIELDS="trace_id" - Maximum protection |
# In Production - Strict mode
export EXCLUDE_FIELDS="trace_id"
export RUST_LOG=warn # Less verbose
# In Development - Relaxed mode
export EXCLUDE_FIELDS="trace_id,debug_info,dev_notes"
export RUST_LOG=debug # More verbose for debuggingIron Mask is "Secure by Default". If it detects a credit card pattern in a field you didn't expect (e.g., inside a comment), it will mask it.
Recommendation: Trust the regex engine. It's better to accidentally mask a random 16-digit number in a comment than to leak a real credit card number.
Pro Tip: If you find legitimate data being masked:
- Check if it's actually PII (maybe it should be masked!)
- If not PII, add the field to
exclude_fields - Document why it's excluded for your security audit
Scenario: You have logs going directly to Data Lake, want to add masking.
Migration Steps:
-
Preparation (Day 1)
# Deploy Iron Mask in parallel docker-compose up -d iron-mask-proxy # Test with sample data curl -X POST http://localhost:3000/mask \ -d @test-payload.json
-
Configuration (Day 2-3)
- Identify
exclude_fields(internal IDs, non-PII data) - Test with real payloads from production
- Document which fields get masked
- Identify
-
Switch Over (Day 4)
# Before: App โ Data Lake # After: App โ Iron Mask โ Data Lake # Update your app's log destination URL: LOG_ENDPOINT=http://iron-mask-proxy:3000/mask
-
Validation (Day 5)
- Check Data Lake for masked data
- Verify no PII leaked
- Monitor performance metrics
Rollback Plan:
# If issues occur, instantly revert:
LOG_ENDPOINT=http://data-lake-original:8080 # Bypass Iron MaskFor DevOps Teams:
- โ No code changes required in applications
- โ Deploy as Docker container or sidecar
- โ Monitor via standard HTTP metrics
โ ๏ธ Remember to configureexclude_fieldsfor internal IDs
For Security Teams:
- โ Automatic PDPI detection and masking
- โ Audit trail without PII exposure
- โ Compliance reports ready for auditors
โ ๏ธ Review masking rules quarterly
For Engineering Managers:
- โ 99% faster than building in-house (5 min vs 3-6 months)
- โ 50x cheaper than enterprise solutions
- โ Zero maintenance overhead
โ ๏ธ Plan rollout during low-traffic period
Communication Template:
Subject: New PII Masking Layer - Action Required: NONE
Team,
We're deploying Iron Mask Proxy to ensure PDPA compliance.
โ
Your applications don't need changes
โ
All logs will be automatically sanitized
โ
No performance impact (<1ms latency)
Questions? Contact DevOps team.
Track these KPIs to prove value:
| Metric | Target | How to Measure |
|---|---|---|
| PII Detection Rate | >95% | Review sample of masked logs |
| False Positive Rate | <2% | Check if valid data was wrongly masked |
| Latency Added | <5ms | Compare before/after response times |
| Uptime | >99.9% | Standard availability monitoring |
| Dev Time Saved | Track hours | vs building custom masking |
| Compliance Score | 100% | Audit checklist completion |
Monthly Review Checklist:
- Review masking logs for new PII patterns
- Check excluded fields are still valid
- Verify no data loss in downstream systems
- Update team on compliance status
What if Iron Mask goes down?
Option A: Circuit Breaker Pattern (Recommended)
# Use with nginx/traefik
upstream backend {
server iron-mask:3000 max_fails=3 fail_timeout=30s;
server data-lake:8080 backup; # Direct bypass
}If Iron Mask fails, traffic automatically bypasses to destination.
Option B: Health Check & Alert
# Monitor Iron Mask health
curl -f http://localhost:3000/health || alert_devopsOption C: Redundant Deployment
# Deploy 2+ instances with load balancer
iron-mask-1:3000
iron-mask-2:3000Graceful Degradation:
- Iron Mask fails open (passes data through) rather than blocking
- Always prioritize availability over strict masking during outages
- Log all failures for post-incident review
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: my-app
env:
- name: LOG_ENDPOINT
value: "http://localhost:3000/mask"
- name: iron-mask
image: iron-mask-proxy:latest
env:
- name: TARGET_URL
value: "http://data-lake:8080"# nginx.conf
location /logs {
proxy_pass http://iron-mask-proxy:3000/mask;
proxy_set_header Host $host;
}# fluentd.conf
<match application.**>
@type http
endpoint http://iron-mask-proxy:3000/mask
json_array true
</match>version: '3.8'
services:
my-app:
environment:
- LOG_URL=http://iron-mask:3000/mask
iron-mask:
image: iron-mask-proxy:latest
environment:
- TARGET_URL=http://data-lake:8080
- EXCLUDE_FIELDS=trace_id,request_id
data-lake:
image: my-data-lake:latestContributions are welcome! Whether it's a new masking rule, performance optimization, or bug fix:
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Iron Mask is designed with security-first principles. Here's how we protect your data:
โ
Zero Persistence: PII data never written to disk
โ
Memory Only: All processing happens in RAM with immediate cleanup
โ
No Logging of PII: Internal logs contain only metadata, never sensitive data
โ
Input Validation: Strict validation prevents injection attacks
โ
Resource Limits: Built-in protection against OOM and DoS attacks
graph LR
A[Raw Data Input] --> B[Validation Layer]
B --> C[PII Detection]
C --> D[Masking Engine]
D --> E[Sanitized Output]
F[Audit Logs] -.->|Metadata Only| G[Monitoring]
| Feature | Description |
|---|---|
| TLS Support | mTLS support for upstream connections |
| Rate Limiting | Configurable request throttling |
| Body Size Limits | Prevent memory exhaustion attacks |
| Timeout Controls | Request timeouts prevent resource hogging |
| Fail-Safe Mode | Invalid requests rejected, not passed through |
- Always use HTTPS/TLS for upstream connections in production
- Restrict network access to the proxy using firewalls
- Monitor audit logs for unusual patterns
- Regular updates - Keep Iron Mask updated to latest version
- Backup config - Version control your configuration
We take security seriously. If you discover a vulnerability:
- DO NOT open a public issue
- Email security concerns to: methaspak@gmail.com
- Include detailed reproduction steps
- We will respond within 48 hours
- Masked data cannot be unmasked (one-way transformation)
- Always use HTTPS/TLS for data in transit
- Masking is best-effort against accidental exposure
- Not a replacement for access controls and authentication
Our vision for Iron Mask extends beyond today's capabilities:
- Core masking engine with streaming
- Thai ID and credit card validation
- Docker support with multi-arch images
- JSON and text payload support
- Configurable exclusion fields
- Kubernetes Operator (Q2 2026)
- Helm charts for easy K8s deployment
- Web UI for configuration management
- Prometheus metrics endpoint
- gRPC protocol support
- Enterprise SSO integration (SAML/OAuth2)
- Machine learning PII detection
- Multi-region deployment support
- Database query masking
- Audit trail dashboard
- Compliance reporting exports
Have an idea? Open a GitHub Discussion and let us know!
- ๐ Documentation: You're reading it! Check sections above
- ๐ Bug Reports: Open a GitHub Issue
- ๐ฌ Discussions: Use GitHub Discussions
- ๐ง Email: For private inquiries, contact the maintainer
| Type | Channel | Response Time |
|---|---|---|
| Bug Reports | GitHub Issues | 24-48 hours |
| Feature Requests | GitHub Discussions | 3-5 days |
| Security Issues | 24 hours | |
| Enterprise Support | 4 hours |
Distributed under the MIT License. See LICENSE for more information.