Free Software,  Linux,  Sécurity

Base de données sécurisée avec PostgreSQL et OpenSSL

  • Présentation de PostgreSQL

PostgreSQL est un outil libre et fondé par une communauté mondiale de développeurs et d’entreprises. Il permet de stocker plus de types de données que les types traditionnels entier, caractères, etc… L’utilisateur peut créer des types, des fonctions, utiliser l’héritage de type et encore d’autres fonctionnalités très intéressantes. Réputé pour sa stabilité, et son excellente compatibilité avec la norme ANSI SQL, mon choix s’est porté vers PostgreSQL par rapport aux besoins de performances des entreprises. En effet, les applications Web utilisent d’une part une base de données MySQL pour la partie front-end (les performances sont meilleures pour de petites requêtes vers une petite base de données), et d’une autre part une autre base de données PostreSQL pour les grosses requêtes sur des bases de données importantes, souvent utilisées par les applications métier.

Note : Dans ce billet, nous considérons avoir un serveur de base de données, un serveur web et un serveur d’applications séparés.

  • Installation des paquetages

Nous considérons que nous possédons déjà un système d’exploitation Debian GNU/Linux installé sur la machine.

Nous allons maintenant installer les logiciels nécessaires :

apt-get install postgresql

Il est intéressant de remarquer que les dépendances vont être automatiquement installées (grâce au système de gestion de paquets APT).

  • Configuration de PostgreSQL

Lors de l’installation, l’utilisateur «  postgres » est créé automatiquement. Par défaut, le mot de passe de cet utilisateur n’est pas connu. Par mesure de sécurité, nous allons en affecter un et nous passerons sous l’utilisateur « postgres » sans passer par l’utilisateur « root » pour exécuter les processus (et donc éviter de lui donner trop de permissions) :

passwd postgres

Pour travailler sur la base de données, il faut commencer par se connecter sous le compte de ce nouvel utilisateur :

su – postgres

Par défaut les instances se trouvent dans le répertoire /var/lib/postgresql (c’est le ~postgres). Elles sont gérées avec les wrappers en Perl pg_*cluster.

Par exemple pg_createcluster utilise en fait la commande /usr/lib/postgresql/bin/initdb -D <datadir>.

Il faut également avoir des droits corrects sur /tmp/ et d’autant plus pour PostgreSQL sans lesquels l’installation échouera complètement :

chmod 1777 /tmp

Nous allons créer notre base de données qui sera utilisée par l’application métier, mais tout d’abord, il faudra créer un utilisateur qui sera dédié à cette base de données.

# su – postgres

$ createuser dbadmin -P -D -A

$ createdb -0 dbadmin -E UNICODE DB1

Note : dbadmin sera l’utilisateur de la base de données DB1, elle même encodée en UNICODE.

Ensuite, il convient de configurer deux fichiers : pg_hba.conf et postgresql.conf.

Notons que les fichiers de configuration se trouvent dans le répertoire /etc/postgresql/8.3/main et la modification de ces derniers se font avec le super utilisateur « postgres ».

Le fichier pg_hba.conf permet de régler les permissions. Voici la syntaxe :

local DATABASE USER METHOD [OPTION]

host DATABASE USER CIDR-ADDRESS METHOD [OPTION]

hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTION]

hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTION]

La ligne « local » permettra d’être en écoute « localement » sur la machine.

Le champ « DATABASE » concerne une base de donnée précise. Ce champ peut être de valeur « all » pour toutes les bases de données, « sameuser, « samerole », ou encore un nom précis de base de données.

Le champ « USER » peut être un nom d’utilisateur précis, un nom de groupe (avec le préfixe « + ») ou une liste d’utilisateurs séparés par des « – ».

Le champ « CIDR-ADDRESS » spécifie l’adresse IP (V4 ou V6) d’un hôte ou réseau distant ainsi qu’un masque de sous-réseau.

Le champ « METHOD » énonce la méthode d’authentification.

Le champ « [OPTION] » peut être utile lors d’une authentification avec PAM par exemple.

Voici maintenant notre fichier de configuration pg_hba.conf :

local all postgres ident sameuser

hostssl BDD1 dbadmin 192.168.53.1/32 md5

Ce fichier de configuration permet à l’utilisateur « postgres » d’accéder à toutes les bases de données en local, et notre serveur d’application distant pourra accéder à la base de données BDD1, avec l’utilisateur dbadmin, avec une authentification protégée par md5. Notez que dans cette configuration, une connexion SSL est exigée pour le serveur distant. Cela évite dans le cas d’une attaque « Man-on-the-middle » qu’une personne tierce accède aux données échangées.

Ensuite, il faut modifier le fichier de configuration postgresql.conf. Voici les paramètres à modifier ou à ajouter :

listen_addresses = ‘*’

port = 5432

ssl = on

password_encryption = on

Il faudra ensuite créer un certificat pour l’échange des données clients/serveur.

Nous allons créer un certificat auto-signé, dédié à PostgreSQL :

$ cd /var/lib/postgresql/8.3/main/

$ openssl req -new -text -out server.req

$ openssl rsa -in privkey.pem -out server.key

$ openssl req -x509 -in server.req -text -key server.key -out server.crt

$ rm privkey.pem

$ chmod 600 serveur.key

Note : Ces commandes sont réalisées avec l’utilisateur « postgres ».

La clé et le certificat sont crées et protégés, nous pouvons maintenant redémarrer le service PostgreSQL :

$ /etc/init.d/postgresql-8.3 restart

Le serveur peut désormais se connecter au serveur de base de données, avec les paramètres suivants :

Hôte du serveur : 192.168.53.153

Port TCP : 5432

SSL : exigé

Base de données : BDD1

Utilisateur : dbadmin

Mot de passe : <mot de passe de l’utilisateur dbadmin>

La base de données est maintenant crée, et configurée de manière à ce que les accès y soient sécurisés.

Software Engineeer at Red Hat, Private Pilot, French guy hiding somewhere in Canada.