Ab und an kommt es mal vor, dass ein User im AD erhöhte Rechte oder zusätzliche Gruppen bekommen muss.
Zum Beispiel könnte dieser erhöhte Rechte im Internet (AD-basierte Proxygruppen) oder für eine Applikation (Argh!) benötigen.
Was passiert aber nun, wenn diese Rechte in Vergessenheit geraten und dadurch Schaden (z.B. Data-Loss, Malware, ...) entsteht? Die Frage ist natürlich reichlich polemisch, allerdings muss man sich die Frage stellen, wer dafür die Verantwortung trägt? Natürlich die IT.
Und genau die kann dafür sorgen, dass solche Dinge NICHT in Vergessenheit geraten, indem man sich automatisch in periodischen Abständen ein Aufstellung der wichtigsten Gruppen zuschicken lässt.
Genau dieses erfüllt das Skript, welches ich, aus den oben erwähnten Gefahren heraus, geschrieben habe:
Zum Beispiel könnte dieser erhöhte Rechte im Internet (AD-basierte Proxygruppen) oder für eine Applikation (Argh!) benötigen.
Was passiert aber nun, wenn diese Rechte in Vergessenheit geraten und dadurch Schaden (z.B. Data-Loss, Malware, ...) entsteht? Die Frage ist natürlich reichlich polemisch, allerdings muss man sich die Frage stellen, wer dafür die Verantwortung trägt? Natürlich die IT.
Und genau die kann dafür sorgen, dass solche Dinge NICHT in Vergessenheit geraten, indem man sich automatisch in periodischen Abständen ein Aufstellung der wichtigsten Gruppen zuschicken lässt.
Genau dieses erfüllt das Skript, welches ich, aus den oben erwähnten Gefahren heraus, geschrieben habe:
#!/usr/bin/php -q <?php /* Read dom admins from AD Author: Oliver Skibbe oliskibbe (at) gmail.com Date: 2013-10-28 */ function parseLdapDn($dn) { $dn = addcslashes( $dn, "<>" ); $result = ldap_explode_dn( $dn, 0 ); //translate hex code into ascii again foreach( $result as $key => $value ) $result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value); unset($result["count"]); return $result; } function sendMail ( $bodyStuff ) { global $debug, $dryrun, $to, $replyto, $cc, $from; // mail header $header = "MIME-Version: 1.0\r\n"; $header .= "Content-type: text/html; charset=utf-8\r\n"; $header .= "From: " . $from . "\r\n"; $header .= "Reply-To: " . $replyto . "\r\n"; if ( $cc ) { $header .= "Cc: " . $cc . "\r\n"; } $header .= "X-Mailer: PHP ". phpversion(); $subject = "Mitglieder der Gruppe {$bodyStuff["name"]}"; // erfüllt seinen Zweck.. $body = "<html> <br> Mitglieder der Gruppe {$bodyStuff["name"]} <br><br> <table border=\"1\"> <tr><th align=\"left\"><b>Username</b></th><th align=\"left\"><b>OU</b></th></tr>\n\n"; unset($bodyStuff["name"]); foreach ( $bodyStuff as $members) { foreach ( $members as $member => $foo ) { $body .= "<tr><td nowrap>{$member}</td><td>{$foo}</td></tr>\n"; } } $body .= "\n</table> </html>"; if ( $debug || $dryrun ) { echo "Subject " . $subject . PHP_EOL; echo "Body: " . $body . PHP_EOL; echo "Header: " . $header . PHP_EOL; } if ( ! $dryrun ) { $result = mail( $to, $subject, $body, $header); } else { $result = true; } return $result; } // Variables // debug prints $debug = false; // do not send mail, just print $dryrun = false; // receiver $to = "oliskibbe@gmail.com"; $replyto = "ticketsystem@example.tld"; $from = "absender@example.tld"; // optional $cc = "chef@example.tld"; // ad $host = "ADHOST"; $user = "ADUSER"; $pass = "ADPASS"; // erlaube mehrere Gruppen z.B. Domänen-Admin und Proxy Gruppen ohne Beschränkung $filter = "(&(|(name=Domänen-Admins)(name=FreiesInternet))(objectcategory=group))"; $dn = "dc=example,dc=local"; // nur Name und Mitglieder $justthese = array('name', 'member'); // mit AD verbinden $link = ldap_connect($host) or die ("Keine Verbindung zu {$host} möglich!" . PHP_EOL); // AD Protokoll Einstellungen setzen ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($link, LDAP_OPT_REFERRALS, 0); // Am AD anmelden $bind = ldap_bind($link, $user, $pass) or die ("Keine Anmeldung am AD mit User {$user} an Host {$host} möglich!"); $searchresult = ldap_search ($link, $dn, $filter, $justthese ); $result = ldap_get_entries($link, $searchresult); ldap_close($link); // helper foreach ( $result as $groupArray ) { $members = array(); if (is_array ($groupArray) ) { $members["name"] = $groupArray["name"][0]; // remove count stuff unset($groupArray["member"]["count"]); foreach ( $groupArray["member"] as $member ) { $dnResult = parseLdapDn($member); $name = str_replace("CN=","",$dnResult[0]); unset($dnResult[0]); $members[$members["name"]][$name] = implode(",", $dnResult); unset($member); unset($dnResult); } $result = sendMail($members); if ( ! $result && $debug ) { echo "Sending mail failed!"; } } }
Dieses Skript fragt 1-n Gruppen über den LDAP Filter ab und verschickt wunderschöne E-Mails mit einer tabellarischen Aufstellung der entsprechenden User und in welcher OU sich diese befinden.
Download
Anschließend trägt man dieses Skript in die crontab ein:
0 01 * * 1 /usr/bin/php -q /usr/local/bin/check_ad_admins.php
Nun wird man jede Woche am Montag zum Arbeitsbeginn eine E-Mail mit den aktuellen Gruppenmitgliedern haben, bei sehr großen Firmen sollte man vielleicht noch einen Zwischenschritt einlegen und entweder eine kleine Datenbank oder ein Textfile mit Altwerten füllen um die neu hinzugekommen zu highlighten, aber in meinem Fall war das nicht nötig.
Bei Fragen wie immer einfach melden.
Keine Kommentare:
Kommentar veröffentlichen