diff --git a/api/changelog.d/sentry-no-personal-data.security.md b/api/changelog.d/sentry-no-personal-data.security.md new file mode 100644 index 0000000000..b0c7d6d5fe --- /dev/null +++ b/api/changelog.d/sentry-no-personal-data.security.md @@ -0,0 +1 @@ +Sentry error events no longer include user identity, IP addresses, cookies, headers or request bodies, which could contain personal data or provider credentials diff --git a/api/src/backend/api/tests/test_sentry.py b/api/src/backend/api/tests/test_sentry.py index 14308f0cb6..c83861a2e4 100644 --- a/api/src/backend/api/tests/test_sentry.py +++ b/api/src/backend/api/tests/test_sentry.py @@ -30,6 +30,21 @@ def test_initialize_sentry_uses_configured_dsn(): assert mock_init.call_args.kwargs["before_send"] is sentry_settings.before_send +def test_initialize_sentry_sends_no_personal_data(): + with ( + patch.object( + sentry_settings.env, + "str", + return_value="https://fake-public-key@sentry.example.invalid/1", + ), + patch.object(sentry_settings.sentry_sdk, "init") as mock_init, + ): + sentry_settings.initialize_sentry() + + assert mock_init.call_args.kwargs["send_default_pii"] is False + assert mock_init.call_args.kwargs["max_request_body_size"] == "never" + + def _make_log_record(msg, level=logging.ERROR, name="test", args=None): """Build a real LogRecord so getMessage() works like in production.""" record = logging.LogRecord( diff --git a/api/src/backend/config/settings/sentry.py b/api/src/backend/config/settings/sentry.py index f5a593601e..1d283f9041 100644 --- a/api/src/backend/config/settings/sentry.py +++ b/api/src/backend/config/settings/sentry.py @@ -193,10 +193,10 @@ def initialize_sentry(): sentry_sdk.init( dsn=sentry_dsn, - # Add data like request headers and IP for users, - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info before_send=before_send, - send_default_pii=True, + # No user identity, IPs, cookies, headers or request bodies: bodies carry emails and provider details. + send_default_pii=False, + max_request_body_size="never", traces_sample_rate=env.float("DJANGO_SENTRY_TRACES_SAMPLE_RATE", default=0.02), _experiments={ # Set continuous_profiling_auto_start to True