Ich poste hier den Code, wie man von einem Apacheserver unter Linux einen Ordner unter einem Windows-Server erstellen kann, Sicherheitsgruppen in Active Directory erstellt und diese dann auf den Ordner berechtigt.
Ich hoffe es hilft dem ein oder anderen.
Für das Vorhaben habe ich das Symfony-Framework in Version 6.4 (LTS) verendet und den icewind/smb-Wrapper.
Unter Linux muss außerdem "smbcacls" verfügbar sein.
Informationen zu "smbcacls" die wichtig sind finden sich unter docs.redhat.com
Die Verbindung zum LDAP-Server wird mittels LDAPS hergestellt. Ob es mit normalem LDAP funktioniert habe ich nicht probiert.
Ich hoffe es hilft dem ein oder anderen.
Für das Vorhaben habe ich das Symfony-Framework in Version 6.4 (LTS) verendet und den icewind/smb-Wrapper.
Unter Linux muss außerdem "smbcacls" verfügbar sein.
Informationen zu "smbcacls" die wichtig sind finden sich unter docs.redhat.com
Die Verbindung zum LDAP-Server wird mittels LDAPS hergestellt. Ob es mit normalem LDAP funktioniert habe ich nicht probiert.
Code:
.env.local: # Serverkonfiguration LDAP_IP=<IP_des_Domäneservers> LDAP_PORT=636 LDAP_OPT_REFERRALS=0 LDAP_VERSION=3 LDAP_ENCRYPTION=ssl LDAP_DOMAIN=<domain> LDAP_TLD=<tld> # Zugangsdaten LDAP LDAP_USERNAME=<Benutzer_mit_Administrator-Rechten> LDAP_PASSWORD=<Passwort_des_Benutzers> # OU-Bases LDAP_GLOBAL_GROUPS_BASE_DN=OU=GlobalGroups,OU=<Your_Custom_OU>,DC=<domain>,DC=<tld> # Freigaben LDAP_SHARES='<Share1>', '<Share2>'
PHP-Code:
# Ordner erstellen
public function createLdapFolder(array $data): bool
{
$prefixMapping = [
'general' => 'Allg_',
'scan' => 'Scan_',
'other' => '',
];
$selectPrefix = $data['selectPrefix'];
$folderName = $data['folderName'];
// Prüfen auf ungültige Zeichen im Ordnernamen
if (!preg_match('/^[a-zA-Z0-9_\-]+$/', $folderName)) {
$this->requestStack->getCurrentRequest()->getSession()->getFlashBag()->add('error', 'Der Ordnername enthält ungültige Zeichen.');
return false;
}
// Prüfen, ob eine Kategorie ausgewählt wurde
if (!isset($prefixMapping[$selectPrefix])) {
$this->requestStack->getCurrentRequest()->getSession()->getFlashBag()->add('error', 'Ungültige Auswahl.');
return false;
}
$prefix = $prefixMapping[$selectPrefix];
$completeFolderName = $prefix . $folderName;
$serverFactory = new ServerFactory();
$auth = new BasicAuth($_ENV['LDAP_USERNAME'], $_ENV['LDAP_DOMAIN'], $_ENV['LDAP_PASSWORD']);
$server = $serverFactory->createServer($_ENV['LDAP_IP'], $auth);
$shares = $server->listShares();
foreach ($shares as $shareName) {
$shareName->getName();
}
// LDAP Shares aus der ENV-Datei
$ldapShares = array_map('trim', explode(',', $_ENV['LDAP_SHARES']));
// Share anhand von $selectPrefix bestimmen
if ($selectPrefix === 'other') {
$shareName = in_array('Share2', $ldapShares) ? 'Share2' : null;
} else {
$shareName = in_array('Share1', $ldapShares) ? 'Share1' : null;
}
try {
// Order auf der Freigabe erstellen
$share = $server->getShare($shareName);
$share->mkdir($completeFolderName);
// Datenweitergabe um auf Basis des Ordernamens die entsprechenden Sicherheitsgruppen im AD zu erstellen.
$this->createLdapFolderGroups($shareName, $completeFolderName);
return true;
} catch (\Exception $e) {
throw new \Exception("Fehler beim Erstellen des Ordners: " . $e->getMessage());
return false;
}
}
PHP-Code:
# Sicherheitsgruppen im Active Directory erstellen:
public function createLdapFolderGroups(string $shareName, string $completeFolderName): bool
{
$baseDn = 'OU=FolderGroups,' . $_ENV['LDAP_GLOBAL_GROUPS_BASE_DN'];
// Gruppe für Lesezugriff
$entryRO = new Entry('cn=GG_Folder_' . $completeFolderName . '-RO,' . $baseDn, [
'sAMAccountName' => ['GG_Folder_' . $completeFolderName . '-RO'],
'objectClass' => ['top', 'group'],
'groupType' => [-2147483646],
]);
// Gruppe für Lese- und Schreibzugriff
$entryRW = new Entry('cn=GG_Folder_' . $completeFolderName . '-RW,' . $baseDn, [
'sAMAccountName' => ['GG_Folder_' . $completeFolderName . '-RW'],
'objectClass' => ['top', 'group'],
'groupType' => [-2147483646],
]);
try {
// Erstellen der Sicherheitsgruppen im Active Directory
$this->ldap->getEntryManager()->add($entryRO);
$this->ldap->getEntryManager()->add($entryRW);
// Datenweitergabe um die Berechtigungsgruppen dem Ordner zuzuweisen
$this->setFolderPermissions($shareName, $completeFolderName);
return true;
} catch (\Exception $e) {
throw new \Exception("Fehler bei der Erstellung der Gruppe: " . $e->getMessage());
return false;
}
}
PHP-Code:
# Zuweisen der Sicherheitsgruppen zum erstellen Ordner und setzen der Berechtigungen
private function setFolderPermissions(string $shareName, string $completeFolderName)
{
// Die soeben erstellen Sicherheitsgruppen im Active Directory. Angabe der Domain ist hier verpflichtend
$groupRO = $_ENV['LDAP_DOMAIN']."\\GG_Folder_" . $completeFolderName . "-RO";
$groupRW = $_ENV['LDAP_DOMAIN']."\\GG_Folder_" . $completeFolderName . "-RW";
try {
// Vorbereiten des Befehls zum setzen der Leserechte
$cmdRO = "smbcacls //" . $_ENV['LDAP_IP'] . "/" .
$shareName . " " . escapeshellarg($completeFolderName) .
" -U " . $_ENV['LDAP_USERNAME'] . "%" . $_ENV['LDAP_PASSWORD'] .
" -a " . escapeshellarg("ACL:{$groupRO}:ALLOWED/OI|CI/READ");
// Vorbereiten des Befehls zum setzen der Schreibrechte
$cmdRW = "smbcacls //" . $_ENV['LDAP_IP'] . "/" .
$shareName . " " . escapeshellarg($completeFolderName) .
" -U " . $_ENV['LDAP_USERNAME'] . "%" . $_ENV['LDAP_PASSWORD'] .
" -a " . escapeshellarg("ACL:{$groupRW}:ALLOWED/OI|CI/CHANGE");
// Befehle ausführen
exec($cmdRO, $output, $returnCode);
exec($cmdRW, $output, $returnCode);
} catch (\Exception $e) {
throw new \Exception("Fehler beim Setzen der Ordnerberechtigung: " . $e->getMessage());
return false;
}
}