Chapitre 4. Paramétrer PostgreSQL sous Windows et GNU/Linux

Table des matières

4.1. Se procurer une distribution déjà compilée - Optionnel pour Windows -
4.2. Les variables d'environnement de PostgreSQL
4.3. Le super-utilisateur de PostgreSQL
4.3.1. Le super-utilisateur?
4.3.2. Création du super-utilisateur
4.3.3. Pouvoir accéder à la session du super-utilisateur sous DOS sans changer la session en cours
4.4. Initialisation de PostgreSQL: groupe de bases de données par défaut (Windows)
4.5. Initialisation de PostgreSQL: groupe de bases de données par défaut (GNU/Linux)
4.6. Autoriser les connexions TCP/IP et Démarrer/Arrêter le serveur
4.6.1. Autoriser les connexions TCP/IP
4.6.2. Méthode 1: Démarrage/Arrêt manuel
4.6.3. Méthode 2: Démarrage/Arrêt automatique pour Windows
4.6.4. Méthode 2: Démarrage/Arrêt automatique pour GNU/Linux
4.7. Devenir soi-même super-utilisateur de PostgreSQL
4.8. Autoriser les machines du réseau intranet/extranet à se connecter au serveur
4.8.1. Intranet: Authentification par méthode de confiance (trusting) et connexion à toutes les bases
4.8.2. Extranet: Authentification par MD5, connexion à une seule et unique base de données pour un utilisateur unique de PostgreSQL - Optionnel -
4.9. Gestion des fichiers de logs
4.9.1. Création du répertoire pour les logs
4.9.2. Activation des paramètres

Dans les chapitre précédents des parties I et II, nous avons effectué les diverses installations nécessaires de nos outils. Afin de tirer profit de notre installation, il est maintenant temps de passer à la finalisation qui va concerner le serveur PostgreSQL. Afin que ce dernier soit fonctionnel, il est nécessaire de définir diverses variables d'environnement de PostgreSQL, de définir le super-utilisateur de PostgreSQL qui fera dans un premier temps son initialisation, d'installer le service etc...Nous verrons ces divers points en détail dans ce chapitre.

Dans le cas de l'utilisation de PostgreSQL, surtout les aspects techniques, - et surtout l'aspect traitant des rôles dans PostgreSQL englobant la notion d'utilisateur que j'avoue avoir négligé dans cette documentation faute de temps, je ne saurais trop vous conseiller la traduction de la documentation réalisée par Guillaume LELARGE, qui effectue un travail de traduction incroyable, disponible à l'adresse suivante http://traduc.postgresqlfr.org/pgsql-8.2.1-fr/

4.1. Se procurer une distribution déjà compilée - Optionnel pour Windows -

Si vous n'avez pas suivi les deux premiers chapitres pour les diverses compilations nécessaires, il vous est toujours possible de disposer d'une distribution conforme aux deux premiers chapitres. Cette distribution est disponible à l'adresse suivante

http://www.davidgis.fr/download/postgresql-8.2.1_postgis-1.2.0_geos-2.2.3_proj-4.5.0.zip

Pour être en conformité avec le début de la documentation, créez-vous le chemin PostgreSQL\8.2.1 sur votre partition C: ou D: de votre ordinateur en vérifiant que le système de fichier de la partition est du NTFS. Vous obtiendrez donc C:\PostgreSQL\8.2.1 ou D:\PostgreSQL\8.2.1. Décompressez ensuite le fichier téléchargé dans le répertoire en question.

Note

Il est possible de choisir un autre répertoire pour l'installation de la distribution. Si tel est votre choix, il faudra faire attention et adapter les commandes/instructions de la documentation au choix de répertoire que vous aurez décidé.

Pour être en conformité avec la suite de la documentation, il est aussi demandé de disposer au moins de MinGW et de Msys (voir chapitre 1)

4.2. Les variables d'environnement de PostgreSQL

Que vous soyez sous Windows XP ou Windows 2000, créez les variables d'environnement suivantes - propres à PostgreSQL -:

Exemple 4.1. Exemples de variable d'environnement sous Windows

  • PGPORT= 5432

  • PGDATA = C:\PostgreSQL\8.2.1\data

Exemple 4.2. Exemple de variables d'environnement sous GNU/Linux

  • PGPORT= 5432

  • PGDATA = /usr/local/pgsql/data

PGDATA permettra à PostgreSQL de connaître le répertoire racine des données des diverses bases [...]. . PGPORT lui dire sur quel port écouter. L'intérêt de ces variables sera vu plus tard.

Ajoutez aussi au début de votre variable PATH les chemins d'accès

Exemple 4.3. Modification de la variable d'environnement PATH pour Windows,ajout de PGDATA

