Formation Evolix

Administration système & réseau & sécurité

Cron

Démon de planification de tâches

Les fichiers de cron

      
# systemctl status cron
      
      
# vim /etc/crontab
# vim /etc/default/cron
      
    
    
# vim /etc/cron.d/example
    
30 05 * * 0 www-data /usr/local/adm/savelog-weekly
    

Éditer une table

      
        $ crontab -e
        
        
        # crontab -u jdoe -e
      
0,30,45,51 * * * * /usr/local/adm/send-data
*/15 * * * * /usr/local/adm/check-nis 1>/dev/null 2>&1
00 01 * * * nice -10 find /inf -name core -exec rm -f {} \;
10 03 * * 1-6 nice -10 /usr/local/adm/sauvegarde-daily
30 05 * * 0 /usr/local/adm/savelog-weekly
30 06 1 * * /usr/local/adm/savelog-monthly
00 00 1 1 * /usr/local/bin/happy-new-year
MAILTO=alert@example.com
@daily /usr/local/bin/minuit-check
    

Documentation et consultation

      
$ man 5 crontab
      
      
$ crontab -l
      
      
# crontab -u jdoe -l
      
    

ntpd

Démon de protocole de temps réseau.
      
$ date
      
      
# apt install ntp
      
      
# vim /etc/ntp.conf :
      
server ntp.evolix.net
      
# syctemctl restart ntp
# syctemctl status ntp
      
    
      
# ntpq -p
      
      
$ timedatectl
      
      
# hwclock --show
      
      
# hwclock --systohc
      
    

systemd

Gestionnaire système et service

systemd est un gestionnaire de services

Alternative au System V, installé par défaut depuis Debian 8.

      # systemctl status
      # systemctl list-units
      # systemctl --failed
      # systemctl list-unit-files
    
  • Unités par défaut : /usr/lib/systemd/system/
  • Modifications manuelles : /etc/systemd/system/
      # systemctl start <unité>
      # systemctl stop <unité>
      # systemctl restart <unité>
      # systemctl reload <unité>
    
      # systemctl status <unité>
      # systemctl is-enabled <unité>
      # systemctl enable <unité>
      # systemctl disable <unité>
    
      # systemctl reboot
      # systemctl poweroff
      # systemd-analyze
    

Modifier une unité

      # cp -a /lib/systemd/system/<service>.service /etc/systemd/system/
      # vim /etc/systemd/system/<service>.service
      # systemctl cat ssh
      # systemctl edit <unité>
      # systemctl daemon-reload
    

Postfix

Agent de transport de courriers électroniques

Installation et configuration


# apt install postfix
    
  • process : /etc/postfix/master.cf
  • options : /etc/postfix/main.cf
  # vim main.cf
smtpd_banner = $myhostname ESMTP mail server
biff = no
append_dot_mydomain = no
myhostname = hosting.example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $myhostname
mydestination = $myhostname localhost.localdomain localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
disable_vrfy_command = yes
  
  
# date | mail -s test jdoe@example.com
# mailq
# qshape deferred
# postcat -vq < queue_id > > message.txt
# postsuper -d < queue_id >
# postsuper -d ALL
# postsuper -r < queue_id >
# postsuper -r ALL

# mailq | tail -n +2 | \
    awk 'BEGIN { RS = "" } /example\.com$/ { print $1 }' | \
    tr -d '*!' | postsuper -d -
  

syslog

Rsyslog est le démon syslog par défaut sous Debian.

Le protocole syslog gère la journalisation

Les messages sont :
  • émis par diverses applications (messages kernel, user, daemon, mail, etc.)
  • triés par facility (LOG_KERN, LOG_CRON, LOG_DAEMON, LOG_MAIL, LOG_AUTH, etc.)
  • ordonnés par severity (LOG_EMERG, LOG_ALERT, LOG_ERR, LOG_WARNING, etc.) ;
  • reçus par un démon qui les répartit dans différents fichiers situés dans le répertoire /var/log/ ou par d’autres façons (serveur syslog distant, terminal, etc.)
      # systemctl status rsyslog
      # vim /etc/rsyslog.conf
