· by Milos Petrovic· security· http headers· monitoring· sre

    Monitor Security Headers: CSP, HSTS, & More

    Your site can be 'up' but still insecure. Learn how to use uptime monitoring checks to enforce security headers like Content-Security-Policy (CSP), HSTS, and others to prevent silent security regressions.

    Cover image for Monitor Security Headers: CSP, HSTS, & More

    A 200 OK status code tells you your server is responding, but it doesn't tell you if it's responding securely. A single code change, a web server update, or a CDN misconfiguration can silently strip critical HTTP security headers from your responses. This can leave your application and your users vulnerable to attacks like cross-site scripting (XSS) and clickjacking, even while your uptime checks report 100% availability.

    This is a blind spot in many monitoring strategies. You need to go beyond uptime and verify that your security posture remains intact. This guide explains why and how to monitor your application's security headers automatically.

    Why Monitor Security Headers?

    Monitoring security headers isn't about paranoia; it's about robust engineering. It turns your security policy from a one-time configuration into a continuously verified, testable part of your infrastructure.

    • Prevent Silent Regressions: The most common benefit is catching accidental regressions. A developer might update a middleware library, or an operator might tweak a load balancer config, inadvertently removing a header. Header monitoring turns this silent failure into a loud, actionable alert.
    • Enforce Policy: It ensures your intended security policy is actually being enforced in production. What's in your nginx.conf or web framework code is the intention; what a user's browser receives is the reality. Monitor the reality.
    • Catch Environment-Specific Errors: A header might be set correctly in your local development environment but be stripped or modified by a caching layer, CDN, or reverse proxy in production. External monitoring is the only way to catch this.

    Key Security Headers to Monitor

    While there are many security-related headers, start with the ones that provide the biggest security wins. You can use curl to quickly check the current headers for any site.

    # Use -I to fetch headers only
    curl -I https://your-domain.com
    

    Strict-Transport-Security (HSTS)

    This header is a critical defense against protocol downgrade attacks and cookie hijacking. It tells browsers to only communicate with your site over HTTPS.

    • What it does: Forces all subsequent connections to use HTTPS, preventing man-in-the-middle attacks that try to downgrade connections to HTTP.
    • Example: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
    • What to Monitor:
      • Presence: The header must be present on your primary domain's response.
      • Value: The max-age should be a large value, typically one to two years in seconds (31,536,000 to 63,072,000). A small max-age might indicate a misconfiguration.

    Content-Security-Policy (CSP)

    CSP is a powerful defense against Cross-Site Scripting (XSS). It allows you to create an allow-list of sources for content like scripts, styles, and images.

    • What it does: Prevents the browser from loading resources from unauthorized domains or executing inline scripts.
    • Example: Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com;
    • What to Monitor:
      • Presence: The most important thing is simply ensuring the header is present. CSP policies can be long and complex, so matching the entire value can be brittle. An alert on a missing CSP header is a huge win.

    X-Frame-Options / Content-Security-Policy: frame-ancestors

    These headers prevent your site from being embedded in an <iframe> on another site, a primary defense against clickjacking attacks.

    • What it does: Stops attackers from loading your site in a transparent iframe and tricking users into clicking on buttons or links.
    • Example: X-Frame-Options: DENY or Content-Security-Policy: frame-ancestors 'none';
    • What to Monitor:
      • Presence & Value: The header should be present with a value of DENY, SAMEORIGIN, or 'none' for frame-ancestors. Alert if it's missing or has a less-secure value.

    Other Important Headers

    • X-Content-Type-Options: nosniff: Prevents the browser from MIME-sniffing a response away from the declared content type.
    • Referrer-Policy: strict-origin-when-cross-origin: Protects user privacy by controlling how much referrer information is included with requests.
    • Permissions-Policy: Controls which browser features (like camera, microphone, geolocation) can be used on your site.

    How to Monitor Headers: A Practical Guide

    Manual Checks with curl

    You can perform a quick check from the command line using curl and grep. This is perfect for debugging or one-off verification.

    # Check for HSTS header and its content
    curl -s -I https://serverinspector.com/ | grep -i "Strict-Transport-Security"
    
    # Expected output:
    # Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
    

    While useful, manual checks don't scale and can't alert you when a header disappears at 3 AM.

    Automated Monitoring

    To continuously enforce your security policy, you need automated monitoring. The right tool can turn your security requirements into actionable alerts.

    Tools like ServerInspector make this simple. You can configure a standard HTTP Uptime Check to also perform Header Assertions. This lets you require a specific header to be present, and you can even use regular expressions to verify its value. This turns a security policy into an automated, alerting check that runs 24/7.

    Header Monitoring Checklist

    Use this table as a starting point for building your header monitoring strategy.

    HeaderCheck TypeWhat to VerifyAlert Condition
    Strict-Transport-SecurityHeader PresenceHeader exists on a 301/302 redirect or 200 OK responseHeader is missing
    Strict-Transport-SecurityHeader Value Containsmax-age is a large number (e.g., 31536000)max-age is small or missing
    Content-Security-PolicyHeader PresenceHeader existsHeader is missing
    X-Frame-OptionsHeader Value EqualsValue is DENY or SAMEORIGINHeader is missing or has wrong value
    X-Content-Type-OptionsHeader Value EqualsValue is nosniffHeader is missing or has wrong value
    Server / X-Powered-ByHeader AbsenceHeader does not existHeader is present

    Integrating into Your Workflow

    Don't just set up alerts and forget them. Integrate security header monitoring into your development and deployment processes.

    1. Add to New Service Checklists: When launching a new service or endpoint, make "Configure Header Monitoring" a required step.
    2. Test in CI/CD: Use curl scripts in your CI pipeline to test headers against your staging environment before deploying to production.
    3. Use External Monitoring for Production: For critical services, continuous external monitoring from multiple regions, like that provided by ServerInspector, is the ultimate safety net. It will catch any configuration drift or deployment error that slips past your CI pipeline.

    FAQ

    Q: Isn't this overkill? My server configuration handles this.

    A: Configuration is intention, but monitoring is verification. Server configs can be overridden by other layers (load balancers, CDNs), deployments can fail, and human error happens. Automated monitoring verifies that your intention is being met in the real world, 24/7.

    Q: Should I monitor every single security header?

    A: Start with the most critical ones that offer the biggest security benefits: Strict-Transport-Security, Content-Security-Policy, and X-Frame-Options (or frame-ancestors). You can add others as your security posture matures.

    Q: My CSP is very long and changes often. How can I monitor it effectively?

    A: For complex and dynamic headers like CSP, simply monitoring for the presence of the Content-Security-Policy header is a great start. It's often not practical to match the entire value. An alert that the header is missing entirely is extremely valuable.

    Q: Can I monitor for headers that shouldn't be there?

    A: Yes, and it's a good practice for minimizing fingerprinting. You can set up checks that alert you if a "forbidden" header like Server, X-Powered-By, or X-AspNet-Version is found in the response. This helps ensure your information leakage policies are being followed.