- OS : Ubuntu 24.04.1 LTS
- RAM : 2G
- Disque : 30G
- VCPU 2
Mettre à jour la distribution linux
sudo apt update && sudo apt upgradeInstaller Apache, git, php et composer
sudo apt-get install git composer apache2 libapache2-mod-php php php-cli php-opcache php-mysql php-zip php-gd php-mbstring php-curl php-xml -yCréer le répertoire du projet
cd /var/www
sudo mkdir deming
sudo chown $USER:$GROUP demingCloner le projet depuis Github
git clone https://www.github.com/dbarzin/demingCréer les répertoires temporaires
cd deming
mkdir -p storage/framework/views
mkdir -p storage/framework/cache
mkdir -p storage/framework/sessions
mkdir -p bootstrap/cacheInstaller les packages avec composer
composer installInstaller la base de données (fonctionne aussi avec PostgreSQL et MySQL)
sudo apt install mariadb-serverLancer MariaDB avec les droits root
sudo mariadbCréer la base de données deming et l'utilisateur deming_user
CREATE DATABASE deming CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'deming_user'@'localhost' IDENTIFIED BY 'demPasssword-123';
GRANT ALL ON deming.* TO deming_user@localhost;
GRANT PROCESS ON *.* TO 'deming_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;Créer un fichier .env dans le répertoire racine du projet :
cd /var/www/deming
cp .env.example .envMettre les paramètre de connexion à la base de données :
vi .envDB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=deming
DB_USERNAME=deming_user
DB_PASSWORD=demPasssword-123Exécuter les migrations
LANG=fr php artisan migrate --seedRemarque: la graine est importante (--seed), car elle créera le premier utilisateur administrateur pour vous.
Générer la clé de l'application
php artisan key:generateSi vous voulez utiliser l'API, installez Laravel Passport (option) :
php artisan passport:installCréer le lien de stockage
php artisan storage:linkPour importer la base de données avec les attributs de sécurité de la norme 27001:2022 (optionel)
LANG=fr php artisan db:seed --class=AttributeSeederPeupler la base de données avec la norme ISO 27001:2022 et générer un jeu de tests (optionel)
php artisan deming:import-framework ./storage/app/repository/ISO27001-2022.fr.xlsx --clean
php artisan deming:generate-testsphp artisan serveou pour y accéder à l'application depuis un autre serveur
php artisan serve --host 0.0.0.0 --port 8000L'application est accessible à l'URL [http://127.0.0.1:8000]
utilisateur : admin@admin.localhost
mot de passe : adminL'administrateur utilise la langue anglaise par défaut. Pour changer de langue, allez dans la page de profil de l'utilisateur (en haut à droite de la page principale).
Pour importer un référentiel et générer des données de test, allez dans "Configuration" -> "Import" (optionel).
Il est également possible de faire démarrer l'application en tant que service systemd. Pour cela, créez un nouveau fichier de définition du service :
su root -c "vi /etc/systemd/system/deming.service"Ajoutez les lignes suivantes:
[Unit]
Description=Deming
After=network.target
After=mariadb.service
After=apache2.service
[Service]
Type=simple
ExecStart=/usr/bin/php artisan serve --host 127.0.0.1 --port 8000
User=www-data
Group=www-data
WorkingDirectory=/var/www/deming
KillMode=mixed
[Install]
WantedBy=multi-user.targetPrenez en compte ce nouveau service et démarrez l'application :
systemctl daemon-reload
systemctl enable --now deming.servicePour configurer Apache, modifiez les propriétés du répertoire Deming et accordez les autorisations appropriées au répertoire de stockage avec la commande suivante :
sudo chown -R www-data:www-data /var/www/deming
sudo chmod -R 775 /var/www/deming/storageEnsuite, créez un nouveau fichier de configuration d'hôte virtuel Apache pour servir l'application :
sudo vi /etc/apache2/sites-available/deming.confAjouter les lignes suivantes :
<VirtualHost *:80>
ServerName deming.local
ServerAdmin admin@example.com
DocumentRoot /var/www/deming/public
<Directory /var/www/deming>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>Enregistrez et fermez le fichier lorsque vous avez terminé. Ensuite, activez l'hôte virtuel Apache et le module de réécriture avec les commandes suivantes :
sudo a2enmod rewrite
sudo a2dissite 000-default.conf
sudo a2ensite deming.conf
sudo a2dismod php8.3
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpmEnfin, redémarrez le service Apache pour activer les modifications :
sudo systemctl restart apache2En complément des étapes ci-dessus, créez ou modifiez le fichier de configuration d'hôte virtuel Apache pour servir l'application :
su root -c "vi /etc/apache2/sites-available/deming.conf"Ajouter les lignes suivantes :
<VirtualHost *:80>
ServerName deming.local
RewriteEngine On
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1
</VirtualHost>
<VirtualHost *:443>
ServerName deming.local
DocumentRoot /var/www/deming/public
Protocols h2 h2c http/1.1
<Directory /var/www/deming>
AllowOverride All
</Directory>
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
ProxyPreserveHost On
# Si vous utilisez php-fpm (chemin de la socket à adapter à votre cas)
#<FilesMatch \.php$>
# SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"
#</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
Header always set Referrer-Policy "no-referrer"
Header always set X-Content-Type-Options "no-sniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Robots-Tag "none"
Header always set X-Frame-Options "SAMEORIGIN"
Header edit Set-Cookie ^(.*)$ "$1;HttpOnly;Secure;SameSite=Strict"
</IfModule>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/deming.local.crt
SSLCertificateKeyFile /etc/apache2/ssl/deming.local.key
</VirtualHost>Dans le cadre de cette configuration servant l'application en HTTPS, il pourra être nécessaire de positionner la variable APP_ENV à la valeur production dans le fichier .env de Deming.
Vous devez définir les valeurs de upload_max_filesize et post_max_size dans votre php.ini (/etc/php/8.3/fpm/php.ini) :
; Taille maximale autorisée pour les fichiers téléchargés.
upload_max_filesize = 10M
; Doit être supérieur ou égal à upload_max_filesize
post_max_size = 10MAprès avoir modifié le(s) fichier(s) php.ini, vous devez redémarrer le service php-fpm pour utiliser la nouvelle configuration.
sudo systemctl restart php-fpmSi vous souhaitez envoyer des e-mails de notification depuis Deming. Vous devez configurer l'accès au serveur SMTP dans .env
MAIL_HOST='smtp.localhost'
MAIL_PORT=2525
MAIL_AUTH=true
MAIL_SMTP_SECURE='ssl'
MAIL_SMTP_AUTO_TLS=false
MAIL_USERNAME=
MAIL_PASSWORD=Vous pouvez également configurer DKIM :
MAIL_DKIM_DOMAIN = 'admin.local';
MAIL_DKIM_PRIVATE = '/path/to/private/key';
MAIL_DKIM_SELECTOR = 'default'; // Match your DKIM DNS selector
MAIL_DKIM_PASSPHRASE = ''; // Only if your key has a passphraseN'oubliez pas de configurer le contenu et la fréquence d'envoi des mails.
Cette section te permet d’activer l’authentification LDAP dans Deming avec LDAPRecord v2. Elle fonctionne indifféremment avec Active Directory ou OpenLDAP, et peut cohabiter avec l’authentification locale (base de données).
Prérequis : l’extension PHP LDAP doit être installée et active.
sudo apt-get install php-ldap
sudo systemctl restart apache2Ajouter / adapter les variables suivantes :
# Activation LDAP dans Deming (mode hybride)
LDAP_ENABLED=true # Active l’authentification LDAP
LDAP_FALLBACK_LOCAL=true # Si LDAP échoue, tenter l’auth locale
LDAP_AUTO_PROVISION=false # Créer automatiquement l’utilisateur local après bind LDAP OK
# Connexion au serveur LDAP
LDAP_HOST=ldap.example.org
LDAP_PORT=389 # 389 (StartTLS) ou 636 (LDAPS)
LDAP_BASE_DN=dc=example,dc=org
LDAP_USERNAME=cn=admin,dc=example,dc=org # Compte de service pour la recherche
LDAP_PASSWORD=********
LDAP_TLS=true # StartTLS (recommandé si port 389)
LDAP_SSL=false # true si tu utilises ldaps:// sur 636
LDAP_TIMEOUT=5 # (optionnel)
# Attributs candidats pour identifier l’utilisateur saisi dans le formulaire
# L’ordre a de l’importance : le premier qui matche est utilisé.
# OpenLDAP: uid, cn, mail ; AD: sAMAccountName, userPrincipalName, mail
LDAP_LOGIN_ATTRIBUTES=uid,cn,mail,sAMAccountName,userPrincipalNameExemples
-
OpenLDAP (DN utilisateur typique :
uid=jdupont,ou=people,dc=example,dc=org) :LDAP_TLS=true LDAP_SSL=false LDAP_LOGIN_ATTRIBUTES=uid,cn,mail
-
Active Directory (UPN :
jdupont@example.org, sAM :jdupont) :LDAP_TLS=true LDAP_SSL=false LDAP_LOGIN_ATTRIBUTES=sAMAccountName,userPrincipalName,mail,cn LDAP_USERNAME=EXAMPLE\\svc_ldap # ou DN complet du compte de service
Après modification du .env :
php artisan config:clear
php artisan optimize:clearCertificats : si tu utilises StartTLS/LDAPS avec un CA interne, ajoute le CA au trust store de ta distribution (ex. /usr/local/share/ca-certificates + update-ca-certificates).
Le contrôleur d’authentification :
- recherche l’entrée LDAP via une OR-query sur les attributs listés dans
LDAP_LOGIN_ATTRIBUTES; - récupère le DN ;
- tente un bind avec le mot de passe saisi ;
- si OK, il connecte l’utilisateur applicatif local correspondant (et peut auto-provisionner s’il n’existe pas, selon
LDAP_AUTO_PROVISION).
Avant de tester via l’UI, valide la connexion en CLI :
php artisan tinkerPuis dans Tinker :
use LdapRecord\Container;
$dn = 'uid=jdupont,ou=people,dc=example,dc=org'; // ou cn=..., ou DN AD
Container::getConnection()->auth()->attempt($dn, 'MOT_DE_PASSE', true);
// => true attendu si l’authentification réussit- PHP LDAP manquant :
php -m | grep ldapdoit renvoyerldap. Sinonsudo apt-get install php-ldap, puis redémarrage PHP/Apache. - Mauvais DN : ajoute les
ou=...corrects (ex.ou=people). - TLS/SSL : StartTLS =
LDAP_TLS=true(389). LDAPS =LDAP_SSL=true(636). Ne laisse pas en clair en prod. - Certificat non approuvé : ajoute le CA au système (voir ci-dessus).
- Recherche impossible : vérifie
LDAP_USERNAME/LDAP_PASSWORD(compte de service) et les ACL de l’annuaire. - Attribut de login : aligne
LDAP_LOGIN_ATTRIBUTESavec ce que tes utilisateurs saisissent réellement (uid ? UPN ? email ?).
- Utilise TLS/LDAPS. Point.
- Restreins les droits du compte de service au strict nécessaire (lecture des attributs requis).
- Évite de logger des mots de passe ou DN complets côté application.
- Si tu actives l’auto-provisioning, stocke un mot de passe aléatoire côté base (pas un duplicat du LDAP) et applique tes politiques de rôles/profils.
Pour configurer Keycloak, suivez ces étapes :
- Ouvrez votre fichier .env.
- Modifiez les paramètres de configuration de Keycloak comme suit :
SOCIALITE_PROVIDERS="keycloak"
KEYCLOAK_CLIENT_ID= # Client Id (on Keycloak)
KEYCLOAK_CLIENT_SECRET= # Client Secret
KEYCLOAK_REDIRECT_URI=${APP_URL}auth/callback/keycloak
KEYCLOAK_BASE_URL=<KeyCloak IP Address>
KEYCLOAK_REALM= # Realm NameAprès avoir ajouter keycloak à la variable SOCIALITE_PROVIDERS un bouton apparaîtra sur la page de connexion, permettant aux utilisateurs de se connecter via Keycloak. (Il est possible de modifier le texte du bouton avec la variable KEYCLAOK_DISPLAY_NAME).
Pour autoriser la création d'utilisateur et/ou la mise à jour par Keycloak ajouter les paramètre suivants :
KEYCLOAK_ALLOW_CREATE_USER=true
KEYCLOAK_ALLOW_UPDATE_USER=trueSi vous souhaitez que récupérer le rôle de l'utilisateur fourni par Keycloak lors de sa création ou la mise à jour, il est nécessaire de lui de demander un scope supplémentaires et de définir le nom claim qui contiendra le rôle :
KEYCLOAK_ADDITIONAL_SCOPES="roles"
KEYCLOAK_ROLE_CLAIM="resource_access.deming.roles.0"Il est également possible de fournir un rôle par défaut, utilisé si Keycloak ne fournit pas le rôle :
KEYCLOAK_DEFAULT_ROLE=<Valeur possible : auditee, auditor, user>Pour une documentation plus complète sur la configuration de Keycloak, consultez la documentation officielle de Keycloak.
Il est possiblie d'ajouter un founisseur d'identité OpenID Connect générique, il suffit d'ajouter oidc à la variable SOCIALITE_PROVIDERS. Toutes les variables vu ci-dessus existe, elles commencent par OIDC_ (voir le fichier .env.example pour plus d'information)
Modifier le crontab
sudo crontab -eajouter cette ligne dans le crontab
* * * * * cd /var/www/deming && php artisan schedule:run >> /dev/null 2>&1Pour mettre à jour Deming, il faut aller dans le répertoire de Deming et récupérer les sources
cd /var/www/deming
git pullMigrer la base de données
php artisan migrateMettre à jour les librairies
composer installVider les caches
php artisan optimize:clearPour repartir d'une base de données vide avec la norme ISO 27001:2022.
Voici la commande pour recréer la DB :
php artisan migrate:fresh --seedPuis importer les attributs
php artisan db:seed --class=AttributeSeederPeupler la base de données avec la norme ISO 27001:2022
php artisan deming:import-framework ./storage/app/repository/ISO27001-2022.fr.xlsx