Security at WATCHDESK

How your department's data is protected

WATCHDESK is built to protect the sensitive personal information that volunteer fire departments entrust to it — including Social Security Numbers, personal contact details, and service records. Security is not an afterthought; it is engineered into every layer of the platform, from how data is stored and encrypted to how users authenticate and how stations are isolated from one another.

This document provides a technical overview of the security controls in place. If you have questions about any of these measures, contact admin@watchdesk.org.

Security at a Glance

Key protections built into every layer of the platform

🔒
Encryption at Rest SSNs encrypted with AES-256-GCM authenticated encryption
🔐
Encryption in Transit All connections secured with TLS 1.2+ / HTTPS enforced
🛡
Tenant Isolation Station data is logically separated at the database query level
👤
OAuth 2.0 SSO No passwords stored — delegates to Google or Microsoft identity
📑
Full Audit Trail Every create, update, delete, and access event is logged
🛡
Role-Based Access Granular permissions limit who can view, edit, or certify data

Contents

Data Encryption & SSN Protection

How Social Security Numbers and sensitive PII are safeguarded

Social Security Numbers are the most sensitive data WATCHDESK handles. They are required for LOSAP retirement credit forms and Maryland State Tax Credit submissions, and they receive the highest level of protection in the system.

Encryption at Rest

SSNs are encrypted before being written to the database using AES-256-GCM (Advanced Encryption Standard with 256-bit keys in Galois/Counter Mode). This is an authenticated encryption algorithm, which means it provides both confidentiality (data cannot be read without the key) and integrity (any tampering with the ciphertext is automatically detected and rejected).

  • Key length: 256-bit (the strongest AES key size)
  • Mode: GCM (Galois/Counter Mode) with a 128-bit authentication tag
  • Initialization vector: A cryptographically random 96-bit IV is generated for each encryption operation, ensuring that encrypting the same SSN twice produces completely different ciphertext
  • Key storage: The encryption key is stored in Google Cloud Secret Manager, a dedicated secrets vault — completely separate from the database. The key never resides in source code, configuration files, or environment variables on disk

Access Controls on SSN Data

  • SSNs are never displayed in standard application views. Only a masked format (e.g., ***-**-1234) is shown in the interface
  • Full SSN decryption occurs only when generating official LOSAP or State Tax forms required by government agencies
  • Administrative access to reveal a full SSN is rate-limited (maximum 10 requests per 15-minute window per user) and individually logged with the requesting user's identity and timestamp
  • Members can view their own SSN through the self-service portal, subject to the same rate limiting and audit logging
Key separation principle: The encryption key and the encrypted data are stored in completely separate systems. Gaining access to the database alone does not provide the ability to decrypt any SSN. An attacker would need to independently compromise both the database and the secrets management system.
Other PII: Personal information such as names, addresses, phone numbers, dates of birth, and driver's license data is stored in the database and protected by connection encryption (TLS), access controls, and station-level data isolation. This data is accessible only to authorized users within the member's own station.

Connection Security

Protecting data as it moves between your browser and our servers

All communication between your browser and WATCHDESK is encrypted using TLS (Transport Layer Security). This prevents anyone on the network — including ISPs, Wi-Fi operators, or other devices on the same network — from reading or modifying data in transit.

HTTPS Enforcement

  • WATCHDESK is served exclusively over HTTPS. Unencrypted HTTP connections are not accepted
  • The server sends a Strict-Transport-Security (HSTS) header with a one-year duration, instructing browsers to always use HTTPS for all future requests — even if a user types http:// in the address bar
  • TLS termination is handled by Google's global load balancer infrastructure, which supports TLS 1.2 and TLS 1.3 with modern cipher suites

Database Connection Encryption

The connection between the application server and the PostgreSQL database is encrypted automatically through Google Cloud's internal networking. In the production environment, the application connects via a secure Unix domain socket provided by Google Cloud SQL, which does not traverse any external network.

End-to-end protection: Data is encrypted from the moment it leaves your browser until it reaches the application server (TLS), and SSNs remain encrypted even when stored in the database (AES-256-GCM). There is no point in the data lifecycle where sensitive information is unprotected.

Authentication

How users prove their identity

WATCHDESK uses OAuth 2.0 Single Sign-On (SSO) for all member authentication. This means WATCHDESK does not store or manage user passwords. Instead, authentication is delegated to your station's existing identity provider — either Google Workspace or Microsoft 365.

Why This Matters

  • No password database to breach. Since WATCHDESK never stores passwords, there is no password database that could be compromised
  • Your IT policies apply automatically. Password complexity requirements, multi-factor authentication (MFA), account suspension, and session policies set by your station's IT administrator are enforced by Google or Microsoft — not by WATCHDESK
  • Credential phishing is mitigated. Users sign in through Google or Microsoft's own login page — never through a WATCHDESK-hosted password form
  • Instant deactivation. If a member leaves the department and their Google Workspace or Microsoft 365 account is disabled, they immediately lose access to WATCHDESK. No separate account to remember to deactivate

