Vincent Liefooghe - Logiciels (libres), CMS, IDM & Co https://www.vincentliefooghe.net/ fr Gestion du firewall sous CentOS8 / Red Hat 8 https://www.vincentliefooghe.net/content/gestion-du-firewall-sous-centos8-red-hat-8 <span property="dc:title" class="field field--name-title field--type-string field--label-hidden">Gestion du firewall sous CentOS8 / Red Hat 8</span> <span rel="sioc:has_creator" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">Vincent</span></span> <span property="dc:date dc:created" content="2021-04-14T11:54:24+00:00" datatype="xsd:dateTime" class="field field--name-created field--type-created field--label-hidden">mer 14/04/2021 - 13:54</span> Wed, 14 Apr 2021 11:54:24 +0000 Vincent 210 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/gestion-du-firewall-sous-centos8-red-hat-8#comments Forgerock OpenDJ / DS - Supprimer les contrôles de syntaxe https://www.vincentliefooghe.net/content/forgerock-opendj-ds-supprimer-les-contr%C3%B4les-syntaxe <span class="field field--name-title field--type-string field--label-hidden">Forgerock OpenDJ / DS - Supprimer les contrôles de syntaxe</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Par défaut les nouveaux annuaires LDAP issus des sources OpenDS (tels que OpenDJ / DS chez Forgerock, mais aussi Ping Directory) renforcent les contrôles sur la syntaxe des attributs, le schéma, etc.</p> <p>Ceci empêche par exemple d'avoir un objet avec de multiples classes structurelles non hiérarchiques (par exemple <em>inetorgperson</em> et <em>country</em>).</p> <p>Par contre lorsqu'on importe des données d'un annuaire un peu moins strict (type Sun / Oracle DSEE), on se heurte souvent à des erreurs.</p> <p>La solution la plus propre est de modifier le fichier LDIF pour remettre au carré les données :</p> <ul> <li>supprimer / modifier les attributs non conformes</li> <li>modifier le schéma pour éviter les héritages multiples</li> </ul> <p>Mais ceci n'est pas toujours faisable.</p> <p>On peut alors relâcher les contrôles effectuer, en utilisant l'utilitaire <em>dsconfig </em>(testé depuis la version OpenDJ 2.6 jusque DS 7) :</p> <pre> #!/bin/bash PORT=5444 HOST=djlyreco BINDPASS="SuperPa$$w0rd" cd /path/to//opendj # Do not check schema bin/dsconfig set-global-configuration-prop --hostname $HOST --port ${PORT} --bindDN "cn=Directory Manager" \ --bindPassword ${BINDPASS} --set check-schema:false --trustAll --no-prompt # Allows multiple structural object classes (warning only) bin/dsconfig set-global-configuration-prop --hostname $HOST --port ${PORT} --bindDN "cn=Directory Manager" \ --bindPassword ${BINDPASS} --set single-structural-objectclass-behavior:warn --trustAll --no-prompt # Allows invalid attribute syntax bin/dsconfig set-global-configuration-prop --hostname $HOST --port ${PORT} \ --bindDN "cn=Directory Manager" --bindPassword ${BINDPASS} --set invalid-attribute-syntax-behavior:warn --trustAll --no-prompt # Allow pre-encoded passwords : pour l'import de compte avec des mots de passe existant bin/dsconfig -p ${PORT} -h $HOST -D "cn=Directory Manager" -w ${BINDPASS} \ set-password-policy-prop --policy-name "Default Password Policy" --set allow-pre-encoded-passwords:true -X -n</pre><p> </p> <p>La dernière ligne permet également d'importer des mots de passe pré-encodés. C'est utile en cas de migration de données entre annuaires, pour garder les mêmes mots de passe.</p> <p> </p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">Vincent</span></span> <span class="field field--name-created field--type-created field--label-hidden">mer 09/12/2020 - 11:30</span> <div class="field field--name-field-categorie field--type-entity-reference field--label-above"> <div class="field__label">Catégorie</div> <div class="field__item"><a href="/cat%C3%A9gorie/iam" hreflang="fr">IAM</a></div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tag</div> <div class="field__items"> <div class="field__item"><a href="/tags/ldap" hreflang="fr">ldap</a></div> <div class="field__item"><a href="/tags/opendj" hreflang="fr">opendj</a></div> <div class="field__item"><a href="/tags/forgerock" hreflang="fr">forgerock</a></div> </div> </div> <section class="field field--name-comment-node-book field--type-comment field--label-hidden comment-wrapper"> <h2 class="title comment-form__title">Ajouter un commentaire</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=208&amp;2=comment_node_book&amp;3=comment_node_book" token="FCUJHl0s_eMjKa8Cw3DvkSQUZ310pub5HrSmdbeosj4"></drupal-render-placeholder> </section> Wed, 09 Dec 2020 10:30:28 +0000 Vincent 208 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/forgerock-opendj-ds-supprimer-les-contr%C3%B4les-syntaxe#comments Passer en PHP 7.x sur un serveur CentOS sans accès aux repositories https://www.vincentliefooghe.net/content/passer-php-7x-sur-un-serveur-centos-sans-acc%C3%A8s-aux-repositories <span property="dc:title" class="field field--name-title field--type-string field--label-hidden">Passer en PHP 7.x sur un serveur CentOS sans accès aux repositories</span> <span rel="sioc:has_creator" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/vincentl" typeof="schema:Person" property="schema:name" datatype="">vincentl</span></span> <span property="dc:date dc:created" content="2020-11-12T10:11:23+00:00" datatype="xsd:dateTime" class="field field--name-created field--type-created field--label-hidden">jeu 12/11/2020 - 11:11</span> Thu, 12 Nov 2020 10:11:23 +0000 vincentl 207 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/passer-php-7x-sur-un-serveur-centos-sans-acc%C3%A8s-aux-repositories#comments Migration LXD sur Ubuntu 18.04 vers 20.04 https://www.vincentliefooghe.net/content/migration-lxd-sur-ubuntu-1804-vers-2004 <span property="dc:title" class="field field--name-title field--type-string field--label-hidden">Migration LXD sur Ubuntu 18.04 vers 20.04</span> <span rel="sioc:has_creator" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">Vincent</span></span> <span property="dc:date dc:created" content="2020-07-26T19:58:54+00:00" datatype="xsd:dateTime" class="field field--name-created field--type-created field--label-hidden">dim 26/07/2020 - 21:58</span> Sun, 26 Jul 2020 19:58:54 +0000 Vincent 206 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/migration-lxd-sur-ubuntu-1804-vers-2004#comments Migration Media et Images Inline https://www.vincentliefooghe.net/content/migration-media-et-images-inline <span class="field field--name-title field--type-string field--label-hidden">Migration Media et Images Inline</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Dans la série d'articles sur la migration de mon site <a href="https://www.vincentliefooghe.net/content/migration-drupal-7-vers-drupal-8">https://www.vincentliefooghe.net/content/migration-drupal-7-vers-drupal-8 </a> j'en viens maintenant à une partie qui m'a pris pas mal de temps et demandé un peu de développement.</p> <p>Sur mon site en Drupal 7, j'avais utilisé le module Media_Wysiwyg et Colorbox, qui me permettaient d'insérer des images directement dans le texte.</p> <p>Je n'ai pas trouvé d'équivalent sous Drupal 8, mais en utilisant comme format d'affichage "Colorbox" pour le champ media_image, ceci répond à mon besoin : ouvrir un champ image dans une "lightbox".</p> <article class="media media--type-image media--view-mode-default" data-align="center"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Image</div> <div class="field__item"> <a href="https://www.vincentliefooghe.net/sites/default/files/2020-04/Capture%20d%E2%80%99%C3%A9cran%20de%202020-04-20%2021-58-11.png" title="Définition du format d'affichage Media Image" data-colorbox-gallery="gallery-all-3X6zFy1LvV4" class="colorbox" data-cbox-img-attrs="{&quot;alt&quot;:&quot;Définition du format d'affichage Media Image&quot;}"><img src="/sites/default/files/styles/large/public/2020-04/Capture%20d%E2%80%99%C3%A9cran%20de%202020-04-20%2021-58-11.png?itok=nlAgY3jD" width="480" height="154" alt="Définition du format d'affichage Media Image" typeof="foaf:Image" class="image-style-large" /> </a> </div> </div> </article> <p>Il reste donc à convertir les fichiers en média, et ensuite à convertir, dans le corps du texte de chaque contenu, les tags "colorbox" en tags "drupal media".</p> <h2>Création des Media liés aux fichiers</h2> <p>Lors de la migration, les fichiers ont bien été importés. Par contre ils ne sont pas reconnus comme <em>media</em> par Drupal ,et donc pas réutilisables.</p> <p>Après avoir cherché - en vain - des modules qui géraient ceci, j'ai fini par passer par un bout de programme PHP qui utilise les fonctions de Drupal pour réaliser cette opération.</p> <p>Le code php est le suivant :</p> <pre style="margin: 0px; text-indent: 0px;"> &lt;?php // Create Media images from file use Drupal\media\Entity\Media; // Requete pour recupérer les fichiers de type Image $results = \Drupal::database()-&gt;query("select * from file_managed where filemime like 'image%'")-&gt;fetchAll(); foreach ($results as $file ) { echo "File name:",$file-&gt;filename," Id : ",$file-&gt;fid," mime : ",$file-&gt;filemime," uid : ",$file-&gt;uid; echo "Creation du Media Image pour ",$file-&gt;filename,PHP_EOL; $media = Media::create([ 'bundle' =&gt; 'image', 'uid' =&gt; $file-&gt;uid, 'langcode' =&gt; $file-&gt;langcode, 'field_media_image' =&gt; [ 'target_id' =&gt; $file-&gt;fid, 'alt' =&gt; $file-&gt;filename ] ]); $media-&gt;setPublished(TRUE); $retour=$media-&gt;save(); if ( $retour != 1 ) { echo "Retour KO ? ",$retour,PHP_EOL; } } return (TRUE);</pre><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">On peut le lancer avec drush, via la commande :</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> <pre> drush --uri=drupal.loc scr /chemin/vers/mon/fichier.php</pre><p>Après cette étape, on récupère bien dans la librairies de media tous les fichiers</p> <h2 style="margin: 0px; text-indent: 0px;">Reprise des images inline</h2> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> <p class="western">Pour convertir les tags, j'ai développé un programme PHP qui va remplacer les instructions inline Colorbox, par exemple</p> <pre> &lt;p&gt;[[{"type":"media","view_mode":"colorbox","fid":"88","attributes":{"alt":"","class":"media-image","height":"300","typeof":"foaf:Image","width":"494"}}]]&lt;/p&gt;</pre><p class="western">par</p> <pre> &lt;drupal-media data-align="center" data-entity-type="media" data-entity-uuid="b5631639-11f9-4945-85b7-85a477cbdcf8"&gt;&lt;/drupal-media&gt;</pre><p class="western">Le script sera lancé avec en paramètre le Node Id à traiter :</p> <pre> php mediaInline.php -i nid</pre><p class="western">Par exemple</p> <pre> php mediaInline.php -i 136</pre><p class="western">Note : j'ai fait le choix de traiter les contenus un par un. Au total, j'avais identifié une vingtaine d'articles concernés. La migration unitaire me permettait de vérifier le traitement pour chacun.</p> <p class="western">Afin de voir le résultat, il faut vider le cache Drupal avec la commande :</p> <pre> drush cr</pre><p> </p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/vincentl" typeof="schema:Person" property="schema:name" datatype="">vincentl</span></span> <span class="field field--name-created field--type-created field--label-hidden">lun 20/04/2020 - 21:54</span> <div class="field field--name-field-categorie field--type-entity-reference field--label-above"> <div class="field__label">Catégorie</div> <div class="field__item"><a href="/cat%C3%A9gorie/cms" hreflang="fr">CMS</a></div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tag</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/1" hreflang="fr">Drupal</a></div> <div class="field__item"><a href="/tags/media" hreflang="fr">media</a></div> </div> </div> <div class="field field--name-field-fichier field--type-file field--label-above"> <div class="field__label">Fichier</div> <div class="field__items"> <div class="field__item"> <span class="file file--mime-application-pdf file--application-pdf"> <a href="https://www.vincentliefooghe.net/sites/default/files/mediaInline.php_.pdf" type="application/pdf; length=53900" title="mediaInline.php_.pdf">Script de migration Colorbox vers media</a></span> </div> </div> </div> <section class="field field--name-comment-node-book field--type-comment field--label-hidden comment-wrapper"> <h2 class="title comment-form__title">Ajouter un commentaire</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=205&amp;2=comment_node_book&amp;3=comment_node_book" token="fPxOoNJNWdkHGUVo_eQPh31e8VYhG0jBWRM4c513qDE"></drupal-render-placeholder> </section> Mon, 20 Apr 2020 19:54:26 +0000 vincentl 205 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/migration-media-et-images-inline#comments Migration avec le module migrate_upgrade https://www.vincentliefooghe.net/content/migration-avec-le-module-migrateupgrade <span class="field field--name-title field--type-string field--label-hidden">Migration avec le module migrate_upgrade</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><h2>Installation et activation des modules Drush requis</h2> <p>On va installer les 2 modules suivants : migrate_upgrade, migrate_tools.</p> <pre> <code>composer require drupal/migrate_upgrade composer require drupal/migrate_tools </code></pre><p>Puis activer les modules :</p> <pre> <code>drush pm:enable migrate_upgrade migrate_tools -y </code></pre><p>Dans le fichier <em>settings.php</em> , il faut ajouter la définition de la base source.</p> <p><strong>Important</strong> : elle doit s'appeler <strong>migrate</strong>.</p> <p>Par exemple :</p> <pre> <code>$databases['migrate']['default'] = array ( 'database' =&gt; 'dbdrupal7', 'username' =&gt; 'user_drupal7', 'password' =&gt; 'mdp_drupal7', 'prefix' =&gt; '', 'host' =&gt; 'localhost', 'port' =&gt; '3306', 'namespace' =&gt; 'Drupal\\Core\\Database\\Driver\\mysql', 'driver' =&gt; 'mysql' ); </code></pre><h2>Générer la migration Drupal 7 vers Drupal 8</h2> <p>Dans la version que j'ai installé, on peut utiliser <em>migrate_upgrade</em> pour générer les scripts de migration, qui seront lancés avec <em>drush</em>.</p> <h3>Prérequis</h3> <p>Attention : à cause d'une incompatibilité avec drush 10, cette fonction nécessite que l'on modifie le fichier <code>vendor/drush/drush/includes/drush.inc</code> pour ajouter la définition de drush_print :</p> <pre style="margin: 0px; text-indent: 0px;"> function drush_print($message = '', $indent = 0, $handle = NULL, $newline = TRUE) { $msg = str_repeat(' ', $indent) . (string)$message; if ($newline) { $msg .= &amp;quot;\n&amp;quot;; } if (($charset = 'UTF-8' ) &amp;amp;&amp;amp; function_exists('iconv')) { $msg = iconv('UTF-8', $charset, $msg); } if (!$handle) { $handle = STDOUT; } fwrite($handle, $msg);</pre><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">}</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> <p>Sinon on a le message :</p> <pre> drush migrate-upgrade --legacy-db-key=migrate --configure-only [error] Error: Call to undefined function drush_get_option() in drush_print()</pre><p>Lancer la commande avec le chemin vers le répertoire source "legacy", ce qui permet de migrer les fichiers également :</p> <pre> drush migrate-upgrade --legacy-db-key=migrate --legacy-root /var/www/drupal7/vincentl --migration-prefix=upg1_ --configure-only</pre><p class="western"><span style="line-height:100%">On peut ensuite voir le résultat avec la commande drush migrate-status</span></p> <p class="western"><span style="line-height:100%">Et on peut lancer la migration avec :</span></p> <pre> drush migrate:import upg1_d7_taxonomy_vocabulary drush migrate:import upg1_d7_taxonomy_term_categorie drush migrate:import upg1_d7_taxonomy_term_tags drush migrate-import --group=migrate_drupal_7 </pre><p><strong>Note</strong> : je lance d'abord les migrations de taxonomie pour que la génération des liens de menu se passe correctement. Comme dit précédemment, le processus est assez itératif et a demandé plusieurs essais avant de trouver les bons réglages.</p> <p>Après cette étape, le contenu a été migré, ainsi que les types de contenu, les menus, etc.</p> <p>Il reste à faire quelques mises au point et reprise de paramétrage sur les formats de texte (insertion du bouton media par exemple), ainsi que refaire le thème, et traiter le cas des images <em>inline</em>.</p> <p> </p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/vincentl" typeof="schema:Person" property="schema:name" datatype="">vincentl</span></span> <span class="field field--name-created field--type-created field--label-hidden">lun 20/04/2020 - 21:42</span> <div class="field field--name-field-categorie field--type-entity-reference field--label-above"> <div class="field__label">Catégorie</div> <div class="field__item"><a href="/cat%C3%A9gorie/cms" hreflang="fr">CMS</a></div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tag</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/1" hreflang="fr">Drupal</a></div> </div> </div> <section class="field field--name-comment-node-book field--type-comment field--label-hidden comment-wrapper"> <h2 class="title comment-form__title">Ajouter un commentaire</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=204&amp;2=comment_node_book&amp;3=comment_node_book" token="KVD93o-80gUsSKm2muCPtDa4b3TQ3e1ZtQ8mC6723F0"></drupal-render-placeholder> </section> Mon, 20 Apr 2020 19:42:22 +0000 vincentl 204 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/migration-avec-le-module-migrateupgrade#comments Processus de migration vers Drupal 8 https://www.vincentliefooghe.net/content/processus-migration-vers-drupal-8 <span class="field field--name-title field--type-string field--label-hidden">Processus de migration vers Drupal 8</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><h2>Processus de migration</h2> <p>Le processus de migration a été testé plusieurs fois. Je suis parti sur la base d'une sauvegarde du site Drupal 7 (fichiers + base de données).</p> <p>J'ai installé ça dans un container LXC sur mon PC, ce qui me permettra de supprimer tout cela une fois la migration terminée.</p> <p>Au final, on a donc un container sous Debian 10 avec PHP 7.3.11 et une base MariaDB 10.1.</p> <p>L'idée est donc la suivante :</p> <ul> <li>création d'une base de données pour Drupal 8</li> <li>installation d'un site en Drupal 8, en mode "standard", mais sans contenu</li> <li>installation et activation des modules portés sous Drupal 8</li> <li>installation et activation des modules de migration</li> <li>lancement de la migration des contenus</li> <li>reprise des média et de leur affichage (la migration ne gère pas ce point a priori)</li> <li>ajustements manuels / reparamétrage dans la cible D8.</li> </ul> <p>Le processus a été fait de manière itérative, je m'y suis repris à 3 ou 4 fois avant d'avoir un processus qui tienne la route.</p> <h2>Installation Drupal 8</h2> <p>Une fois la base de données créée, on procède à l'installation de Drupal 8.</p> <p>A la date d'installation, la version est Drupal 8.8.5.</p> <p>Il est maintenant fortement recommandé d'utiliser <em>composer</em> pour installer et mettre à jour Drupal.</p> <p>Sachant que même l'installation de modules utilise <em>composer</em>, c'est la solution que j'ai utilisé. C'est d'ailleurs très pratique quand on refaire plusieurs fois la même installation, puisqu'une fois le fichier _composer.json _ généré, il est possible de s'en resservir.</p> <p>Mon fichier comprend les modules suivants :</p> <pre> <code>"repositories": [ { "type": "composer", "url": "https://packages.drupal.org/8" } ], "require": { "composer/installers": "^1.2", "drupal/colorbox": "^1.4", "drupal/core-composer-scaffold": "^8.8", "drupal/core-project-message": "^8.8", "drupal/core-recommended": "^8.8", "drupal/honeypot": "^1.30", "drupal/pathauto": "^1.6", "drupal/tagclouds": "^1.0", "drupal/token": "^1.6", "drupal/xmlsitemap": "^1.0@RC", "drush/drush": "^10.2" }, </code></pre><p>On remarquera que <em>drush</em> est installé en même temps que Drupal.</p> <p>Une fois le répertoire d'installation créé, et le fichier <em>composer.json</em> copié dans ce répertoire, l'installation se fait simplement :</p> <pre> composer install</pre><p>A ce niveau, on peut déjà accéder au nouveau site (il faut auparavant avoir paramétré le virtualhost qui pointe sur le bon répertoire), entrer les paramètres de la base de données. J'ai personnellement choisi d'installer uniquement le français, car je ne vais pas gérer le multilingue.</p> <p>Comme le site sera migré, on peut s'arrêter avant la configuration du site.</p> <p>L'étape suivante est de préparer et lancer la migration.</p> <p> </p> <p> </p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/vincentl" typeof="schema:Person" property="schema:name" datatype="">vincentl</span></span> <span class="field field--name-created field--type-created field--label-hidden">dim 19/04/2020 - 12:45</span> <div class="field field--name-field-categorie field--type-entity-reference field--label-above"> <div class="field__label">Catégorie</div> <div class="field__item"><a href="/cat%C3%A9gorie/cms" hreflang="fr">CMS</a></div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tag</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/1" hreflang="fr">Drupal</a></div> </div> </div> <section class="field field--name-comment-node-book field--type-comment field--label-hidden comment-wrapper"> <h2 class="title comment-form__title">Ajouter un commentaire</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=203&amp;2=comment_node_book&amp;3=comment_node_book" token="xD-sOgwyT6pbo6nlI2ZTcPkiu5rO3q8ptqPnaVjYMI0"></drupal-render-placeholder> </section> Sun, 19 Apr 2020 10:45:31 +0000 vincentl 203 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/processus-migration-vers-drupal-8#comments Problème de démarrage LXC sur device Btrfs https://www.vincentliefooghe.net/content/probl%C3%A8me-d%C3%A9marrage-lxc-sur-device-btrfs <span property="dc:title" class="field field--name-title field--type-string field--label-hidden">Problème de démarrage LXC sur device Btrfs</span> <span rel="sioc:has_creator" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">Vincent</span></span> <span property="dc:date dc:created" content="2020-04-15T09:04:12+00:00" datatype="xsd:dateTime" class="field field--name-created field--type-created field--label-hidden">mer 15/04/2020 - 11:04</span> Wed, 15 Apr 2020 09:04:12 +0000 Vincent 201 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/probl%C3%A8me-d%C3%A9marrage-lxc-sur-device-btrfs#comments IBM Directory Server : gestion des mots de passe https://www.vincentliefooghe.net/content/ibm-directory-server-gestion-des-mots-passe <span property="dc:title" class="field field--name-title field--type-string field--label-hidden">IBM Directory Server : gestion des mots de passe</span> <div property="content:encoded" class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>L'installation par défaut de l'annuaire ISDS ne semble pas "terminée" en ce qui concerne la gestion des mots de passe : pas de politique de mot de passe par défaut, pas d'activation non plus. Et une modification par <em>ldapmodify</em> stocke le mot de passe en clair (tout au moins, il ressort en clair dans un <em>ldapsearch</em>).</p> <h2>Autoriser le changement de mot de passe par l'utilisateur</h2> <p>Par défaut, l'utilisateur ne peut pas modifier lui-même son mot de passe. Par exemple, en utilisant la commande <em>ldapchangepwd</em> renvoie une erreur :</p> <pre> /opt/ibm/ldap/V6.3/bin/ldapchangepwd -D uid=jdoe,ou=people,o=example.com -w secret -n SuperSecret ldap_simple_bind: Error, Password must be changed after reset changing password for entry uid=jdoe,ou=people,o=example.com Insufficient access --- Error, Password may not be modified</pre><p>Pour résoudre ce problème, il faut :</p> <ul> <li>ajouter une ACL permettant le changement de mot de passe en mode "Self"</li> <li>permettre le changement de mot de passe par l'utilisateur lui-même dans la politique de mot de passe (qu'il faut créer)</li> </ul> <h3>Ajout d'une politique de mot de passe par défaut</h3> <p>On va créer un fichier LDIF qui contient la définition de la politique globale :</p> <pre> dn: cn=pwdpolicy,cn=ibmpolicies objectclass: container objectclass: pwdPolicy objectclass: ibm-pwdPolicyExt objectclass: ibm-pwdGroupAndIndividualPolicies objectclass: top cn: pwdPolicy pwdAttribute: userPassword pwdGraceLoginLimit: 0 pwdLockoutDuration: 0 pwdFailureCountInterval: 0 passwordMaxRepeatedChars: 0 passwordMaxConsecutiveRepeatedChars: 0 pwdMaxAge: 0 pwdMinAge: 0 pwdExpireWarning: 0 passwordMinAlphaChars: 0 passwordMinOtherChars: 0 passwordMinDiffChars: 0 pwdLockout: false pwdAllowUserChange: true pwdMustChange: true pwdSafeModify: false ibm-pwdGroupAndIndividualEnabled: false ibm-pwdPolicy: true pwdCheckSyntax: 1 pwdInHistory: 5 pwdMaxFailure: 3 pwdMinLength: 6</pre><p> </p> <p>Le fichier sera ensuite ajouté à l'annuaire via <em>ldapadd</em> avec un compte administrateur.</p> <h3>Ajout d'une ACL permettant le changement</h3> <p>On va également ajouter une ACL sur l'arborescence qui contient les comptes</p> <pre> dn: ou=people,o=example.com changetype: modify add: aclentry aclentry: access-id:CN=THIS:at.userPassword:rwsc:normal:rsc</pre><p>Et on l'ajoute avec un <em>ldapmodify</em></p> <p>Suite à cela, la modification du mot de passe fonctionne correctement, par l'utilisateur lui-même.</p> <pre> /opt/ibm/ldap/V6.3/bin/ldapchangepwd -D uid=jdoe,ou=people,o=example.com -w secret -n SuperSecret changing password for entry uid=jdoe,ou=people,o=example.com</pre><p>Par contre, si on récupère avec un ldapsearch, la valeur est renvoyée en clair...</p> <pre> /opt/ibm/ldap/V6.3/bin/ldapsearch -D uid=jdoe,ou=people,o=example.com -w SuperSecret -b o=example.com uid=jdoe userpassword uid=jdoe,ou=people,o=example.com userpassword=SuperSecret</pre><h2>Modifier l'algorithme d'encryption</h2> <p>Par défaut, les mots de passe sont chiffrées avec l'algorithme AES256, qui est symétrique. Du coup, le mot de passe est décodé par le moteur de l'annuaire avant d'être affiché.</p> <p>Il vaut mieux donc utiliser un algorithme asymétrique type SSHA ou SHA2-x.</p> <pre> dn: cn=configuration changetype: modify replace: ibm-slapdPwEncryption ibm-slapdPwEncryption: ssha</pre><p>Si on redémarre l'annuaire (ou si on utilise la commande <em>idsldapexop</em>), on voit que le mot de passe est alors stocké de manière irréversible.</p> <pre> /opt/ibm/ldap/V6.3/bin/ldapchangepwd -D uid=jdoe,ou=people,o=example.com -w SuperSecret-n Pa55word changing password for entry uid=jdoe,ou=people,o=example.com /opt/ibm/ldap/V6.3/bin/ldapsearch -D uid=jdoe,ou=people,o=example.com -w SuperSecret -b o=example.com uid=jdoe userpassword uid=jdoe,ou=people,o=example.com userpassword={SSHA}4EqpfNQFq1aWqT+ouD5bEKFPyrIiFSd7AEQORENiet0xYiqgJLi73Q==</pre><h2>Import de mots de passe hachés</h2> <p>Si on migre les données d'un autre annuaire, via un fichier LDIF par exempe, avec un mot de passe chiffré dans un autre algorithme, ITDS utilise alors cet algorithme, et pas celui défini par défaut.</p> <p><strong>Attention</strong>, si on a activé l'option <em>pwdMustChange</em>, dans la politique de mot de passe, l'utilisateur sera obligé de modifier son mot de passe à la première connexion.</p> <p>Ce paramètre est dynamique, on peut donc le repasser à False si nécessaire.</p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> </div> <span rel="sioc:has_creator" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/vincentl" typeof="schema:Person" property="schema:name" datatype="">vincentl</span></span> <span property="dc:date dc:created" content="2020-04-13T15:42:22+00:00" datatype="xsd:dateTime" class="field field--name-created field--type-created field--label-hidden">lun 13/04/2020 - 17:42</span> <div class="field field--name-field-categorie field--type-entity-reference field--label-above"> <div class="field__label">Catégorie</div> <div class="field__item"><a href="/cat%C3%A9gorie/iam" hreflang="fr">IAM</a></div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tag</div> <div class="field__items"> <div class="field__item"><a href="/tags/itds" hreflang="fr">itds</a></div> <div class="field__item"><a href="/tags/ibm" hreflang="fr">ibm</a></div> <div class="field__item"><a href="/tags/ldap" hreflang="fr">ldap</a></div> </div> </div> <section class="field field--name-comment-node-blog field--type-comment field--label-hidden comment-wrapper"> <h2 class="title comment-form__title">Ajouter un commentaire</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=200&amp;2=comment_node_blog&amp;3=comment_node_blog" token="CguhFyApblCiIABXQL6ywDk-91Pf663FSaAfAxz5ikg"></drupal-render-placeholder> </section> Mon, 13 Apr 2020 15:42:22 +0000 vincentl 200 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/ibm-directory-server-gestion-des-mots-passe#comments Connexion OpenIDM / AD SSL https://www.vincentliefooghe.net/content/connexion-openidm-ad-ssl <span property="dc:title" class="field field--name-title field--type-string field--label-hidden">Connexion OpenIDM / AD SSL </span> <div property="content:encoded" class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><em>De l'importance d'utiliser un nom de serveur correspondant au CN du certificat...</em></p> <h2>Contexte</h2> <p>Afin de pouvoir tester la connexion d'un OpenIDM sur un serveur AD (et par la suite la mise en place du plugin de synchronisation de mot de passe) j'ai mis en place une maquette simple avec :</p> <ul> <li>un serveur OpenIDM sous CentOS</li> <li>un serveur AD sous Windows 2008R2</li> </ul> <p>J'ai mis en place un certificat sur le serveur AD, qui est aussi le contrôleur de domaine principal, avec un certificat qu'il a généré.</p> <p>J'ai importé le certificat dans le Keystore OpenIDM, comme pour toute connexion sécurisée.</p> <h2>Problème</h2> <p>Mais cependant, impossible d'avoir une connexion opérationnelle. La connexion en LDAPS ne fonctionne pas (port 636 / ssl = "true"), alors qu'elle est opérationnelle en LDAP (port 389 / ssl="false")</p> <p>Au démarrage, on trouve ceci dans les logs :</p> <pre>SEVERE: OpenICF connector test of SystemIdentifier{ uri='system/AD/'} failed! org.identityconnectors.framework.common.exceptions.ConnectionFailedException: javax.naming.CommunicationException: mytest-dc.local:636 [Root exception is java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)] </pre><p>Même chose en testant via une requête REST :</p> <pre>http://engine.local:8180/openidm/system/AD/?_action=test Caused by: javax.naming.CommunicationException: mytest-dc.local:636 [Root exception is java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)] </pre><h2>Cause et résolution</h2> <p>Au final, il s'agissait d'un problème de nom DNS. En effet, le serveur AD a son propre nom DNS, et ce n'est pas celui que j'utilisais dans ma connexion (mytest-dc.local).</p> <p>Les logs me donnaient bien une piste :</p> <pre>WARNING: Resource exception: 500 Internal Server Error: "javax.naming.CommunicationException: simple bind failed: lyreco-dc.local:636 [Root exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching lyreco-dc.local found.]" </pre><p>J'ai donc modifié le fichier <em>conf/boot/boot.properties</em> pour positionner le nom de machine égal au CN du certificat du serveur, que l'on peut récupérer avec la commande suivante :</p> <pre>openssl x509 -in adldaps.pem -noout -text |grep Subject Subject: CN=<strong>WIN-RLQ30AF9URF.group.id-num.com</strong> Subject Public Key Info: X509v3 Subject Key Identifier: X509v3 Subject Alternative Name:</pre><p>Une fois le paramétrage du nom effectué, et après avoir modifié mon fichier /etc/hosts pour que mon serveur OpenIDM arrive à faire le lien entre l'adresse IP et le nom, tout est allé beaucoup mieux.</p> <p>Pour que la modification soit prise en compte, il a fallu redémarrer OpenIDM (puisque mon paramétrage se trouve dans le fichier boot.properties).</p> <p>Il a également fallu que je passe par la console d'admin, et que je valide la connexion AD pour que cela soit opérant.</p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> </div> <span rel="sioc:has_creator" class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/vincentl" typeof="schema:Person" property="schema:name" datatype="">vincentl</span></span> <span property="dc:date dc:created" content="2019-11-11T14:17:56+00:00" datatype="xsd:dateTime" class="field field--name-created field--type-created field--label-hidden">lun 11/11/2019 - 15:17</span> <div class="field field--name-field-categorie field--type-entity-reference field--label-above"> <div class="field__label">Catégorie</div> <div class="field__item"><a href="/cat%C3%A9gorie/iam" hreflang="fr">IAM</a></div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tag</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/3" hreflang="fr">openidm</a></div> <div class="field__item"><a href="/tags/active-directory" hreflang="fr">active directory</a></div> <div class="field__item"><a href="/tags/ssl" hreflang="fr">ssl</a></div> </div> </div> <section class="field field--name-comment-node-blog field--type-comment field--label-hidden comment-wrapper"> </section> Mon, 11 Nov 2019 14:17:56 +0000 vincentl 199 at https://www.vincentliefooghe.net https://www.vincentliefooghe.net/content/connexion-openidm-ad-ssl#comments