Station Linux et serveur Windows

Nous allons réaliser ici la première étape pour intégrer des stations Linux dans un domaine Microsoft Active Directory de niveau fonctionnel 2003. L’intégration dans un domaine AD de niveau 2008 et plus sera abordé une prochaine fois.

Conditions de départ de l’expérience :

  • Station : Ubuntu Linux 13.10, installation de base 64bits sans paquet supplémentaire.
  • Serveur : Microsoft Windows 2003 R2, domaine Active Directory activé, niveau de fonctionnalité 2003.
  • Domaine : MONRESEAU.NET

La documentation ci-dessous s’appuie beaucoup sur l’article ‘koo.fi blog – Ubuntu 12.04 Active Directory Authentication‘.

Plan :

  1. Station – Installer et configurer Kerberos
  2. Station – Installer et configurer Samba
  3. Station РCr̩ation du fichier Keytab
  4. Station РR̩g̩n̩ration automatique du ticket Kerberos
  5. Station – Installer et configurer LDAP
  6. Serveur – Configurer les comptes utilisateurs AD
  7. Station – Configurer NSS
  8. Station – Configurer PAM
  9. Fin
  10. Liens
  11. Annexes

Sur la station, toutes les commandes sont lancées en tant que root ou, mieux, via sudo.

1. Station – Installer et configurer Kerberos

La station a pour nom de machine STATION01.

Le réseau et les dépôts de paquets doivent être fonctionnels.

Ajouter les paquets nécessaires à Kerberos :
aptitude install libpam-krb5 krb5-user kstart ntp

Le domaine AD est définit en MONRESEAU.NET. Le domaine DNS associé est mondomain.net. L’UID des utilisateurs dans l’AD est définit à partir de 5000, ils ne seront pas reconnus avec une valeur inférieure. Il y a deux controleurs de domaine AD : dc1.monreseau.net et dc2.monreseau.net.

Modifier le fichier /etc/krb5.conf :

[appdefaults]
  pam = {
    realm = MONRESEAU.NET
    ticket_lifetime = 1d
    renew_lifetime = 1d
    forwardable = true
    proxiable = false
    retain_after_close = false
    minimum_uid = 5000
    try_first_pass = true
    ignore_root = true
  }
[libdefaults]
  default_realm = MONRESEAU.NET
  default_keytab_name = FILE:/etc/krb5.keytab
  krb4_config = /etc/krb.conf
  krb4_realms = /etc/krb.realms
  kdc_timesync = 1
  ccache_type = 4
  forwardable = true
  proxiable = false
  v4_instance_resolve = false
  v4_name_convert = {
    host = {
      rcmd = host
      ftp = ftp
    }
    plain = {
      something = something-else
    }
  }
  fcc-mit-ticketflags = true
[realms]
  MONRESEAU.NET = {
    kdc = dc1
    kdc = dc2
    admin_server = dc1
    default_domain = monreseau.net
    auth_to_local = DEFAULT
  }
[domain_realm]
  .monreseau.net = MONRESEAU.NET
  monreeau.net = MONRESEAU.NET
[login]
  krb4_convert = true
  krb4_get_tickets = false

On demande un ticket Kerberos à un controleur de domaine AD. Le ticket est demandé pour un compte qui a le droit d’ajouter une nouvelle station dans le domaine AD, typiquement un administrateur. Ce droit va servir pour la configuration de Samba.
Utiliser la commande :
kinit administrateur@MONRESEAU.NET

On peut vérifier à tout moment que l’on a bien un ticket valide avec :
klist

2. Station – Installer et configurer Samba

Ajouter les paquets nécessaires à Samba :
aptitude install smbclient

Modifier le fichier de configuration /etc/samba/smb.conf :

