OpenLDAP, TLS, SAMBA, CA Server

Objectif

Note: Les étapes ci-dessous ne sont pas complètent à 100%, vous devez avoir une base avant de vous lancer à suivre les étapes. Je recommande que vous preniez connaissance de chaque technologie/logiciel avant de commencer.

Ce projet est un prototype pour mettre en place un serveur LDAP sécurisé en utilisant OpenLDAP.
L'objectif est d'utiliser LDAP pour authentifier les usagers sur les machines linux et de même pour le service Samba.

Le partage de fichier utilisé est Samba et NFS.

Pour la sécurité, on a besoin de CA serveur local pour créer les certificats.

Le tout utilise Docker pour OpenLDAP et le reste est installer directement sur la machine.

Étape 1 - Création du CA Server

Remplissez tous les champs demandé en utilisant vos informations.
Fournissez une passphrase sécuritaire lors de la création de votre CA Certificate (Étape 1.1).

Étape 1.1 - Création du CA certificate

openssl genrsa -des3 -out CAcert.key 2048

Étape 1.2 - Création du Root Certificate

openssl req -x509 -new -nodes -key CAcert.key -sha256 -days 1825 -out rootCA.pem

Étape 1.3 - Création des certificats Requis pour le prototype

Certificat 1 - ldap

openssl genrsa -out ldap.key 2048
openssl req -new -key ldap.key -out ldap.csr
nano ldap.ext
# Ajouter ceci:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = openldap.example.local

Création du certificat:

openssl x509 -req -in ldap.csr -CA rootCA.pem -CAkey CAcert.key -CAcreateserial -out ldap.crt -days 1825 -sha256 -extfile ldap.ext

Certificat 2 - PHPldapadmin

openssl genrsa -out phpldapadmin.key 2048
openssl req -new -key phpldapadmin.key -out phpldapadmin.csr
nano phpldapadmin.ext
# Ajouter ceci:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = ldap.example.local

Création du certificat:

openssl x509 -req -in phpldapadmin.csr -CA rootCA.pem -CAkey CAcert.key -CAcreateserial -out phpldapadmin.crt -days 1825 -sha256 -extfile phpldapadmin.ext

Étape 1.4 - Installation du Root certificat sur un client

Étape 1.4.1 - Linux

Source: https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate

sudo mkdir /usr/share/ca-certificates/example.local
sudo openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
sudo cp rootCA.crt /usr/share/ca-certificates/example.local/
sudo dpkg-reconfigure ca-certificates

Étape 1.4.2 - Windows

Source: https://superuser.com/questions/1031444/importing-pem-certificates-on-windows-7-on-the-command-line

  1. Utiliser Winscp ou autre pour copier le fichier rootCA.crt du CA serveur.
  2. Ouvrir une console en mode administrateur.
  3. Entrer cette commande avec le fichier rootCA.crt
    1. certutil –addstore -enterprise –f "Root" <pathtocertificatefile>

À partir de maintenant, dans un web browser, il devrait y avoir un crochet Vert et aucune erreur de certificat.

Étape 2 - Création du conteneur OpenLDAP

Installation de docker et de docker-compose:

apt-get update

apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

apt-get update

apt-get install -y docker-ce=17.03.2~ce-0~ubuntu-xenial

groupadd docker

usermod -aG docker myUSER

chown myUSER:myUSER /home/myUSER/.docker -R
chmod g+rwx "/home/myUSER/.docker" -R

systemctl enable docker

curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

Création du fichier docker-compose.yml

Notes:

  • les volumes doivent refléter votre environnement.
  • Où on voit example et PASSWORD, ceci doit être remplacer par vos informations.
  • Vous devez configurer le DNS et les certificats pour pointer
    • openldap.example.local : OpenLDAP
    • ldap.example.local : PHPldapAdmin
