Skip to main content

A Nagios plugin for monitoring Microsoft Defender API endpoints

Project description

๐Ÿ›ก๏ธ Check MS Defender

Python Version License: MIT Build Status

A comprehensive Nagios plugin for monitoring Microsoft Defender for Endpoint API endpoints. Built with modern Python practices and designed for enterprise monitoring environments.

โœจ Features

  • ๐Ÿ” Dual Authentication - Support for Client Secret and Certificate-based authentication
  • ๐ŸŽฏ Multiple Endpoints - Monitor onboarding status, last seen, vulnerabilities, products with CVEs, alerts, and machine details
  • ๐Ÿ“Š Nagios Compatible - Standard exit codes and performance data output
  • ๐Ÿ—๏ธ Clean Architecture - Modular design with testable components
  • ๐Ÿ”ง Flexible Configuration - File-based configuration with sensible defaults
  • ๐Ÿ“ˆ Verbose Logging - Multi-level debugging support
  • ๐Ÿ Modern Python - Built with Python 3.9+ using type hints and async patterns

๐Ÿš€ Quick Start

Installation

# Create virtual environment (recommended)
python -m venv /usr/local/libexec/nagios/check_msdefender
source /usr/local/libexec/nagios/check_msdefender/bin/activate

# Install from source
pip install git+https://github.com/lduchosal/check_msdefender.git

Basic Usage

# Check machine onboarding status
check_msdefender onboarding -d machine.domain.tld

# Check last seen (with custom thresholds)
check_msdefender lastseen -d machine.domain.tld -W 7 -C 30

# Check vulnerabilities
check_msdefender vulnerabilities -d machine.domain.tld -W 10 -C 100

# Check products with CVE vulnerabilities
check_msdefender products -d machine.domain.tld -W 5 -C 1

# Check alerts
check_msdefender alerts -d machine.domain.tld -W 1 -C 5

# List all machines
check_msdefender machines

# Get detailed machine info
check_msdefender detail -d machine.domain.tld

๐Ÿ“‹ Available Commands

Command Description Default Thresholds
onboarding Check machine onboarding status W:1, C:2
lastseen Days since machine last seen W:7, C:30
vulnerabilities Vulnerability score calculation W:10, C:100
products Count of vulnerable software with CVEs W:5, C:1
alerts Count of unresolved alerts W:1, C:0
machines List all machines W:10, C:25
detail Get detailed machine information -

Vulnerability Scoring

The vulnerability score is calculated as:

  • Critical vulnerabilities ร— 100
  • High vulnerabilities ร— 10
  • Medium vulnerabilities ร— 5
  • Low vulnerabilities ร— 1

Products CVE Monitoring

The products command monitors installed software with known CVE vulnerabilities:

  • Groups CVEs by software (name, version, vendor)
  • Shows CVE details including severity levels and disk paths
  • Counts vulnerable software (not individual CVEs)
  • Default thresholds: Warning at 5 vulnerable software, Critical at 1
  • Displays up to 10 software entries with first 5 CVEs per software

Alert Monitoring

The alerts command monitors unresolved security alerts for a machine:

  • Counts only unresolved alerts (status โ‰  "Resolved")
  • Excludes informational alerts when critical/warning alerts exist
  • Shows alert details including creation time, title, and severity
  • Default thresholds: Warning at 1 alert, Critical at 0 (meaning any alert triggers warning)

Onboarding Status Values

  • 0 - Onboarded โœ…
  • 1 - InsufficientInfo โš ๏ธ
  • 2 - Unknown โŒ

โš™๏ธ Configuration

Authentication Setup

Create check_msdefender.ini in your Nagios directory or current working directory:

Client Secret Authentication

[auth]
client_id = your-application-client-id
client_secret = your-client-secret
tenant_id = your-azure-tenant-id

[settings]
timeout = 5

Certificate Authentication

[auth]
client_id = your-application-client-id
tenant_id = your-azure-tenant-id
certificate_path = /path/to/certificate.pem
private_key_path = /path/to/private_key.pem

[settings]
timeout = 5

Microsoft Defender API Setup

  1. Register Application in Azure Active Directory
  2. Grant API Permissions:
    • Machine.Read.All
    • Vulnerability.Read
    • Vulnerability.Read.All
    • Alert.Read.All
  3. Create Authentication (Secret or Certificate)
  4. Note Credentials (Client ID, Tenant ID, Secret/Certificate)

๐Ÿ“š Complete API Setup Guide

๐Ÿ”ง Command Line Options

Option Description Example
-c, --config Configuration file path -c /custom/path/config.ini
-m, --machineId Machine ID (GUID) -m "12345678-1234-1234-1234-123456789abc"
-d, --computerDnsName Computer DNS Name (FQDN) -d "server.domain.com"
-W, --warning Warning threshold -W 10
-C, --critical Critical threshold -C 100
-v, --verbose Verbosity level -v, -vv, -vvv
--version Show version --version