*.*;auth,authpriv.none;cron,mail,local4,local5,local7.none -/var/log/syslog
cron.*      /var/log/cron.log
#mail.info  -/var/log/mail.info
#mail.warn  -/var/log/mail.warn
#mail.err   /var/log/mail.err
local0.*    /var/log/postgresql.log
local1.*    /var/log/sympa.log
local4.*    -/var/log/openldap.log
local5.*    -/var/log/haproxy.log
local7.*    -/var/log/dhcp.log
    

Journaux principaux :

  • auth.log : authentification système (login, su, getty)
  • daemon.log : relatif aux daemons
  • mail.* : relatifs aux mails
  • kern.log : générés par le noyau
  • user.log : générés par des programmes utilisateur
  • debug : messages de debug
  • messages : messages d'infos
  • syslog : tous les messages (sauf exceptions définies)

logrotate

Le logiciel logrotate permet de gérer la rotation des journaux système et applicatif de façon précise et ordonnée.

  • Logrotate est exécuté tous les jours (cron.daily)
  • selon la fréquence choisie les journaux sont compressés et datés
  • des actions spécifiques sont possibles (relance du service, gérénation de stats…)

Exemple de configuration

    
# vim /etc/logrotate.d/dpkg
    
/var/log/dpkg.log {
        monthly
        rotate 12
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
}
    

Note : le programme "savelog" permet une rotation ultrasimple de journaux en ajoutant un suffixe et conservant 7 versions.

log2mail

Pour surveiller précisement un fichier journal et recevoir immédiatemment des alertes par mail si certains termes apparaissent dans ce fichier.

Installation, configuration et gestion

    
# apt install log2mail
    
    
# vim /etc/log2mail/config/default
    
file = /var/log/mail.log
pattern = "fatal"
mailto = admin@example.com
template = /etc/log2mail/mail
    
# /etc/init.d/log2mail restart
    
    

logcheck

Logcheck envoie par mail, les lignes inconnues (non répertoriées dans ses règles) trouvées dans certains journaux.

Installation et configuration

      
# aptitude install logcheck logcheck-database
      
      
# vim /etc/logcheck/logcheck.conf
      
REPORTLEVEL="server"
SENDMAILTO="alert@example.com"
MAILASATTACH=0
FQDN=1
TMP="/tmp"
	
Exceptions dans /etc/logcheck/ignore.d.server/
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: \[IPTABLES DROP\] : IN=eth0 OUT= MAC=.*
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: INFO: SSL Socket Shutdown.$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ ntpd\[[0-9]+\]: clock is now [[:alnum:]]+$
    

fail2ban

Exécute des actions à la détection de comportements anormaux.

Installation et commandes utiles

      
# apt install fail2ban
      
      
# fail2ban-client status
      
      
# fail2ban-client status ssh
      
    

Exemple de filtre

      
# vim /etc/fail2ban/filter.d/demo :
      
[Definition]
failregex =  warning: \[\]: authentication failed:
ignoreregex =
    

Exemple de jail

      
# vim /etc/fail2ban/jail.local
      
[demo-rule]
enabled  = true
port     = http,https
filter   = demo
logpath  = /var/log/demo.log
maxretry = 3
findtime = 1800
bantime  = 3600
    

Introduction à Git

Qu'est-ce que Git ?

Système de contrôle de versions, open-source, décentralisé, conçu pour être efficace et rapide.

Contrôle de versions

  • conserver différentes versions dans le temps
  • naviguer dans l'historique
  • gérer des branches
  • travailler en équipe

outils connus ?

  • cp-old
    cp main.c main.c.old
  • RCS, CVS, SVN
  • GIT, Mercurial, Bazar, Darcs, GNU Arch…
  • Perforce, IBM Rational, Visual SourceSafe…

Open-source

  • License GPL v2
  • Créé par Linus Torvalds pour le noyau Linux
  • multi-plateformes

Décentralisé

  • Tout est local (le plus souvent)
  • échanges possibles entre dépôts (FS ou réseau)
  • tout l'historique est disponible
  • pereine et fiable (copies autonomes et complètes)

Rapide, efficace

  • simple base de données clés/valeurs
  • écrit en C, très portable
  • adapté à toutes les tailles de projets

Concepts de base

Historique

  • métadonnées sur le commit
  • liaison(s) avec le(s) parent(s)
  • visualisation chonologique