[global]
  workgroup = MONRESEAU
  netbios name = STATION01
  realm = MONRESEAU.NET
  server string = %h
  dns proxy = no
  log file = /var/log/samba/log.%m
  max log size = 1000
  syslog = 0
  panic action = /usr/share/samba/panic-action %d
  security = ADS
  kerberos method = system keytab
  encrypt passwords = true
  passdb backend = tdbsam
  obey pam restrictions = yes
  unix password sync = yes
  passwd program = /usr/bin/passwd %u
  passwd chat = *Entersnews*spassword:* %nn *Retypesnews*spassword:* %nn *passwordsupdatedssuccessfully* .
  pam password change = yes
  map to guest = bad user
  usershare allow guests = yes
[printers]
  comment = All Printers
  browseable = no
  path = /var/spool/samba
  printable = yes
  guest ok = no
  read only = yes
  create mask = 0700
[print$]
  comment = Printer Drivers
  path = /var/lib/samba/printers
  browseable = yes
  read only = yes
  guest ok = no

Joindre la station au domaine AD avec la commande :
net ads join -k

Il se peut qu’il y ai une erreur « DNS update failed« . Ce n’est pas grave, l’ajout au domaine AD marche quand même.

Voir la documentation de Samba concernant kerberos method.

3. Station РCr̩ation du fichier Keytab

Nous avons dit à Kerberos d’utiliser le fichier /etc/krb5.keytab mais celui-ci n’existe pas, il faut le créer. Lancer la commande :
net ads keytab create

On peut vérifier que tout se passe bien jusqu’ici :
kinit -V -k "STATION01$"

Le fichier de Keytab contient une clé qu’il va falloir protéger :
chown root.root /etc/krb5.keytab
chmod 600 /etc/krb5.keytab

4. Station РR̩g̩n̩ration automatique du ticket Kerberos

Le ticket Kerberos de la machine n’a qu’une validité de 24 heures, il doit être régégéré régulièrement. On choisit de le régénérer toutes les heures via cron.

Ajouter à /etc/crontab :

2  *    * * *   root    kinit -k "STATION01$" -c /tmp/krb5cc_host ; chmod 644 /tmp/krb5cc_host

Revoir la protection de /tmp/krb5cc_host …

Pour régénerer le ticket de l’utilsiateur, on ajout un petit script à l’ouverture de session.
Créer le fichier /usr/share/upstart/sessions/krenew.conf avec :

description "User TGT KRB5"
author "Stephane DENDIEVEL"

start on starting xsession-init

respawn

exec krenew -K 60

5. Station – Installer et configurer LDAP

Ajouter les paquets nécessaires à OpenLDAP :
aptitude install ldap-utils libsasl2-modules-gssapi-mit

Modifier le fichier /etc/ldap.conf :

use_sasl on
sasl_auth_id STATION01$
krb5_ccname FILE:/tmp/krb5cc_host
base dc=monreseau,dc=net
uri ldap://dc1.monreseau.net ldap://dc2.monreseau.net
ldap_version 3
sizelimit 10000
timelimit 10
bind_timelimit 5
network_timeout 3
tls_checkpeer no
referrals no
bind_policy soft
scope sub
nss_base_passwd	dc=monreseau,dc=net?sub
nss_base_shadow	dc=monreseau,dc=net?sub
nss_base_group	dc=monreseau,dc=net?sub
nss_map_objectclass posixAccount User
nss_map_objectclass shadowAccount User
nss_map_objectclass posixGroup Group
nss_map_attribute uid uid
nss_map_attribute uidNumber uidNumber
nss_map_attribute gidNumber gidNumber
nss_map_attribute loginShell loginShell
nss_map_attribute gecos name
nss_map_attribute userPassword msSFU30Password
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute shadowLastChange pwdLastSet
nss_map_attribute uniqueMember msSFU30PosixMember
nss_map_attribute cn cn
pam_login_attribute msSFU30Name
pam_filter objectclass=User
pam_password ad
nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,colord,daemon,dirmngr,dnsmasq,festival,games,gdm,gnats,hplip,irc,kdm,kernoops,libuuid,lightdm,list,lp,mail,man,messagebus,news,ntp,proxy,pulse,root,rtkit,saned,speech-dispatcher,sync,sys,syslog,usbmux,uucp,whoopsie,www-data

