Vous n'êtes pas identifié(e).

#1 12/01/2011 13:33:37

peyo
Membre

Gestion de droits sur un user public

Bonjour,
J'ai installé pg sur un serveur spatialisé par postgis. Tout fonctionne très bien, le serveur rend plusieurs milliers d'objets vectoriels à distance de manière très fluide, c'est génial.

Maintenant je souhaite ouvrir le service au public, c'est là que je bloque, mes connaissances en administration de droits étant nulles.

Ce que je voudrais : créer un utilisateur "anonyme" ayant :

- les droits select et connect sur la base qui s'appelle "ressources_publiques"
- limiter le nombre de connexions simultanées à 10 pour ce role
- mettre fin à la connexion après deux heures d'innactivité pour ce user (est-ce possible ?)

Mais je n'y arrive pas ...

avec pgadmin j'ai crée un role de connexion "anonyme" ça c bon, je peux me connecter à la base, mais je ne vois rien...

j'ai essayé

GRANT SELECT ON DATABASE ressources_publiques TO anonyme
GRANT SELECT ON DATABASE ressources_publiques TO GROUP anonyme

dans psql en tant que user postgres mais ça ne fonctionne pas.

A titre d'information, j'ai deux bases sur le serveur :
la base postgres (celle là à priori le user anonyme n'a pas à y toucher)
la base ressources_publiques
cette dernière contient deux shémas :
- irennes (qui contient les tables georeferencées)
- public (qui contient les fonctions de spatialisation comme le calcul de surface sur les objets etc...)

Je pense que mon pg_hba.conf est bon, j'ai tout ouvert pour tous les users depuis l'ip du poste à partir duquel je me connecte. j'a pas d'erreurs de ce coté là.

Merci de l'aide que vous pouvez m'apporter.

peyo

(pg 8.3.12 sous debian lenny)

Dernière modification par peyo (12/01/2011 13:41:26)

Hors ligne

#2 12/01/2011 14:40:09

Marc Cousin
Membre

Re : Gestion de droits sur un user public

Le privilège SELECT est un privilège de table, pas de base. Sur une base, c'est grant connect qu'on peut donner (ou révoquer en fait, puisque tout le monde a ce grant par défaut). Pour le privilège SELECT, vous devrez le faire table par table.

Pour limiter le nombre de connexions par un utilisateur, c'est dans ALTER USER que vous trouverez la solution.

Il y a aussi des GRANT à faire sur les schemas, et mettre ces schemas dans le search_path.

Désolé, c'est un peu expéditif, mais je n'ai pas pour le moment le temps de vous en dire plus smile


Marc.

Hors ligne

#3 12/01/2011 17:23:44

peyo
Membre

Re : Gestion de droits sur un user public

ok merci, vu, faut le faire à la mano...

voici donc un script bash qui donne des droits de SELECT à un user pour de multiples tables d'un schéma dans mabase

#!/bin/bash                                                                                                 

# update des droits du user anonyme sur le schema mon_shema de mabase                                                 
for table in `echo "SELECT relname FROM pg_stat_all_tables WHERE schemaname='mon_shema';" | psql mabase | grep -v "pg_" | grep "^ "`;
do
    echo "GRANT SELECT ON TABLE mon_shema.$table TO anonyme;"
    echo "GRANT SELECT ON TABLE mon_shema.$table TO anonyme;" | psql mabase
done

# REVOKE                                                                                                   
#for table in `echo "SELECT relname FROM pg_stat_all_tables WHERE schemaname='mon_shema';" | psql mabases | grep -v "pg_" | grep "^ "`;
#do                                                                                                         
#    echo "REVOKE ALL PRIVILEGES ON mon_shema.$table FROM anonyme CASCADE;"
#    echo "REVOKE ALL PRIVILEGES ON mon_shema.$table FROM anonyme CASCADE;" | psql mabase       
#done

Dernière modification par peyo (12/01/2011 17:25:35)

Hors ligne

#4 12/01/2011 17:48:13

gleu
Administrateur

Re : Gestion de droits sur un user public

Merci pour le partage de ce script.

Je m'étonne de l'utilisation de la vue système pg_stat_all_tables pour ça. Surtout qu'elle contient aussi des objets systèmes. Il est certainement mieux d'utiliser cette requête :

select n.nspname||'.'||c.relname
from pg_class c, pg_namespace n
where c.relnamespace=n.oid
  and n.nspname = 'le_schema'
  and c.relkind='r';

ou pour tous les schémas utilisateurs :

select n.nspname||'.'||c.relname
from pg_class c, pg_namespace n
where c.relnamespace=n.oid
  and n.nspname <> 'pg_catalog'
  and n.nspname <> 'information_schema'
  and n.nspname !~ '^pg_toast'
  and c.relkind='r';

Et je vois votre grep qui a certainement pour but de ne conserver que les lignes de résultats. Utilisez plutôt les options -At. Par exemple :

export REQUETE="select n.nspname||'.'||c.relname from pg_class c, pg_namespace n where c.relnamespace=n.oid and n.nspname <> 'pg_catalog' and n.nspname <> 'information_schema' and not n.nspname  ~ '^pg_toast' and c.relkind='r'"
psql -At -c "$REQUETE" yang
public.counters
public.services

Guillaume.

Hors ligne

#5 12/01/2011 17:51:51

gleu
Administrateur

Re : Gestion de droits sur un user public

Pour infos, j'ai modifié trois fois le message ci-dessus, donc ne pas hésiter à relire si vous avez été plus rapide que moi.


Guillaume.

Hors ligne

#6 13/01/2011 11:00:30

peyo
Membre

Re : Gestion de droits sur un user public

Merci je regarde ça attentivement. Pourquoi est-ce ennuyeux de passer par une vue ? le filtre sur le schema rend les bonnes tables. Sympa le coup du -At ça va m'éviter un paquet de filtres.
J'ai encore du mal avec le langage , quand vous écrivez
from pg_class c
c devient un alias de pg_class ?

Hors ligne

#7 13/01/2011 11:11:42

gleu
Administrateur

Re : Gestion de droits sur un user public

Pourquoi est-ce ennuyeux de passer par une vue ?

Le problème n'est pas de passé par une vue. Le problème est de faire appel à une table de statistiques qui est vide ou pas à jour si le collecteur de statistiques est désactivé. Autant accéder directement à l'information réelle, qui se trouve dans la table pg_class.

quand vous écrivez "from pg_class c", c devient un alias de pg_class ?

Oui, c'est cela.


Guillaume.

Hors ligne

#8 18/01/2011 15:30:36

peyo
Membre

Re : Gestion de droits sur un user public

Bonjour, voici une version moins sale pour mettre à jour des droits de visualisation :

#!/bin/bash

# Le script doit être exécuté en tant que user postgres

# Donne des droits en lecture seule à un utilisateur sur 
# les schemas publics d'une base de donnée postgres. Les 
# droits sont limités à la visualisation des tables
# publiques de la base ( lecture seule : SELECT ).

USERNAME="mon_user"
DATABASENAME="ma_db"
MAXCONNECTIONS="15"
PSQL="/usr/lib/postgresql/8.3/bin/psql"

# Mise à jour des droits sur les schemas

REQUETE="select n.nspname
from pg_namespace n
where n.nspname <> 'pg_catalog'
  and n.nspname <> 'information_schema'
  and n.nspname !~ '^pg_toast'
  and n.nspname <> 'pg_temp_1';"

for schema in `$PSQL -At -d $DATABASENAME -c "$REQUETE"`
do
    $PSQL -a -d $DATABASENAME -c "GRANT USAGE ON SCHEMA $schema TO $USERNAME"
done

# Mise à jour des droits sur les tables

REQUETE="select n.nspname||'.'||c.relname
from pg_class c, pg_namespace n
where c.relnamespace=n.oid
  and n.nspname <> 'pg_catalog'
  and n.nspname <> 'information_schema'
  and n.nspname !~ '^pg_toast'
  and c.relkind='r';"

for table in `$PSQL -At -d $DATABASENAME -c "$REQUETE"`
do
    $PSQL -a -d $DATABASENAME -c "GRANT SELECT ON TABLE $table TO $USERNAME;"
done

# Nombre de connections autorisées

$PSQL -a -d $DATABASENAME -c "ALTER USER $USERNAME CONNECTION LIMIT $MAXCONNECTIONS;"

Hors ligne

Pied de page des forums