commit, tree, blob

  • un commit pointe sur un arbre
  • chaque élément pointe sur un autre arbre
  • … ou sur un "blob" (contenu final)

les branches

  • la botte secrète de Git
  • faciles à créer, fusionner, détruire
  • éphémères ou durables
  • locales ou partagées
  • la base d'un workflow d'équipe

3 zones

  • working copy : ce que voit votre éditeur
  • staging area : préparer des commits
  • repository : la base de données interne

Utilisation

  • en ligne de commande
  • dans un outil (graphique) dédié
  • intégré aux éditeurs…

En pratique : /etc/.git

Une bonne pratique Evolix.

Installation de Git


    # apt install git
    # git --version
    git version 2.11.0
    

Initialisation du dépôt


    $ cd /etc
    $ su
    # git init
    # git status
    # git add .
    # git commit -m "commit initial"
    

Premières modifications


    # echo "127.0.0.1 foo" >> /etc/hosts
    # git status
    # git diff [HEAD]
    # git commit --all --message "Ajout de foo dans /etc/hosts"
    # git log
    # git show
    

Aller plus loin

Le livre Pro Git est incontournable,
pour le débutant comme pour l'expert.

git-scm.com/book/fr/v2

Monitoring

  • statistiques
    • nombreuses métriques locales
    • Munin, Collectd/Grafana, Beats/ELK
  • alerting
    • surveillance de services HTTP, SMTP, POP3, SQL etc. + ressources (charge processeur, utilisation des disques, etc.)
    • Nagios, Icinga, Zabbix, Monit

Sécurité

Sécurité physique

  • protection du BIOS par mot de passe
  • protection du boot loader
  • empêcher le reboot
  • clear_console
  • reporting
  • fermeture de session en cas d'inactivité

Sécurité logicielle

  • gestion des mots de passe
  • configuration sécurisée
  • veille
  • mises à jour de sécurité
  • sauvegardes
  • firewall

Réseau / iptables

Rappels réseau

  • Couche physique : Ethernet (adresses MAC)
  • Couche réseau : IPv4 (adressage, HostID, NetID, Masque, Brodcast, protocole ARP, ICMP)
  • Couche transport : TCP, UDP (notion de ports, mode connecté)
  • Couche application : HTTP, SMTP, DNS, etc.

Afficher les règles du firewall

    
# iptables -L -t filter -v
    
    
  • INPUT: les chaînes appliquées sur INPUT concerneront tout paquet à destination de localhost
  • OUTPUT: les chaînes appliquées sur OUTPUT concerneront tout paquet en provenance de localhost
  • FORWARD: le paquet n'est pas destiné à la machine locale, mais il doit être relayé sur une autre interface. Les chaînes de FORWARD ne concerneront pas les paquets à destination ou venant de la machine locale.

Exemple de règles :

  
# iptables -A INPUT -i eth1 -j ACCEPT
  

  
# iptables -A INPUT -p tcp --sport 143 --dport 1024:65535 \
    -s 31.170.8.33 -m state --state ESTABLISHED,RELATED -j ACCEPT
  
  

Analyse de minifirewall

Introduction à Ansible

Qu'est-ce qu'Ansible ?

Automatisation de configuration d'infrastructure et déploiement

Objectifs d'Ansible

  • homogénéité
  • fiabilité
  • rapidité

Parfait pour

  • tâches répétitives
  • actions urgentes
  • demandes spécifiques

Principes fondateurs

  • Idempotence
  • Pas d'agent
  • Souplesse et légèreté

Installation

Paquets pour de nombreuses distributions


# apt install ansible
# ansible --version
ansible 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Commandes de base


        $ ansible localhost --module-name ping
        $ ansible localhost --module-name ping --one-line
        $ ansible localhost --module-name setup
        $ ansible localhost --module-name setup --args "filter=ansible_mem*"
        $ ansible localhost --module-name lineinfile --args \
          "dest=/etc/hosts regexp=example.com line='192.168.0.25 example.com'"
      

Éléments de base

Modules

  • couche d'abstraction du shell
  • homogénéité
  • idempotence

Tasks / Handlers

  • invocation d'un module avec des paramètres
  • le handler n'est exécuté qu'une fois