Copier /etc/ldap.conf vers /etc/ldap/ldap.conf .

La configuration peut être vérifiée simplement avec la commande :
ldapsearch

6. Serveur – Configurer les comptes utilisateurs AD

Dans une console ADUC, activer l’affichage étendu. On peut passer aussi par l’ADSIedit. enfin, on peut scripter par Powershell.

Pour chaque utilisateur, ajouter les propriétés :

  • uid = username
    C’est le nom que doit saisir l’utilisateur pour s’identifier. Typiquement égual à sAMAccountName.
  • uidNumber = 10001
    Doit être unique et non existant par défaut sur les stations Linux.
  • gidNumber = 100
    Soit l’équivalent du groupe users sous Linux.
  • HomeUnixDirectory = /home/username
    Là ou sera créé et utilisé le répertoire de l’utilisateur.
  • loginShell = /bin/bash
    Le shell par défaut de l’utilisateur.

Il n’est pas nécessaire d’installer des outils pour gérer les comptes UNIX dans Windows 2003 R2 dans notre cas.

7. Station – Configurer NSS

Ajouter les paquets nécessaires à NSS :
aptitude install libnss-ldap libpam-ldap libnss-myhostname

Modifier le fichier /etc/nsswitch.conf :

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis

8. Station – Configurer PAM

Ajouter les paquets suplémentaires à PAM :
aptitude install libpam-ccreds

Modifier le fichier /etc/pam.d/common-auth :

auth    [success=3 default=ignore]    pam_krb5.so minimum_uid=5000
auth    [success=2 default=ignore]    pam_unix.so nullok_secure try_first_pass
auth    [success=1 default=ignore]    pam_ldap.so use_first_pass
auth    requisite    pam_deny.so
auth    required    pam_permit.so
auth    optional    pam_cap.so

Modifier le fichier /etc/pam.d/common-account :

account    [success=2 new_authtok_reqd=done default=ignore]    pam_unix.so 
account    [success=1 default=ignore]    pam_ldap.so 
account    requisite   pam_deny.so
account    required    pam_permit.so
account    required    pam_krb5.so minimum_uid=5000

Modifier le fichier /etc/pam.d/common-password :

password    [success=3 default=ignore]    pam_krb5.so minimum_uid=5000
password    [success=2 default=ignore]    pam_unix.so obscure use_authtok try_first_pass sha512
password    [success=1 user_unknown=ignore default=die]    pam_ldap.so use_authtok try_first_pass
password    requisite    pam_deny.so
password    required    pam_permit.so
password    optional    pam_gnome_keyring.so

Modifier le fichier /etc/pam.d/common-session :

session    [default=1]    pam_permit.so
session    requisite    pam_deny.so
session    required    pam_permit.so
session    optional    pam_umask.so
session    optional    pam_krb5.so minimum_uid=5000
session    required    pam_unix.so 
session    required    pam_mkhomedir.so skel=/etc/skel/ umask=0077
session    optional    pam_ldap.so 
session    optional    pam_systemd.so 
session    optional    pam_ck_connector.so nox11

9. Fin

Un petit redémarrage et la connexion en tant qu’utilisateur de l’AD devrait fonctionner.
Au besoin, on peut vérifier aussi en console (taper [Ctrl]-[Alt]-[F1] ) ou via SSH.

On peut vérifier ce qui remonte de l’AD sur une station avec les commandes :
getent passwd
getent shadow
getent group

Il y a surement des choses à améliorer, mais on a une bonne base de travail.

Pour le gestionnaire de connexion, j’ai recherché lequel permettait de saisir un identifiant (de l’AD) tout en restant assez sexy. Je me suis arrêté sur KDM.

Thunderbird plante au bout de quelques secondes de fonctionnement. C’est semble-t-il un problème spécifique avec les comptes utilisateurs sur LDAP, càd non locaux. Installer nscd pour résoudre ce problème.