PATH=C:\PostgreSQL\8.2.1\bin;C:\PostgreSQL\8.2.1\lib;(le reste de votre PATH usuel)

PGDATA=C:\PostgreSQL\8.2.1\data

Exemple 4.4. Modification de la variable d'environnement PATH, ajout de PGDATA pour GNU/linux dans /etc/bash.bashrc

...
... (en fin de fichier)
export PATH="/usr/local/pgsql/bin:$PATH"
export PGDATA="/usr/local/pgsql/data"

Cet ajout en début de votre variable PATH permettra à PostgreSQL d'accéder aux divers utilitaires accompagnant la distribution (cf. répertoire bin) mais aussi aux diverses bibliothèques - fichiers *.dll - (cf. répertoires de lib). Il sera aussi possible par la suite d'accéder aux bibliothèques de Geos et de Proj.

Figure 4.1. Exemple d'emploi de variables d'environnement de PostgreSQL 8.0.0 pour une connexion cliente. À adapter ici pour la version 8.2.1

Exemple d'emploi de variables d'environnement de PostgreSQL 8.0.0 pour une connexion cliente. À adapter ici pour la version 8.2.1

Important

Variables d'environnement lors d'une session client à un serveur distant

PostgreSQL utilise d'autres variables qui lui sont propres. Si lors d'un travail répété, vous seriez par exemple amener à vous connecter souvent au même serveur distant et à la même base sur ce serveur - à condition toutefois que votre connexion au serveur soit acceptée par ce dernier -, il vous est aussi possible de définir les variables PGUSER, PGDATABASE et PGHOST à nouveau.

SI vous accédez au serveur temporairement au travers d'une fenêtre DOS, il vous est par exemple possible de définir

set PGDATABASE=votre_base_distante
set PGHOST=IP_du_serveur
set PGPORT=port_sur_lequel_écouter
set PGUSER=utilisateur_PostgreSQL_sur_le_serveur

et d'utiliser psql le moniteur interactif de PostgreSQL pour faire vos requêtes. Nous verrons cet utilitaire au chapitre suivant.

4.3. Le super-utilisateur de PostgreSQL

Nous allons ici voir quelques règles régissant les droits avec le serveur PostreSQL puis nous créerons - si besoin est - ce super-utisateur.

4.3.1. Le super-utilisateur?

Comme nous l'énoncions, au début de ce chapitre, la prochaine étape concerne l'initialisation du répertoire qui accueillera nos futures bases de données: PGDATA. Pour l'instant, ce répertoire n'existe pas encore. Or avec PostgreSQL, seul le super-utilisateur a le droit de le créer.

Mais alors qui est ce super-utilisateur?

Ce super-utilisateur - comme première propriété - doit être un utilisateur physique de votre machine. Oui mais depuis la version 8.2.1 de PostgreSQL, les programmeurs de PostgreSQL pour des raisons de sécurité (impliquant des failles/fuites de sécurités selon les droits accordés à cet utilisateur sous Linux qui peuvent être dûe à des attaques de requêtes de type "SQL injection" par le réseau ou par une mauvaise utilisation des modules objets chargés dans les bases par de simples utilisateurs etc...) ont imposés que cet utilisateur devait avoir des droits limités sur la machine sur lequel tourne PostgreSQL.

Or, sous Windows, on distingue deux types d'utilisateurs:

  • ceux qui ont des droits administratifs - les administrateurs - ils peuvent tout faire sur la machine, installer/désintaller des logiciels, lancer des services, supprimer des utilisateurs, modifier les variables d'environnement physiques etc...

  • ceux qui ont des droits limités: ils peuvent accéder aux logiciels mise à leur disposition par les administrateurs, ne peuvent accéder à certains répertoires, etc...

Le super-utilisateur - comme seconde propriété - sera donc un utilisateur ayant des droits limités

Oui mais - comme troisième propriété - comme son titre l'indique, il sera le grand manitou, le gourou au sens de PostgreSQL de la secte des utilisateurs de PostgreSQL. Il a le droit de créer des utilisateurs, d'étendre/restreindre leur droit de lecture/modification aux bases de données du serveur. Il aura aussi le droit de leur accorder le droit de créer ou non des bases par exemple, de leur attribuer des mots de passe etc...En un mot, il aura droit de vie/mort sur ses sujets :-)

Mais ici, nous resterons dans la politique dite du "trusting". Je m'explique. Pour la suite du document je vais supposer que vous êtes administrateur sur la machine sur laquelle vous avez installé PostgreSQL et les autres outils. Nous allons demander au super-utilisateur de nous confier ses supers pouvoirs (à vous) et de faire confiance à toute machine du réseau qui se connecterait au serveur PostgreSQL sans demander de mot de passe à sa majesté.