๐Ÿข Nagios Integration

Command Definitions

# Microsoft Defender Commands
define command {
    command_name    check_defender_onboarding
    command_line    $USER1$/check_msdefender/bin/check_msdefender onboarding -d $HOSTALIAS$
}

define command {
    command_name    check_defender_lastseen
    command_line    $USER1$/check_msdefender/bin/check_msdefender lastseen -d $HOSTALIAS$ -W 7 -C 30
}

define command {
    command_name    check_defender_vulnerabilities
    command_line    $USER1$/check_msdefender/bin/check_msdefender vulnerabilities -d $HOSTALIAS$ -W 10 -C 100
}

define command {
    command_name    check_defender_products
    command_line    $USER1$/check_msdefender/bin/check_msdefender products -d $HOSTALIAS$ -W 5 -C 1
}

define command {
    command_name    check_defender_alerts
    command_line    $USER1$/check_msdefender/bin/check_msdefender alerts -d $HOSTALIAS$ -W 1 -C 5
}

Service Definitions

# Microsoft Defender Services
define service {
    use                     generic-service
    service_description     DEFENDER_ONBOARDING
    check_command           check_defender_onboarding
    hostgroup_name          msdefender
}

define service {
    use                     generic-service
    service_description     DEFENDER_LASTSEEN
    check_command           check_defender_lastseen
    hostgroup_name          msdefender
}

define service {
    use                     generic-service
    service_description     DEFENDER_VULNERABILITIES
    check_command           check_defender_vulnerabilities
    hostgroup_name          msdefender
}

define service {
    use                     generic-service
    service_description     DEFENDER_PRODUCTS
    check_command           check_defender_products
    hostgroup_name          msdefender
}

define service {
    use                     generic-service
    service_description     DEFENDER_ALERTS
    check_command           check_defender_alerts
    hostgroup_name          msdefender
}

๐Ÿ—๏ธ Architecture

This plugin follows clean architecture principles with clear separation of concerns:

check_msdefender/
โ”œโ”€โ”€ ๐Ÿ“ cli/                     # Command-line interface
โ”‚   โ”œโ”€โ”€ commands/               # Individual command handlers
โ”‚   โ”‚   โ”œโ”€โ”€ onboarding.py      # Onboarding status command
โ”‚   โ”‚   โ”œโ”€โ”€ lastseen.py        # Last seen command
โ”‚   โ”‚   โ”œโ”€โ”€ vulnerabilities.py # Vulnerabilities command
โ”‚   โ”‚   โ”œโ”€โ”€ products.py        # Products CVE monitoring command
โ”‚   โ”‚   โ”œโ”€โ”€ alerts.py          # Alerts monitoring command
โ”‚   โ”‚   โ”œโ”€โ”€ machines.py        # List machines command
โ”‚   โ”‚   โ””โ”€โ”€ detail.py          # Machine detail command
โ”‚   โ”œโ”€โ”€ decorators.py          # Common CLI decorators
โ”‚   โ””โ”€โ”€ handlers.py            # CLI handlers
โ”œโ”€โ”€ ๐Ÿ“ core/                    # Core business logic
โ”‚   โ”œโ”€โ”€ auth.py                # Authentication management
โ”‚   โ”œโ”€โ”€ config.py              # Configuration handling
โ”‚   โ”œโ”€โ”€ defender.py            # Defender API client
โ”‚   โ”œโ”€โ”€ exceptions.py          # Custom exceptions
โ”‚   โ”œโ”€โ”€ nagios.py              # Nagios plugin framework
โ”‚   โ””โ”€โ”€ logging_config.py      # Logging configuration
โ”œโ”€โ”€ ๐Ÿ“ services/                # Business services
โ”‚   โ”œโ”€โ”€ onboarding_service.py  # Onboarding business logic
โ”‚   โ”œโ”€โ”€ lastseen_service.py    # Last seen business logic
โ”‚   โ”œโ”€โ”€ vulnerabilities_service.py # Vulnerability business logic
โ”‚   โ”œโ”€โ”€ products_service.py    # Products CVE monitoring business logic
โ”‚   โ”œโ”€โ”€ alerts_service.py      # Alerts monitoring business logic
โ”‚   โ”œโ”€โ”€ machines_service.py    # Machines business logic
โ”‚   โ”œโ”€โ”€ detail_service.py      # Detail business logic
โ”‚   โ””โ”€โ”€ models.py              # Data models
โ””โ”€โ”€ ๐Ÿ“ tests/                   # Comprehensive test suite
    โ”œโ”€โ”€ unit/                   # Unit tests
    โ”œโ”€โ”€ integration/            # Integration tests
    โ””โ”€โ”€ fixtures/               # Test fixtures