Avec Gnome, cinnamon et Unity la déconnexion et le changement d’utilisateur posent parfois problème. Ce problème n’apparait pas sous afterstep, blackbox, enlightenment, fluxbox, flwm, icewm, KDE, LXDE, twm, tinywm, vtwm, windowmaker ou XFCE. Cela semble lié à GTK

10. Liens

11. Annexes

Voici un script install.sh de déploiement rapide à lancer avec le compte d’installation de la station Linux fraichement installée :

#!/bin/bash
# ----------------------------------------------------------------------------
#  Script de préparation des stations Ubuntu Linux.
   SCRIPTVERSION='20140304'
# ----------------------------------------------------------------------------
SCRIPTNAME="install.sh"
[ -f $SCRIPTNAME ] && chmod a+x $SCRIPTNAME

# Reconnexion en tant que root.
echo "Connecté en tant que $USER."
[ "$(id -u)" != 0 ] && echo "sudo ./$SCRIPTNAME" && sudo bash -c ./$SCRIPTNAME && return 0
sleep 1
[ "$(id -u)" != 0 ] && exit 0
echo "($SCRIPTVERSION)"

# Variables.
HOSTNAME=""       # Définit plus tard.   Nom de la machine.
ADMNAME=""        # Définit plus tard.   Nom du compte administrateur de l'AD.
ADMPASS=""        # Définit plus tard.   Mot de passe du compte admin de l'AD.
ADSERV1="dc1"                          # Premier controleur de domaine AD.
ADSERV2="dc2"                          # Deuxième controleur de domaine AD.
ADDN="dc=monreseau,dc=net"             # DN LDAP dans l'AD.
ADDOM="MONRESEAU.NET"                  # Domaine AD.
ADWKG=$(echo $ADDOM | cut -d '.' -f 1) # Détermine le workgroup. Ne pas modifier.
ADDNS=$(echo $ADDOM | tr '[:upper:]' '[:lower:]') # Détermine le domaine DNS. Ne pas modifier.
ADMINUID="5000"                        # Valeur minimum de UID accepté pour les comptes AD.
DNSSERV1="192.168.0.10"                # Adresse IP du premier serveur DNS.
DNSSERV2="192.168.0.11"                # Adresse IP du deuxième serveur DNS.
DNSSEARCH="monreseau.net"              # Domaine de recherche DNS par défaut.
IPADDR=""         # définit plus tard.   Adresse IP de la machine.
IPBASEADDR="192.168."                  # Base de l'adresse IP.
IPMASK="16"                            # Masque de réseau, forme numérique.
IPLMASK="255.255.0.0"                  # Masque de réseau, forme longue.
IPGATE=""         # définit plus tard.   Adresse IP de la passerelle par défaut du réseau.
IFACE=$(cat /proc/net/dev | cut -d ':' -f 1 | grep -v '|' | grep -v lo | sed 's/ //g' | head -1) # Prend la première interface définit dans le noyau. Ne pas modifier.
UBUNTU="saucy"                         # Version de la distri Ubuntu utilisée.

# Remplissage par l'admin des valeurs de base de cette station.
echo "-------------------------------------------------------------------------------"
read -p "Nom de machine : " HOSTNAMEtmp
HOSTNAME=$(echo -n $HOSTNAMEtmp | tr '[:lower:]' '[:upper:]' | tr -dc "A-Z0-9-")
read -p "Adresse IP     : $IPBASEADDR" IPADDRtmp
IPADDR=$(echo -n "$IPBASEADDR$IPADDRtmp" | tr -dc "0-9.")
echo " "
echo       "Domaine ActiveDirectory : $ADDOM"
read -p    "Code administrateur AD  : " ADMNAME
read -s -p "MdP administrateur AD   : " ADMPASS
echo " "

