Table des matières
Samba4 en Active Directory
Je vais montrer comment j'ai installé Samba4 en “Active Directory” (AD
) pour chez moi
Accrochez vous un peu, parce qu'il faudra savoir comment configurer un DNS et, à la toute fin, un Window$ 7 Pro (ou plus) sera souhaitable…
Pour vraiment avoir une AD opérationnelle pour une école ou une entreprise, il faudra connaître les bases de l'Administration sous Windows … (Mais si vous êtes ici et que vous avez tout compris jusqu'ici, alors vous avez déjà le niveau )
Comme d'hab, je me suis inspiré de diverses sources:
~~READMORE~~
AD : c'est quoi ?
Ma définition
Grosso merdo, c'est un protocole reposant sur un annuaire LDAP et permettant de mettre en œuvre des autorisations d'accès a des ressources informatiques, et dont le périmètre est définie par une ou plusieurs zones DNS locales (non publiques).
Oups: c'est pas exactement ça? Pas grave, c'est ce que j'en ai compris
Un exemple:
- Vous avez des utilisateurs (avec compte et mot de passe). (Enregistrés dans l'AD)
- Vous voulez qu'ils accèdent a des postes. (Enregistrés dans l'AD)
- Vous voulez qu'ils accèdent a des dossiers partagés. (Autorisés par l'AD)
Comme tout le monde le sait, l'“Active Directory
” vient de l'univers Micro$oft, et s'est imposé en entreprise grâce à ses grandes qualités fonctionnelles !
Heureusement pour les travailleurs les moins fortunés et les plus malins, “Samba
” peut prendre en charge la gestion d'un “Active Directory
”.
Zone DNS et Domaine
La clé de voute de l'AD, c'est la zone DNS.
For Active Directory to work properly computers that are a part of it need all of these names to resolve correctly. This means it must serve as the DNS server for all the PCs that exists within your domain.
Source: https://wiki.samba.org/index.php/Active_Directory_Naming_FAQ
Si vous ne définissez pas correctement la zone DNS, ou si les clients ne voient pas la zone DNS, votre AD ne fonctionnera pas, partiellement ou en totalité.
Choisir une zone DNS
Ce que la doc dit:
- la zone DNS ne devrait pas être fantaisiste.
- la zone DNS devrait être votre propriété.
- la zone DNS devrait être gérée uniquement par les contrôleurs de l'AD dans un réseau local.
En entreprise: remplacer le mot “devrait” par “doit”.
Zone parent
Alors oubliez tout de suite les zones DNS se terminant avec des TLD imaginaire comme “.local
” ou “.dns
” , et n'utilisez pas des domaines qui ne vous appartiennent pas, comme “example.com
” ou “microsoft.com
”.
Choisissez un domaine FQDN existant…
Exemple: “thierry-jaouen.fr
” : Ce domaine m'appartient
Mais cette zone DNS couvre des ressources publiques, et je n'exposerai pas une AD sur un réseau public.
Zone locale
A partir de la zone DNS parent, on peut définir une zone locale qui sera véritablement dédié a notre AD.
Pour ma part, je choisis quelque chose de bien long, mais de bien clair:
ad.local.thierry-jaouen.fr.
Traduction:
. | La racine du DNS des Internets |
fr. | TLD officiel de la France |
thierry-jaouen.fr. | Domaine publique (a moi) |
local.thierry-jaouen.fr. | Zone interne, dans mon réseau local |
ad.local.thierry-jaouen.fr. | Zone dédié à l'AD |
Parce qu'en pratique, je ne souhaite pas que toute la zone “local.thierry-jaouen.fr
” soit géré par l'AD.
Je veux juste que ça concerne uniquement la zone ad.local.thierry-jaouen.fr
.
Domaine
Source: https://wiki.samba.org/index.php/Active_Directory_Naming_FAQ
Ensuite, vient le domaine: la zone DNS et le “domaine
” sont généralement liés par un nom commun, proche, mais ce n'est pas obligatoire.
Pour la suite, je vais choisir: “THIERRY-JAOUEN
”.
Il ne s'agit pas d'une zone DNS, mais juste d'un nom attribué pour l' AD
: c'est le domaine.
Par ailleurs, le choix du nom a certaines restrictions …
Selon les situations, l' AD
pourra être désigné par sa zone DNS ou par son nom (de “domain”).
Délégation de zone dans les DNS
… allowing devices outside your domain to resolve names from this list still represents an unnecessary exposure of internal information and a possible security risk.
Source: https://wiki.samba.org/index.php/Active_Directory_Naming_FAQ
Maintenant, il faut que cette zone DNS soit déclarée dans les DNS de notre réseau local.
Chez moi, les zones internes sont gérés par des DNS sous “bind
” (ou “bind9
”) : Ils prennent déjà en charge quelques zones, dont la principale: “local.thierry-jaouen.fr
”.
On va faire en sorte de déléguer la sous-zone “ad.local.thierry-jaouen.fr
” aux DNS de l'AD (qu'on va installer très vite après…)
Dans “bind
”, j'ai simplement fait les déclarations suivantes. (Je laisse le lecteur adapté a ses besoins…)
Dans “/etc/bind/named.conf.local
”, j'ai déjà une zone comme ça pour déclarer ma zone “local”.
zone "local.thierry-jaouen.fr" { type master; file "/etc/bind/MASTER/db.local.thierry-jaouen.fr"; allow-query { any; }; allow-transfer { none; }; };
Et dans “/etc/bind/MASTER/db.local.thierry-jaouen.fr
” :
; ; zone local.thierry-jaouen.fr ; $TTL 3600 @ IN SOA ns0.local.thierry-jaouen.fr. hostmaster.thierry-jaouen.fr. ( 2017010800 ; serial number 24h ; refresh 1h ; retry 2w ; expire 1h ; minimum TTL ) ; ---------------------------------------------------------- NS ns0.local.thierry-jaouen.fr. MX 0 . TXT "v=spf1 -all" ; ---------------------------------------------------------- ; Pour test livebox A 192.168.0.1 nas A 192.168.0.2 fuck-hadopi CNAME fuck-hadopi.vm.ovh.local.thierry-jaouen.fr. ; ---------------------------------------------------------- ; delegation sous domaine AD dc0.ad A 192.168.0.7 ad NS dc0.ad ; ----------------------------------------------------------
Les 2 dernières lignes sont les plus importantes, car elle délègue la zone “ad
” a notre futur premier contrôleur de domaine.
En passant, on vient de définir les paramètres réseaux de notre “Domaine Controler
” (DC
) :
IP | 192.168.0.7 |
---|---|
Nom DNS | dc0.ad.local.thierry-jaouen.fr. |
Installation du contrôleur de domaine
Notre (premier) contrôleur de domaine (DC
) = On va mettre en service notre AD.
Notes préalables
Debian 8
Sur un nouveau PC (une VM suffit), il faut installer un Debian minimal, mais sans oublier:
ntp bind9
Donc:
# apt-get install ntp bind9
Bind9_DLZ
Comme recommandé dans la doc, on va installer Samba4 en AD, avec le support “BIND9_DLZ
”.
Source: https://wiki.samba.org/index.php/BIND9_DLZ_DNS_Back_End
Donc, si ce n'est pas déjà le cas, il faut prévoir d'installer bind9 comme DNS de votre DC
.
rfc2307 / NIS
Source: https://wiki.samba.org/index.php/Setting_up_RFC2307_in_AD
On va installer l'AD avec le support de “rfc2307
”: cela permet d'étendre les attributs et objets LDAP (dans la base de l'AD
) pour un meilleur support des fonctionnalités propres à *NIX.
Par exemple: les comptes et les groupes pourront avoir respectivement des “UID
” et “GID
” commun à l'ensemble des services de l'AD… Fini le calvaire des mappages entre les ID Windows (“SID
”) et les UID/GID *NIX.
Samba tout frais
install
# apt-get install samba winbind libnss-winbind krb5-user
Et comme cette installation par défaut ne nous convient pas (évidement), on arrête immédiatement les services en faisant:
# /etc/init.d/samba stop # /etc/init.d/winbind stop
C'est un peu confus, mais je crois qu'arrêter Samba et/ou Winbind avec “systemctl ” me pose des soucis… A vous de voir… |
Petite purge
On va effacer des fichiers: Faites des backups !!! |
Effacer toutes les conf pouvant troubler l'installation:
# mv /etc/samba/smb.conf{,-origin}
Virer tout les fichiers avec les extensions “.tdb” et “.ldb” des répertoires suivant:
# smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR" LOCKDIR: /var/run/samba STATEDIR: /var/lib/samba CACHEDIR: /var/cache/samba PRIVATE_DIR: /var/lib/samba/private
# find /var/run/samba/ \( -iname '*.tdb' -o -iname '*.ldb' \) -delete # find /var/lib/samba/ \( -iname '*.tdb' -o -iname '*.ldb' \) -delete # find /var/cache/samba/ \( -iname '*.tdb' -o -iname '*.ldb' \) -delete
Notre Samba est purgé.
Domain Provision
Source: https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller
On va se placer dans la “home” de root:
# cd /root # mkdir ad # chmod 0700 ad # cd ad
Choisir un mot de passe pour le compte “Administrator
”: on créé un mot de passe complexe dans un fichier (ouh c'est vilain):
# pwgen -s 10 1 > pass.txt
On va utiliser “samba-tool
” pour créer notre AD pour notre premier DC.
Pour cela, j'ai choisit de composer un petit script nommé “domain_provision.sh
” , au moins pour auto-documenter ce que j'ai fait, car je ne le fera plus, sauf en cas de désastre (coucou Murphy):
#!/bin/sh PASSWORD="$( cat /root/ad/pass.txt )" samba-tool domain provision --use-rfc2307 \ --realm=ad.local.thierry-jaouen.fr \ --dns-backend=BIND9_DLZ \ --domain=THIERRY-JAOUEN \ --server-role=dc \ --adminpass="${PASSWORD}"
Exécuter ce script:
# ./domain_provision.sh Looking up IPv4 addresses Looking up IPv6 addresses No IPv6 address will be assigned Setting up share.ldb Setting up secrets.ldb Setting up the registry Setting up the privileges database Setting up idmap db Setting up SAM db Setting up sam.ldb partitions and settings Setting up sam.ldb rootDSE Pre-loading the Samba 4 and AD schema Adding DomainDN: DC=ad,DC=local,DC=thierry-jaouen,DC=fr ... etc... Server Role: active directory domain controller Hostname: dc0 NetBIOS Domain: THIERRY-JAOUEN DNS Domain: ad.local.thierry-jaouen.fr DOMAIN SID: S-1-5-21-1288284448-696143219-565403640
NIS
Source: https://wiki.samba.org/index.php/Administer_Unix_Attributes_in_AD_via_ADUC
Ce n'est pas indispensable, mais si vous étendez les objets LDAP avec RFC2307 (comme c'est recommandé plus haut), vous voudriez surement choisir les ranges des UID/GID attribué au NIS: par défaut, c'est à partir de 10000
.
Pour personnaliser cela, on installe d'abord quelques outils pour explorer la base LDAP:
# apt-get install ldb-tools
On effectue une recherche bien précise (adapté selon votre domaine bien sur!):
# ldbsearch -H /var/lib/samba/private/sam.ldb -b CN=thierry-jaouen,CN=ypservers,CN=ypServ30,CN=RpcServices,CN=System,DC=ad,DC=local,DC=thierry-jaouen,DC=fr
Ce qui retourne:
# record 1 dn: CN=thierry-jaouen,CN=ypservers,CN=ypServ30,CN=RpcServices,CN=System,DC=ad,DC=local,DC=thierry-jaouen,DC=fr objectClass: top objectClass: msSFU30DomainInfo cn: thierry-jaouen instanceType: 4 whenCreated: 20141203151947.0Z whenChanged: 20141203151947.0Z uSNCreated: 3769 uSNChanged: 3769 showInAdvancedViewOnly: TRUE name: thierry-jaouen objectGUID: 70123456-ab12-12b3-ab12-1af2345baa12 objectCategory: CN=msSFU-30-Domain-Info,CN=Schema,CN=Configuration,DC=ad,DC=local,DC=thierry-jaouen,DC=fr msSFU30MasterServerName: DC0 msSFU30OrderNumber: 10000 msSFU30Domains: thierry-jaouen distinguishedName: CN=thierry-jaouen,CN=ypservers,CN=ypServ30,CN=RpcServices,CN=System,DC=ad,DC=local,DC=thierry-jaouen,DC=fr # returned 1 records # 1 entries # 0 referrals
Donc, on va definir les NIS/UID/GID (par defaut c'est “10000”) à:
UID | 210000 |
---|---|
GID | 230000 |
NOTA: on pourrait ne rien changer, ou faire coïncider UID et GID.
Donc, on va éditer avec “ldbedit
” , et en utilisant les mêmes paramètres que pour la recherche:
# ldbedit -H .... (même chose que ci-dessus)
Et ajouter les 2 valeurs… (voir le rendu après)
# 0 adds 2 modifies 0 deletes
Voici le résultat:
# ldbsearch -H .... ... msSFU30MaxGidNumber: 230000 msSFU30MaxUidNumber: 210000 ...
Démarrer Samba
Et ouai, on a oublié qu'il est actuellement en vrac car il n'a aucune configuration.
On va le démarrer, mais si ça ne fonctionne pas, c'est normal parce qu'on n'a pas encore fini.
Il est même possible que vous deviez rebooter le système:
Mais ne paniquez pas tant que vous n'avez pas tout configuré (voir la suite).
Mais pour tester “kerberos”, on a besoin d'un service Samba qui fonctionne.
une configuration minimal
Voici une conf pour commencer… Mais en pratique, elle est suffisante, car si on suit bien les conseils données dans la doc, les “DC
” doivent resté simple, sans aucun partage, en dehors de “netlogon
” et “sysvol
”…
Bref, dans “ma” conf, dans le fichier “/etc/samba/smb.conf
” :
# Global parameters [global] workgroup = THIERRY-JAOUEN realm = ad.local.thierry-jaouen.fr netbios name = DC0 server role = active directory domain controller server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate idmap_ldb:use rfc2307 = yes [netlogon] path = /var/lib/samba/sysvol/ad.local.thierry-jaouen.fr/scripts read only = No [sysvol] path = /var/lib/samba/sysvol read only = No
nsswitch.conf
Ca pourrait avoir son importance, mais pour que les comptes (uid/gid) qui vont peupler l'AD soient visible avec des petits noms dans l'environnement de votre système Linux (Debian), il faut faire en sorte d'avoir dans le fichier “/etc/nsswitch.conf
” :
passwd: compat winbind group: compat winbind
On ne touche pas le reste: uniquement les lignes concernant “passwd” et “group”.
Démarrer
( ← En fait, “ # /etc/init.d/winbind start
winbind
” va démarrer avec Samba…)
# /etc/init.d/samba start
Sinon, rebooter… (ouai, c'est approximatif )
Bind9 et DLZ Back end
Bind
Dans la section “options” de “named.conf.options”, ajouter:
// --- TJ --------------- // doc: /var/lib/samba/private/named.txt // pour mise a jour dynamique... tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab"; // ----------------------
Dans le fichier “named.conf.local”, ajouter:
// --- TJ -------------------- // Samba 4 et BIND9_DLZ include "/var/lib/samba/private/named.conf"; // ---------------------------
Kerberos
Remplacer la conf de “krb5.conf” :
# cd /etc # mv krb5.conf{,-origin}
Et remplacer par la conf samba:
# ln -s /var/lib/samba/private/krb5.conf
Pour info (ne pas modifier), le contenu de mon “krb5.conf
”:
[libdefaults] default_realm = AD.LOCAL.THIERRY-JAOUEN.FR dns_lookup_realm = false dns_lookup_kdc = true
Tester le DNS
# named-checkconf
# /etc/init.d/bind9 restart
UPDATE ( suite à un commentaire anonyme (merci à lui) ) |
Modifier le fichier “/etc/resolv.conf
” pour avoir un truc ressemblant à ça:
domain ad.local.thierry-jaouen.fr search ad.local.thierry-jaouen.fr nameserver 127.0.0.1
Qui gère la zone AD ?
# dig +short -t NS ad.local.thierry-jaouen.fr dc0.ad.local.thierry-jaouen.fr.
Sur quel port est le service ldap ? (normalement 389
)
# dig +short -t SRV _ldap._tcp.ad.local.thierry-jaouen.fr 0 100 389 dc0.ad.local.thierry-jaouen.fr.
Sur quel port est le service kerberos? (normalement 88
)
# dig +short -t SRV _kerberos._udp.ad.local.thierry-jaouen.fr 0 100 88 dc0.ad.local.thierry-jaouen.fr.
Si tout les tests passent, alors le DNS est correctement configuré pour répondre aux requêtes des clients de l'AD.
Tester Kerberos
La manière la plus simple étant de s'authentifier avec le compte “Administrator
”.
(à ce stade, c'est d'ailleurs le seul compte “user” qui existe!)
Quand ça marche:
# kinit Administrator Password for Administrator@AD.LOCAL.THIERRY-JAOUEN.FR: xxxx Warning: Your password will expire in 41 days on mar. 25 déc. 2016 01:19:43 CET # klist Ticket cache: FILE:/tmp/krb5cc_0 ... bla bla... # kdestroy
Quand ça marche pas, on a un message du genre:
kinit: Cannot contact any KDC for realm 'AD.LOCAL.THIERRY-JAOUEN.FR' while getting initial credentials
Il faut vérifier la conf.
Autres tests divers
# samba-tool domain level show Domain and forest function level for domain 'DC=ad,DC=local,DC=thierry-jaouen,DC=fr' Forest function level: (Windows) 2008 R2 Domain function level: (Windows) 2008 R2 Lowest function level of a DC: (Windows) 2008 R2
Via “winbind
”, les groupes présents au début:
# wbinfo -g enterprise read-only domain controllers domain admins domain users domain guests domain computers domain controllers schema admins enterprise admins group policy creator owners read-only domain controllers dnsupdateproxy
Le groupe “domain admins” a quoi comme GID ?
# getent group "domain admins" domain admins:x:3000008:
Les groupes via les outils Samba.
# samba-tool group list Allowed RODC Password Replication Group Enterprise Read-Only Domain Controllers ... snip ... IIS_IUSRS DnsAdmins Guests Users
La liste des comptes “utilisateurs” au début:
# samba-tool user list Administrator dns-dc0 krbtgt Guest
Quelques infos sur ce domaine:
# wbinfo -D THIERRY-JAOUEN Name : THIERRY-JAOUEN Alt_Name : ad.local.thierry-jaouen.fr SID : S-1-5-21-1244829999-619969999-564069999 Active Directory : Yes Native : Yes Primary : Yes
Quel est le “SID
” d' “Administrator”
# wbinfo -n Administrator S-1-5-21-1244829999-619969999-56407040-500 SID_USER (1)
Il est bien mappé sous Linux:
# wbinfo -S S-1-5-21-1244829999-619969999-56407040-500 0
“0
” n'est pas une erreur: “Administrator” est mappé en tant que “root”, donc UID==0
Lister les groupes d'“Administrator”:
# wbinfo -r Administrator 100 3000004 3000006 ... etc ...
En retrouver la correspondance sous Linux:
# wbinfo --gid-info 100 domain users:x:100: # wbinfo --gid-info 3000004 group policy creator owners:x:3000004: ... etc ...
Premiers pas dans l'AD
Remarques préalable
A ce stade, on n'a qu'un seul DC (“Domain Controler”): c'est mieux si on en a 2 ou plus. On verra (ou pas) dans un prochain article.
On verra (ou pas) dans un autre article comment joindre l'AD… en fait, c'est hyper documenté partout…
Si vous créez des comptes, n'oubliez pas de leur affecter des “UID/GID” , sinon, vous ne les verrez pas sous Linux car “winbind
” ne pourra pas les mappers.
ligne de commandes
D'après la documentation, l'outil “RSAT/mmc
” de Window$ est plus cool pour jouer avec l'AD.
Mais des fois, c'est plus cool de jouer avec des commandes sous Linux
créer un nouveau compte admin (pour ma pomme)
Qui sont les “Admin” en ce moment:
# samba-tool group listmembers "Domain Admins" Administrator
1 seul membre… Okay.
Je créé mon compte:
# samba-tool user add thierry New Password: Retype Password: User 'thierry' created successfully
Voyons a quoi il ressemble pour l'instant:
# getent passwd thierry thierry:*:3000016:100::/home/THIERRY-JAOUEN/thierry:/bin/false
(En fait, la “home” n'existe pas, et on s'en fout un peu)
(Noté bien “300016
” est l'UID dans l'environnement du DC, ce n'est pas le “NIS” qui n'a pas encore été défini.)
# wbinfo -r thierry 3000016 100 3000009
# wbinfo --gid-info 3000016 thierry:x:3000016:thierry
On voit qu'il y a déjà des groupes automatiquement ajoutés…
3000016 | thierry |
---|---|
100 | domain users |
3000009 | BUILTIN\users |
J'ajoute mon compte dans le groupe “Domain Admins”:
# samba-tool group addmembers "Domain Admins" thierry Added members to group Domain Admins
Examinons les groupes:
# wbinfo -r thierry 3000016 100 3000008 3000005 3000009 3000003
3000003 | BUILTIN\administrators |
---|---|
3000005 | denied rodc password replication group |
3000008 | domain admins |
Il va falloir utiliser “mmc
” (voir section suivante) pour définir le “NIS”.
Lorsque cela sera fait, il faudra vider le cache:
# net cache flush
… pour voir les “bons” UID/GID.
Et ainsi (par exemple):
# id thierry uid=210000(thierry) gid=230001(domain users) groupes=230001(domain users),230000(domain admins),3000005(denied rodc password replication group),3000009(BUILTIN\users),3000003(BUILTIN\administrators)
RSAT/mmc
Sortez le carnet de chèque, il faut un Windows Pro pour installer ces outils.
Vous pouvez trouver des explications par là:
DNS
(Sans entrer dans les détails avec des screenshots de folie)
L'une des premières choses a faire, c'est d'installer le module “DNS” pour gérer …. le DNS de l'AD.
Dans mon cas, j'y ajoute de suite “dc0.ad.local.thierry-jaouen.fr
” (IP: 192.168.0.7) qui est le premier contrôleur de domaine.
On vérifiera qu'il n'y a que la zone “ad.local.thierry-jaouen.fr
” qui est géré par l'AD.
Comptes
On organise son AD (Drag/drop/click/copy/paste) et lorsqu'on créé des comptes et des groupes, on n'oublie pas d'affecter des “UID/GID” a chaque fois. (Y a des rares cas où ce ne n'est pas nécessaire)
La suite
Exemple:
- Joindre l'AD et monter un petit partage …
- Créer un 2ieme DC …
A suivre…