Playbooks

  • exécution procédurale de tâches
  • définition du contexte
  • orchestration complexe

Rôles

  • comme un paquet autonome
  • contient tasks, handlers, variables, templates
  • inclus dans des playbooks
  • stockés localement ou récupérés dans un registre

Inventaire et variables

  • liste des serveurs
  • moyens d'accès
  • variables spécifiques (par hôte ou groupe)

        inventory/
        ├── group_vars
        │   ├── all.yml
        │   ├── hypervisors.yml
        │   └── proxies.yml
        ├── hosts
        ├── hosts-dev
        └── host_vars
            ├── stack01-data01.yml
            ├── stack01-front01-web01.yml
            └── stack01-front01.yml
    

        kvm01 ansible_host=192.168.2.1
        kvm02 ansible_host=192.168.2.2

        stack01-front01 ansible_host=192.168.2.1 ansible_port=22020
        stack01-front01-web01 ansible_host=192.168.2.1 ansible_port=22101
        stack01-data01 ansible_host=192.168.2.1 ansible_port=22010

        [hypervisors]
        kvm01
        kvm02

        [fronts]
        stack01-front01

        [dbs]
        stack01-data01

        [web]
        stack01-front01-web01
    

Variables

  • sources multiples (facts ou configuration)
  • règles de précédence pour personnalisation

Un playbook


        ---
        - hosts: localhost

          tasks:
          - name: example.com in /etc/hosts
            lineinfile:
              dest: /etc/hosts
              regexp: example.com
              line: '192.168.0.25 example.com'
              state: present
        
$ ansible-playbook playbook.yml

OpenSSH

Client et serveur pour connexions shell à distance.

SSH: Secure Shell

  • Client: ssh, scp, sftp
  • Serveur: ssh-add, ssh-agent, ssh-keygen, ssh-keysign, ssh-keyscan, et sftp-server

Configuration du serveur

      # vim /etc/ssh/sshd_config
Port 22
Port 2222

PermitRootLogin yes/no/without-password

AllowUsers foo bar baz

Match Address 192.0.2.1,192.0.2.2
    PasswordAuthentication yes
Match User foo,bar
    PasswordAuthentication no
      
$ ssh-keygen
$ cat .ssh/id_rsa.pub
$ vim .ssh/authorized_keys
      
    

Agent SSH

    $ ssh-agent
    $ scp   fichier-local    identité-distante@hôte-distant:chemin/fichier
    $ scp   identité-distante@hôte-distant:chemin/fichier   fichier-local
    

Sauvegardes

File-system (totales ou incrémentales)

    
    tar -cpvf
    cpio, pax
    dump/restore, partimage
    dd
    
    
    umount /file-system
    
    
    dump 0uf /dev/rst0 /file-system
    
	

LA solution magique...

    
    rsync -av --delete
    cp -al
    
    

EvoBackup :
forge.evolix.org/projetcs/evobackup

Gestion des droits

Sous les systèmes de type Unix ou Linux, il existe plusieurs types de fichiers:

  • les fichiers,
  • les répertoires,
  • les liens symboliques,
  • les fichiers-périphériques.

