|
| 1 | +# Backend AD |
| 2 | +Ce backup sert à synchroniser les identitées avec Active Directory sur windows server >= 2019 |
| 3 | + |
| 4 | +## Installation |
| 5 | + |
| 6 | +Pour l'instant juste le paquet debian est disponible |
| 7 | + |
| 8 | + |
| 9 | +téléchargez le packet debian à l'adresse : [https://github.com/Libertech-FR/sesame-backend-ad/releases/](https://github.com/Libertech-FR/sesame-backend-ad/releases/) |
| 10 | + |
| 11 | +``` |
| 12 | +dpkg -i sesame-backend-ad_x.x.x_amd64.deb |
| 13 | +``` |
| 14 | +Les erreurs sont normales car il y a des dependences supplémentaires à installer : |
| 15 | + |
| 16 | +``` |
| 17 | +apt-get install -f |
| 18 | +``` |
| 19 | + |
| 20 | +## Activation et paramètrage |
| 21 | + |
| 22 | +allez dans le répertoire /var/lib/backend-modules/ad |
| 23 | + |
| 24 | +et lancez le script d'activation (install.sh |
| 25 | + |
| 26 | +``` |
| 27 | +cd /var/lib/backend-modules/ad |
| 28 | +./install.sh |
| 29 | +``` |
| 30 | +Le script va vous demander un certains nombre de renseignement pour pouvoir configurer le backend |
| 31 | + |
| 32 | +* **Numero de demarrage du module (2 positions) :** Position d'execution du Backend dans le repertoire /var/lib/sesame-backend/backends. Mettre un chiffre sur 2 positions. |
| 33 | +* **Adresse du serveur AD primaire :** Entrez le FDQN ou l'adresse IP du serveur de domaine (assurez vous avant que le serveur où est installé le daemon peut accéder au poer 22 (ssh) |
| 34 | +* **Utilisateur (doit avoir les droits d'administration) :** Utilateur ayant les droits d'administration du serveur |
| 35 | +* **Mot de passe :** Mot de passe de cet utilisateur (le mot de passe ne sera pas enregistré sur le serveur mais est utilisé pour copier la clé publique qui sera générée par le script |
| 36 | +* **Base ldap AD :** Base LDAP de votre domaine (vous pouvez l'avoir en vous connectant sur le serveur windows (Utilisateurs et ordinateurs Active Directory -> bouton droit sur le domaine et editeur d'attributs, cherchez "DistinguishedName") |
| 37 | +* **Domaine pour UserPrincipalName :** Le nom de domaine sou la forme DOMAIN.XX (vous pouvez le voir dans l'onglet compte d'un utilisateur. |
| 38 | + |
| 39 | +Une fois les renseignements donnés le script va générer une paire de clés ed25519 et va recopier la clé publique sur le serveur AD |
| 40 | + |
| 41 | + |
| 42 | +## Architecture du Backend après l'installation |
| 43 | +Le script d'installation aura mis dans dans **/var/lib/sesame-daemon/XXad** les repertoires, fichiers necessaires |
| 44 | + |
| 45 | +``` |
| 46 | +XXad - etc - config.conf |
| 47 | + - bin - changepwd.py |
| 48 | + - ping.py |
| 49 | + - resetpwd.py |
| 50 | + - upsertidentity.py |
| 51 | + - lib - ad_utils.py |
| 52 | + - backends_utils.py |
| 53 | + - ps1_templates - changepassword.template |
| 54 | + - ping.template |
| 55 | + - resetpassword.template |
| 56 | + - upsertidentity.template |
| 57 | + config.yml |
| 58 | +``` |
| 59 | +### Fichier de configuration (etc/config.conf) |
| 60 | + |
| 61 | +``` |
| 62 | +# Paramètres générés par install.sh |
| 63 | +host=ad.mydomain.com |
| 64 | +user=administrator |
| 65 | +base=dc=mydomain,dc=com |
| 66 | +domain=libertest.fr |
| 67 | +# Paramètres que vous devez renseigner manuellement |
| 68 | +branchForEtd=ou=Etudiants |
| 69 | +branchForAdm=ou=Administratifs |
| 70 | +branchForEsn=ou=Enseignants |
| 71 | +branchAttr=supannTypeEntiteAffectation |
| 72 | +backendFor=adm,etd,esn |
| 73 | +``` |
| 74 | +#### Paramètres renseignés par install.sh |
| 75 | +* **host** = adresse du serveur AD primaire |
| 76 | +* **user** = Utilisateur ayant les droits d'administration |
| 77 | +* **base** = Base LDAP du domaine (DistinguishedName) |
| 78 | +* **domain** = domaine sous la forme doamin.xx |
| 79 | + |
| 80 | +#### Paramètres facultatifs |
| 81 | +* **branchForEtd** = branche relative pour la population etd |
| 82 | +* **branchForAdm** = branche relative pour la population adm |
| 83 | +* **branchForEsn** = branche relative pour la population esn |
| 84 | +* **branchAttr** = Attribut qui sert à determiner le type de population |
| 85 | +* **backendFor** = Le backend fera l'action pour les populations listées |
| 86 | + |
| 87 | +### Les templates powershell |
| 88 | + |
| 89 | +Le principe de fonctionnenemt est le suivant : |
| 90 | + |
| 91 | +* Le script python genére un script powershell par rapport au modèle (templates). |
| 92 | +* Le script copie via ssh le script généré sur le serveur windows. |
| 93 | +* Le script powershell est exécuté. |
| 94 | + |
| 95 | +Les templates sont généré avec la librairie **jinja2** |
| 96 | + |
| 97 | +Vous trouverez la documentation Jinja à [https://jinja.palletsprojects.com/en/3.1.x/](https://jinja.palletsprojects.com/en/3.1.x/) |
| 98 | + |
| 99 | +Les variables disponibles pour le template sont : |
| 100 | + |
| 101 | +* **e** L'identité sous forme e.attribut exemple : e.cn, e.supannTypeEntiteAffectation |
| 102 | +* **domain** la variable domain du fichier de configuration |
| 103 | +* **base** Base LDAP du domaine present dans le fichier de configuration |
| 104 | +* **dn** Le DN calculé de l'identité |
| 105 | +* **path** le DN superieur de l'identité |
| 106 | + |
| 107 | + |
| 108 | +Exemple de template (upsertidentity.template) |
| 109 | + |
| 110 | +```powershell |
| 111 | +try{ |
| 112 | + $tab=Get-ADUser -Filter 'employeeNumber -eq "{{ e.employeeNumber }}" -and employeeType -eq "{{ e.employeeType }}"' -Properties "DistinguishedName" |
| 113 | + if ($tab["DistinguishedName"] -ne "{{ dn }}"){ |
| 114 | + try{ |
| 115 | + $dn=$tab["DistinguishedName"] |
| 116 | + move-adObject "$dn" -targetpath "{{ path }}" |
| 117 | + }catch{ |
| 118 | + Write-Host $_ |
| 119 | + exit 1 |
| 120 | + } |
| 121 | + } |
| 122 | + $UserExists = $true |
| 123 | +} |
| 124 | +catch{ |
| 125 | + $UserExists = $false |
| 126 | +} |
| 127 | +if ($UserExists -eq $false){ |
| 128 | + $np = @{ |
| 129 | + Path="{{ path }}" |
| 130 | + EmployeeNumber="{{ e.employeeNumber }}" |
| 131 | + Name="{{ e.cn }}" |
| 132 | + DisplayName="{{ e.displayName }}" |
| 133 | + GivenName="{{ e.givenName }}" |
| 134 | + Surname="{{ e.sn }}" |
| 135 | + SamAccountName="{{ e.uid }}" |
| 136 | + EmailAddress="{{ e.mail }}" |
| 137 | + UserPrincipalName = "{{ e.uid }}" + '@' + "{{ domain }}" |
| 138 | + Enabled=$false |
| 139 | + CannotChangePassword=$true |
| 140 | + ChangePasswordAtLogon = $false |
| 141 | + } |
| 142 | + try{ |
| 143 | + new-adUser @np -OtherAttributes @{ 'EmployeeType' = '{{ e.employeeType }}' } |
| 144 | + Write-Host "Identity created" |
| 145 | + }catch{ |
| 146 | + Write-Host $_ |
| 147 | + exit 1 |
| 148 | + } |
| 149 | +}else{ |
| 150 | + try{ |
| 151 | + $dn=$tab["DistinguishedName"] |
| 152 | + $UserPrincipalName = "{{ e.uid }}" + '@' + "{{ domain }}" |
| 153 | + set-adUser -Identity "$dn" -SamAccountName "{{ e.uid }}" -DisplayName "{{e.displayName}}" -GivenName "{{ e.givenName }}" -EmailAddress "{{ e.mail }}" -UserPrincipalName "$UserPrincipalName" |
| 154 | + Write-Host "Identity modified" |
| 155 | + }catch{ |
| 156 | + Write-Host $_ |
| 157 | + exit 1 |
| 158 | + } |
| 159 | +} |
| 160 | +exit 0 |
| 161 | +
|
| 162 | +``` |
| 163 | + |
| 164 | +Le powershell doit donner un code de retour (exit) |
| 165 | +* 0 tout est ok |
| 166 | +* 1 Erreur |
| 167 | + |
| 168 | +L'erreur ou le message doit être écrite sur la sortie standard (Write-Host) |
0 commit comments