pfsense-redactor


Namepfsense-redactor JSON
Version 1.0.8 PyPI version JSON
download
home_pageNone
SummarySafely removes sensitive information from pfSense config.xml exports
upload_time2025-11-05 20:14:54
maintainerNone
docs_urlNone
authorpfSense Redactor Contributors
requires_python>=3.9
licenseMIT
keywords pfsense security redaction privacy firewall config xml
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pfSense XML Configuration Redactor

The **pfSense XML Configuration Redactor** safely removes sensitive information from `config.xml` exports before they are shared with support, consultants, auditors, or AI tools for security analysis.

## Installation

### From PyPI (recommended)

```bash
pip install pfsense-redactor
```

> **Note:** If you encounter an `externally-managed-environment` error (common on macOS and modern Linux distributions), use one of these alternatives:
>
> **Option 1: Install with pipx (recommended for CLI tools)**
> ```bash
> brew install pipx
> pipx install pfsense-redactor
> ```
>
> **Option 2: Use a virtual environment**
> ```bash
> python3 -m venv venv
> source venv/bin/activate
> pip install pfsense-redactor
> ```
>
> **Option 3: Install in user space**
> ```bash
> pip install --user pfsense-redactor
> ```

### From Source

```bash
git clone https://github.com/grounzero/pfsense-redactor.git
cd pfsense-redactor
```

**Option 1: Development mode (recommended for contributing)**
```bash
pip install -e .
```

**Option 2: With virtual environment**
```bash
python3 -m venv venv
source venv/bin/activate
pip install -e .
```

The tool preserves **network architecture and routing logic** whilst sanitising **secrets and identifiers** allowing safe troubleshooting and topology review without disclosing private data.

> Keeps firewall and routing context  
> Removes passwords, keys, public IPs (optional), tokens, certs  
> Supports anonymisation for consistent placeholder mapping  
> Understands pfSense config structures, namespaces, VPNs, WireGuard, XML attributes, IPv6 zone IDs

---

## Features

### Protects real secrets
- Passwords & encrypted passwords
- Pre-shared keys (IPSec, OpenVPN, WireGuard)
- TLS/OpenVPN static keys & certs
- SNMP community strings
- LDAP / RADIUS secrets
- API keys & tokens
- PEM blocks (RSA / EC / OpenSSH)

### Preserves network logic
- Subnets & masks (255.x.x.x always preserved)
- Router topology
- VLAN and VPN interfaces
- Firewall rules and gateways

### Smart redaction
| Data | Behaviour |
|------|----------|
| Internal IPs | Preserve with `--keep-private-ips` |
| Public IPs | Mask or anonymise |
| Email addresses | Mask or anonymise |
| URLs | Preserve structure, mask hostname |
| MAC addresses | Mask format-preserving |
| Certificates | Collapse to `[REDACTED_CERT_OR_KEY]` |

### Operational modes

| Mode | Purpose |
|------|--------|
| Default | Safe redaction for sharing logs |
| `--keep-private-ips` | Preserve private IPs (best for support/AI) |
| `--anonymise` | Replace identifiers with consistent placeholders (`IP_1`, `domain3.example`) |
| `--aggressive` | Scrub **all** fields (plugins/custom XML) |

---

## Requirements

- **Python 3.8+**

---

## Usage

### Basic usage
```bash
# Output filename auto-generated as config-redacted.xml
pfsense-redactor config.xml

# Or specify output filename explicitly
pfsense-redactor config.xml redacted.xml
```

### Preserve private IPs (recommended)
```bash
pfsense-redactor config.xml redacted.xml --keep-private-ips
```

### Allow-list specific IPs and domains
```bash
# Preserve specific public services (never redact)
pfsense-redactor config.xml --allowlist-ip 8.8.8.8 --allowlist-domain time.nist.gov

# Preserve entire CIDR ranges
pfsense-redactor config.xml --allowlist-ip 203.0.113.0/24

# Use an allow-list file (supports IPs, CIDRs, and domains)
pfsense-redactor config.xml --allowlist-file my-allowlist.txt
```