version: '3'
services:
  openldap:
    image: osixia/openldap:latest
    container_name: openldap
    restart: always
    environment:
      LDAP_LOG_LEVEL: "256"
      LDAP_ORGANISATION: "Example Corp."
      LDAP_DOMAIN: "example.local"
      LDAP_ADMIN_PASSWORD: "PASSWORD"
      LDAP_CONFIG_PASSWORD: "PASSWORD"
      LDAP_RFC2307BIS_SCHEMA: "false"
      LDAP_BACKEND: "mdb"
      LDAP_TLS: "true"
      LDAP_TLS_CRT_FILENAME: "ldap.crt"
      LDAP_TLS_KEY_FILENAME: "ldap.key"
      LDAP_TLS_CA_CRT_FILENAME: "ca.crt"
      LDAP_TLS_ENFORCE: "true"
      LDAP_TLS_CIPHER_SUITE: "NORMAL"
      LDAP_TLS_PROTOCOL_MIN: "3.1"
      LDAP_TLS_VERIFY_CLIENT: "allow"
    tty: true
    stdin_open: true
    privileged: true
    command: --loglevel trace --copy-service
    volumes:
      - /srv/Kubernetes/OpenLDAP/database:/var/lib/ldap
      - /srv/Kubernetes/OpenLDAP/config:/etc/ldap/slapd.d
      - /srv/Kubernetes/OpenLDAP/certs/ldap:/container/service/slapd/assets/certs/
    ports:
      - "389:389"
      - "636:636"
  phpldapadmin:
    image: osixia/phpldapadmin:latest
    container_name: phpldapadmin
    hostname: ldap.example.local
    domainname: example.local
    volumes:
      - /srv/Kubernetes/OpenLDAP/certs/phpldapadmin/:/container/service/phpldapadmin/assets/apache2/certs
      - /srv/Kubernetes/OpenLDAP/certs/phpldapadmin/ldap/:/container/service/ldap-client/assets/certs
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: "#PYTHON2BASH:[{'openldap.example.local': [{'server': [{'tls': True}]},{'login': [{'bind_id': 'cn=admin,dc=example,dc=local'}]}]}]"
      PHPLDAPADMIN_HTTPS: "true"
      PHPLDAPADMIN_HTTPS_CRT_FILENAME: "phpldapadmin.crt"
      PHPLDAPADMIN_HTTPS_KEY_FILENAME: "phpldapadmin.key"
      PHPLDAPADMIN_HTTPS_CA_CRT_FILENAME: "ca.crt" # root certificate"
      PHPLDAPADMIN_LDAP_CLIENT_TLS: "true"
      PHPLDAPADMIN_LDAP_CLIENT_TLS_REQCERT: "allow"
      PHPLDAPADMIN_LDAP_CLIENT_TLS_CA_CRT_FILENAME: "ca.crt"
      PHPLDAPADMIN_LDAP_CLIENT_TLS_CRT_FILENAME: "ldap.crt"
      PHPLDAPADMIN_LDAP_CLIENT_TLS_KEY_FILENAME: "ldap.key"
    ports:
      - "443:443"
    restart: "always"
    depends_on:
      - openldap

 

Étape 2.1 - Configuration du conteneur

Pour lancer le conteneur,

docker-compose up

Si tout va bien vous pouvez continuer.

Étape 2.2 - Installation de l'outil de management sur Windows

Vous pouvez aussi utiliser phpldapadmin pour configurer votre serveur.

Télécharger le logiciel qui suit : http://www.ldapadmin.org

Puis ajouter votre connexion et vous serez ensuite directement redirigé sur la page de configuration.

Étape 2.3 - Test

À partir de l'outil vous devez être capable de vous connecter et de créer un OU par exemple,

dc=example,dc=local [openldap.example.local]
  OU=computers
  OU=Groups
  OU=Users
  cn=admin
  sambaDomainName=EXAMPLE.LOCAL

Étape 3 - Intégration d'un client sur le serveur LDAP

Étape 3.1 - Linux

Ce lien couvre plusieurs distributions: https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/configure-ldap-client-on-ubuntu-16-04-debian-8.html

Sinon en résumé:

sudo apt-get update
sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd

Veuillez remplir les champs comme suit (En utilisant vos informations)

  1. LDAP Server Uniform Resource Identifier: ldaps://[Votre-nom-de-domaine-utilise-pour-le-certificat]
  2. Distinguished name of the search base: dc=example,dc=local
  3. LDAP Version : 3
  4. Make local root database admin: YES
  5. Does the LDAP database require login: YES
  6. LDAP account for root: cn=admin,dc=example,dc=local
  7. LDAP root account password : ***********

Ajout de l'authentification sur le client:

sudo vi /etc/nsswitch.conf
# Changer les lignes comme suit:
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

# Pour créer automatiquement les répertoire des nouveaux users:

sudo vi /etc/pam.d/common-session
session required        pam_mkhomedir.so skel=/etc/skel umask=077

sudo service nscd restart

Tester si la connexion est bien établie.

getent passwd [un-username-qui-est-dans-ldap]

# Si une ligne apparait qui ressemble à:
tgingras:x:1000:1000:...
# Alors le LDAP est bien connecté

Étape 4 - Samba

Source: https://help.ubuntu.com/lts/serverguide/samba-ldap.html.en
Source: https://www.ibm.com/developerworks/linux/tutorials/l-ldapsamba/index.html

Étape 4.1 - Installation de Samba

sudo apt-get install -y samba samba-client

Étape 4.2 - Intégration de LDAP avec Samba

nano /etc/samba/smb.conf

Ajoutez/Changez le contenu du ficheir pour:

