FTPS, Active Directory et …

Partie 0 : Brève explication

Avant d’entrer dans le vif du sujet, nous devrons tout d’abord intégrer notre machine (ici Debian 6.0.3) dans l’Active Directory afin que les utilisateurs de celui-ci puissent également accéder au FTPS qui sera mis en place.

Le domaine sera : test.local

Le contrôleur de domaine : ldap.test.local

Le contrôleur intègre un serveur DNS.

Partie 1 : Intégration AD

Nous partirons du principe que notre Active directory est déjà présent et qu’il tourne parfaitement sur notre machine Windows 2008 R2.

Les paquets à installer sont les suivants : libkrb53 krb5-config krb5-user samba winbind ntpdate ntp

Etant donné que nous utiliserons le protocole Kerberos, nous devons nous assurer d’avoir une parfaite synchronisation des horloges systèmes.

# ntpdate ldap.test.local

Passons maintenant au fichier /etc/krb5.conf (il ne faut rien mettre d’autre dans ce fichier):

[logging]
default = FILE:/var/log/krb5.log

[libdefaults]
ticket_lifetime = 24000
clock_skew = 300
dns_lookup_realm = false
dns_lookup_kdc = true

[realms]
TEST.LOCAL = {
kdc = ldap.test.local:88
admin_server = ldap.test.local
default_domain = TEST.LOCAL
}

[domain_realm]
.test.local = TEST.LOCAL
test.local = TEST.LOCAL

Nous allons ouvrir un ticket kerberos avec ce compte en tapant la commande :

# kinit Administrator@TEST.LOCAL

La console affiche ce message : Password for Administrator@TEST.LOCAL:
On entre alors le password et si la console nous rend la main sans message d’erreur on peut s’assurer du succès de l’ouverture du ticket en tapant:

 # klist

La console nous renvoie alors : Ticket cache: FILE:/tmp/krb5cc_0Default principal: Administrator@TEST.LOCAL avec la date de création et d’expiration.

Il faut maintenant se rendre dans le fichier de configuration de Samba.

Samba va permettre de faire communiquer une machine Windows et avec une machine Unix, Winbind permet de récupérer les utilisateurs et les groupes du  domaine Windows.

# nano /etc/samba/smb.conf

On y copie EXACTEMENT les lignes suivantes :

  [global]
  security = ads
  realm = TEST.LOCAL
  password server = 172.16.10.1
  # note that workgroup is the \'short\' domain name
  workgroup = test
  winbind separator = /
  idmap uid = 10000-20000
  idmap gid = 10000-20000
  winbind enum users = yes
  winbind enum groups = yes
  template homedir = /home/%D/%U
  template shell = /bin/bash
  client use spnego = yes
  client ntlmv2 auth = yes
  encrypt passwords = yes
  winbind use default domain = yes
  restrict anonymous = 2
  # to avoid the workstation from
  # trying to become a master browser
  # on your windows network add the
  # following lines
  domain master = no
  local master = no
  preferred master = no
  os level = 0

Maintenant que nous avons modifié le fichier, un redémarrage des différents services est nécessaire :

  # /etc/init.d/samba stop
  # /etc/init.d/winbind stop
  # /etc/init.d/samba start
  # /etc/init.d/winbind start

Il faut maintenant que nous configurions le système d’authentification.

    • Rendons nous dans le fichier /etc/nsswitch.conf et ajoutons les lignes suivantes :
  # nano /etc/nsswitch.conf
  # Example configuration of GNU Name Service Switch functionality.
  # If you have the `glibc-doc-reference' and `info' packages installed, try:
  # `info libc "Name Service Switch"' for information about this file.
  passwd:         compat winbind
  group:          compat winbind
  shadow:         compat
  hosts:          files dns
  networks:       files
  protocols:      db files
  services:       db files
  ethers:         db files
  rpc:            db files
  netgroup:       nis
  bootparams:     files
  automount:      files
  aliases:        mount
    • Dans le fichier /etc/pam.d/common-account, nous devons rajouter la ligne suivante :
