Skip to main content
Posture checks allow you to verify that devices meet your security requirements before they can access network resources. NetBird evaluates device state and configuration to ensure compliance with your security policies.

Overview

Posture checks enable zero-trust security by continuously validating device security posture. Only devices that pass all configured checks can access protected resources.
Posture checks are evaluated in real-time. If a device falls out of compliance, network access is automatically restricted.

Available Posture Check Types

NetBird supports five types of posture checks:

NetBird Version

Ensure peers run a minimum NetBird client version

OS Version

Require minimum operating system or kernel versions

Geolocation

Allow or deny access based on geographic location

Peer Network Range

Restrict based on the peer’s local network address

Process Running

Verify specific security software is running

NetBird Version Check

Ensure all peers are running a minimum version of the NetBird client.

Configuration

{
  "Name": "Minimum NetBird Version",
  "Description": "Require NetBird 0.24.0 or higher",
  "Checks": {
    "NBVersionCheck": {
      "MinVersion": "0.24.0"
    }
  }
}

Use Cases

  • Enforce security patches and bug fixes
  • Ensure compatibility with new features
  • Phase out deprecated client versions
  • Maintain consistent security capabilities
Version strings must be valid semantic versions (e.g., 0.24.0). Pre-release tags like -dev or -alpha are automatically sanitized during comparison.

OS Version Check

Require minimum operating system or kernel versions across different platforms.

Supported Operating Systems

{
  "OSVersionCheck": {
    "Android": {
      "MinVersion": "11.0"
    }
  }
}
Checks Android OS version (e.g., Android 11, 12, 13).

Multi-Platform Configuration

You can specify requirements for multiple platforms in a single check:
{
  "Name": "Minimum OS Versions",
  "Description": "Enforce modern OS versions across all platforms",
  "Checks": {
    "OSVersionCheck": {
      "Android": { "MinVersion": "11.0" },
      "Ios": { "MinVersion": "15.0" },
      "Darwin": { "MinVersion": "12.0" },
      "Linux": { "MinKernelVersion": "5.10" },
      "Windows": { "MinKernelVersion": "10.0.19041" }
    }
  }
}
At least one OS must be specified. Peers running operating systems not listed in the check will be denied access.

Geolocation Check

Control access based on the peer’s geographic location using country codes and city names.

Configuration

{
  "Name": "Allowed Locations",
  "Description": "Only allow access from specific countries",
  "Checks": {
    "GeoLocationCheck": {
      "Action": "allow",
      "Locations": [
        {
          "CountryCode": "US"
        },
        {
          "CountryCode": "GB",
          "CityName": "London"
        },
        {
          "CountryCode": "DE",
          "CityName": "Berlin"
        }
      ]
    }
  }
}

Actions

Allow action grants access only to peers in specified locations:
{
  "Action": "allow",
  "Locations": [
    { "CountryCode": "US" }
  ]
}
  • Peers in listed locations: Access granted
  • Peers in other locations: Access denied

Location Specification

Country Code (required):
  • 2-letter ISO 3166-1 alpha-2 format
  • Examples: US, GB, DE, JP, AU
City Name (optional):
  • Commonly used English city name
  • When specified, both country and city must match
  • Example: "CountryCode": "US", "CityName": "New York"
Peers must have location information available. If location cannot be determined, access is denied for security.

Peer Network Range Check

Restrict access based on the peer’s local network address ranges.

Configuration

{
  "Name": "Corporate Network Only",
  "Description": "Allow only devices on corporate networks",
  "Checks": {
    "PeerNetworkRangeCheck": {
      "Action": "allow",
      "Ranges": [
        "10.0.0.0/8",
        "172.16.0.0/12",
        "192.168.1.0/24"
      ]
    }
  }
}

Actions

Grant access only to peers on specified networks:
{
  "Action": "allow",
  "Ranges": ["192.168.1.0/24"]
}
  • Peer on 192.168.1.x: Access granted
  • Peer on other networks: Access denied

Use Cases

  • Require VPN or office network connectivity
  • Block access from public WiFi networks
  • Enforce network segmentation policies
  • Prevent access from untrusted network ranges
Network ranges are specified using CIDR notation (e.g., 192.168.1.0/24). The check compares the peer’s local network addresses against the masked prefixes.

Process Check

Verify that specific security software or processes are running on the peer device.

Configuration

{
  "Name": "Required Security Software",
  "Description": "Ensure endpoint protection is active",
  "Checks": {
    "ProcessCheck": {
      "Processes": [
        {
          "LinuxPath": "/usr/bin/antivirus-daemon",
          "MacPath": "/Applications/SecuritySoftware.app/Contents/MacOS/daemon",
          "WindowsPath": "C:\\Program Files\\SecuritySoftware\\agent.exe"
        }
      ]
    }
  }
}

