--- title: The anon extension subtitle: Protecting sensitive data in Postgres databases enableTableOfContents: true updatedOn: '2025-11-07T02:45:10.110Z' --- The `anon` extension ([PostgreSQL Anonymizer](https://postgresql-anonymizer.readthedocs.io)) provides data masking and anonymization capabilities to protect sensitive data in Postgres databases. It helps protect personally identifiable information (PII) and other sensitive data, facilitating compliance with regulations such as [GDPR](https://gdpr-info.eu/). This reference guide introduces the `anon` extension's capabilities and masking functions. For complete step-by-step workflows on anonymizing data in Neon branches, including manual procedures and GitHub Actions automation, see [data anonymization](/docs/workflows/data-anonymization). ## Enable the extension The `anon` extension is currently [experimental](/docs/extensions/pg-extensions#experimental-extensions) and may change in future releases. When using the Neon Console or API for anonymization workflows, the extension is enabled automatically. It can also be enabled manually using SQL commands. ### Enable via SQL When working with SQL-based workflows (such as using `psql` or other SQL clients), enable the `anon` extension in your Neon database by following these steps: 1. Connect to your Neon database using either the [Neon SQL Editor](/docs/get-started/query-with-neon-sql-editor) or an SQL client like [psql](/docs/connect/query-with-psql-editor) 2. Enable experimental extensions: ```sql SET neon.allow_unstable_extensions='true'; ``` 3. Install the extension: ```sql CREATE EXTENSION IF NOT EXISTS anon; ``` When using the Neon Console or API to create branches, the extension is enabled automatically. See the [data anonymization workflow guide](/docs/workflows/data-anonymization) for details. ## Masking rules Masking rules define which data to mask and how to mask it using SQL syntax. These rules are applied using `SECURITY LABEL` SQL commands and stored within the database schema to implement the privacy by design principle. ## Masking functions The `anon` extension provides [built-in functions](https://postgresql-anonymizer.readthedocs.io/en/latest/masking_functions/) for different anonymization requirements, including but not limited to: | Function Type | Description | Example | | ------------------ | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------- | | Faking | Generate realistic data | `anon.fake_first_name()` and `anon.lorem_ipsum()` | | Pseudonymization | Create consistent and reversible fake data | `anon.pseudo_email(seed)` | | Randomization | Generate random values | `anon.random_int_between(10, 100)` and `anon.random_in_enum(enum_column)` | | Partial scrambling | Hide portions of strings | `anon.partial(ip_address, 8, ''XXX.XXX'', 0)` would change `192.168.1.100` to `192.168.XXX.XXX` | | Nullification | Replace with static values or `NULL` | `MASKED WITH VALUE 'CONFIDENTIAL'` | | Noise addition | Alter numerical values while maintaining distribution | `anon.noise(salary, 0.1)` adds `+/- 10%` noise to the `salary` column | | Generalization | Replace specific values with broader categories | `anon.generalize_int4range(age, 10)` would change `54` to `[50,60)` | ## Static masking Static masking permanently modifies the original data in your tables. This approach is useful for creating anonymized copies of data when: - Migrating production data to development branches - Creating sanitized datasets for testing - Archiving data with sensitive information removed - Distributing data to third parties ### Branch operations and static masking When using Neon's branch features with static masking: - Creating a child branch copies all data as-is from the parent - Resetting a branch from the parent replaces all branch data with the parent's current state - In both cases, any previous anonymization is lost and must be reapplied ## Practical examples For complete implementation examples showing how to apply these masking functions in real workflows, see the [data anonymization guide](/docs/workflows/data-anonymization), which covers: - Creating and anonymizing development branches - Applying different masking strategies to protect sensitive data - Automating anonymization with GitHub Actions - Best practices and safety tips ## Limitations - Neon currently only supports static masking with the `anon` extension - With static masking, branch reset operations restore original data, requiring anonymization to be run again - Additional `pg_catalog` functions cannot be declared as `TRUSTED` in Neon's implementation ## Conclusion The `anon` extension provides a toolkit for protecting sensitive data in Postgres databases. By defining appropriate masking rules, you can create anonymized datasets that maintain usability while protecting individual privacy. ## Reference - [Data anonymization workflow guide](/docs/workflows/data-anonymization) - Practical guide for anonymizing data in Neon branches - [PostgreSQL Anonymizer Repository](https://gitlab.com/dalibo/postgresql_anonymizer) - [Official Documentation](https://postgresql-anonymizer.readthedocs.io/en/latest/) - [Masking Functions Reference](https://postgresql-anonymizer.readthedocs.io/en/latest/masking_functions/)