A Nagios plugin for monitoring Microsoft Defender API endpoints
Project description
๐ก๏ธ Check MS Defender
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
- Register Application in Azure Active Directory
- Grant API Permissions:
Machine.Read.AllVulnerability.ReadVulnerability.Read.AllAlert.Read.All
- Create Authentication (Secret or Certificate)
- Note Credentials (Client ID, Tenant ID, Secret/Certificate)
๐ง 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.comapi.securitycenter.microsoft.comapi-eu.securitycenter.microsoft.comapi-eu3.securitycenter.microsoft.comapi-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:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - 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
- Built with nagiosplugin framework
- Uses Azure Identity SDK for authentication
- Powered by Click for CLI interface
โญ Star this repository if you find it useful!
๐ Report Bug โข ๐ก Request Feature โข ๐ Documentation
๐ Sponsor
If this project helps you, consider supporting its development:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file check_msdefender-1.2.12.tar.gz.
File metadata
- Download URL: check_msdefender-1.2.12.tar.gz
- Upload date:
- Size: 37.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: pdm/2.26.7 CPython/3.13.12 Linux/6.17.0-1008-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2be97b15b85c06ae1150b005cf85dee9444a07cfa19cb419dd8f41ddfeaa96b9
|
|
| MD5 |
bf75449f22704566e7c8283df8324090
|
|
| BLAKE2b-256 |
ff9f9ff67bc687657c8e23dd511893c25b1697c6084ec9da9f5be3926c67749e
|
File details
Details for the file check_msdefender-1.2.12-py3-none-any.whl.
File metadata
- Download URL: check_msdefender-1.2.12-py3-none-any.whl
- Upload date:
- Size: 37.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: pdm/2.26.7 CPython/3.13.12 Linux/6.17.0-1008-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec74974e7a22e974a2447d4b744ef79dd8f289e3a0498af0a3bd94a69868e02c
|
|
| MD5 |
9660e397bb32d5bcad0eacd6713e85c9
|
|
| BLAKE2b-256 |
a8717693977f95090dd68853d539ca42cbcb32fc1662076105e5175cf4f26cad
|