Il ne reste donc plus en première instance qu'à créer ce fameux super-utilisateur.

4.3.2. Création du super-utilisateur

Sur votre machine, voyez si s'il n'existe pas déjà un utilisateur ayant des droits limités et possédant un mot de passe. Si ce dernier n'existe pas, créez-le. Attention, il est impératif que cet utilisateur ait des droits limités sur la machine et qu'il ait un mot de passe.

Pour faciliter la lecture des futures commandes de ce document, j'appelerais postgres le super-utilisateur de PostgreSQL et david un administrateur sous Windows - qui vous correspondra sous Windows. Sous Windows, postgres et david auront comme mot de passe empr888. Donc, pour récapituler - même si je me répète -, postgres est un utilisateur limité sous Windows et david est administrateur de la machine (vous correspondant) à qui on souhaite conférer les pouvoirs de super-utilisateur de postgres le moment venu. Vos futures commandes seront donc à modifier en fonction des spécifications ici mentionnées. Les lignes de commandes permettant de distinguer les deux fenêtres des utilsateurs commenceront par '# sous david:' (correspondant à votre session) ou bien '# sous postges :' (correspondant à la fenêtre du super-utilisateur que vous aurez plus tard). TOUTES LES COMMANDES SUIVANTES SONT A SAISIR DANS DES FENÊTRES DOS.

4.3.3. Pouvoir accéder à la session du super-utilisateur sous DOS sans changer la session en cours

Imaginons que nous soyons connectés sous Windows sous la session de david. La prochaine étape va constituer à initialiser le répertoire PGDATA. Ceci se fait en ouvrant normalement une fenêtre DOS sous la session de postgres. Pour éviter de changer de session et accéder plus facilement à cette fenêtre, ceci est possible depuis la session de david.

Pour cela, il faut utiliser la commande runas de Windows. Je sais qu'elle existe sous Windows XP mais je ne garantis pas ici son existence sous Windows 2000. L'obtention de la fenêtre en question se fait en saisissant dans une fenêtre DOS:

# sous david:
runas /user:postgres cmd

Il suffit alors comme demandé de saisir le mot de passe de postgres.

Figure 4.2. Utilisation de la commande runas

Utilisation de la commande runas

Une nouvelle fenêtre DOS appartenant à postgres devrait s'ouvrir. C'est cette fenêtre qui désignera comme nous l'avons dit '# sous postgres' maintenant

Figure 4.3. Nouvelle fenêtre DOS obtenue

Nouvelle fenêtre DOS obtenue

Avertissement

Code 850 en DOS et 1252 et Police Lucida Console - facultatif -

Certains utilitaires de PostgreSQL (psql, initdb...) que vous verrons plus tard ne sont pas adaptés aux fenêtres DOS pour afficher correctement les caractères sur huit bits. Si nous laissons l'affichage par défaut actif de la fenêtre DOS dont le code par défaut est 850, certains caractères risquent de ne pas s'afficher correctement. On risquerait par exemple d'avoir 'é' affiché sous forme de 'ù'.

Le mieux est de mettre la police en Lucida Console et de mettre le code de page de DOS en 1252. Le changement de Police peut se faire en faisant un clic-droit sur la barre bleue de la fenêtre et de choisir «Propriétés». Puis dans l'onglet «Police», cochez «Lucida Console». Dans DOS, tapez ensuite la commande suivante: cmd.exe /k chcp 1252

4.4. Initialisation de PostgreSQL: groupe de bases de données par défaut (Windows)

L'initialisation - au sens du système de fichiers - consiste à la création du (premier) groupe de vos futures bases de données par défaut. Cela va consister "à remplir" le répertoire correspondant à la variable d'environnement PGDATA de PostgreSQL qui n'existe pas encore. Elle répond aux besoins suivants. Quel encodage choisir par défaut? Quel doit être le mode de connexion par défaut? etc...Mais le reste des configurations des paramètrages du serveur peut par la suite être reprise dans les fichiers .conf de PostgreSQL.

Pour l'initialisation, il faut utiliser l'outil initdb.

Dans la fenêtre de postgres,

Exemple 4.5. Mise en place du cluster pour Windows

# sous postgres:
initdb -A trust -E SQL_ASCII

Par défaut ici, nous utiliserons le jeu d'encodage SQL_ASCII (cf . -E SQL_ASCII) et autoriserons toute personne voulant se connecter au serveur par le réseau sans demande de mot de passe (cf. -A trust).

Figure 4.4. Initialisation du groupe de bases de données pour PostgreSQL 8.0.3 (ancienne image)

Initialisation du groupe de bases de données pour PostgreSQL 8.0.3 (ancienne image)

4.5. Initialisation de PostgreSQL: groupe de bases de données par défaut (GNU/Linux)