[global]
workgroup = EXAMPLE.LOCAL
netbios name = example
server string = example
passdb backend = ldapsam:ldap://openldap.example.local/
log level = 5
log file = /var/log/samba/log.%m
max log size = 1000
time server = Yes
add user script = /var/lib/samba/sbin/smbldap-useradd -a '%u'
delete user script = /var/lib/samba/sbin/smbldap-userdel '%u'
add group script = /var/lib/samba/sbin/smbldap-groupadd -p '%g'
delete group script = /var/lib/samba/sbin/smbldap-groupdel '%g'
add user to group script = /var/lib/samba/sbin/smbldap-groupmod -m '%u''%g'
delete user from group script = /var/lib/samba/sbin/smbldap-groupmod -x '%u' '%g'
set primary group script = /var/lib/samba/sbin/smbldap-usermod -g '%g' '%u'
add machine script = /var/lib/samba/sbin/smbldap-useradd -w '%u'
logon path =
logon home =
logon drive = H:
domain logons = Yes
preferred master = Yes
domain master = Yes
wins support = Yes
ldap admin dn = cn=admin,dc=example,dc=local
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Computers
ldap passwd sync = Yes
ldap suffix = dc=example,dc=local
ldap user suffix = ou=Users
idmap backend = ldap:ldaps://openldap.example.local
idmap uid = 10000-20000
idmap gid = 10000-20000

[netlogon]
        path = /var/lib/samba/netlogon/scripts
        browseable = No
        root preexec = /var/lib/samba/netlogon/scripts/logon.pl %U %I

[Partage]
        path = /srv/Mon-partage
        browseable = Yes
        writable = Yes
        create mode = 0770
        comment = Partage
        guest ok = No

Pour créer un mot de passe Samba à l'administrateur:

smbpasswd -w [admin-password]

Création de l'arborescence des dossiers:

mkdir -p /var/lib/samba/netlogon/scripts/ /var/lib/samba/printing/
chmod -R 755 /var/lib/samba/netlogon /var/lib/samba/printing

cd /var/lib/samba/netlogon/
touch logon.pl
chmod 755 /var/lib/samba/netlogon/logon.pl

nano logon.pl
# ajouter ceci dans le fichier 
#!/usr/bin/perl
use strict;
# Set the permissions on any file we create to 640 (i.e. -rw-r--r--)
umask(022);
 
my $NETLOGON_DIR = "/var/lib/samba/netlogon/scripts";
my $LOG_DIR = "/var/log/samba";
my $SERVERNAME = "linus";
## You will need to modify this hash to match your mountpoints.
my %MOUNTPOINTS = (
                "engineering" => "NET USE W: \\\\$SERVERNAME\\engineering \/YES\r\n",
                "marketing" => "NET USE W: \\\\$SERVERNAME\\marketing \/YES\r\n",
                "management" => "NET USE W: \\\\$SERVERNAME\\management \/YES\r\n"
                );
 
## Make sure that there is a user name and that it contains a valid
## user name string (i.e. no invalid chars).
if ($#ARGV != 1 ||
    $ARGV[0] =~ /[^a-zA-Z0-9-_]/) {
    exit(1);
}
 
# Make sure that the user exists and log attempts with invalid IDs
my $uid = getpwnam($ARGV[0]);
if ($uid == /[^0-9]/){
    my $now = localtime;
    open LOG, ">>$LOG_DIR/log.netlogon";
    print LOG "$now";
    print LOG " - Error: Unknown user $ARGV[0] logged into $SERVERNAME from $ARGV[1]\n";
    close LOG;
    exit(1);
}
# Log the logon attempt
my $now = localtime;
open LOG, ">>$LOG_DIR/log.netlogon";
print LOG "$now";
print LOG " - User $ARGV[0] logged into $SERVERNAME from $ARGV[1]\n";
close LOG;
 
 
## Create a custom logon batch file.
open FH, ">$NETLOGON_DIR/$ARGV[0].cmd";
 
# Turn echo off
print FH "\@ECHO OFF\r\n";
 
# Synchronize time between Windows client and Linux server.
print FH "NET TIME \\\\$SERVERNAME \/SET \/YES\r\n";
 
foreach my $key (keys(%MOUNTPOINTS)) {
    if (isMember($ARGV[0], $key)) {
       # Put mount points in file
       print FH "$MOUNTPOINTS{$key}";
    }
}
close FH;
 
 
# Checks to see if the given user is a member of
# the given group.
# Returns 1 if true and 0 otherwise.
sub isMember{
    my ($user, $group) = @_;
    my ($name, $passwd, $gid, $members) = getgrnam($group);
    my @members = split /\s+/, $members;
 
    for(@members){
       if ($user eq $_) {
          return 1;
       }
    }
    return 0;
}


Démarrer le service Samba

sudo /etc/init.d/samba start

Étape 4.3 - Test à partir d'une machine Windows

En entrant l'adresse du serveur dans un explorateur de fichier : \\example.local,

le server Samba devrait vous demander un nom d'utilisateur/mot de passe (Précédemment créé)

Ensuite, vous devriez vous le dossier partage.

Étape 5 - Améliorations

  • Ajouter un ordinateur au domaine.
  • Ajouter de l'automatisation lors de la création des certificats.
  • Création d'un script pour l'ajout d'un usager au LDAP.
  • Rendre le tout redondant.
  • Ajouter les sauvegardes à la solution.
  • Intégrer LibreNMS pour le monitoring.
  • Intégrer Elastic search pour le logging.
  • Automatiser tout le déploiement avec Ansible.

Sources

  • https://wiki.samba.org/index.php/Samba_%26_LDAP
  • https://wiki.samba.org/index.php/Samba4/LDAP_Backend

 

Laisser un commentaire