Per-Station OAuth Configuration

Each station has its own OAuth credentials, registered under that station's own Google Workspace or Microsoft 365 tenant. This means your station's IT administrator controls which identity provider is used and maintains full ownership of those credentials.

Account linking: When a member signs in for the first time, they are prompted to link their email to their existing member record by entering their PGFD identification number. This one-time step connects their identity provider account to their department record. No new accounts are created on external services.

Authorization & Access Control

Who can see and do what within the application

After a user is authenticated, WATCHDESK enforces role-based access control (RBAC) to determine what actions they are permitted to take. Roles are assigned per member and are checked on every request.

Role Capabilities
Member (default) View own profile, activity history, and qualification points. Submit training, hours, and other records for admin review. Edit own contact information.
Data Entry Everything a member can do, plus create and edit records for all station members (responses, meetings, drills, hours, training, etc.).
Station Admin Everything data entry can do, plus delete records, approve or reject member submissions, manage lookup values, assign roles, and view the activity audit log.
Certifier Review and certify annual LOSAP and State Tax qualification status for members. This role is separate from admin to allow segregation of duties.
Feature-level enforcement: Authorization is not just page-level. Individual operations (creating a member, deleting a record, revealing an SSN, certifying LOSAP eligibility) each have their own permission check. Even if a URL is known, unauthorized actions are blocked at the server before any data is accessed.

Multi-Tenant Data Isolation

How your station's data is kept separate from every other station

WATCHDESK serves multiple fire stations from a single platform. Each station's data is logically isolated so that members and administrators at one station can never view, query, or modify data belonging to another station.

How Isolation Works

  • Every record in the database (members, responses, meetings, hours, training, attachments, audit logs, etc.) is tagged with a station identifier
  • When a user signs in, the system determines their station from their member record. Every subsequent database query is automatically scoped to include only records matching that station identifier
  • This scoping is applied at the service layer — the code that executes before any database query runs. There is no mechanism in the application for a user to override or alter their station scope
  • File attachments are organized into station-specific storage paths. A download request for a file belonging to another station will be denied even if the file identifier is known

What This Means for Your Station

Your member roster, response history, hours, training records, meeting attendance, LOSAP and State Tax data, and uploaded documents are visible only to authorized members of your own station. No other station on the platform can access your data through the application.

Your Data Stays Yours

Station data isolation is enforced on every query, every API call, and every file request. It is not optional, not configurable, and cannot be bypassed by end users. This is a core architectural guarantee of the platform.

HTTP Security Headers

Browser-level protections applied to every response

WATCHDESK sends a suite of security headers with every HTTP response. These headers instruct the browser to enable built-in protections against common web attacks.

Header Protection Provided
Strict-Transport-Security Forces HTTPS for all connections for one year, preventing protocol downgrade attacks
X-Content-Type-Options Prevents browsers from misinterpreting file types (MIME sniffing), reducing the risk of certain injection attacks
X-Frame-Options Blocks the application from being embedded in iframes on other websites, preventing clickjacking attacks
Content-Security-Policy Restricts which external resources (scripts, styles, fonts, images) the browser is allowed to load, mitigating cross-site scripting (XSS) attacks
Referrer-Policy Limits the information sent in the Referer header when navigating away, preventing URL-based data leakage
Permissions-Policy Disables browser APIs that WATCHDESK does not use (camera, microphone, geolocation), reducing the attack surface
API response caching: All API endpoints return Cache-Control: no-store headers, ensuring that sensitive data is never cached by the browser or any intermediate proxy.

Rate Limiting & Abuse Prevention

Protection against brute-force and automated attacks

Sensitive endpoints are protected by rate limiting, which restricts the number of requests a single client can make within a time window. This defends against brute-force login attempts, credential stuffing, and automated data harvesting.

Protected Action Limit
Login and account linking 10 attempts per 15-minute window
OAuth initiation 20 attempts per 15-minute window
Local password authentication 5 attempts per 15-minute window
SSN reveal (admin or self-service) 10 requests per 15-minute window

When a rate limit is exceeded, the server responds with 429 Too Many Requests and the client must wait for the window to reset. Rate limits are applied per IP address.

Timing attack prevention: Login endpoints use constant-time comparison techniques. When a username is not found, the server still performs a password hash comparison against a dummy value so that the response time is consistent regardless of whether the account exists. This prevents attackers from enumerating valid usernames by measuring response times.

File Upload Security

Multi-layer validation for every uploaded file

Members and administrators can upload file attachments (certificates, training documents, images, etc.) to various record types. Every upload passes through three layers of validation before being accepted.

Three-Layer File Validation

  1. MIME type allowlist — Only approved file types are accepted (PDF, JPEG, PNG, GIF, WebP, Microsoft Office, and plain text). All other types are rejected
  2. Extension cross-validation — The file extension must match the declared MIME type. A file claiming to be image/jpeg but named with an .html extension is rejected
  3. Magic byte inspection — The actual binary content of the file is inspected to verify its true format matches the declared type. This prevents attackers from disguising executable or script files as images or documents