La mise en place du cluster diffère légèrement par rapport à celle de Windows ici. Il faut avant tout commencer par créer le répertoire nécessaire au cluster. En tant que root faîtes:

Exemple 4.6. Création du répertoire pour les bases de données

mkdir /usr/local/pgsql/data
chown postgres:postgres /usr/local/pgsql/data

Note

SI vos variables PATH et PGDATA sont à jour, vous devriez à la place pouvoir saisir

mkdir $PGDATA
chown postgres:postgres $PGDATA

Maintenant, il faut se logguer en tant que postgres pour pouvoir lancer la commande de initdb

su postgres
initdb -A trust

4.6. Autoriser les connexions TCP/IP et Démarrer/Arrêter le serveur

Il existe deux types de démarrage soit par la méthode manuelle ou en paramétrant PostgreSQL en tant que service sous Windows. Voyons en détail les deux méthodes. Il vous faudra choisir l'une des deux.

4.6.1. Autoriser les connexions TCP/IP

Avant la version 7.5 devel de PostgreSQL - version qui n'existe plus aujourd'hui -, l'ancienne façon pour autoriser les connexions TCP/IP était de fournir l'option -o -i à l'outil en ligne de commande pg_ctl. Depuis la version 8.0, cette méthode a été délaissée au profit d'une autre méthode. La manière la plus élégante pour autoriser les connexions TCP/IP est de modifier le paramètre listen_addresses du fichier sous Windows c:\PostgreSQL\8.2.1\data\postgresql.conf, respectivement /usr/local/pgsql/data/postgresql.conf pour GNU/Linux.

Ouvrez ce fichier et remplacez la ligne

#listen_addresses = 'localhost' # what IP interface(s) to listen on; 

par

listen_addresses = '*' # what IP interface(s) to listen on; 

4.6.2. Méthode 1: Démarrage/Arrêt manuel

Le démarrage manuel impose que vous devez démarrer PostgreSQL à chaque démarrage physique de votre machine. Pour cela, il faut utiliser l'outil pg_ctl . Si tel est votre choix, pour démarrer PostgreSQL

# sous postgres:
pg_ctl start

Pour arrêter le serveur, il suffit de taper:

# sous postgres:
pg_ctl stop

N'oubliez que si vous choisissez cette méthode, vous devez d'abord saisir la commande donnée avec runas si vous démarrez votre machine depuis votre session habituelle (cd. david ici).

Figure 4.5. Démarrage manuel de PostgreSQL

Démarrage manuel de PostgreSQL

Figure 4.6. Arrêt manuel de PostgreSQL

Arrêt manuel de PostgreSQL

4.6.3. Méthode 2: Démarrage/Arrêt automatique pour Windows

Avec cette méthode, vous n'aurez pas besoin de vous soucier de démarrer PostgreSQL à chaque démarrage de votre machine. En effet, nous allons ici procéder à l'installation du service Windows, livré avec PostgreSQL. C'est toujours pg_ctl que nous utiliserons avec l'option register

Note

Avant de procéder à l'installation du service, dans le cas éventuel où vous auriez testé le démarrage manuel(cf pg_ctl start), assurez-vous d'avoir arrêter le serveur par la commande pg_ctl stop

4.6.3.1. Installation du service

Nous allons créer le service nommé postgresqlwin32. C'est le super-utilisateur qui doit avoir le droit sous Windows d'installer les services. Donc nous ferons depuis une fenêtre DOS de david:

# sous david:
pg_ctl register -N postgresqlwin32 -U postgres -P empr888

Le service est installé. Il faut maintenant le lancer. Ne pas oublier qu'ici «empr888» est le mot de passe de postgres.

ATTENTION AU PARE-FEU (FIREWALL): L'utilisation express de service sous Windows implique que votre logiciel de pare-feu - si vous en avez un - autorise de lancer le service sur le port 5432 (cf. PGPORT) qui est le port sur lequel PostgreSQL écoute. Avant de continuer, configurez votre logiciel de pare-feu/firewall pour qu'il autorise cette opération.

4.6.3.2. Lancer le service

cela se fait en tapant

# sous david:
net start postgresqlwin32

Figure 4.7. Installation et démarrage du service (postgresqlwin32)pour PostgreSQL

Installation et démarrage du service (postgresqlwin32)pour PostgreSQL

Rappel: ces deux états (installation et démarrage) du service ne sont à effectuer qu'une seule fois!

4.6.3.3. Désinstaller ou arrêter le service - Optionnel -

Dans les deux cas - au cas où un problème surviendrait ou pour une raison de confort (...)

  • pour arrêter le service:

    # sous david:
    net stop postgresqlwin32
  • pour désinstaller le service:

    # sous david:
    pg_ctl unregister -N postgresqlwin32