Un fichier appartient à un utilisateur (en fait un numéro d'utilisateur) et à un groupe (en fait un numéro de groupe).

Les 3 droits fondamentaux sont la lecture, l'écriture et l'éxecution.

Pour un fichier, ces 3 droits sont définis pour 3 catégories:

  • l'utilisateur,
  • le groupe
  • et le "reste du monde".

Pour chacune de ces catégories: on note les droits sous la forme rwx.

[s:sst] u:rwx g:rwx o:rwx

Commandes utiles/essentielles :

  • ls -l, stat, chmod, chown, chgrp
  • su, newgrp, login, who, w, w.procps

$ chmod < catégorie >+< nouveau_droit > fichier


$ chmod < nouveaux_droits > fichier

Droits pour un répertoire :

    r = lister, x = traverser, w = écrire (et même effacer !!)
    

Droits spéciaux :

  • Exécutables setuid ou setgid
  • Répertoire setgid ou stickybit

Notation décimale :


777 = ?
700 = ?
600 = ?
644 = ?
755 = ?
775 = ?
701 = ?

umask : Pour gérer droit niveau utilisateurs : commande umask Fixé dans le fichier profile ou bashrc (local ou général...)

NFS

    
    # apt install nfs-kernel-server
    
    
    # vim /etc/exports
    
    /srv/nfs 192.0.2.4(rw,root_squash,sync,no_subtree_check)
    /srv/nfs2 192.0.2.0/27(ro) 192.0.242(rw)
    
    
    # apt install nfs-common
    # mount -t nfs -o nfsvers=3 192.0.2.1:/srv/nfs /mnt
    
    

DRBD

#apt install drbd-utils

Sur une installation DRBD on définit :

  • des ressources : chaque ressource DRBD a plusieurs paramètres, notamment le second serveur vers qui envoyer/recevoir la réplication
  • des volumes : chaque ressource DRBD peut avoir un ou plusieurs volumes, chaque volume est accessible via un périphérique unique nommé /dev/drbdXX

Exemple simple d’une ressource foo avec un volume /dev/drbd42 définie dans un fichier /etc/drbd.d/foo.res entre deux serveurs nommés tic et tac :

resource "foo" {
    volume 0 {
        device minor 42;
        disk /dev/sdz1;
        meta-disk internal;
    }
    on tic {
        address 192.0.2.1:7014;
    }
    on tac {
        address 192.0.2.2:7014;
    }
}
# drbdadm -d adjust all
# drbdadm adjust all

# drbdadm dump
# drbdadm create-md [ressource]
# drbdadm attach/detach [ressource]
# drbdadm connect/disconnect [ressource]
# drbdadm adjust/adjust-with-progress [ressource]
# drbdadm primary/secondary [ressource]


$ cat /proc/drbd
# drbd-overview

Virtualisation

  • KVM/libvirt
  • Xen
  • VMware

Focus sur KVM :

# apt install qemu-kvm bridge-utils qemu-utils libvirt-bin virtinst
# apt install netcat-openbsd

# virsh list --all
# virsh start < vm-name >
# virsh shutdown < vm-name >
# virsh destroy < vm-name >
# virsh edit < vm-name >
# virsh undefine < vm-name >
# virsh define template.xml

# virt-install --connect=qemu:///system \
  --name=template \
  --cpu mode=host-passthrough --vcpus=1 \
  --ram=512 \
  --disk path=/path/template.qcow2, \
  bus=virtio,cache=none,size=42,format=qcow2 \
  --network=bridge:br0,model=virtio \
  --noautoconsole --graphics vnc,listen=127.0.0.1,keymap=fr \
  --cdrom=/home/images/debian-8.6.0-amd64-netinst.iso

Conteneur

LXC


# apt install lxc bridge-utils debootstrap
# lxc-create -t debian -n foo
# lxc-start -n foo -d
# lxc-attach -n foo
# lxc-stop -n foo
# lxc-info -n foo
# lxc-console -n foo
# lxc-halt -n foo
# lxc-destroy -n foo

Conteneur

Docker


# apt install docker-engine
$ docker ps [options]
$ docker run [options] IMAGE [commande]
$ docker stop|kill [options] CONTENEUR
$ docker rm [options] CONTENEUR
$ docker rmi [options] IMAGE
$ docker exec [options] CONTENEUR COMMANDE

Authentification

/etc/passwd

Historiquement sous Unix, l'authentification est gérée par une liste des utilisateurs avec les mots de passe chiffrés accessible à tous, à savoir le fameux fichier /etc/passwd accessible en lecture et la commande passwd « set-uid root »

/etc/shadow recommandé

Le mot de passe chiffré est dans le fichier /etc/shadow inaccessible en lecture. Commande pour activer/désactiver l'authentification shadow :
      
# shadowconfig on/off
      
    

Groupes UNIX

Les groupes d'un système sont dans le fichier /etc/group

Gestion des utilisateurs

Utilitaires basiques : paquet Debian "passwd"

useradd, groupadd, userdel, groupdel, usermod, groupmod, chsh, chfn

Gestion des utilisateurs

Utilitaires convivaux : paquet Debian "adduser"

adduser, addgroup, deluser et delgroup
Ils tiennent sont configurables via /etc/adduser.conf :
DSHELL=/bin/bash
DHOME=/home
SKEL=/etc/skel
QUOTAUSER="forquota"
DIR_MODE=0750

« Profil » pour un utilisateur créé

Il se trouve dans le répertoire /etc/skel/
Les utilisateurs
  • sont identifiés par leur nom de compte
  • appartiennent à un groupe primaire (voir /etc/passwd)
  • peuvent appartenir à des groupes secondaires (voir /etc/group)
      jdoe@serveur:~$ whoami
jdoe
      jdoe@serveur:~$ groups
jdoe dialout cdrom audio video plugdev
      jdoe@serveur:~$ id
uid=1000(jdoe) gid=1000(jdoe) groupes=20(dialout),24(cdrom),29(audio),44(video)
    

Restriction de login

      # vim /etc/login.defs
FAIL_DELAY 10 \ delai minimum entre deux tentatives de login
FAILLOG_ENAB  yes \ journaliser les tentatives ratées
LOG_UNKFAIL_ENAB yes \ retenir les identifiants iconnus essayés
LOG_OK_LOGINS yes \ retenir les tentatives réussies
LOGIN_TIMEOUT  60 \ delai maximim pour authentification
CHFN_RESTRICT rwh \ restriction pour la commande chfn
    
Complété par… Linux-PAM (à suivre)

/etc/shadow

Contient les infos sécurisées, notamment le mot de passe, mais également des paramètres d'expiration.
# vipw -s
foo:$1$mYploS2J$uSouKZPBjUF6D094HPgGj/:13853:0:99999:7:::
    

Politique de gestion des mots de passe

  • Mot de passe aléatoire ou quasi-aléatoire
  • Trace écrite bannie
  • Empêcher mot de passe trop simple pour les utilisateurs: librairie cracklib
  • Programme de génération de mot de passe: otp, apg, makepasswd, pwgen
  • Programme pour cracker les mots de passe: John the Ripper

Qui est root ?

  • UID=0
  • su, su -, su -c

sudo

  • Droits délégués (administration partagée, utilisation de scripts, etc.)
  • Éditer les droits : commande visudo
  • sudo -u, sudo sh -c,
# apt install sudo

Configuration

# visudo
jdoe ALL = ALL
jdoe ALL = NOPASSWD: ALL
jdoe ALL = /usr/sbin/tcpdump
jdoe ALL = (foo) /bin/kill
jdoe ALL = (ALL) sudoedit /etc/hosts
    
Pour lister les droits :
# sudo -l

Système de gestion des utilisateurs

!=

Système d'authentification des utilisateurs

  • Les UID et GID peuvent exister sans entrée dans /etc/password
  • Correspondances UID<->login, GID<->group faites par libnss (Name Services Switch)
  • Idem pour les noms de services, protocoles, machines (DNS)
# vim /etc/nsswitch.conf
passwd:         compat
group:          compat
shadow:         compat
hosts:          files dns

Pluggable Authentication Module – PAM

  • Système de gestion très modulaire
  • Abstraction transparente des système d'authentification
  • Utilisable directement par les applications

Modules PAM

  • NIS
  • LDAP
  • Kerberos

Ils deviennent interchangeables sans reconfiguration ou recompilation des services.

  • Configuration : /etc/pam.d/
  • Comportement par défaut : /etc/pam.d/other
  • Syntaxe : "type niveau module arguments"
  • /etc/security/access.conf : permissions de login
  • /etc/security/limits.conf : limites diverses

Syntaxe des fichiers : "type"

  • auth : authentification
  • account : vérification des types de services autorisés
  • session : tâches à effectuer avant/après l'accès
  • password : mécanismes d'authentification

Syntaxe des fichiers : "niveau"

  • required : le succès à cette étape est nécessaire
  • requisite : le succès est nécessaire et l'accès est refusé en cas d'erreur
  • sufficient : le succès à cette étape suffit
  • optional : l'accès pourra etre refusé en fonction d'autres paramètres

Exemple /etc/pam.d/login

# Authenticate the user
auth       required   pam_unix.so
# Ensure users account and password are still active
account    required   pam_unix.so
# Change the users password, but at first check the strength
# with pam_cracklib(8)
password   required   pam_cracklib.so retry=3 minlen=6 difok=3
password   required   pam_unix.so use_authtok nullok md5
session    required   pam_unix.so