Storage & Access

  • Files are stored in a private cloud storage bucket that is not publicly accessible. There are no direct download URLs
  • All file downloads are served through authenticated API endpoints that verify the requesting user's identity and station membership before returning the file
  • Files are organized into station-specific paths, reinforcing data isolation
  • Maximum file size is 10 MB per upload
  • Per-station storage quotas can be configured to prevent abuse
  • All uploads and deletions are recorded in the audit log

Audit Logging

A complete record of who did what and when

WATCHDESK maintains a comprehensive audit trail of all significant actions taken within the application. This log provides accountability, supports incident investigation, and helps station administrators monitor activity.

What Is Logged

  • Record operations — every create, update, and delete across all modules (members, responses, meetings, hours, training, drills, certifications, etc.)
  • Approval actions — when an admin approves or rejects a member submission
  • SSN access — every time a full SSN is revealed, including who requested it
  • File operations — uploads and deletions, including filename and size
  • Certification actions — when a certifier marks a member as LOSAP or State Tax qualified

Log Details

Each audit entry records the date and time, the email address of the user who performed the action, the type of action (create, update, delete, approve, reject, etc.), and a description of what was affected. Logs are scoped to each station and viewable by station administrators through the admin dashboard.

Immutable record: Audit log entries cannot be edited or deleted through the application interface. They serve as a tamper-resistant record of activity for compliance and accountability purposes.

Session Security

How user sessions are managed and protected

After a user signs in, the application creates a session to maintain their authenticated state across page requests. Sessions are designed with the following protections:

  • Server-side storage — session data is stored in the database, not in the browser. The browser receives only an opaque session identifier cookie
  • HttpOnly flag — the session cookie cannot be read by client-side JavaScript, protecting against cross-site scripting (XSS) attacks that attempt to steal session tokens
  • Secure flag — the cookie is transmitted only over HTTPS connections, preventing interception on unencrypted networks
  • SameSite attribute — set to Lax, which prevents the cookie from being sent on cross-origin POST requests — a defense against cross-site request forgery (CSRF) attacks
  • Automatic expiration — sessions expire after 4 hours of inactivity. Expired sessions are automatically purged from the database on an hourly cycle
  • No token persistence — OAuth access tokens received during sign-in are used once for identity verification and then discarded. They are not stored in the session or anywhere else in the system

Infrastructure & Hosting

Where the platform runs and how the environment is secured

WATCHDESK runs entirely on Google Cloud Platform (GCP), one of the three major hyperscale cloud providers. Google Cloud's infrastructure is SOC 1/2/3 certified, ISO 27001 certified, and FedRAMP authorized.

Platform Components

Component Service Security Benefit
Application Hosting Google App Engine Fully managed runtime with automatic patching, no OS-level access to maintain
Database Google Cloud SQL (PostgreSQL) Managed database with automated backups, encryption at rest, and private networking
File Storage Google Cloud Storage Private bucket with IAM-based access control; no public URLs
Secrets Management Google Cloud Secret Manager Encryption keys, database credentials, and OAuth secrets stored in a dedicated vault with IAM-controlled access
TLS Termination Google Cloud Load Balancer TLS 1.2+ with modern cipher suites, managed SSL certificates

Operational Security

  • No direct server access — the application runs on a fully managed platform (App Engine). There is no SSH access, no operating system to patch, and no server configuration files exposed
  • Automatic scaling — the platform scales instances up and down based on traffic. When idle, it can scale to zero instances, minimizing the attack surface
  • Secrets never in code — database passwords, encryption keys, and OAuth credentials are fetched at startup from Secret Manager. They are never committed to source code or stored in configuration files
  • Automated backups — the database is automatically backed up by Google Cloud SQL, with point-in-time recovery available

Questions

We're happy to discuss any of these measures in more detail

If you have questions about WATCHDESK's security practices, want to discuss specific compliance requirements, or need additional information for your station's evaluation, please contact:

admin@watchdesk.org

For information about what data WATCHDESK collects and how it is used, see our Privacy Statement. For a full overview of platform features, see the Platform Overview.

Security Controls Summary

All protections at a glance

AES-256-GCM Encryption SSNs encrypted at rest with authenticated encryption
TLS 1.2+ / HTTPS All connections encrypted in transit with HSTS enforcement
OAuth 2.0 SSO No passwords stored; delegates to Google or Microsoft
Role-Based Access Control Granular permissions enforced on every request
Station Data Isolation Query-level scoping prevents cross-station access
Rate Limiting Brute-force protection on auth and SSN endpoints
Full Audit Trail Every action logged with user identity and timestamp
Security Headers HSTS, CSP, X-Frame-Options, and more on every response
3-Layer File Validation MIME check, extension match, and magic byte inspection
Secure Sessions HttpOnly, Secure, SameSite cookies with 4-hour expiry
Secrets Management Keys and credentials stored in GCP Secret Manager vault
Google Cloud Platform SOC 2, ISO 27001, FedRAMP authorized infrastructure