account sufficient      pam_winbind.so

C’est-à-dire qu’au final, le fichier doit contenir ces 2 lignes :

account sufficient      pam_winbind.so
account sufficient      pam_unix.so
    • Modifions maintenant le fichier /etc/pam.d/common-auth :
auth sufficient pam_winbind.so krb5_auth krb5_ccache_type=FILE
auth sufficient pam_unix.so nullok_secure use_first_pass
auth required pam_deny.so
    • Dernier fichier à modifier, /etc/pam.d/common-session :
session required pam_unix.so
session required pam_mkhomedir.so umask=0022 skel=/etc/skel

Nous allons à présent modifier les fichiers /etc/hostname, /etc/hosts et /etc/resolv.conf. Commençons par le premier :

     # nano /etc/hostname

On ajoute dans ce fichier le nom de la machine suivi du suffixe :

ftps.test.local

Dans le fichier /etc/hosts, on rassemble l’ensemble des noms pouvant être utilisés pour identifier la machine :

127.0.0.1 localhost
127.0.0.1 ftps.test.local ftps
172.16.10.1 ldap.test.local ldap
172.16.10.42 ftps.test.local ftps

Dans /etc/resolv.conf :

nameserver 172.16.10.1

Nous allons à présent intégrer notre Debian au domaine, pour cela on utilise la commande suivante :

# net ads join -S LDAP.TEST.LOCAL -U Administrator

Le mot de passe nous est demandé, on le rentre. On obtient ceci en réponse : 

Using short domain name – TEST
Joined 'ftps to realm 'TEST.LOCAL’

On peut tester que nous avons bien rejoint le domaine :

# wbinfo –u (liste des utilisateurs du domaine)
# wbinfo –g (liste des groupes du domaine)
# getent passwd (renvoi l’ensemble des utilisateurs utilisables)
# getent group (renvoi l’ensemble des groupes utilisables)

Partie 2 : FTPS

Pour une question d’affinité, j’ai décidé de travailer avec vsftpd.

vsFTPd, forme raccourcie de Very Secure FTP Daemon, est un serveur FTP libre simple et sécurisé.

Il a été développé dans l’optique de la meilleure sécurité possible afin de combler les failles des serveurs FTP classiques. Il bénéficie de toutes les options habituelles des serveurs FTP classiques (proFTPd, Pure-FTPd,…) et prend en charge l’IPv6 ainsi que SSL.

Afin d’installer vsftpd, nous allons utiliser le célèbre apt-get install :

# apt-get install vsftpd

On se rend maintenant dans le fichier de configuration :

# nano /etc/vsftpd.conf

On supprime l’entièreté du fichier et on copie :

#### GENERAL CONFIGURATION ####
listen=YES
connect_from_port_20=YES
pam_service_name=vsftpd
#ftpd_banner=Bienvenue sur le serveur ftp.
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd.banned_emails
use_localtime=YES
#dirlist_enable=NO
idle_session_timeout=600
data_connection_timeout=12

#### RIGHTS CONFIGURATION #####
local_enable=YES
write_enable=YES
anonymous_enable=NO
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
chroot_local_user=YES
chroot_list_file=/etc/vsftpd/user_list
local_umask=077
#chown_uploads=YES
#chown_username=whoever
secure_chroot_dir=/var/run/vsftpd/empty
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
#ls_recurse_enable=YES
setproctitle_enable=YES

#### VIRTUAL USER CONFIGURATION #####
virtual_use_local_privs=YES
user_sub_token=$USER
local_root=/home/TEST/$USER
hide_ids=YES # SUPER IMPORTANT
#########