# Mise en place du nom de machine.
echo "-------------------------------------------------------------------------------"
echo "Mise en place du nom de machine : $HOSTNAME"
hostname $HOSTNAME
echo -n "$HOSTNAME" > /etc/hostname
cat > /etc/hosts << EOF
127.0.0.1	localhost
127.0.1.1	$HOSTNAME
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
echo " "

# Mise en place du réseau.
echo "-------------------------------------------------------------------------------"
echo "Désactivation du NetworkManager."
cat > /etc/NetworkManager/NetworkManager.conf << EOF
[main]
plugins=ifupdown,keyfile,ofono
dns=dnsmasq

[ifupdown]
managed=true
EOF
sleep 2
nmcli nm enable false

echo "Mise en place de l'adresse IP sur $IFACE : $IPADDR/$IPMASK"
ifconfig $IFACE $IPADDR/$IPMASK
sleep 5
IPGATE="$(echo $IPADDR | cut -d '.' -f 1).0.0.1"
[ "$IPMASK" == 16 ] && IPGATE="$(echo $IPADDR | cut -d '.' -f 1-2).0.1"
[ "$IPMASK" == 24 ] && IPGATE="$(echo $IPADDR | cut -d '.' -f 1-3).1"
echo "Mise en place de la route par défaut : $IPGATE"
route del default 2>&-
route add default gw $IPGATE

echo " "
echo "Test de la connectivité réseau en cours..."
ping -c 1 -W 1 $IPGATE >&- 2>&-
[ "$(arp -an | grep $IPGATE | grep incomplete)" != "" ] && echo "ERREUR de réseau !!!" && sleep 5 && exit 0
echo "Réseau OK."

echo " "
echo "Ecriture de la configuration."
cat > /etc/network/interfaces << EOF
auto lo
iface lo inet loopback
auto $IFACE
iface $IFACE inet static
  address $IPADDR
  netmask $IPLMASK
  gateway $IPGATE
EOF
echo " "

# Mise en place du DNS.
echo "-------------------------------------------------------------------------------"
echo "Mise en place du DNS."
echo "Serveur DNS1 : $DNSSERV1"
echo "nameserver $DNSSERV1" > /etc/resolv.conf
echo -n "  dns-nameservers $DNSSERV1" >> /etc/network/interfaces
if [ "$DNSSERV2" != "" ]
then
  echo "Serveur DNS2 : $DNSSERV2"
  echo "nameserver $DNSSERV2" >> /etc/resolv.conf
  echo -n " $DNSSERV2" >> /etc/network/interfaces
fi
echo "Domaine de recherche par défaut : $DNSSEARCH"
echo "search $DNSSEARCH" >> /etc/resolv.conf
echo " " >> /etc/network/interfaces
echo "  dns-search $DNSSEARCH" >> /etc/network/interfaces
> /etc/resolvconf/resolv.conf.d/base
> /etc/resolvconf/resolv.conf.d/head

echo " "
echo "Test de la résolution de nom en cours..."
[ "$(host $ADSERV1 | grep address)" == "" ] && echo "ERREUR de résolution de noms !!!" && sleep 5 && exit 0
echo "DNS OK."
echo " "

# Mise à l'heure.
echo "-------------------------------------------------------------------------------"
echo "Mise à l'heure..."
[ -f /etc/init.d/ntp ] && /etc/init.d/ntp stop
ntpdate ntp
date
echo " "

# Mise en place des dépôts.
echo "-------------------------------------------------------------------------------"
echo "Mise en place des dépôts."
echo "deb http://fr.archive.ubuntu.com/ubuntu/ $UBUNTU main restricted universe multiverse" > /etc/apt/sources.list
echo "deb http://fr.archive.ubuntu.com/ubuntu/ $UBUNTU-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://security.ubuntu.com/ubuntu $UBUNTU-security main restricted universe multiverse" >> /etc/apt/sources.list
[ -f /etc/apt/apt.conf ] && rm /etc/apt/apt.conf

export DEBIAN_FRONTEND=noninteractive

echo " "
echo "Mise à jour de la liste des paquets..."
apt-get -qq update