### Topology-safe anonymisation
```bash
pfsense-redactor config.xml redacted.xml --anonymise
```

### Allow internal DNS names
```bash
pfsense-redactor config.xml redacted.xml --no-redact-domains --keep-private-ips
```

### Aggressive mode
```bash
pfsense-redactor config.xml redacted.xml --aggressive
```

### Dry run
```bash
# Show statistics only
pfsense-redactor config.xml --dry-run

# Show statistics with sample redactions (safely masked)
pfsense-redactor config.xml --dry-run-verbose
```

### Output to STDOUT
```bash
pfsense-redactor config.xml --stdout > redacted.xml
```

### In-place (danger)
```bash
pfsense-redactor config.xml --inplace --force
```

---

## Allow-lists

Allow-lists let you preserve specific well-known IPs and domains that don't leak private information.

### Default allow-list files

The tool automatically loads allow-lists from these locations (if they exist):
1. `.pfsense-allowlist` in current directory
2. `~/.pfsense-allowlist` in home directory

To disable: use `--no-default-allowlist`

### Allow-list file format

Create `.pfsense-allowlist` or use `--allowlist-file`:

```
# Comments start with #
# One item per line (IP, CIDR, or domain)

# Public DNS servers
8.8.8.8
1.1.1.1

# Cloud provider ranges
203.0.113.0/24
198.51.100.0/24

# NTP servers (suffix matching: preserves time.nist.gov and *.time.nist.gov)
time.nist.gov
pool.ntp.org

# Wildcard domains (*.example.org preserves all subdomains)
*.pfsense.org
```

See [`allowlist.example`](allowlist.example) for a complete template.

### CLI allow-list flags

```bash
# Add specific IPs or CIDR ranges (repeatable)
--allowlist-ip 8.8.8.8 --allowlist-ip 203.0.113.0/24

# Add specific domains (repeatable, case-insensitive, supports suffix matching)
--allowlist-domain time.nist.gov --allowlist-domain pool.ntp.org

# Load from file (supports IPs, CIDRs, and domains)
--allowlist-file /path/to/allowlist.txt

# Disable default file loading
--no-default-allowlist
```

**Features:**
- **CIDR support**: `203.0.113.0/24` preserves all IPs in that range
- **Suffix matching**: `example.org` preserves `sub.example.org`, `db.corp.example.org`, etc.
- **Wildcard domains**: `*.example.org` is equivalent to suffix matching on `example.org`
- **IDNA/punycode**: Automatically handles internationalised domains (e.g., `bücher.example` ↔ `xn--bcher-kva.example`)
- **Merged sources**: All CLI flags, files, and default files are combined

**Note:** Items in allow-lists are never redacted in:
- Raw text IP/domain references
- URL hostnames
- Bare FQDNs

---

## Example

### Input
```xml
<openvpn>
  <server>
    <local>192.168.10.1</local>
    <tlsauth>-----BEGIN OpenVPN Static key-----ABC123...</tlsauth>
    <remote>198.51.100.10</remote>
    <remote_port>443</remote_port>
  </server>
</openvpn>
```

### Output (`--keep-private-ips`)
```xml
<openvpn>
  <server>
    <local>192.168.10.1</local>
    <tlsauth>[REDACTED]</tlsauth>
    <remote>XXX.XXX.XXX.XXX</remote>
    <remote_port>443</remote_port>
  </server>
</openvpn>
```

### Output (`--anonymise`)
```xml
<openvpn>
  <server>
    <local>IP_1</local>
    <tlsauth>[REDACTED]</tlsauth>
    <remote>IP_2</remote>
    <remote_port>443</remote_port>
  </server>
</openvpn>
```

---

## Security Notes

> **Never restore the redacted file to pfSense.**

Redacted output is for **analysis only**, because:

- CDATA and comments are removed by XML parser
- PEM blocks and binary data are collapsed
- Some optional metadata fields may be stripped

Always keep the **original secure copy**.

### Path Security

The tool includes built-in protections against malicious file path operations:

**Default behaviour (secure):**
- Only relative paths are allowed by default
- Directory traversal (`../../../etc/passwd`) is blocked
- Paths with null bytes are rejected
- Writing to system directories (`/etc`, `/sys`, `/proc`, `/Windows/System32`, etc.) is blocked
- Safe locations (home directory, current working directory, temp directories) are automatically allowed

**Using `--allow-absolute-paths`:**
- Enables absolute paths for intentional use cases
- Still blocks writes to sensitive system directories
- Still blocks directory traversal attempts
- Useful when you need to specify full paths explicitly

**Examples:**
```bash
# Safe: relative path (default)
pfsense-redactor config.xml output.xml

# Blocked: absolute path without flag
pfsense-redactor /etc/config.xml output.xml
# Error: Absolute paths not allowed (use --allow-absolute-paths)

# Blocked: directory traversal
pfsense-redactor ../../../etc/passwd output.xml
# Error: Path contains directory traversal components (..)

# Blocked: writing to system directory (even with flag)
pfsense-redactor config.xml /etc/output.xml --allow-absolute-paths
# Error: Cannot write to sensitive system directory

# Allowed: absolute path to safe location with flag
pfsense-redactor ~/config.xml ~/output.xml --allow-absolute-paths

# Blocked: in-place editing of system files
pfsense-redactor /etc/hosts --inplace --force --allow-absolute-paths
# Error: Cannot use --inplace with this file
```

**Protected system directories:**
- Unix/Linux: `/etc`, `/sys`, `/proc`, `/dev`, `/boot`, `/root`, `/bin`, `/sbin`, `/usr/bin`, `/usr/sbin`, `/lib`, `/lib64`, `/var/log`, `/var/run`, `/tmp`, `/run`
- Windows: `C:\Windows`, `C:\Windows\System32`, `C:\Program Files`, `C:\ProgramData`
- Critical files: `/etc/passwd`, `/etc/shadow`, `/etc/sudoers`, etc.

---

## Testing

### Dry run summary
```bash
# Statistics only
pfsense-redactor config.xml --dry-run

# Statistics with sample redactions (safely masked to avoid leaks)
pfsense-redactor config.xml --dry-run-verbose
```

**Sample output with `--dry-run-verbose`:**
```
[+] Redaction summary:
    - Passwords/keys/secrets: 10
    - Certificates: 6
    - IP addresses: 26
    - Domain names: 47

[+] Samples of changes (limit N=5):
    IP: 198.51.***.42 → XXX.XXX.XXX.XXX
    IP: 2001:db8:*:****::1 → XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
    URL: https://198.51.***.42/admin → https://XXX.XXX.XXX.XXX/admin
    FQDN: db.***.example.org → example.com
    MAC: aa:bb:**:**:ee:ff → XX:XX:XX:XX:XX:XX
    Secret: p****************d (len=18) → [REDACTED]
    Cert/Key: PEM blob (len≈2048) → [REDACTED_CERT_OR_KEY]
```

**Sample masking policy** (prevents leaks in dry-run output):
- **IP**: Keep first and last octet/segment, mask middle (e.g., `198.51.***.42`)
- **URL**: Show full URL but mask host as above
- **FQDN**: Keep TLD and one left label, mask rest (e.g., `db.***.example.org`)
- **MAC**: Mask middle octets (e.g., `aa:bb:**:**:ee:ff`)
- **Secret**: Show length and first/last 2 chars only (e.g., `p****************d (len=18)`)
- **Cert/Key**: Just show placeholder with length (e.g., `PEM blob (len≈2048)`)

### Recommended test flags
| Purpose | Command |
|--------|---------|
| Support & AI review | `--keep-private-ips --no-redact-domains` |
| Topology map w/o identifiers | `--anonymise` |
| Nuke everything | `--aggressive` |

---

## Stats example

```
[+] Redaction summary:
    - Passwords/keys/secrets: 4
    - Certificates: 2
    - IP addresses: 11
    - MAC addresses: 3
    - Domain names: 5
    - Email addresses: 1
    - URLs: 2
```

---

## Contributing