Key Design Principles

  • ๐ŸŽฏ Single Responsibility - Each module has one clear purpose
  • ๐Ÿ”Œ Dependency Injection - Easy testing and mocking
  • ๐Ÿงช Testable - Comprehensive test coverage
  • ๐Ÿ“ˆ Extensible - Easy to add new commands and features
  • ๐Ÿ”’ Secure - No secrets in code, proper credential handling

๐Ÿงช Development

Development Setup

# Clone repository
git clone https://github.com/lduchosal/check_msdefender.git
cd check_msdefender

# Create development environment
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# Install in development mode
pip install -e .

Code Quality Tools

# Format code
black check_msdefender/

# Lint code
flake8 check_msdefender/

# Type checking
mypy check_msdefender/

# Run tests
pytest tests/ -v --cov=check_msdefender

Building & Publishing

# Build package
python -m build

# Test installation
pip install dist/*.whl

# Publish to PyPI
python -m twine upload dist/*

๐Ÿ” Output Examples

Successful Check

DEFENDER OK - Onboarding status: 0 (Onboarded) | onboarding=0;1;2;0;2

Warning State

DEFENDER WARNING - Last seen: 10 days ago | lastseen=10;7;30;0;

Critical State

DEFENDER CRITICAL - Vulnerability score: 150 (1 Critical, 5 High) | vulnerabilities=150;10;100;0;

Alerts Warning

DEFENDER WARNING - Unresolved alerts for machine.domain.com | alerts=2;1;5;0;
Unresolved alerts for machine.domain.com
2025-09-14T10:22:14.12Z - Suspicious activity detected (New high)
2025-09-14T12:00:00.00Z - Malware detection (InProgress medium)

๐Ÿ”ง Troubleshooting

Common Issues

Issue Solution
Authentication Errors Verify Azure app permissions and credentials
Network Connectivity Check firewall rules for Microsoft endpoints
Import Errors Ensure all dependencies are installed
Configuration Issues Validate config file syntax and paths

Debug Mode

Enable verbose logging for detailed troubleshooting:

# Maximum verbosity
check_msdefender vulnerabilities -d machine.domain.tld -vvv

# Check specific configuration
check_msdefender onboarding -c /path/to/config.ini -d machine.domain.tld -vv

Required Network Access

Ensure connectivity to:

  • login.microsoftonline.com
  • api.securitycenter.microsoft.com
  • api-eu.securitycenter.microsoft.com
  • api-eu3.securitycenter.microsoft.com
  • api-uk.securitycenter.microsoft.com

๐Ÿ“Š Exit Codes

Code Status Description
0 OK Value within acceptable range
1 WARNING Value exceeds warning threshold
2 CRITICAL Value exceeds critical threshold
3 UNKNOWN Error occurred during execution

๐Ÿค Contributing

We welcome contributions! Here's how to get started:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Guidelines

  • Follow PEP 8 style guide
  • Add tests for new features
  • Update documentation as needed
  • Ensure all tests pass before submitting

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments


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

check_msdefender-1.1.17.tar.gz (36.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

check_msdefender-1.1.17-py3-none-any.whl (34.8 kB view details)

Uploaded Python 3

File details

Details for the file check_msdefender-1.1.17.tar.gz.

File metadata

  • Download URL: check_msdefender-1.1.17.tar.gz
  • Upload date:
  • Size: 36.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.26.4 CPython/3.12.11 Darwin/24.6.0

File hashes

Hashes for check_msdefender-1.1.17.tar.gz
Algorithm Hash digest
SHA256 43a17d0d465547688b6ab1ebf6ef8604124fbbf2c4f32ed4b88f2c0e8d306e14
MD5 e168d216b80f2b31cb1392bd1597006f
BLAKE2b-256 76da341477c9c8207b0180e608c72811ea8e26c030b8cd45e0870e040de26fe3

See more details on using hashes here.

File details

Details for the file check_msdefender-1.1.17-py3-none-any.whl.

File metadata

  • Download URL: check_msdefender-1.1.17-py3-none-any.whl
  • Upload date:
  • Size: 34.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.26.4 CPython/3.12.11 Darwin/24.6.0

File hashes

Hashes for check_msdefender-1.1.17-py3-none-any.whl
Algorithm Hash digest
SHA256 01dbc547b6175812cdb730fbd35b5380d6085c2669cef1218979badf948586e5
MD5 685115b711fe0f2c1b07eba2df335a7f
BLAKE2b-256 567874f73ba4413b1a35fcb7d64519a5962197f1e611f33825b0608b18032433

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page