##### SECURE CONFIGURATION #####
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=YES
# require_ssl_reuse=NO # Certains clients FTP necessitent cette ligne
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
rsa_cert_file=/etc/ssl/private/vsftpd.cert.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key.pem
pasv_enable=YES
pasv_promiscuous=NO
pasv_min_port=40000
pasv_max_port=40100pasv_address=127.0.0.1
#ou domaine.com avec pasv_addr_resolve=YES
port_promiscuous=NO
#rsa_cert_file=/etc/ssl/private/vsftpd.pem
###########

Il faut maintenant sécuriser le protocole (car de base, il ne l’est pas). On va alors créer un certificat :

# apt-get install openssl
# openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem

Il nous est alors demandé de renseigner plusieurs champs, le plus important : Common Name (eg, YOUR name) []

On copie le fichier généré dans le répertoire /etc/ssl/certs/ :

# cp vsftpd.pem /etc/ssl/certs

On sécurise le certificat :

# chown root:root /etc/ssl/certs/vsftpd.pem
# chmod 600 /etc/ssl/certs/vsftpd.pem

Nous ajoutons les lignes suivantes dans notre fichier de configuration (déjà présente dans le fichier du dessus) :

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=YES
 
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES

On redémarre le service :

# /etc/init.d/vsftpd restart

Partie 3 : Répertoire personnel

Un problème se pose, pour que l’utilisateur de l’Active Directory ait un répertoire personnel créé automatique, il faut normalement se connecter avec celui-ci sur la Debian, nous ne pouvons procéder ainsi.

La solution trouvée est de créer un script qui va vérifier l’existence ou nom pour chaque utilisateur du domaine d’un répertoire personnel, si le répertoire n’existe pas il sera créé.

# nano script.sh

On rajoute :

#!/bin/sh
 for user in $( wbinfo -u );
 do
         if [ ! -d /home/TEST/$user ]
         then
                 /bin/mkdir /home/TEST/$user
                 /bin/chown -R $user:"domain users" /home/TEST/$user
         fi
 done
 /etc/init.d/winbind restart

On sauvegarde et on rend exécutable le script :

# chmod +x (777) script.sh

Maintenant, nous devons faire en sorte que ce script soit automatisé toutes les minutes :

# nano /etc/crontab

On y ajoute :

*/1 * * * * root   /root/script.sh

On redémarre le service avec un petit /etc/init.d/cron restart

Partie 4 : Bloquer SSH

Pour une question de sécurité, seul root sera autorisé à utiliser ssh. Nous allons rajouter une ligne dans le fichier /etc/ssh/sshd_config :

AllowUsers root

Partie 5 : Clé publique / Clé privée

Dans PuTTYGen, nous cliquons sur « Generate » puis on remue la souris dans l’encadré rouge afin de générer la clé.

On copie alors la clé publique et on la colle dans le fichier .ssh/authorized_key

# mkdir –p .ssh
# nano .ssh/authorized_keys

On clique ensuite sur “save private key”, nous répondons “oui” à la question « Are you sure you want to save this key without a passphrase to protect it ». On choisit alors un emplacement ou sauver la clé.

Dans PuTTY, on va dans “Connection” puis “Data”, on renseigne le champ « Auto-login username »

Dans « Connection » à « SSH » à « Auth », on clique sur « browse » et on va rechercher la clé privée.

Et pour une question de meilleure lisibilité, on peut se rendre dans « Window » puis « Translation » et choisir «UTF-8»

Pour terminer, on retourne dans « Session », on ajoute l’adresse IP (ou l’Host Name). On donne un nom à la session dans « Saved Sessions », on sauvegarde et on clique sur « Open ».

Partie 6: Client FTP

Le client FTP utilisé ici sera FileZilla. Quelques petites modifications sont à faire afin qu’il fonctionne correctement.

On clique sur « Ouvrir le gestionnaire des sites »

On crée un nouveau site et on y ajoute les champs suivants :

ftp 2ftp

L’identifiant et le mot de passe correspondent à un utilisateur de l’Active Directory.