Skip to main content

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 groupe users-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 :

  • depuis un navigateur
  • depuis un bouton du dashboard
  • pour forcer une synchronisation immédiate

✅ 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