Synchronisation des dossiers utilisateurs AD vers Synology
TrueNAS SCALE + Active Directory + Synology + Nextcloud (accès)
🎯 Objectif
Mettre en place un système automatisé, sécurisé et idempotent permettant de :
- créer automatiquement un dossier personnel par utilisateur Active Directory
- uniquement pour les membres du groupe Accès_CLOUD
- stocker physiquement les données sur le NAS Synology
- gérer exclusivement les droits via les ACL Synology
- déclencher la synchronisation :
- automatiquement (cron)
- manuellement (URL sécurisée via HTTPS)
Nextcloud n’héberge aucun fichier : il sert uniquement de point d’accès collaboratif.
🧱 Architecture globale
Active Directory
→ TrueNAS SCALE (script bash + cron)
→ Synology NAS (partage USERS + ACL AD)
← SSH sécurisé (clé forcée)
→ Serveur Web (wrapper PHP)
→ HTTPS via Nginx Proxy Manager
🖥️ Machines impliquées
| Rôle | Adresse |
|---|---|
| TrueNAS SCALE | 192.168.1.24 |
| Synology NAS | 192.168.1.13 |
| Serveur Web (wrapper PHP) | 192.168.1.11 |
| Active Directory | MEDITHAU.LOCAL |
| Reverse Proxy | Nginx Proxy Manager |
👥 Active Directory
Groupe utilisé
CN=Accès_CLOUD,OU=Groupes,OU=MEDITHAU,DC=medithau,DC=local
Seuls les membres de ce groupe disposent d’un dossier personnel.
Comptes exclus explicitement
- Administrateur
- usr_nextcloud
- svc_nextcloud
🗄️ Synology NAS
Partage SMB
\\192.168.1.13\USERS
Structure finale
USERS/
├─ sscattolini/
├─ amandron/
├─ jmarzal/
└─ ...
Droits
- ACL gérées exclusivement côté Synology
- Chaque utilisateur AD ne voit que son dossier
- Les administrateurs conservent l’accès global
🧰 TrueNAS SCALE – Script principal
Emplacement
/root/scripts/create_users_dirs.sh
Rôle
- Montage SMB temporaire du partage USERS
- Récupération des membres AD du groupe Accès_CLOUD
- Création des dossiers manquants
- Initialisation des ACL AD par utilisateur
- Démontage propre du partage
📜 Script complet create_users_dirs.sh
#!/bin/bash
# ------------------------------------------------------------
# Nom : create_users_dirs.sh
# Chemin : /root/scripts/create_users_dirs.sh
# Description: Création automatique des dossiers utilisateurs
# AD membres du groupe Accès_CLOUD sur Synology
# Options : --dry-run
# Auteur : Sylvain SCATTOLINI
# Date : 2026-01-08
# Version : 1.1
# ------------------------------------------------------------
set -euo pipefail
DOMAIN="MEDITHAU"
GROUP="Accès_CLOUD"
SMB_SERVER="192.168.1.13"
SMB_SHARE="USERS"
DC_SERVER="192.168.1.21"
MOUNT_POINT="/mnt/tmp_users"
LOG="/var/log/create_users_dirs.log"
DRY_RUN=0
EXCLUDED_USERS=(
"Administrateur"
"usr_nextcloud"
"svc_nextcloud"
)
[[ "${1:-}" == "--dry-run" ]] && DRY_RUN=1
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"
}
fail() {
log "ERREUR: $*"
exit 1
}
mkdir -p "$MOUNT_POINT"
log "=== Début create_users_dirs.sh (dry-run=$DRY_RUN) ==="
if ! mountpoint -q "$MOUNT_POINT"; then
mount -t cifs "//$SMB_SERVER/$SMB_SHARE" "$MOUNT_POINT" -o credentials=/root/.smb/credentials_users,vers=3.1.1,serverino || fail "Échec montage SMB"
fi
log "Récupération des membres du groupe AD $GROUP"
USERS=$(net rpc group members "$GROUP" -S "$DC_SERVER" -A /root/.smb/credentials_users | awk -F'\\' '{print $2}')
[ -z "$USERS" ] && fail "Aucun utilisateur récupéré"
for user in $USERS; do
[[ "$user" == *'$' ]] && continue
if [[ " ${EXCLUDED_USERS[*]} " =~ " ${user} " ]]; then
log "Compte technique ignoré : $user"
continue
fi
USER_DIR="$MOUNT_POINT/$user"
if [[ -d "$USER_DIR" ]]; then
log "Existe déjà : $USER_DIR"
continue
fi
if [[ "$DRY_RUN" -eq 1 ]]; then
log "[DRY-RUN] Création : $USER_DIR"
continue
fi
mkdir "$USER_DIR"
log "Créé : $USER_DIR"
smbcacls "//$SMB_SERVER/$SMB_SHARE" "$user" -A /root/.smb/credentials_users --delete=ALL || true
smbcacls "//$SMB_SERVER/$SMB_SHARE" "$user" -A /root/.smb/credentials_users --add="ACL:${DOMAIN}\\$user:ALLOWED/OI|CI/FULL" || true
done
umount "$MOUNT_POINT"
log "=== Fin create_users_dirs.sh ==="
⏰ Cron TrueNAS
0 2 * * * /root/scripts/create_users_dirs.sh >> /var/log/create_users_dirs.log 2>&1
🌐 Déclenchement manuel – Wrapper PHP
Serveur web
192.168.1.11
Emplacement
/var/www/html/users-sync/index.php
📜 Wrapper PHP complet
<?php
declare(strict_types=1);
$SECRET = 'CLE_HTTP_LONGUE_ET_SIMPLE';
$SSH_KEY = '/etc/users-sync/users_sync_key';
$SSH_USER = 'root';
$SSH_HOST = '192.168.1.24';
if (!isset($_GET['key']) || !hash_equals($SECRET, $_GET['key'])) {
http_response_code(403);
exit('Forbidden');
}
$cmd = sprintf(
'ssh -i %s -o BatchMode=yes -o StrictHostKeyChecking=accept-new %s@%s 2>&1',
escapeshellarg($SSH_KEY),
escapeshellarg($SSH_USER),
escapeshellarg($SSH_HOST)
);
exec($cmd, $output, $code);
header('Content-Type: text/plain; charset=utf-8');
echo "Exit code: $code\n";
echo implode("\n", $output);
🔐 Sécurité SSH
- Clé privée :
/etc/users-sync/users_sync_key - Permissions :
root:users-sync 640 - L’utilisateur web (
www-data) est membre du groupeusers-sync - Clé publique sur TrueNAS avec commande forcée
- Aucun shell interactif
🔁 Reverse Proxy (NPM)
Sous-domaine
truenas-sync.tarbouriech.tech
Configuration
- Forward host :
192.168.1.11 - Forward port :
80 - Aucun custom location
- SSL activé
🔗 URL finale
https://truenas-sync.tarbouriech.tech/users-sync/?key=CLE_HTTP
À utiliser :
✅ Résultat final
- Ajout d’un utilisateur au groupe Accès_CLOUD
- Synchronisation automatique ou manuelle
- Dossier créé sur Synology
- ACL correctes
- L’utilisateur ne voit que son dossier
- Les administrateurs gardent la maîtrise totale
🏁 Statut
✔ Fonctionnel
✔ Sécurisé
✔ Documenté
✔ Prêt pour la production
No comments to display
No comments to display