Authenticatie in Apache met PostgreSQL

 
09 januari 2008

Een beveiligde verbinding alleen is niet genoeg om ongenode bezoekers de toegang te ontzeggen. Daarvoor moet er ook een authenticatiesysteem opgezet worden. Hiervoor zijn vele mogelijkheden in Apache 2:

  • basic of digest htaccess files
  • mod-auth-dbd
  • mod-auth-mysql
  • mod-auth-pgsql
  • mod-auth-pam
  • mod-auth-ldap

De eerste optie maakt het beheer wat lastig met diverse files op verschillende plekken en ook zou dit betekenen dat er voor latere onderdelen een separaat systeem opgezet moet worden.

Een login op de server voor iedereen die wil inloggen leek me ook geen goed idee, dus exit pam en ldap.

Blijven over de opties via een database. Debian levert in Etch echter geen mod-auth-mysql mee, dus die viel ook al snel af. Daarna bleek dbd in Etch niet te werken, dus ook die was snel exit.

PostgreSQL is verder mijn favoriete database, dus de keus om met mod-auth-pgsql verder te gaan was niet erg moeilijk.

Om te beginnen moeten de volgende pakketten geinstalleerd worden: apt-get install postgresql-8.1 postgresql-contrib-8.1 libapache2-mod-auth-pgsql xml-core debhelper. De laatste twee zijn suggesties, het contrib pakket is nodig voor cryptografische functies die nog niet standaard in postgresql zitten. Deze moeten als eerste geactiveerd worden, voor we een database kunnen aanmaken. Doe een su – postgres en als gebruiker postgres: pgsql template1 < /usr/share/postgresql/8.1/contrib/pgcrypto.sql

Nu kan de database opgezet worden met createdb wwwauth en een gebruiker om deze te benaderen vanuit apache createuser apache2. De nieuwe gebruiker krijgt geen superuser rechten, nog mag ze nieuwe databases of rollen aanmaken.

Connect nu met de database met pgsql wwwauth en voer de volgende sql statements uit:

create table users (username varchar(32), password varchar(64), email varchar(64));
create table groups (username varchar(32), groupname varchar(32));
create table log(username varchar(32), time timestamp, uri text, ip inet);
grant select on users to apache2;
grant select on groups to apache2;
grant insert on log to apache2;
alter user apache2 with encryped password ‘secretpwd’

De tabel log is optioneel. Kies zelf iets als wachtwoord.

Om straks te kunnen testen voegen we ook alvast een gebruiker toe met de volgende sql:

insert into users values (‘testuser’, encode(digest(‘secretpwd2’,’md5’),’hex’), ‘test@test.test);
insert into groups values (‘testuser’,’test’);

Edit het bestand /etc/postgresql/8.1/main/pg_hba.conf en voeg daar de volgende regel toe: local wwwauth apache2 md5. Herstart postgresql met /etc/init.d/postgresql-8.1 restart en de database is geschikt voor gebruik.

Edit het bestand /etc/apache2/sites-available/default-ssl en voeg aan VirtualHost het volgende toe:

<Location /apache2-default/ >
AuthType Basic
# A hack to make multiple auth-methods work, See Debian BTS #399562
AuthBasicAuthoritative Off
AuthUserFile “/dev/null”
# End of hack
# default is to use a local socket, for remote servers use:
# Auth_PG_host <remoteserver>
Auth_PG_port 5432
Auth_PG_database authwww
Auth_PG_user apache2
Auth_PG_pwd secretpwd
Auth_PG_pwd_table users
Auth_PG_uid_field username
Auth_PG_pwd_field password
Auth_PG_hash_type MD5
Auth_PG_grp_table groups
Auth_PG_grp_group_field groupname
Auth_PG_grp_user_field username
# Skip the following entries if you don’t want to log
Auth_PG_log_table log
Auth_PG_log_uname_field username
Auth_PG_log_date_field time
Auth_PG_log_uri_field uri
Auth_PG_log_addrs_field ip
# For better performance and user-friendliness use:
Auth_PG_cache_passwords on

AuthName “Testing mod-auth-pgsql”
require group test
</Location>

Zorg er voor dat de module ook gebruikt wordt met a2enmod auth_pgsql. Daarna kan apache herstart worden met /etc/init.d/apache2 force-reload. Surf naar de server op https://<server> en je wordt begroet met een pop-up die vraagt om een username en wachtwoord. Met test en secretpwd2 zou je bij de pagina moeten komen.


Werken met ?
Kijk dan bij onze mogelijkheden voor starters en/of ervaren IT'ers.


Categorieën: Development

Tags: , ,