ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2017:05:24:samba4_en_active_directory

Samba4 en Active Directory

Je vais montrer comment j'ai installé Samba4 en “Active Directory” (AD) pour chez moi :-D

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:

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 :-D

Un exemple:

  1. Vous avez des utilisateurs (avec compte et mot de passe). (Enregistrés dans l'AD)
  2. Vous voulez qu'ils accèdent a des postes. (Enregistrés dans l'AD)
  3. 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 ! :-D

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:

  1. la zone DNS ne devrait pas être fantaisiste.
  2. la zone DNS devrait être votre propriété.
  3. 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 :-D

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

# /etc/init.d/winbind start ( ← En fait, “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…

Comments

Bonjour, Merci pour les infos, c'est plus simple que de relire toute la doc samba. Par contre, je crois qu'il serait utile d'indique ce que doit contenir le /etc/resolv.conf du serveur samba, ne serait-ce pas : domain ad.local.thierry-jaouen.fr search ad.local.thierry-jaouen.fr nameserver 127.0.0.1 ? Je dis ça car j'ai bloqué sur : dig +short -t NS ad.local.thierry-jaouen.fr qui ne me renvoyait rien, et j'ai pu corrigé en changeant le resolv.conf (celui du samba, pas du DNS principal qui délègue).

1 |
JL
| 2017/09/12 16:29 | reply

@JL: Bien vu ! Merci.

2 |
Thierry JAOUEN
| 2017/09/13 17:44 | reply

:) Et pour la configuration ntp, j'ajouterais qu'il faut décommenter dans /etc/ntp.conf le “broadcast 192.168.3.255” et relancer le service. Sinon ça pause problème pour joindre le domaine. Et encore merci pour l'article.

3 | | 2017/09/14 11:35 | reply



Si vous ne pouvez pas lire le code, téléchargez ce fichier .wav pour l'écouter.
blog/2017/05/24/samba4_en_active_directory.txt · Dernière modification: 2017/09/13 17:43 par thierry