4.6.4. Méthode 2: Démarrage/Arrêt automatique pour GNU/Linux

Dans les sources de PostgreSQL, dans le sous-répertoire contrib/start-scripts/, vous trouverez un script nommé linux à partir duquel nous pouvons nous baser pour créer un script qui permettra l'instalaltion du service

4.6.4.1. Modification du script source

Je vous donne ici le conetnu de mon script pour ma propre utilisation.

Exemple 4.7. Script d'installation en service pour GNU/Linux

#! /bin/sh

# chkconfig: 2345 98 02
# description: PostgreSQL RDBMS

# This is an example of a start/stop script for SysV-style init, such
# as is used on Linux systems.  You should edit some of the variables
# and maybe the 'echo' commands.
#
# Place this file at /etc/init.d/postgresql (or
# /etc/rc.d/init.d/postgresql) and make symlinks to
#   /etc/rc.d/rc0.d/K02postgresql
#   /etc/rc.d/rc1.d/K02postgresql
#   /etc/rc.d/rc2.d/K02postgresql
#   /etc/rc.d/rc3.d/S98postgresql
#   /etc/rc.d/rc4.d/S98postgresql
#   /etc/rc.d/rc5.d/S98postgresql
# Or, if you have chkconfig, simply:
# chkconfig --add postgresql
#
# Proper init scripts on Linux systems normally require setting lock
# and pid files under /var/run as well as reacting to network
# settings, so you should treat this with care.

# Original author:  Ryan Kirkpatrick <pgsql@rkirkpat.net>

# $PostgreSQL: pgsql/contrib/start-scripts/linux,v 1.7 2004/10/01 18:30:21 tgl Exp $

## EDIT FROM HERE

# Installation prefix
prefix=/usr/local/pgsql

# Data directory [  ! ! ! LIGNE A MODIFIER  ! ! !]
PGDATA="/usr/local/pgsql/data"

# Who to run the postmaster as, usually "postgres".  (NOT "root")
PGUSER=postgres

# Where to keep a log file [  ! ! ! LIGNE A MODIFIER - A COMMENTER ! ! !]
#PGLOG="$PGDATA/serverlog"

## STOP EDITING HERE

# Check for echo -n vs echo \c
if echo '\c' | grep -s c >/dev/null 2>&1 ; then
    ECHO_N="echo -n"
    ECHO_C=""
else
    ECHO_N="echo"
    ECHO_C='\c'
fi

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# What to use to start up the postmaster (we do NOT use pg_ctl for this,
# as it adds no value and can cause the postmaster to misrecognize a stale
# lock file)

Exemple 4.8. Script d'installation en service pour GNU/Linux (suite)

DAEMON="$prefix/bin/postmaster"

# What to use to shut down the postmaster
PGCTL="$prefix/bin/pg_ctl"

set -e

# Only start if we can find the postmaster.
test -x $DAEMON || exit 0

# Parse command line parameters.
case $1 in
  start)
	$ECHO_N "Starting PostgreSQL: "$ECHO_C
	su - $PGUSER -c "$DAEMON -D '$PGDATA' &" 2>&1
	echo "ok"
	;;
  stop)
	echo -n "Stopping PostgreSQL: "
	su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
	echo "ok"
	;;
  restart)
	echo -n "Restarting PostgreSQL: "
	su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
	su - $PGUSER -c "$DAEMON -D '$PGDATA' &"  2>&1
	echo "ok"
	;;
  reload)
        echo -n "Reload PostgreSQL: "
        su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
        echo "ok"
        ;;
  status)
	su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
	;;
  *)
	# Print help
	echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
	exit 1
	;;
esac

exit 0

4.6.4.2. Installation

Pour l'installer, il faut pouvoir créer les liens symboliques pour que le service soit démarré aux bons niveaux d'éxécution. Il faut commencer par restreindre les droits sur ce fichier; En tant que root, tapez donc

chmod 744 /etc/init.d/postgresql

upda-rc.d va s'occuper de créer les divers liens symboliques attendus (toujours en tant que root)

update-rc.d postgresql defaults

Pour démarrer/arrêter le serveur, il suffira donc de saisir (toujours en tant que root)

/etc/init.d/postgresql {start|stop}

4.7. Devenir soi-même super-utilisateur de PostgreSQL

Le fait d'utiliser PostgreSQL en ayant besoin du super-utilisateur peut devenir à la longue un handicap. En effet, chaque fois que sous votre session habituelle, vous aurez envie d'utiliser les utilitaires de PostgreSQL, vous serez obligé de saisir l'option -U postgres. Le plus simple est de vous rendre super-utilisateur de PostgreSQL.