echo " "
echo "Mise à jour du système..."
apt-get -y -qq dist-upgrade
apt-get -y -qq dist-upgrade
dpkg --configure -a
[ "$?" != "0" ] && echo "ERREUR de mise à jour des paquets !!!" && sleep 5 && exit 0

echo " "
echo "Mise en place de paquets par défaut..."
apt-get -y -qq install aptitude ntp smbclient libpam-krb5 krb5-user ldap-utils libsasl2-modules-gssapi-mit libnss-ldap 
 libpam-ldap cifs-utils kstart libnss-myhostname libpam-ccreds nscd

echo " "
echo "Nettoyage des paquets..."
apt-get -y -qq autoremove
dpkg --configure -a
dpkg --configure -a
dpkg --configure -a
[ "$?" != "0" ] && echo "ERREUR de configuration des paquets !!!" && sleep 5 && exit 0

apt-get clean
export DEBIAN_FRONTEND=
echo " "

# Mise en place du démon NTP.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration NTP."

cat > /etc/ntp.conf << EOF
driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
server 0.ubuntu.pool.ntp.org
server 1.ubuntu.pool.ntp.org
server 2.ubuntu.pool.ntp.org
server 3.ubuntu.pool.ntp.org
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict 127.0.0.1
restrict ::1
EOF

service ntp restart
date
echo " "

# Mise en place du démon KRB.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration KRB."

cat > /etc/krb5.conf << EOF
[appdefaults]
	pam = {
		realm = $ADDOM
		ticket_lifetime = 1d
		renew_lifetime = 1d
		forwardable = true
		proxiable = false
		retain_after_close = false
		minimum_uid = $ADMINUID
		try_first_pass = true
		ignore_root = true
	}
[libdefaults]
	default_realm = $ADDOM
	default_keytab_name = FILE:/etc/krb5.keytab
	krb4_config = /etc/krb.conf
	krb4_realms = /etc/krb.realms
	kdc_timesync = 1
	ccache_type = 4
	forwardable = true
	proxiable = false
#	default_tgs_enctypes = des3-hmac-sha1
#	default_tkt_enctypes = des3-hmac-sha1
#	permitted_enctypes = des3-hmac-sha1
	v4_instance_resolve = false
	v4_name_convert = {
		host = {
			rcmd = host
			ftp = ftp
		}
		plain = {
			something = something-else
		}
	}
	fcc-mit-ticketflags = true
[realms]
	$ADDOM = {
		kdc = $ADSERV1
EOF

if [ "$ADSERV2" != "" ]
then
  cat >> /etc/krb5.conf << EOF
		kdc = $ADSERV2
EOF
fi

cat >> /etc/krb5.conf << EOF
		admin_server = $ADSERV1
		default_domain = $ADDNS
		auth_to_local = DEFAULT
	}
[domain_realm]
	.$ADDNS = $ADDOM
	$ADDNS = $ADDOM
[login]
	krb4_convert = true
	krb4_get_tickets = false
EOF

sleep 2
echo "Vérification de la configuration Kerberos."
kinit $ADMNAME@$ADDOM << EOF
$ADMPASS
EOF

[ "$(klist | grep krbtgt)" == "" ] && echo "ERREUR impossible de récupérer un ticket Kerberos de l'AD !!!" && sleep 5 && exit 0
sleep 2
echo "Kerberos OK."
echo " "

# Mise en place du démon SAMBA.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration SAMBA."

cat > /etc/samba/smb.conf << EOF
[global]
   workgroup = $ADWKG
   netbios name = $HOSTNAME
   realm = $ADDOM
   server string = %h
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   security = ADS
   kerberos method = system keytab
   encrypt passwords = true
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Entersnews*spassword:* %nn *Retypesnews*spassword:* %nn *passwordsupdatedssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
[printers]
   comment = All Printers
   browseable = no
   path = /var/spool/samba
   printable = yes
   guest ok = no
   read only = yes
   create mask = 0700
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
EOF

