MTES-MCT / asgard-postgresql

ASGARD. Système de gestion des droits pour PostgreSQL.
https://snum.scenari-community.org/Asgard/Documentation/co/SiteReference.html
Other
2 stars 3 forks source link

Compatibilité avec passwordcheck #13

Closed alhyss closed 6 days ago

alhyss commented 11 months ago

Lorsque le module passwordcheck est actif sur le serveur, la première tentative d'activation d'Asgard v1.4.0 se solde par l'erreur suivante :

CREATE EXTENSION asgard ;
ERREUR:  password must not contain user name
CONTEXTE : instruction SQL « CREATE ROLE "consult.defaut" WITH
            LOGIN
            PASSWORD 'consult.defaut'
            NOSUPERUSER
            INHERIT
            NOCREATEDB
            NOCREATEROLE
            NOREPLICATION
            NOBYPASSRLS »
fonction PL/pgSQL inline_code_block, ligne 100 à instruction SQL

Il n'y a pas d'erreur si le rôle "consult.defaut" existe déjà, Asgard ne tentant alors pas de le recréer.

    -- Role: "consult.defaut"

    IF NOT 'consult.defaut' IN (SELECT rolname FROM pg_catalog.pg_roles)
    THEN

        CREATE ROLE "consult.defaut" WITH
            LOGIN  
            PASSWORD 'consult.defaut'
            NOSUPERUSER
            INHERIT
            NOCREATEDB
            NOCREATEROLE
            NOREPLICATION
            NOBYPASSRLS ;

        COMMENT ON ROLE "consult.defaut" IS 'Rôle de connexion générique pour la consultation des données publiques. Membre de g_consult.' ;

    END IF ;
alhyss commented 11 months ago

Solution palliative : créer manuellement le rôle "consult.defaut" avant la première activation d'Asgard sur une base du serveur.

CREATE ROLE "consult.defaut" LOGIN PASSWORD '1*MotDePasseAssezRobuste' ;
CREATE EXTENSION asgard ;

Dans la prochaine version d'Asgard, on pourrait imaginer soit durcir le mot de passe du rôle "consult.defaut" d'une manière générale, soit uniquement quand passwordcheck est actif, en procédant par exemple de la manière suivante :

    -- Role: "consult.defaut"

    IF NOT 'consult.defaut' IN (SELECT rolname FROM pg_catalog.pg_roles)
    THEN
        IF NOT (
            SELECT setting ~ '^(.*,\s*)passwordcheck\s*,' 
                FROM pg_settings
                WHERE name = 'shared_preload_libraries'
        )
        THEN
            CREATE ROLE "consult.defaut" WITH
                LOGIN  
                PASSWORD 'consult.defaut'
                NOSUPERUSER
                INHERIT
                NOCREATEDB
                NOCREATEROLE
                NOREPLICATION
                NOBYPASSRLS ;
        ELSE
            CREATE ROLE "consult.defaut" WITH
                LOGIN  
                PASSWORD '1*MotDePasseAssezRobuste'
                NOSUPERUSER
                INHERIT
                NOCREATEDB
                NOCREATEROLE
                NOREPLICATION
                NOBYPASSRLS ;
        END IF ;

        COMMENT ON ROLE "consult.defaut" IS 'Rôle de connexion générique pour la consultation des données publiques. Membre de g_consult.' ;

    END IF ;
alhyss commented 6 days ago

consult.defaut est désormais créé avec le mot de passe 'AccèsDonnéesPubliques' qui est visiblement acceptable du point de vue de passwordcheck. Si le rôle existe déjà, son mot de passe ne sera pas automatiquement modifié. Un changement manuel pourra être nécessaire en cas de migration sur un serveur où le module passwordcheck est activé.