Il est vrai que je suis en contradiction avec ce que j'ai mentionné dans la section du super-utilisateur (voir seconde propriété) et que normalement vous devriez ne pas pouvoir le faire. Mais je mentionnerais ici la commande qui le permet de manière à vous simplifier la vie et pour vous éviter de trimbaler le -U postgres en question à chaque occasion rencontrée. Que Saint-PostgreSQL me pardonne !!! Le but avoué ici est d'autoriser celui qui a utilisé MinGW - qui a tout installé - de devenir super-utilisateur de PostreSQL.

Il vous suffira de saisir

# sous postgres:
createuser -s david

L'option -s permet à david non seulement de créer à son tour de nouveaux utilisateurs mais aussi de créer de nouvelles bases de données.

Voilà, vous êtes maitre absolu de votre PostgreSQL. Vous ne serez plus obligé de saisir la commande avec runas depuis votre session habituelle!

4.8. Autoriser les machines du réseau intranet/extranet à se connecter au serveur

Nous envisageons ici le cas où votre machine est le serveur PostgreSQL principal du réseau intranet. Si quelqu'un du réseau souhaite se connecter au serveur depuis un poste client, le meilleur outil que je puisse conseiller pour pouvoir administrer les bases de manière distante est d'installer sur le poste client l'outil PgAdmin qui tourne magnifiquement bien sous Windows (mais aussi linux).

Commencez par arrêter le serveur selon le mode de démarrage que vous avez choisi précédemment:

  1. MODE MANUEL:

    # sous postgres:
    pg_ctl stop
  2. MODE AUTOMATIQUE:

    # sous david:
    net stop postgresqlwin32

4.8.1. Intranet: Authentification par méthode de confiance (trusting) et connexion à toutes les bases

Déterminer le jeu de chiffrage IP de votre réseau intranet. Nous allons supposer ici que ce sera 192.168.134.X où X est un numéro quelconque du réseau. Nous allons autoriser toutes les machines du réseau à se connecter au serveur PostgreSQL.

Éditez le fichier c:\PostgreSQL\8.2.1\data\pg_hba.conf et ajoutez la ligne suivante dans ce fichier:

host    all         all         192.168.134.0    255.255.255.0          trust

Le zéro dans la chaine 192.168.134.0 est là pour dire que toute la plage du réseau disponible est autorisée.

Note

Restreinte la plage de connexions des IP au serveur:

Si on souhaite restreinte la plage des connexions clientes - par exemple pour les IP allant de 192.168.134.1 à 192.168.134.12, on peut aussi essayer

host all all 192.168.134.1/12 trust

Il suffit ensuite de redémarrer le serveur en remplaçant le mot-clé 'stop' par 'start'. Autre astuce, au lieu de démarrer le serveur, il suffit normalement de saisir pg_ctl reload pour prendre en compte les modifications apportées à ce fichier.

Du côté client, pour pouvoir se connecter, l'utilisateur pourra par exemple se connecter en précisant juste un nom de super-utilisateur de PostgreSQL du serveur ainsi que son IP:

psql -h SERVEUR_IP -U SERVEUR_USER -d BASE_DE_DONNEES ...

Si par exemple, l'hôte serveur a pour IP 192.168.134.7 et que le nom du super-utilisateur est postgres et qu'on veuille se connecter à la base mabasededonnees

psql -h 192.168.134.7 -U postgres -d mabasededonnees ...

4.8.2. Extranet: Authentification par MD5, connexion à une seule et unique base de données pour un utilisateur unique de PostgreSQL - Optionnel -

Le but ici est de créer un utilisateur normal - qui n'est pas super-utilisateur - de PostgreSQL. Celui doit pouvoir

  • se connecter à une seule base quelque soit son IP (interne ou externer au réseau);

  • se connecter à une seule et unique base de données;

  • la base de données est une base de données déjà créée par un des super-utilisateurs. Il aura le droit de modifier/accéder librement aux données déjà existantes et d'en rajouter de nouvelles. Il devient donc propriétaire de la base;

  • sur cette base, il ne pourra pas ajouter d'utilisateur supplémentaires, il lui est aussi impossible de créer des bases supplémentaires.

Dans l'attente des objectifs ci-dessus, nous savons que postgres et david - voir les sections précédentes - sont super-utilisateurs. Nous appelerons l'utilisateur en question keizer - on reconnait là les fans de Usual Suspects! LOL - et la base à laquelle il se connectera nous l'appelerons testgis. Nous supposerons donc que david a créé cette base, puisque cette base doit être déjà existante.

4.8.2.1. Création de l'utilisateur (createuser)

Pour la création de cet utilisateur, nous aurons recours à l'outil en ligne de commande createuser dont la documentation succinte est obtenue en saisissant

createuser --help