echo "Création du compte AD de la machine."
net ads join -k
sleep 2

echo "Création du fichier keytab."
net ads keytab create
[ ! -f /etc/krb5.keytab ] && echo "ERREUR impossible de générer le fichier keytab !!!" && sleep 5 && exit 0
echo "Fichier keytab OK."
sleep 2

echo "Vérification de la connexion à l'AD."
kinit -V -k "$HOSTNAME$"
[ "$?" != "0" ] && echo "ERREUR de connexion !!!" && sleep 5 && exit 0
echo "Connexion AD OK."
echo " "

# Mise en place de la régénération périodique de tickets.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration CRON."

cat > /etc/crontab << EOF
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 11	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 11	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 11	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# Cnx AD MONRESEAU
2  *    * * *   root    kinit -k "$HOSTNAME$" -c /tmp/krb5cc_host ; chmod 644 /tmp/krb5cc_host
EOF

service cron restart

echo "Mise à jour du fichier rc.local ."
cat > /etc/rc.local << EOF
#!/bin/sh -e
kinit -k "$HOSTNAME$" -c /tmp/krb5cc_host
chmod 644 /tmp/krb5cc_host
# Ne pas enlever !!!
exit 0
EOF

echo "Mise à jour du renouvellement de ticket utilisateur."
cat > /usr/share/upstart/sessions/krenew.conf << EOF
description "User TGT KRB5"
author "sden"

start on starting xsession-init

respawn

exec krenew -K 60
EOF

echo " "

# Mise en place de la configuration LDAP.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration LDAP."

cat > /etc/ldap.conf << EOF
use_sasl on
sasl_auth_id $HOSTNAME$
krb5_ccname FILE:/tmp/krb5cc_host
base $ADDN
uri ldap://$ADSERV1.$DNSSEARCH ldap://$ADSERV2.$DNSSEARCH
ldap_version 3
#port 389
sizelimit 10000
#timelimit 30
timelimit 10
#bind_timelimit 30
bind_timelimit 5
network_timeout 3
tls_checkpeer no
referrals no
bind_policy soft
#idle_timelimit 3600
#pam_filter objectclass=account
#pam_login_attribute uid
#pam_lookup_policy yes
#pam_check_host_attr yes
#pam_check_service_attr yes
#pam_groupdn cn=PAM,ou=Groups,dc=padl,dc=com
#pam_member_attribute uniquemember
#pam_min_uid 0
#pam_max_uid 0
#pam_login_attribute userPrincipalName
#pam_template_login_attribute uid
#pam_template_login nobody
#pam_password_prohibit_message Please visit http://internal to change your password.
scope sub
nss_base_passwd	$ADDN?sub
nss_base_shadow	$ADDN?sub
nss_base_group	$ADDN?sub
#nss_base_hosts		ou=Hosts,dc=padl,dc=com?one
#nss_base_services	ou=Services,dc=padl,dc=com?one
#nss_base_networks	ou=Networks,dc=padl,dc=com?one
#nss_base_protocols	ou=Protocols,dc=padl,dc=com?one
#nss_base_rpc		ou=Rpc,dc=padl,dc=com?one
#nss_base_ethers	ou=Ethers,dc=padl,dc=com?one
#nss_base_netmasks	ou=Networks,dc=padl,dc=com?ne
#nss_base_bootparams	ou=Ethers,dc=padl,dc=com?one
#nss_base_aliases	ou=Aliases,dc=padl,dc=com?one
#nss_base_netgroup	ou=Netgroup,dc=padl,dc=com?one
nss_map_objectclass posixAccount User
nss_map_objectclass shadowAccount User
nss_map_objectclass posixGroup Group
nss_map_attribute uid uid
nss_map_attribute uidNumber uidNumber
nss_map_attribute gidNumber gidNumber
nss_map_attribute loginShell loginShell
nss_map_attribute gecos name
nss_map_attribute userPassword msSFU30Password
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute shadowLastChange pwdLastSet
nss_map_attribute uniqueMember msSFU30PosixMember
nss_map_attribute cn cn
pam_login_attribute msSFU30Name
pam_filter objectclass=User
pam_password ad
#ssl on
#sslpath /etc/ssl/certs
#ssl start_tls
#tls_cacertfile /etc/ssl/ca.cert
#tls_cacertdir /etc/ssl/certs
#tls_randfile /var/run/egd-pool
#tls_ciphers TLSv1
#tls_cert
#tls_key
#sasl_secprops maxssf=0
#pam_sasl_mech DIGEST-MD5
nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,colord,daemon,dirmngr,dnsmasq,festival,games,gdm,gnats,hplip,irc,kdm,kernoops,libuuid,lightdm,list,lp,mail,man,messagebus,news,ntp,proxy,pulse,root,rtkit,saned,speech-dispatcher,sync,sys,syslog,usbmux,uucp,whoopsie,www-data
EOF

