A lightweight and flexible Python library for scrubbing sensitive information from Sentry events before they are sent to the server.
Project description
Sentry Scrubber
A lightweight Python library designed to protect sensitive information in Sentry events.
Introduction
sentry-scrubber is a lightweight Python library designed to protect sensitive information in Sentry events. It
automatically detects and scrubs usernames, IP addresses, file paths, and other potentially sensitive data before events
are sent to Sentry.
Table of Contents
Installation
pip install sentry-scrubber
Basic Usage
Quick Start
import sentry_sdk
from sentry_scrubber.scrubber import SentryScrubber
# Create a scrubber with default settings
scrubber = SentryScrubber()
# Initialize Sentry with the scrubber
sentry_sdk.init(
dsn="https://your-dsn@sentry.io/project",
before_send=scrubber.scrub_event
)
Scrubbing Individual Events
from sentry_scrubber.scrubber import SentryScrubber
# Create a scrubber instance
scrubber = SentryScrubber()
# Example event with sensitive information
event = {
"user": {"username": "john_doe"},
"server_name": "johns-macbook",
"contexts": {
"os": {
"home_dir": "/Users/john_doe/Documents"
}
},
"request": {
"url": "https://api.example.com/users/john_doe",
"env": {
"SERVER_ADDR": "192.168.1.1"
}
}
}
# Scrub the event
scrubbed_event = scrubber.scrub_event(event)
print(scrubbed_event)
# Result: {'user': {'username': '<redacted>'}, 'server_name': '<redacted>', 'contexts': {'os': {'home_dir': '/Users/<redacted>/Documents'}}, 'request': {'url': 'https://api.example.com/users/<redacted>', 'env': {'SERVER_ADDR': '<redacted>'}}}
Scrubbing Text
from sentry_scrubber.scrubber import SentryScrubber
scrubber = SentryScrubber()
sensitive_occurrences = set()
# Example text with sensitive information
text = "Error in file /home/username/app/main.py at line 42, reported from 192.168.1.1"
# Scrub the text
scrubbed_text = scrubber.scrub_text(text, sensitive_occurrences)
print(scrubbed_text) # "Error in file /home/<redacted>/app/main.py at line 42, reported from <redacted>"
print(sensitive_occurrences) # {'username'}
Configuration Options
Custom Home Folders
from sentry_scrubber.scrubber import SentryScrubber
# Define custom home folders to detect usernames
custom_home_folders = {
'users',
'home',
'projects', # Custom folder
'workspace' # Custom folder
}
scrubber = SentryScrubber(home_folders=custom_home_folders)
Sensitive Dictionary Keys
from sentry_scrubber.scrubber import SentryScrubber
# Define custom keys to scrub
custom_keys = {
'USERNAME',
'USERDOMAIN',
'server_name',
'COMPUTERNAME',
'api_key', # Custom sensitive key
'auth_token', # Custom sensitive key
'password' # Custom sensitive key
}
scrubber = SentryScrubber(dict_keys_for_scrub=custom_keys)
Dictionary Markers for Removal
from sentry_scrubber.scrubber import SentryScrubber
# Define markers that indicate sections to be removed
dict_markers = {
'visibility': 'private'
}
scrubber = SentryScrubber(dict_markers_to_scrub=dict_markers)
# Example usage
event = {
'public_info': 'This is public',
'private_section': {
'visibility': 'private', # This will cause the entire 'private_section' to be redacted
'secret_data': 'sensitive information'
}
}
scrubbed = scrubber.scrub_event(event)
# Result: {'public_info': 'This is public', 'private_section': '<redacted>'}
Exclusions
from scrubber import SentryScrubber
# Define values to be excluded from scrubbing
exclusions = {
'local',
'127.0.0.1',
'localhost', # Custom exclusion
'admin', # Custom exclusion
'test_user' # Custom exclusion
}
scrubber = SentryScrubber(exclusions=exclusions)
Disable IP or Hash Scrubbing
from scrubber import SentryScrubber
# Create a scrubber that doesn't scrub IP addresses
scrubber_no_ip = SentryScrubber(scrub_ip=False)
# Create a scrubber that doesn't scrub hash values
scrubber_no_hash = SentryScrubber(scrub_hash=False)
# Create a scrubber that scrubs neither IPs nor hashes
scrubber_minimal = SentryScrubber(scrub_ip=False, scrub_hash=False)
Advanced Scrubbing Techniques
Define Event Fields to Remove
from scrubber import SentryScrubber
scrubber = SentryScrubber()
# Add fields to completely remove from events
scrubber.event_fields_to_cut.add('device')
scrubber.event_fields_to_cut.add('debug_data')
Sensitive Information Pairs
from scrubber import SentryScrubber
scrubber = SentryScrubber()
# Manually add sensitive information and corresponding placeholders
scrubber.sensitive_strings.add({"john_doe", "secret_token_123"})
# Now any instance of these strings will be replaced in subsequent scrubs
text = "User john_doe used secret_token_123 to authenticate"
scrubbed = scrubber.scrub_text(text)
# Result: "User <redacted> used <redacted> to authenticate"
Integration with Sentry
Django Integration
# settings.py
import sentry_sdk
from sentry_scrubber.scrubber import SentryScrubber
from sentry_sdk.integrations.django import DjangoIntegration
scrubber = SentryScrubber(
# Add custom configurations here
dict_keys_for_scrub={'api_key', 'csrf_token', 'session_id', 'USERNAME'}
)
sentry_sdk.init(
dsn="https://your-dsn@sentry.io/project",
integrations=[DjangoIntegration()],
before_send=scrubber.scrub_event
)
Flask Integration
# app.py
import sentry_sdk
from sentry_scrubber.scrubber import SentryScrubber
from sentry_sdk.integrations.flask import FlaskIntegration
from flask import Flask
# Initialize scrubber
scrubber = SentryScrubber()
# Initialize Sentry with Flask integration
sentry_sdk.init(
dsn="https://your-dsn@sentry.io/project",
integrations=[FlaskIntegration()],
before_send=scrubber.scrub_event
)
app = Flask(__name__)
FastAPI Integration
# main.py
import sentry_sdk
from sentry_scrubber.scrubber import SentryScrubber
from fastapi import FastAPI
# Initialize scrubber
scrubber = SentryScrubber()
# Initialize Sentry
sentry_sdk.init(
dsn="https://your-dsn@sentry.io/project",
before_send=scrubber.scrub_event
)
app = FastAPI()
API Reference
SentryScrubber
SentryScrubber(
home_folders: Optional[set] = None,
dict_keys_for_scrub: Optional[set] = None,
dict_markers_to_scrub: Optional[dict] = None,
exclusions: Optional[set] = None,
scrub_ip: bool = True,
scrub_hash: bool = True,
)
Methods
scrub_event(event: Optional[Dict[str, Any]], _=None) -> Optional[Dict[str, Any]]: Scrubs a Sentry eventscrub_text(text: Optional[str], sensitive_occurrences: Set[str]) -> Optional[str]: Scrubs sensitive information from textscrub_entity_recursively(entity, sensitive_strings: set, depth=10): Recursively scrubs an entity
Properties
home_folders: Set of folder names used to identify usernames in pathsdict_keys_for_scrub: Set of dictionary keys whose values should be scrubbeddict_markers_to_scrub: Dictionary of markers that indicate sections to be redactedevent_fields_to_cut: Set of fields to remove from eventsexclusions: Set of values to exclude from scrubbing
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sentry_scrubber-2.0.0.tar.gz.
File metadata
- Download URL: sentry_scrubber-2.0.0.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.12.3 Linux/6.8.0-1021-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
470204bae09cb8a37361e03cc082874fcad44b5bce15c14d0a2ff35f84e9dd95
|
|
| MD5 |
a444c65f4eb17ff577f4ede5f5511437
|
|
| BLAKE2b-256 |
2ad1abdfc5ced28f696ada98ec87ce2aab631b47c1d31d53402ecde8ee772e86
|
File details
Details for the file sentry_scrubber-2.0.0-py3-none-any.whl.
File metadata
- Download URL: sentry_scrubber-2.0.0-py3-none-any.whl
- Upload date:
- Size: 12.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.12.3 Linux/6.8.0-1021-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76c425e568e34f829dbb5b1c866dc6fcb31cae16f361959639af06374134c15b
|
|
| MD5 |
2197fca733e19500a62f0d551c3e7419
|
|
| BLAKE2b-256 |
32bcbc4454685ba6378835a8fe6f1ccf62c7d99eb5a1646d4bd0e87b2de56cf9
|