L’objectif de ce plugin pour Nagios est de superviser l’état des comptes AD (oui, je ne fais pas que du SCOM malgré un ouvrage ENI dessus!)
J’utilise l’agent nsclient++ sur les serveurs afin de pouvoir exécuter des scripts PowerShell entre autre. On a donc:
Nagios => check_nrpe => script powershell => retour nagios
Je m’appui sur le module PowerShell Standard ActiveDirectory. Cela fonctionne également sur les serveurs Core.
La supervision peut porter sur:
- Account Disabled
- Account Expired
- Account Expiring
- Account Inactive
- Locked Out
- Password Expired
- Password Never Expires
La sortie fournie les données pour avoir un graphe (performance data)
Configuration testée
Linux:
- Centos 6.4 x64
- Nagios 3.4.4
- check_nrpe 2.13
- Centreon 2.4.2
Active Directory:
- Windows Server 2008 R2 / Windows Server 2012
- nsclient++ 0.4.1 x64
- Serveurs Core et normaux
Arguments du script
- action (LockedOut par défaut)
- searchBase (tout le domaine par défaut)
- seachScope (récursif par défaut)
- maxWarn (avertissement si supérieur)
- maxCrit (Critique si supérieur)
action peut être:
AccountDisabled,AccountExpired,AccountExpiring,AccountInactive,LockedOut,PasswordExpired,PasswordNeverExpires
LockedOut par défaut
searchBase peut être:
dc=mydomain,dc=com / ou=my users,dc=mydomain,dc=com
tout le domaine par défaut
seachScope peut être:
Base,OneLevel,Subtree
Subtree par défaut
maxWarn and maxCrit doivent être des entiers
Exemples d’utilisation
Exemple en exécution directe PowerShell:
PS C:Program FilesNSClient++scripts> . .lotp_check_ad_accounts.ps1 AccountInactive "dc=mydomain,dc=com" subtree 5 10 CRITICAL: 216 AccountInactive|216;5;10 PS C:Program FilesNSClient++scripts>
Exécution NRPE:
[root~]# /usr/lib64/nagios/plugins/check_nrpe -H prd-dom-dc01 -n -c check_ad_account -a AccountInactive "dc=pmside,dc=net" subtree 5 10 CRITICAL: 216 AccountInactive|'AccountInactive'=216;5;10 [root~]#
Installation:
Sur les DC:
- Activer l’exécution de scripts PowerShell non signés : Set-ExecutionPolicy RemoteSigned
- copier le script dans C:Program FilesNSClient++scripts
- Ajouter dans le fichier nsclient.ini:
- [/settings/external scripts/wrapped scripts]
check_ad_account=lotp_check_ad_accounts.ps1 $ARG1$ $ARG2$ $ARG3$ $ARG4$ $ARG5$
- [/settings/external scripts/wrapped scripts]
Configuration:
Par exemple, sur Centreon, en ajoutant la commande:
$USER1$/check_nrpe -H $HOSTADDRESS$ -n -c check_ad_account -a $ARG1$ "$ARG2$" $ARG3$ $ARG4$ $ARG5$
Téléchargement
(enlever le .txt à la fin)
Code source en direct si le téléchargement ne passe pas:
# ==================================================================== # Search in AD for lockedout account. To be used through NRPE / nsclient++ # Author: Mathieu Chateau - LOTP # mail: mathieu.chateau@lotp.fr # version 0.1 # ====================================================================# # Require Set-ExecutionPolicy RemoteSigned.. or sign this script with your PKI # # ============================================================ # # Do not change anything behind that line! # param ( [string]$action="LockedOut", [string]$searchBase="", [string]$searchScope="Subtree", [int]$maxWarn=5, [int]$maxCrit=10 ) # check that powershell ActiveDirectory module is present if(Get-Module-Name "ActiveDirectory" -ListAvailable) { try { Import-Module-Name ActiveDirectory } catch { Write-Host "CRITICAL: Missing PowerShell ActiveDirectory module" exit 2 } } else { Write-Host "CRITICAL: Missing PowerShell ActiveDirectory module" exit 2 } # check params if provided if($action -notmatch "^(AccountDisabled|AccountExpired|AccountExpiring|AccountInactive|LockedOut|PasswordExpired|PasswordNeverExpires)$") { Write-Hos t"CRITICAL: action parameter can only be AccountDisabled,AccountExpired,AccountExpiring,AccountInactive,LockedOut,PasswordExpired,PasswordNeverExpires. Provided $action" exit 2 } if($searchScope -notmatch "^(Base|OneLevel|Subtree)$") { Write-Host "CRITICAL: searchScope parameter can only be Base,OneLevel,Subtree. Provided $searchScope" exit 2 } if(($searchBase -ne "") -and $searchBase -ne ((Get-ADDomain).DistinguishedName)) { $search=Get-ADObject -Filter 'ObjectClass -eq "OrganizationalUnit" -and DistinguishedName -eq $searchBase' if ($search.Count -ne 1) { Write-Host"CRITICAL: SearchBase not found or duplicate. Provided $searchBase" exit 2 } } else { $searchBase=(Get-ADDomain).DistinguishedName } $command="Search-ADAccount -"+$action+" -SearchBase '"+$searchBase+"' -SearchScope "+$searchScope $result=invoke-expression $command if($result.Count -gt $maxCrit) { $state="CRITICAL" $exitcode=2 } elseif($result.Count -gt $maxWarn) { $state="WARNING" $exitcode=1 } else { $state="OK" $exitcode=0 } $output=$state+": "+$result.Count+""+$action+"|"+$action+"="+$result.Count+";"+$maxWarn+";"+$maxCrit Write-Host $output exit $exitcode