cat /etc/ldap.conf > /etc/ldap/ldap.conf

echo "Test de la connexion au serveur LDAP..."
# Laisser le sudo.
[ "$(sudo ldapsearch 2>&- | wc -l)" -lt 100 ] && echo "ERREUR de connexion !!!" && sleep 5 && exit 0
echo "LDAP OK"
echo " "

# Mise en place de la configuration NSswitch.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration NSswitch."

cat > /etc/nsswitch.conf << EOF
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis
EOF

echo " "

# Mise en place de la configuration PAM.
echo "-------------------------------------------------------------------------------"
echo "Mise en place de la configuration de PAM."

cat > /etc/pam.d/common-auth << EOF
auth	[success=3 default=ignore]	pam_krb5.so minimum_uid=$ADMINUID
auth	[success=2 default=ignore]	pam_unix.so nullok_secure try_first_pass
auth	[success=1 default=ignore]	pam_ldap.so use_first_pass
auth	requisite	pam_deny.so
auth	required	pam_permit.so
auth	optional	pam_cap.so
EOF

cat > /etc/pam.d/common-account << EOF
account	[success=2 new_authtok_reqd=done default=ignore]	pam_unix.so 
account	[success=1 default=ignore]	pam_ldap.so 
account	requisite	pam_deny.so
account	required	pam_permit.so
account	required	pam_krb5.so minimum_uid=$ADMINUID
EOF

cat > /etc/pam.d/common-password << EOF
password	[success=3 default=ignore]	pam_krb5.so minimum_uid=$ADMINUID
password	[success=2 default=ignore]	pam_unix.so obscure use_authtok try_first_pass sha512
password	[success=1 user_unknown=ignore default=die]	pam_ldap.so use_authtok try_first_pass
password	requisite	pam_deny.so
password	required	pam_permit.so
password	optional	pam_gnome_keyring.so
EOF

cat > /etc/pam.d/common-session << EOF
session	[default=1]	pam_permit.so
session	requisite	pam_deny.so
session	required	pam_permit.so
session optional	pam_umask.so
session	optional	pam_krb5.so minimum_uid=$ADMINUID
session	required	pam_unix.so 
session required	pam_mkhomedir.so skel=/etc/skel/ umask=0077
session	optional	pam_ldap.so 
session	optional	pam_systemd.so 
session	optional	pam_ck_connector.so nox11
EOF

echo " "

echo "-------------------------------------------------------------------------------"
echo "Réactivation du NetworkManager."
nmcli nm enable true
echo " "

echo "-------------------------------------------------------------------------------"
echo "Script d'installation terminé normalement."
# Nettoyage
ADMNAME=""
ADMPASS=""

Une réflexion sur « Station Linux et serveur Windows »

  1. Petite correction du script final.
    Si la machine change de nom, la création du fichier keytab ne passe pas, il faut ajouter cette ligne au moment du changement de nom :
    hostname $HOSTNAME
    Et ça marche!

Les commentaires sont fermés.