Pour les objectifs que nous visons, nous noterons les options suivantes qui nous serons utiles

  • -e: restitue à l'écran les instructions envoyées à PostgreSQL pour savoir ce que fait exactement le serveur;

  • -D: comportement par défaut de createuser pour spécifier que l'utilisateur n'est pas autorisé à créer des bases de données;

  • -R: comportement par défaut de createuser pour spécifier que l'utilisateur n'est pas autoriser à créer/ajouter des rôles supplémentaires, droit qui pourrait pû l'éléver au rang de super-utilisateur;

  • -P: appel à une invite pour pouvoir saisir le mot de passe du nouvel utilisateur;

  • -E: demande que le mot de passe soit crypté.

  • -S: le rôle ne peut pas être un super-utilisateur

Créons donc notre nouvel utilisateur avec comme mot de passer soze. Comme souvent dans le monde de GNU/Linux, au lieu de saisir la ligne suivante quand les options ne contiennent que "-unelettre"

createuser -D -e -P -E -R -S keizer

Nous saisirons plutôt

createuser -DePERS keizer

qui nous renverra en sortie sur l'écran par exemple depuis MinGW:[4]

david@OLIVIA ~
$createuser -DePERS keizer
Entrez le mot de passe pour le nouvel utilisateur : soze
Entrez-le de nouveau : soze
CREATE ROLE keizer ENCRYPTED PASSWORD 'azer' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
CREATE ROLE

L'avant-dernière ligne ci-dessus est la requête SQL envoyé au serveur et affiché par createuser. Elle confirme les droits attendus pour l'utilisateur créé (NOCREATEDB, NOCREATEUSER). Il nous faut maintenant configurer PostgreSQL pour que keizer puisse accéder à la base de données.Le paramètre LOGIN est important dans la mesure où il confirme que l'utilisateur keizer puisse se connecter à la base. En effet sans ce paramètre, keizer ne peut pas se connecter à la base.

Note

Modifier le mot de passe:

Si par la suite, on souhaite par exemple pouvoir modifier le mot de passe "soze" de keizer en "kobayashi", on pourra utiliser la requête suivante

ALTER USER keizer PASSWORD 'kobayashi';

4.8.2.2. Configuration de PostgreSQL

Le fichier pg_hba.conf est le fichier qui pilote PostgreSQL pour les connexions réseau. Éditez le fichier suivant

c:\PostgreSQL\8.2.1\data\pg_hba.conf

et ajoutez la ligne suivante dans le fichier à la fin:

host    testgis     keizer    0.0.0.0   0.0.0.0     md5

La méthode d'authentification choisie est md5 (cf. option -E de createuser). Les adresses et masques de sous-réseaux ici donnés en absolu ('0.0.0.0') autorisent à se connecter depuis l'extérieur du réseau interne, à condition que le port 5432 de PostgreSQL soit accessible depuis l'extérieur du réseau!.

Nous n'oublierons pas de faire

pg_ctl reload

pour que le serveur recharge à la volée la nouvelle configuration réseau ajoutée dans le fichier pg_hba.conf.

4.8.2.3. Accorder au nouvel utilisateur les droits d'accès aux données déjà existantes dans la base

Pour notre dernier objectif à atteindre, il nous faut rendre keizer propriétaire de la base déjà existante ainsi que des tables déjà existantes. En effet, nous rappelons à cette fin que ces dernières ont été créées par le super-utilisateur david. Ces droits sont accordés en ayant recours aux deux requêtes suivantes. david est donc propriétaire de la base et des tables déjà existantes:

  • pour la base testgis:

    ALTER DATABASE testgis OWNER TO keizer
  • pour chaque table de la base:

    ALTER TABLE table OWNER TO keizer

Pour connaître les nom des tables contenues dans la base tesgis, on peut utiliser la requête suivante:

SELECT tablename FROM pg_tables WHERE (tablename NOT LIKE 'pg_%')
AND (tablename NOT LIKE 'sql_%')

et tout en sachant que l'on peut exécuter une requête dynamiquement grâce au moniteur interactif psql (voir prochain chapitre) pour exécuter une requête:

psql -d BASE_DE_DONNEES -c "REQUETE"

Il suffit alors d'avoir recours au petit script shell suivant pour effectuer tout le travail demandé côté serveur:

# à copier dans un script par exemple altertable.sh
psql -d testgis -c "ALTER DATABASE testgis OWNER TO keizer"
psql -d testgis -c "`psql -F " " -Atd testgis -c "select 'ALTER TABLE '\
||tablename||' OWNER TO keizer;' from pg_tables where \
(tablename not like 'pg_%') and (tablename not like 'sql_%') order by tablename`"

En effet, la commande

psql -F " " -Atd testgis -c "select 'ALTER TABLE '\
||tablename||' OWNER TO keizer;' from pg_tables where \
(tablename not like 'pg_%') and (tablename not like 'sql_%') order by tablename

renvoit textuellement les requêtes suivantes

ALTER TABLE <nom_de_la_premiere_table> OWNER TO keizer;
ALTER TABLE <nom_de_la_seconde_table> OWNER TO keizer;
ALTER TABLE <nom_de_la_troisieme_table> OWNER TO keizer;
etc...

Copiez ce code dans un script nommé altertable.sh et, depuis MinGW, tapez simplement pour l'exécuter:

altertable.sh

Figure 4.8. Exemple de connexion dans PgAdmin III

Exemple de connexion dans PgAdmin III

4.9. Gestion des fichiers de logs

Garder une trace des requêtes qui ont été effectuées, par qui et sur quelle base est une des possibilités qu'offre PostgreSQL. Celà permet aussi d'archiver les commandes qui ont été effectués sur le serveur. Tout celà se paramètre depuis le fichier de configuration à savoir C:\PostgreSQL\8.2.1\data\postgresql.conf.

4.9.1. Création du répertoire pour les logs

Dans le répertoire C:\PostgreSQL\8.2.1\data, nous allons commencer par définir un sous-répertoire pour y stocker nos fichiers de log. Appelons-le data. Pour le créer, utilisez la création de répertoire usuelle sous Windows ou depuis une fenêtre DOS tapez la commande

Exemple 4.9. Création du répertoire pour les logs sous WIndows

mkdir C:\PostgreSQL\8.2.1\data\pg_log

Exemple 4.10. Création du répertoire pour les logs sous GNU/Linux

mkdir /usr/local/pgsql/data/pg_log

4.9.2. Activation des paramètres

Ouvrez maintenant le fichier postgresql.conf et rendez-vous aux alentours de la ligne 214 et activez les paramètres redirect_stderr, log_directory et log_filename:

...
...
#---------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#---------------------------------------------------------------------------

# - Where to Log -

#log_destination = 'stderr'		# Valid values are combinations of 
					# stderr, syslog and eventlog, 
					# depending on platform.

# This is used when logging to stderr:
redirect_stderr = on			# Enable capturing of stderr into log 
					# files

# These are only used if redirect_stderr is on:
log_directory = 'pg_log'		# Directory where log files are written
					# Can be absolute or relative to PGDATA
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern.
					# Can include strftime() escapes
#log_truncate_on_rotation = off # If on, any existing log file of the same 
					# name as the new log file will be
...
...

Note

Lisez donc les commentaires qui accompagnent les paramètres pour une meilleure compréhension. Lorqu'on installe PostgreSQL en prenant l'installeur fourni sur le site officiel, l'activation de ces paramètres est une option proposée par défaut.

Pour aller un peu plus loin, nous allon aussi activer des paramètres supplémentaires qui vont nous permettre de savoir qui a effectué une requête, depuis quelle IP, sur quelle base. Pour celà, rendez-vous de la ligne 298 à la ligne à la ligne 316 pour activer les paramètres log_line_prefix, log_statement et log_hostname comme suit:

  • log_line_prefix = '[UTILISATEUR=%u HOTE=%h BASE=%d HEURE=%t COMMANDE=%i]'

  • log_statement = 'all'

  • log_hostname = on

log_line_prefix = '[UTILISATEUR=%u HOTE=%h BASE=%d HEURE=%t COMMANDE=%i]'			
					# Special values:
					#   %u = user name
					#   %d = database name
					#   %r = remote host and port
					#   %h = remote host
					#   %p = PID
					#   %t = timestamp (no milliseconds)
					#   %m = timestamp with milliseconds
					#   %i = command tag
					#   %c = session id
					#   %l = session line number
					#   %s = session start timestamp
					#   %x = transaction id
					#   %q = stop here in non-session 
					#        processes
					#   %% = '%'
					# e.g. '<%u%%%d> '
log_statement = 'all'			# none, mod, ddl, all
log_hostname = on

Si vous voulez voir l'intérêt des paramètres activés ici, rallumez donc votre serveur au moins deux fois - en prenant bien sûr qu personne ne soit connecté dessus ;-) -. Regardez le contenu du sous-répertoire data en question. Effectuez quelques requêtes sur le serveur et examinez le contenu du tout dernier fichier de log.

Avertissement

Faire le ménage de temps en temps

Plus le serveur sera actif et plus le sous-répertoire en question grossira. Pensez à faire le ménage de temps en temps pour ne pas trop remplir votre sous-répertoire en mettant en place par exemple une politique d'effacement des derniers fichiers de logs qui ne sont plus utiles par exemple.



[4] On peut aussi effectuer cela depuis une fenêtre DOS