Pull requests welcome.  Particularly:

- Additional pfSense element coverage
- Plugin XML tag packs (WireGuard, pfBlockerNG, HAProxy, Snort, ACME, FRR)
- Unit test configs

---

## Licence

MIT


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pfsense-redactor",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "pfsense, security, redaction, privacy, firewall, config, xml",
    "author": "pfSense Redactor Contributors",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/ae/d3/c49c6eb76d2f7261de5cd68843f7422cf3878fdc0fe098f6e68a674e26e5/pfsense_redactor-1.0.8.tar.gz",
    "platform": null,
    "description": "# pfSense XML Configuration Redactor\n\nThe **pfSense XML Configuration Redactor** safely removes sensitive information from `config.xml` exports before they are shared with support, consultants, auditors, or AI tools for security analysis.\n\n## Installation\n\n### From PyPI (recommended)\n\n```bash\npip install pfsense-redactor\n```\n\n> **Note:** If you encounter an `externally-managed-environment` error (common on macOS and modern Linux distributions), use one of these alternatives:\n>\n> **Option 1: Install with pipx (recommended for CLI tools)**\n> ```bash\n> brew install pipx\n> pipx install pfsense-redactor\n> ```\n>\n> **Option 2: Use a virtual environment**\n> ```bash\n> python3 -m venv venv\n> source venv/bin/activate\n> pip install pfsense-redactor\n> ```\n>\n> **Option 3: Install in user space**\n> ```bash\n> pip install --user pfsense-redactor\n> ```\n\n### From Source\n\n```bash\ngit clone https://github.com/grounzero/pfsense-redactor.git\ncd pfsense-redactor\n```\n\n**Option 1: Development mode (recommended for contributing)**\n```bash\npip install -e .\n```\n\n**Option 2: With virtual environment**\n```bash\npython3 -m venv venv\nsource venv/bin/activate\npip install -e .\n```\n\nThe tool preserves **network architecture and routing logic** whilst sanitising **secrets and identifiers** allowing safe troubleshooting and topology review without disclosing private data.\n\n> Keeps firewall and routing context  \n> Removes passwords, keys, public IPs (optional), tokens, certs  \n> Supports anonymisation for consistent placeholder mapping  \n> Understands pfSense config structures, namespaces, VPNs, WireGuard, XML attributes, IPv6 zone IDs\n\n---\n\n## Features\n\n### Protects real secrets\n- Passwords & encrypted passwords\n- Pre-shared keys (IPSec, OpenVPN, WireGuard)\n- TLS/OpenVPN static keys & certs\n- SNMP community strings\n- LDAP / RADIUS secrets\n- API keys & tokens\n- PEM blocks (RSA / EC / OpenSSH)\n\n### Preserves network logic\n- Subnets & masks (255.x.x.x always preserved)\n- Router topology\n- VLAN and VPN interfaces\n- Firewall rules and gateways\n\n### Smart redaction\n| Data | Behaviour |\n|------|----------|\n| Internal IPs | Preserve with `--keep-private-ips` |\n| Public IPs | Mask or anonymise |\n| Email addresses | Mask or anonymise |\n| URLs | Preserve structure, mask hostname |\n| MAC addresses | Mask format-preserving |\n| Certificates | Collapse to `[REDACTED_CERT_OR_KEY]` |\n\n### Operational modes\n\n| Mode | Purpose |\n|------|--------|\n| Default | Safe redaction for sharing logs |\n| `--keep-private-ips` | Preserve private IPs (best for support/AI) |\n| `--anonymise` | Replace identifiers with consistent placeholders (`IP_1`, `domain3.example`) |\n| `--aggressive` | Scrub **all** fields (plugins/custom XML) |\n\n---\n\n## Requirements\n\n- **Python 3.8+**\n\n---\n\n## Usage\n\n### Basic usage\n```bash\n# Output filename auto-generated as config-redacted.xml\npfsense-redactor config.xml\n\n# Or specify output filename explicitly\npfsense-redactor config.xml redacted.xml\n```\n\n### Preserve private IPs (recommended)\n```bash\npfsense-redactor config.xml redacted.xml --keep-private-ips\n```\n\n### Allow-list specific IPs and domains\n```bash\n# Preserve specific public services (never redact)\npfsense-redactor config.xml --allowlist-ip 8.8.8.8 --allowlist-domain time.nist.gov\n\n# Preserve entire CIDR ranges\npfsense-redactor config.xml --allowlist-ip 203.0.113.0/24\n\n# Use an allow-list file (supports IPs, CIDRs, and domains)\npfsense-redactor config.xml --allowlist-file my-allowlist.txt\n```\n\n### Topology-safe anonymisation\n```bash\npfsense-redactor config.xml redacted.xml --anonymise\n```\n\n### Allow internal DNS names\n```bash\npfsense-redactor config.xml redacted.xml --no-redact-domains --keep-private-ips\n```\n\n### Aggressive mode\n```bash\npfsense-redactor config.xml redacted.xml --aggressive\n```\n\n### Dry run\n```bash\n# Show statistics only\npfsense-redactor config.xml --dry-run\n\n# Show statistics with sample redactions (safely masked)\npfsense-redactor config.xml --dry-run-verbose\n```\n\n### Output to STDOUT\n```bash\npfsense-redactor config.xml --stdout > redacted.xml\n```\n\n### In-place (danger)\n```bash\npfsense-redactor config.xml --inplace --force\n```\n\n---\n\n## Allow-lists\n\nAllow-lists let you preserve specific well-known IPs and domains that don't leak private information.\n\n### Default allow-list files\n\nThe tool automatically loads allow-lists from these locations (if they exist):\n1. `.pfsense-allowlist` in current directory\n2. `~/.pfsense-allowlist` in home directory\n\nTo disable: use `--no-default-allowlist`\n\n### Allow-list file format\n\nCreate `.pfsense-allowlist` or use `--allowlist-file`:\n\n```\n# Comments start with #\n# One item per line (IP, CIDR, or domain)\n\n# Public DNS servers\n8.8.8.8\n1.1.1.1\n\n# Cloud provider ranges\n203.0.113.0/24\n198.51.100.0/24\n\n# NTP servers (suffix matching: preserves time.nist.gov and *.time.nist.gov)\ntime.nist.gov\npool.ntp.org\n\n# Wildcard domains (*.example.org preserves all subdomains)\n*.pfsense.org\n```\n\nSee [`allowlist.example`](allowlist.example) for a complete template.\n\n### CLI allow-list flags\n\n```bash\n# Add specific IPs or CIDR ranges (repeatable)\n--allowlist-ip 8.8.8.8 --allowlist-ip 203.0.113.0/24\n\n# Add specific domains (repeatable, case-insensitive, supports suffix matching)\n--allowlist-domain time.nist.gov --allowlist-domain pool.ntp.org\n\n# Load from file (supports IPs, CIDRs, and domains)\n--allowlist-file /path/to/allowlist.txt\n\n# Disable default file loading\n--no-default-allowlist\n```\n\n**Features:**\n- **CIDR support**: `203.0.113.0/24` preserves all IPs in that range\n- **Suffix matching**: `example.org` preserves `sub.example.org`, `db.corp.example.org`, etc.\n- **Wildcard domains**: `*.example.org` is equivalent to suffix matching on `example.org`\n- **IDNA/punycode**: Automatically handles internationalised domains (e.g., `b\u00fccher.example` \u2194 `xn--bcher-kva.example`)\n- **Merged sources**: All CLI flags, files, and default files are combined\n\n**Note:** Items in allow-lists are never redacted in:\n- Raw text IP/domain references\n- URL hostnames\n- Bare FQDNs\n\n---\n\n## Example\n\n### Input\n```xml\n<openvpn>\n  <server>\n    <local>192.168.10.1</local>\n    <tlsauth>-----BEGIN OpenVPN Static key-----ABC123...</tlsauth>\n    <remote>198.51.100.10</remote>\n    <remote_port>443</remote_port>\n  </server>\n</openvpn>\n```\n\n### Output (`--keep-private-ips`)\n```xml\n<openvpn>\n  <server>\n    <local>192.168.10.1</local>\n    <tlsauth>[REDACTED]</tlsauth>\n    <remote>XXX.XXX.XXX.XXX</remote>\n    <remote_port>443</remote_port>\n  </server>\n</openvpn>\n```\n\n### Output (`--anonymise`)\n```xml\n<openvpn>\n  <server>\n    <local>IP_1</local>\n    <tlsauth>[REDACTED]</tlsauth>\n    <remote>IP_2</remote>\n    <remote_port>443</remote_port>\n  </server>\n</openvpn>\n```\n\n---\n\n## Security Notes\n\n> **Never restore the redacted file to pfSense.**\n\nRedacted output is for **analysis only**, because:\n\n- CDATA and comments are removed by XML parser\n- PEM blocks and binary data are collapsed\n- Some optional metadata fields may be stripped\n\nAlways keep the **original secure copy**.\n\n### Path Security\n\nThe tool includes built-in protections against malicious file path operations:\n\n**Default behaviour (secure):**\n- Only relative paths are allowed by default\n- Directory traversal (`../../../etc/passwd`) is blocked\n- Paths with null bytes are rejected\n- Writing to system directories (`/etc`, `/sys`, `/proc`, `/Windows/System32`, etc.) is blocked\n- Safe locations (home directory, current working directory, temp directories) are automatically allowed\n\n**Using `--allow-absolute-paths`:**\n- Enables absolute paths for intentional use cases\n- Still blocks writes to sensitive system directories\n- Still blocks directory traversal attempts\n- Useful when you need to specify full paths explicitly\n\n**Examples:**\n```bash\n# Safe: relative path (default)\npfsense-redactor config.xml output.xml\n\n# Blocked: absolute path without flag\npfsense-redactor /etc/config.xml output.xml\n# Error: Absolute paths not allowed (use --allow-absolute-paths)\n\n# Blocked: directory traversal\npfsense-redactor ../../../etc/passwd output.xml\n# Error: Path contains directory traversal components (..)\n\n# Blocked: writing to system directory (even with flag)\npfsense-redactor config.xml /etc/output.xml --allow-absolute-paths\n# Error: Cannot write to sensitive system directory\n\n# Allowed: absolute path to safe location with flag\npfsense-redactor ~/config.xml ~/output.xml --allow-absolute-paths\n\n# Blocked: in-place editing of system files\npfsense-redactor /etc/hosts --inplace --force --allow-absolute-paths\n# Error: Cannot use --inplace with this file\n```\n\n**Protected system directories:**\n- Unix/Linux: `/etc`, `/sys`, `/proc`, `/dev`, `/boot`, `/root`, `/bin`, `/sbin`, `/usr/bin`, `/usr/sbin`, `/lib`, `/lib64`, `/var/log`, `/var/run`, `/tmp`, `/run`\n- Windows: `C:\\Windows`, `C:\\Windows\\System32`, `C:\\Program Files`, `C:\\ProgramData`\n- Critical files: `/etc/passwd`, `/etc/shadow`, `/etc/sudoers`, etc.\n\n---\n\n## Testing\n\n### Dry run summary\n```bash\n# Statistics only\npfsense-redactor config.xml --dry-run\n\n# Statistics with sample redactions (safely masked to avoid leaks)\npfsense-redactor config.xml --dry-run-verbose\n```\n\n**Sample output with `--dry-run-verbose`:**\n```\n[+] Redaction summary:\n    - Passwords/keys/secrets: 10\n    - Certificates: 6\n    - IP addresses: 26\n    - Domain names: 47\n\n[+] Samples of changes (limit N=5):\n    IP: 198.51.***.42 \u2192 XXX.XXX.XXX.XXX\n    IP: 2001:db8:*:****::1 \u2192 XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX\n    URL: https://198.51.***.42/admin \u2192 https://XXX.XXX.XXX.XXX/admin\n    FQDN: db.***.example.org \u2192 example.com\n    MAC: aa:bb:**:**:ee:ff \u2192 XX:XX:XX:XX:XX:XX\n    Secret: p****************d (len=18) \u2192 [REDACTED]\n    Cert/Key: PEM blob (len\u22482048) \u2192 [REDACTED_CERT_OR_KEY]\n```\n\n**Sample masking policy** (prevents leaks in dry-run output):\n- **IP**: Keep first and last octet/segment, mask middle (e.g., `198.51.***.42`)\n- **URL**: Show full URL but mask host as above\n- **FQDN**: Keep TLD and one left label, mask rest (e.g., `db.***.example.org`)\n- **MAC**: Mask middle octets (e.g., `aa:bb:**:**:ee:ff`)\n- **Secret**: Show length and first/last 2 chars only (e.g., `p****************d (len=18)`)\n- **Cert/Key**: Just show placeholder with length (e.g., `PEM blob (len\u22482048)`)\n\n### Recommended test flags\n| Purpose | Command |\n|--------|---------|\n| Support & AI review | `--keep-private-ips --no-redact-domains` |\n| Topology map w/o identifiers | `--anonymise` |\n| Nuke everything | `--aggressive` |\n\n---\n\n## Stats example\n\n```\n[+] Redaction summary:\n    - Passwords/keys/secrets: 4\n    - Certificates: 2\n    - IP addresses: 11\n    - MAC addresses: 3\n    - Domain names: 5\n    - Email addresses: 1\n    - URLs: 2\n```\n\n---\n\n## Contributing\n\nPull requests welcome.  Particularly:\n\n- Additional pfSense element coverage\n- Plugin XML tag packs (WireGuard, pfBlockerNG, HAProxy, Snort, ACME, FRR)\n- Unit test configs\n\n---\n\n## Licence\n\nMIT\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Safely removes sensitive information from pfSense config.xml exports",
    "version": "1.0.8",
    "project_urls": {
        "Homepage": "https://github.com/grounzero/pfsense-redactor",
        "Issues": "https://github.com/grounzero/pfsense-redactor/issues",
        "Repository": "https://github.com/grounzero/pfsense-redactor"
    },
    "split_keywords": [
        "pfsense",
        " security",
        " redaction",
        " privacy",
        " firewall",
        " config",
        " xml"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "091792ad545efb628fea44e0036b678578ec18c78ec460a3e660963dc98f4454",
                "md5": "d0d7621dbcfe162f714a3fac635d4fec",
                "sha256": "f3d168cbd7063af4808586e38f53e065a226b42d56a7f8182eeba00c665ac270"
            },
            "downloads": -1,
            "filename": "pfsense_redactor-1.0.8-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d0d7621dbcfe162f714a3fac635d4fec",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 29236,
            "upload_time": "2025-11-05T20:14:52",
            "upload_time_iso_8601": "2025-11-05T20:14:52.764485Z",
            "url": "https://files.pythonhosted.org/packages/09/17/92ad545efb628fea44e0036b678578ec18c78ec460a3e660963dc98f4454/pfsense_redactor-1.0.8-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aed3c49c6eb76d2f7261de5cd68843f7422cf3878fdc0fe098f6e68a674e26e5",
                "md5": "ec44fd6550de745b37e588c8983302bd",
                "sha256": "27c691732fafc37ae7fd0e164721471b6f08bff2102f57bde81e7fcbba1e8f59"
            },
            "downloads": -1,
            "filename": "pfsense_redactor-1.0.8.tar.gz",
            "has_sig": false,
            "md5_digest": "ec44fd6550de745b37e588c8983302bd",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 194286,
            "upload_time": "2025-11-05T20:14:54",
            "upload_time_iso_8601": "2025-11-05T20:14:54.065448Z",
            "url": "https://files.pythonhosted.org/packages/ae/d3/c49c6eb76d2f7261de5cd68843f7422cf3878fdc0fe098f6e68a674e26e5/pfsense_redactor-1.0.8.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-05 20:14:54",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "grounzero",
    "github_project": "pfsense-redactor",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pfsense-redactor"
}
        
Elapsed time: 1.42495s