LSaddon_openvpn
Cet LSaddon fournit une solution complète pour gérer l'authentification par certificat SSL à une instance OpenVPN. Il permet notamment la gestion d'une autorité de certification simple pour délivrer des certificats pour les accès des utilisateurs. Chaque utilisateur est un objet de l'annuaire et un schéma LDAP est fourni pour permettre le stockage des certificats et clés associés à chaque utilisateur.
L'addon fournit également une vue permettant de gérer ses propres certificats ou ceux d'un autre utilisateur (pour les administrateurs) ainsi qu'un ensemble de commandes CLI pour faire la même chose. Il est également possible d'y télécharger un fichier de configuration pour OpenVPN pour chaque appareil (fichier tout-en-un, incluant les clés et certificats nécessaires).
Pour finir, l'addon fournit une vue d'état d'OpenVPN utilisant son interface de management pour afficher les clients connectés et permettre d'en déconnecter/reconnecter un au besoin.
Note
Le schéma LDAP ci-dessous est fournis à titre d'exemple mais aussi de solution prête à l'emploi pour le fonctionnement de cet addon. Il fournit deux classes d'objet auxiliaire :
-
lsOpenvpnCaSerialNumberPool: classe de l'objet LDAP utilisé pour stocker le prochain numéro de série disponible pour les certificats émis par l'autorité de certification (cf.OPENVPN_POOL_SERIAL_NUMBER_OBJECT_DNetOPENVPN_POOL_SERIAL_NUMBER_OBJECT_ATTR) -
lsOpenvpnClient: classe des objets LDAP clients d'OpenVPN permettant le stockage de leurs clés & certificats (cf.OPENVPN_CLIENT_OBJECT_CLASS,OPENVPN_CLIENT_CERT_ATTR&OPENVPN_CLIENT_KEY_ATTR)
dn: cn=lsOpenvpnAddon,cn=schema,cn=config
cn: lsOpenvpnAddon
objectclass: olcSchemaConfig
objectclass: top
olcobjectidentifier: {1}LsRoot 1.3.6.1.4.1.10650.10000.2
olcobjectidentifier: {2}LsOpenvpnAddon LsRoot:1000
olcobjectidentifier: {3}LsOpenvpnAddonAttribute LsOpenvpnAddon:1
olcobjectidentifier: {4}LsOpenvpnAddonObjectClass LsOpenvpnAddon:2
olcattributetypes: {0}( LsOpenvpnAddonAttribute:0 NAME 'lsOpenvpnCaNextSerialNumber' DESC 'Next available certificate serial number of the OpenVPN CA' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcattributetypes: {1}( LsOpenvpnAddonAttribute:1 NAME 'lsOpenvpnCertificate' DESC 'OpenVPN client certificate' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )
olcattributetypes: {2}( LsOpenvpnAddonAttribute:2 NAME 'lsOpenvpnEncryptedPrivateKey' DESC 'OpenVPN client encrypted private key' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcobjectclasses: {0}( LsOpenvpnAddonObjectClass:0 NAME 'lsOpenvpnCaSerialNumberPool' DESC 'Objectclass of the object used to store the next available certificate serial number of the OpenVPN CA' AUXILIARY MUST lsOpenvpnCaNextSerialNumber )
olcobjectclasses: {1}( LsOpenvpnAddonObjectClass:1 NAME 'lsOpenvpnClient' DESC 'Objectclass of a OpenVPN CA client' AUXILIARY MAY ( lsOpenvpnCertificate $ lsOpenvpnEncryptedPrivateKey ))
Configuration
La configuration de l'addon se passe dans le fichier config.LSaddons.openvpn.php :
// OpenVPN CA directory path (used to store root key & certificate)
define("OPENVPN_CA_PATH", "/etc/openvpn/ldap");
// OpenVPN CA root key path
define("OPENVPN_CA_KEY_PATH", OPENVPN_CA_PATH . "/ca.key");
// OpenVPN CA root certificate path
define("OPENVPN_CA_CERT_PATH", OPENVPN_CA_PATH . "/ca.crt");
// OpenVPN TA key path
define("OPENVPN_TA_KEY_PATH", OPENVPN_CA_PATH . "/ta.key");
// OpenVPN CA root key passphrase
define("OPENVPN_PASSPHRASE", "CHANGEME");
// OpenVPN CA LDAP object DN used to store next available certificate serial number
// Optional, default: LDAP server base DN.
// Note:
// define("OPENVPN_POOL_SERIAL_NUMBER_OBJECT_DN", "o=example");
// OpenVPN CAS LDAP object's attribute name used to store next available certificate serial number
// Optional, default: "lsOpenvpnCaNextSerialNumber"
// define("OPENVPN_POOL_SERIAL_NUMBER_OBJECT_ATTR", "lsOpenvpnCaNextSerialNumber");
// Temporary directory path to use to store custom openssl configuration file on generating
// keys & certificates.
// define("OPENVPN_TMP_DIR", sys_get_temp_dir());
// Prefix of temporary filename
// define("OPENVPN_TMP_FILE_PREFIX", "ls_openvpn_openssl_");
// Default OpenVPN CA root certificate validity (in days)
define("OPENVPN_DEFAULT_ROOT_CERT_DAYS", 3650);
// Default digest algorithm of certificates generated by OpenVPN CA
define("OPENVPN_DEFAULT_DIGEST_ALGO", "sha256");
// Default length of key generated by OpenVPN CA
define("OPENVPN_DEFAULT_KEY_LENGTH", 4096);
// Default type of key generated by OpenVPN CA
define("OPENVPN_DEFAULT_KEY_TYPE", OPENSSL_KEYTYPE_RSA);
// Default cipher of key generated by OpenVPN CA
define("OPENVPN_DEFAULT_KEY_CIPHER", OPENSSL_CIPHER_AES_256_CBC);
// Default validity duration (in days) of certificates generated by OpenVPN CA
define("OPENVPN_DEFAULT_CERT_DAYS", 365);
// Default validity duration (in days) of certificates generated by OpenVPN CA
define("OPENVPN_WARNING_CERT_DAYS", 30);
// Critical validity duration (in days) of certificates generated by OpenVPN CA
define("OPENVPN_CRITICAL_CERT_DAYS", 10);
// OpenVPN client's attribute name used to store its certificate(s)
define("OPENVPN_CLIENT_OBJECT_CLASS", "lsOpenvpnClient");
// OpenVPN client's attribute name used to store its certificate(s)
define("OPENVPN_CLIENT_CERT_ATTR", "lsOpenvpnCertificate");
// OpenVPN client's attribute name used to store its encrypted private key(s)
define("OPENVPN_CLIENT_KEY_ATTR", "lsOpenvpnEncryptedPrivateKey");
// OpenVPN client's attribute name used to store its encrypted private key(s)
define("OPENVPN_CLIENT_PASSPHRASE_REQUIRED", true);
// OpenVPN client's common name LSformat
define("OPENVPN_CLIENT_COMMON_NAME_FORMAT", "%{cn} (%{uid}) - %{device}");
// Secret use to encrypt OpenVPN private keys stored in LDAP
define("OPENVPN_ENCRYPT_PRIVATE_KEYS_SECRET", "ReallyLongSecret");
// Enable/disable OpenVPN LDAP authentication
define("OPENVPN_USE_LDAP_AUTH", true);
// Show "My OpenVPN access" menu link
define("OPENVPN_SHOW_MY_ACCESS_MENU_LINK", true);
// OpenVPN management interface host & port
define("OPENVPN_MANAGEMENT_HOST", "localhost");
define("OPENVPN_MANAGEMENT_PORT", 1290);
// OpenVPN management interface request timeout (in seconds)
define("OPENVPN_MANAGEMENT_TIMEOUT", 10);
// Default OpenSSL options by certificate type for certificates generated by OpenVPN CA
$GLOBALS["OPENVPN_CERT_TYPES_OPENSSL_CONFIG"] = [
// Default (apply to all certificate types)
"default" => [
"basicConstraints" => ["CA:FALSE"],
"subjectKeyIdentifier" => ["hash"],
"authorityKeyIdentifier" => ["keyid:always", "issuer:always"],
],
// OpenVPN CA certificate
"ca" => [
"basicConstraints" => ["critical", "CA:TRUE"],
"keyUsage" => ["keyCertSign", "cRLSign"],
],
// OpenVPN Server certificate
"server" => [
"keyUsage" => ["digitalSignature", "keyEncipherment"],
"extendedKeyUsage" => ["serverAuth"],
],
// OpenVPN client certificate
"client" => [
"keyUsage" => ["digitalSignature"],
"extendedKeyUsage" => ["clientAuth"],
],
];
// OpenVPN client certificates's subject fields name associated with an LSformat
// Notes:
// * The LSformats will be computing using client LSobject, trim and only non-empty value will
// be keep.
// * The commonName will overwrite
$GLOBALS["OPENVPN_CLIENT_CERT_SUBJECT_FIELDS_FORMAT"] = [
"countryName" => "%{c}",
"stateOrProvinceName" => "%{st}",
"localityName" => "%{l}",
"organizationName" => "%{o}",
"organizationalUnitName" => "%{ou}",
"name" => "%{cn}",
"givenName" => "%{givenName}",
"surname" => "%{sn}",
"title" => "%{title}",
"emailAddress" => "%{mail}",
"userId" => "%{uid}",
];
// OpenVPN client certificates's Subject Alternative Name (SAN) fields name associated with an
// LSformat.
// Notes:
// * The LSformats will be computing using client LSobject, trim and only non-empty value will
// be keep.
// * An array of LSformats could be associated to a field name. In this case, each of these formats
// will be computed and keep if non-empty.
$GLOBALS["OPENVPN_CLIENT_CERT_SAN_FIELDS_FORMAT"] = [
"email" => ["%{mail}"],
];
// OpenVPN remote(s) hosts
$GLOBALS["OPENVPN_REMOTE_HOSTS"] = [
isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : gethostname(),
];
// List of LSprofiles with access granted to the "My OpenVPN access" view
$GLOBALS["OPENVPN_MY_ACCESS_ALLOWED_PROFILES"] = ["user"];
// List of LSprofiles with access granted to the "User OpenVPN access" view
$GLOBALS["OPENVPN_USER_ACCESS_ALLOWED_PROFILES"] = ["admin"];
// List of LSprofiles with access granted to the "OpenVPN status" view
$GLOBALS["OPENVPN_STATUS_ALLOWED_PROFILES"] = ["admin"];
// Options for passphrase validation using Zxcvbn lib (optional, see LSformRule_zxcvbn doc)
$GLOBALS["OPENVPN_PASSPHRASE_VALIDATION_ZXCVBN_OPTIONS"] = [];
OPENVPN_CA_PATH
Dossier de stockage des clés & certificats de l'autorité de certification (par défaut: /etc/openvpn/ldap).
OPENVPN_CA_KEY_PATH
Chemin du fichier de la clé privée de l'autorité de certification
OPENVPN_CA_CERT_PATH
Chemin du fichier du certificat de l'autorité de certification
OPENVPN_TA_KEY_PATH
Chemin du fichier du secret partagé utilisé par OpenVPN (directive tls-auth)
OPENVPN_PASSPHRASE
Phrase de passe de protection de la clé privée de l'autorité de certification
OPENVPN_POOL_SERIAL_NUMBER_OBJECT_DN
DN de l'objet LDAP utilisé pour stocker le prochain numéro de série disponible pour les certificats émis par l'autorité de certification. Par défaut, l'objet base DN de l'annuaire est utilisé.
OPENVPN_POOL_SERIAL_NUMBER_OBJECT_ATTR
Nom de l'attribut stockant le prochain numéro de série disponible pour les certificats émis par l'autorité de certification (cf. OPENVPN_POOL_SERIAL_NUMBER_OBJECT_DN). Par défaut : lsOpenvpnCaNextSerialNumber
OPENVPN_TMP_DIR
Chemin du dossier temporaire utilisé pour stocker les fichiers de configuration OpenSSL pour la génération des certificats & clés des clients. Par défaut : dossier système (cf. sys_get_temp_dir()).
OPENVPN_TMP_FILE_PREFIX
Préfixe du nom des fichiers temporaires de configuration OpenSSL pour la génération des certificats & clés des clients (cf. OPENVPN_TMP_DIR). Par défaut : ls_openvpn_openssl_
OPENVPN_DEFAULT_ROOT_CERT_DAYS
Nombre de jours par défaut pour la durée de validité du certificat racine de l'autorité de certification. Par défaut : 3650 soit 10 ans
OPENVPN_DEFAULT_DIGEST_ALGO
Algorithme de hachage (digest) par défaut des certificats générés par l'autorité de certification. Par défaut : sha256
OPENVPN_DEFAULT_KEY_LENGTH
Longueur par défaut des clés privées des certificats générés par l'autorité de certification. Par défaut : 4096
OPENVPN_DEFAULT_KEY_TYPE
Type de clés privées par défaut des certificats générés par l'autorité de certification. Par défaut : OPENSSL_KEYTYPE_RSA. Voir l'option private_key_type de la fonction openssl_csr_new pour voir les autres types disponibles.
OPENVPN_DEFAULT_KEY_CIPHER
Cipher des clés privées par défaut des certificats générés par l'autorité de certification. Par défaut : OPENSSL_CIPHER_AES_256_CBC. Voir l'option encrypt_key_cipher de la fonction openssl_csr_new pour voir les autres types disponibles.
OPENVPN_DEFAULT_CERT_DAYS
Nombre de jours par défaut pour la durée de validité des certificats générés par l'autorité de certification. Par défaut : 365 soit un an
OPENVPN_WARNING_CERT_DAYS
Seuil d'alerte en nombre de jours de validité restant pour les certificats générés par l'autorité de certification. Ce paramètre est utilisé aujourd'hui uniquement pour la mise en évidence de ces certificats dans l'interface web. Par défaut : 30.
OPENVPN_CRITICAL_CERT_DAYS
Seuil d'alerte critique en nombre de jours de validité restant pour les certificats générés par l'autorité de certification. Ce paramètre est utilisé aujourd'hui uniquement pour la mise en évidence de ces certificats dans l'interface web. Par défaut : 10.
OPENVPN_CLIENT_OBJECT_CLASS
Nom de la classe d'objet LDAP utilisée pour le stockage des certificats & clés des clients. Il sera ajouté si nécessaire aux clients lors de l'enregistrement d'un nouveau certificat. Par défaut : lsOpenvpnClient
OPENVPN_CLIENT_CERT_ATTR
Nom de l'attribut utilisé pour le stockage des certificats des clients. Par défaut : lsOpenvpnCertificate
OPENVPN_CLIENT_KEY_ATTR
Nom de l'attribut utilisé pour le stockage des clés privées des clients. Note : Ces clés seront chiffrées avant stockage (cf. OPENVPN_ENCRYPT_PRIVATE_KEYS_SECRET). Par défaut : lsOpenvpnEncryptedPrivateKey
OPENVPN_CLIENT_PASSPHRASE_REQUIRED
Booléen définissant si les clients doivent obligatoirement définir une phrase de passe pour protéger les certificats de leurs appareils. Par défaut : true
OPENVPN_CLIENT_COMMON_NAME_FORMAT
LSformat utilisé pour composer le champ Common Name des certificats des appareils des clients. Ce format est composé avec les informations du client ainsi que le nom de l'appareil renseigné par l'utilisateur (clé : device). Par défaut : {cn} (%{uid}) - %{device}
OPENVPN_ENCRYPT_PRIVATE_KEYS_SECRET
Secret utilisé pour chiffrer les clés privées des clients avant stockage dans l'annuaire LDAP. Il est important de personnaliser ce paramètre sur votre installation.
OPENVPN_USE_LDAP_AUTH
Booléen permettant de définir si l'authentification LDAP est utilisée sur votre instance OpenVPN. En cas d'activation, le paramètre auth-user-pass sera ajouté au fichier de configuration OpenVPN des clients et une colonne Nom d'utilisateur sera ajoutée sur la vue d'état d'OpenVPN.
OPENVPN_SHOW_MY_ACCESS_MENU_LINK
Booléen permettant de définir si le lien Mes accès OpenVPN doit être ajouté au menu de l'application. Par défaut: true
OPENVPN_MANAGEMENT_HOST
Nom d'hôte pour la connexion à l'interface de management d'OpenVPN. Par défaut : localhost
OPENVPN_MANAGEMENT_PORT
Port TCP de connexion à l'interface de management d'OpenVPN. Par défaut : 1290
OPENVPN_MANAGEMENT_TIMEOUT
Délai d'attente maximum de la connexion à l'interface de management d'OpenVPN. Par défaut : 10
$GLOBALS["OPENVPN_CERT_TYPES_OPENSSL_CONFIG"]
Tableau associatif permettant de définir les options OpenSSL pour la génération de chaque type de certificat. La clé default contient les options communes à tous les types de certificat.
$GLOBALS["OPENVPN_CLIENT_CERT_SUBJECT_FIELDS_FORMAT"]
Tableau associatif utilisé pour composer les informations contenues dans le champ sujet des certificats des clients. Chaque clé correspond à une information du sujet du certificat et la valeur associée est un LSformat composé à partir des informations du client. Après génération, seules les informations non vides sont conservées.
$GLOBALS["OPENVPN_CLIENT_CERT_SAN_FIELDS_FORMAT"]
Tableau associatif utilisé pour composer les informations contenues dans le champ Subject Alternative Name (SAN) des certificats des clients. Chaque clé correspond à une information du champ SAN du certificat et la valeur associée est un LSformat (ou un tableau de LSformats) composé à partir des informations du client. Après génération, seules les informations non vides seront conservées.
$GLOBALS["OPENVPN_REMOTE_HOSTS"]
Tableau des adresses IP et FQDN de connexion au service OpenVPN. Note : utilisé uniquement pour la génération du fichier de configuration OpenVPN des clients.
$GLOBALS["OPENVPN_MY_ACCESS_ALLOWED_PROFILES"]
Tableau des LSprofiles ayant le droit d'accéder à la vue "Mes accès OpenVPN". Par défaut : user.
$GLOBALS["OPENVPN_USER_ACCESS_ALLOWED_PROFILES"]
Tableau des LSprofiles ayant le droit d'accéder à la vue "Accès OpenVPN" des autres utilisateurs. Par défaut : admin.
$GLOBALS["OPENVPN_STATUS_ALLOWED_PROFILES"]
Tableau des LSprofiles ayant le droit d'accéder à la vue "État d'OpenVPN". Par défaut : admin.
$GLOBALS["OPENVPN_PASSPHRASE_VALIDATION_ZXCVBN_OPTIONS"]
Tableau des options de la librairie Zxcvbn pour la validation de la sécurité de la phrase de passe des certificats des clients.
Déploiement
Après avoir installé LdapSaisie et OpenVPN, créer le dossier de l'autorité de certification :
sudo mkdir -p /etc/openvpn/ldap
sudo chown root:www-data /etc/openvpn/ldap
sudo chmod 750 /etc/openvpn/ldap
Ajuster ensuite dans la configuration de l'addon la phrase de passe du certificat de la CA (paramètre OPENVPN_PASSPHRASE) ainsi que le secret de chiffrement des clés privées des clients stockées dans l'annuaire (OPENVPN_ENCRYPT_PRIVATE_KEYS_SECRET).
Initialiser ensuite l'autorité de certification du VPN à l'aide des commandes suivantes :
sudo ldapsaisie -A openvpn init_openvpn_ca MonOrganisation
sudo chown root:www-data /etc/openvpn/ldap/ca.*
sudo chmod 640 /etc/openvpn/ldap/ca.*
Générer ensuite le certificat du serveur VPN à l'aide de la commande suivante :
ldapsaisie -A openvpn generate_openvpn_certificate -t server -N -o /etc/openvpn/ldap/ vpn.domain.tld
sudo chown root:www-data /etc/openvpn/ldap/vpn.domain.tld.*
sudo chmod 640 /etc/openvpn/ldap/vpn.domain.tld.*
Note
Il n'est pas indispensable que LdapSaisie soit installé sur la même machine que celle faisant tourner votre instance OpenVPN. Vous devrez simplement copier manuellement sur cette dernière le certificat de l'autorité de certification ainsi que celui du serveur VPN.
Générer ensuite les fichiers utilisés par le service OpenVPN :
sudo openssl dhparam -out /etc/openvpn/ldap/dh2048.pem 2048
sudo openvpn --genkey secret /etc/openvpn/ldap/ta.key
sudo chown root:www-data /etc/openvpn/ldap/dh2048.pem /etc/openvpn/ldap/ta.key
sudo chmod 640 /etc/openvpn/ldap/dh2048.pem /etc/openvpn/ldap/ta.key
Pour finir, vous pouvez configurer l'instance OpenVPN :
sudo wget -O /etc/openvpn/ldap/openvpn.conf \
'https://gitlab.easter-eggs.com/ee/ldapsaisie/-/raw/master/resources/openvpn/config/openvpn.conf?ref_type=heads&inline=false'
sudo ln -s /etc/openvpn/ldap/openvpn.conf /etc/openvpn/ldap.conf
Dans le fichier de configuration d'OpenVPN (/etc/openvpn/ldap/openvpn.conf), ajuster les paramètres à votre installation, notamment :
- le chemin du certificat et clé utilisés par votre instance (paramètres
cert&key) - l'adressage IP au sein de votre réseau VPN (paramètre
server [network] [mask]) - les réseaux accessibles via votre VPN (paramètres
push "route [network] [mask]) - le serveur DNS de votre réseau VPN (paramètre
dhcp-option DNS [adresse IP])
Lors de la connexion des clients, le script openvpn_ldapsaisie_tls_verify est utilisé pour valider le certificat SSL utilisé par le client. OpenVPN vérifie par lui-même que le certificat SSL du client est toujours valide et qu'il a bien été émis par la bonne autorité de certification puis il appelle ce script permettant de valider que ce certificat est toujours attribué à un utilisateur.
Si vous avez utilisé le paquet Debian pour installer LdapSaisie, ce script est automatiquement installé. À défaut, téléchargez et installez-le manuellement :
sudo wget -O /usr/local/sbin/openvpn_ldapsaisie_tls_verify \
'https://gitlab.easter-eggs.com/ee/ldapsaisie/-/raw/master/docker/images/ldapsaisie-openvpn/openvpn_ldapsaisie_tls_verify?ref_type=heads&inline=false'
chmod 755 /usr/local/sbin/openvpn_ldapsaisie_tls_verify
Il vous faudra également ajuster les paramètres de ce script en déployant et en ajustant son fichier de configuration /etc/openvpn/ldap/tls-verify.conf :
cat << EOF > /etc/openvpn/ldap/tls-verify.conf
# LDAP host URI
ldap_host=ldap://172.17.0.1
# LDAP bind DN & password (optional, default: anonymous)
ldap_bind_dn="uid=openvpn,ou=sysaccounts,o=ls"
ldap_bind_password="secret"
# LDAP base DN
ldap_base_dn="o=ls"
# LDAP search filter for OpenVPN client
ldap_filter="(objectClass=lsOpenvpnClient)"
# LDAP OpenVPN client's attribute name used to store its certificates
ldap_cert_attr="lsOpenvpnCertificate"
# OpenVPN CA certificate path
ca_cert=/etc/openvpn/ldap/ca.crt
EOF
chmod 640 /etc/openvpn/ldap/tls-verify.conf
Ce script a par ailleurs besoin d'avoir accès au certificat SSL des clients et pour cela, OpenVPN doit être configuré pour exporter ces derniers dans un fichier temporaire (paramètre tls-export-cert). Vous devez donc prévoir un dossier temporaire pour cela :
Si vous décidez de combiner l'authentification par certificat avec l'authentification LDAP, il faudra également déployer le fichier de configuration du plugin auth-ldap d'OpenVPN :
cp /usr/share/doc/openvpn-auth-ldap/examples/auth-ldap.conf /etc/openvpn/ldap/auth-ldap.conf
chmod 640 /etc/openvpn/ldap/auth-ldap.conf
Aide à la configuration
Vous pouvez vous inspirer du fichier d'exemple fourni avec le projet au besoin.
Vous pouvez ensuite démarrer votre instance OpenVPN et programmer son démarrage automatique :
Vous pouvez à présent générer un premier certificat et tester la connexion d'un client.
Via docker
Une image docker est fournie pour faciliter au besoin le déploiement d'une instance OpenVPN utilisant cette solution d'authentification. L'utiliser vous évitera l'installation d'OpenVPN et autres dépendances, mais vous devrez cependant suivre les différentes étapes de configuration décrite ci-dessous.
Exemple d'utilisation :