Process Specification

Each process can have platform-specific paths: | Platform | Field | Example | |----------|-------|---------|| | Linux | LinuxPath | /usr/sbin/security-agent | | macOS | MacPath | /Library/Application Support/Security/agent | | Windows | WindowsPath | C:\\Program Files\\Security\\agent.exe |
Use double backslashes (\\) for Windows paths in JSON configuration.

Multiple Processes

Require multiple security tools to be running:
{
  "ProcessCheck": {
    "Processes": [
      {
        "LinuxPath": "/usr/bin/antivirus",
        "MacPath": "/Applications/Antivirus.app/Contents/MacOS/antivirus",
        "WindowsPath": "C:\\Program Files\\Antivirus\\av.exe"
      },
      {
        "LinuxPath": "/usr/sbin/firewall-daemon",
        "MacPath": "/Library/Firewall/daemon",
        "WindowsPath": "C:\\Windows\\System32\\firewall.exe"
      },
      {
        "LinuxPath": "/opt/edr/agent",
        "MacPath": "/Applications/EDR.app/Contents/MacOS/agent",
        "WindowsPath": "C:\\Program Files\\EDR\\agent.exe"
      }
    ]
  }
}
All specified processes must be running for the check to pass. At least one platform path must be specified per process.

Combining Multiple Checks

Create comprehensive security policies by combining multiple posture check types:
{
  "Name": "Production Access Requirements",
  "Description": "Strict security requirements for production environment access",
  "Checks": {
    "NBVersionCheck": {
      "MinVersion": "0.24.0"
    },
    "OSVersionCheck": {
      "Windows": { "MinKernelVersion": "10.0.19041" },
      "Darwin": { "MinVersion": "12.0" },
      "Linux": { "MinKernelVersion": "5.10" }
    },
    "GeoLocationCheck": {
      "Action": "allow",
      "Locations": [
        { "CountryCode": "US" },
        { "CountryCode": "GB" }
      ]
    },
    "PeerNetworkRangeCheck": {
      "Action": "allow",
      "Ranges": ["10.0.0.0/8", "192.168.0.0/16"]
    },
    "ProcessCheck": {
      "Processes": [
        {
          "LinuxPath": "/usr/bin/endpoint-security",
          "MacPath": "/Applications/Security.app/Contents/MacOS/security",
          "WindowsPath": "C:\\Program Files\\Security\\endpoint.exe"
        }
      ]
    }
  }
}
When multiple check types are defined, all checks must pass for the peer to gain access. This creates an AND relationship between checks.

Managing Posture Checks

Creating a Posture Check

1

Define Requirements

Identify the security requirements for your environment.
2

Create Check Configuration

Use the API or UI to create a posture check with your requirements.
3

Test with Limited Scope

Apply the check to a small group first to verify it works as expected.
4

Monitor Compliance

Review which peers pass or fail the check.
5

Roll Out

Apply the check to broader peer groups or network policies.

Validation Rules

Posture checks must meet these requirements:
  • Name: Cannot be empty
  • Checks: At least one check type must be defined
  • Version formats: Must be valid semantic versions
  • Country codes: Must be 2-letter ISO 3166-1 alpha-2 format
  • Network ranges: Must be valid CIDR notation
  • Process paths: At least one platform path required per process

Troubleshooting

Diagnosis:
  • Check peer metadata to see reported values
  • Review peer logs for check evaluation details
  • Verify check configuration matches intent
Common causes:
  • Outdated peer information
  • Incorrect version format or comparison
  • Location data not available
  • Process path mismatch
Possible issues:
  • Peer location not being determined
  • GeoIP database out of date
  • Peer behind VPN/proxy obscuring location
Solutions:
  • Verify peer has valid external IP
  • Update GeoIP database if self-hosted
  • Consider network range checks instead for VPN users
Verification steps:
  1. Check exact process path on target system
  2. Ensure process is actually running
  3. Verify path formatting (especially Windows backslashes)
  4. Check file permissions for NetBird to query processes
Platform-specific:
  • Linux: Process must be visible in peer’s process list
  • macOS: May require additional permissions for process enumeration
  • Windows: Ensure correct case and escaped backslashes

Best Practices

1

Start Permissive

Begin with lenient requirements and gradually tighten based on compliance data.
2

Layer Defenses

Use multiple complementary check types for defense in depth.
3

Plan for Exceptions

Have a process for temporary exceptions during incidents or maintenance.
4

Monitor Continuously

Set up alerting for sudden drops in compliance rates.
5

Communicate Changes

Notify users before enforcing new posture requirements.
6

Document Requirements

Maintain clear documentation of why each check exists and what it protects.

Next Steps

Access Policies

Apply posture checks to network policies

Quantum Resistance

Enable post-quantum cryptography

Build docs developers (and LLMs) love