Authentification avec Pam-MySQL

Le but de cette documentation est de mettre en place une authentification SSH, FTP et PHP au travers d'une base de données MySQL. Pour cela nous allons utiliser la technologie PAM.

Création de la base MySQL

# mysql -u root -p 
  create database nss_mysql;
 
  USE nss_mysql;
 
  DROP TABLE IF EXISTS groups;
 
  CREATE TABLE groups (
    group_id int(11) NOT NULL auto_increment primary key,
    group_name varchar(30) DEFAULT '' NOT NULL,
    status        char(1) DEFAULT 'A',
    group_password varchar(64) DEFAULT 'x' NOT NULL,
    gid int(11) NOT NULL
  );                                    
 
  INSERT INTO groups VALUES (1,'users','A','x',100);
 
  DROP TABLE IF EXISTS user;
 
  CREATE TABLE user (
    user_id int(11) NOT NULL auto_increment primary key,
    user_name varchar(50) DEFAULT '' NOT NULL,
    realname varchar(32) DEFAULT '' NOT NULL,
    shell varchar(20) DEFAULT '/bin/sh' NOT NULL,
    password varchar(40) DEFAULT '' NOT NULL,
    status char(1) DEFAULT 'N' NOT NULL,
    uid int(11) NOT NULL,
    gid int(11) DEFAULT '65534' NOT NULL,
    homedir varchar(32) DEFAULT '/bin/sh' NOT NULL,
    lastchange varchar(50) NOT NULL default '',
    min int(11) NOT NULL default '0',
    max int(11) NOT NULL default '0',
    warn int(11) NOT NULL default '7',
    inact int(11) NOT NULL default '-1',
    expire int(11) NOT NULL default '-1'                           
  );
 
  DROP TABLE IF EXISTS user_group;
 
  CREATE TABLE user_group (
    user_id int(11) DEFAULT '0' NOT NULL,
    group_id int(11) DEFAULT '0' NOT NULL
  );
 
  GRANT select(user_name,user_id,uid,gid,realname,shell,homedir,status,password) on user to nss@localhost identified by 'ieopurASDF';
  GRANT select(group_name,group_id,gid,group_password,status) on groups to nss@localhost identified by 'ieopurASDF';
  GRANT select(user_id,group_id) on user_group to nss@localhost identified by 'ieopurASDF';
  GRANT select(user_name,password,user_id,uid,gid,realname,shell,homedir,status,lastchange,min,max,warn,inact,expire) on user to 'nss-shadow'@localhost identified by 'ruASDFDER';
  GRANT update(user_name,password,user_id,uid,gid,realname,shell,homedir,status,lastchange,min,max,warn,inact,expire) on user to 'nss-shadow'@localhost identified by 'ruASDFDER';
  FLUSH PRIVILEGES;

NSS-MySQL et PAM-MySQL

Installation des librairies nécessaires

# apt-get install libpam-mysql libnss-mysql

Configuration

Fichier /etc/nsswitch.conf

Modifier les lignes suivantes comme suit :

  passwd:	compat mysql
  group:	compat mysql
  shadow:	compat mysql

Fichier /etc/nss-mysql.conf

Remplir la ligne avec le mot de passe défini lors de la création de la base :

  users.db_password = ieopurASDF;

Fichier /etc/nss-mysql-root.conf

Remplir la ligne avec le mot de passe défini lors de la création de la base :

  shadow.db_password = ruASDFDER;

Puis positionner les bons droits sur le fichier /etc/nss-mysql-root.conf

chmod 600 /etc/nss-mysql-root.conf

Modifier les fichiers de configuration Pam

Les fichiers sont dans le répertoire /etc/pam.d.

common-account
  #account        required        pam_unix.so
  account sufficient      pam_unix.so
  account required        pam_mysql.so user=nss passwd=ieopurASDF db=nss_mysql table=user usercolumn=user.user_name
common-auth
  #auth   required        pam_unix.so nullok_secure
  auth    sufficient        pam_unix.so nullok_secure
  auth    required        pam_mysql.so user=nss-shadow passwd=ruASDFDER db=nss_mysql table=user usercolumn=user.user_name passwdcolumn=password crypt=1
common-password
  #password   required   pam_unix.so nullok obscure md5
  password   sufficient   pam_unix.so nullok obscure min=5 max=12 md5
  password    required      pam_mysql.so nullok user=nss-shadow passwd=ruASDFDER db=nss_mysql table=user usercolumn=user.user_name passwdcolumn=password crypt=1
common-session

</code vim>

#session        required        pam_unix.so
session sufficient      pam_unix.so
session required        pam_mysql.so user=nss passwd=ieopurASDF db=nss_mysql table=user usercolumn=user.user_name

</code>

common-session-noninteractive
  #session        required        pam_unix.so
  session sufficient      pam_unix.so
  session required        pam_mysql.so user=nss passwd=ieopurASDF db=nss_mysql table=user usercolumn=user.user_name

Ajouter un utilisateur

Insertion de l'utilisateur en base

# mysql -u root -p
  INSERT INTO nss_mysql.groups VALUES (100,'spencer','A','x',1000);
  INSERT INTO nss_mysql.user VALUES (100,'spencer','Spencer Stirling','/bin/bash','','A',1000,1000,'/home/spencer', '041406', '', '','', '', '');
  INSERT INTO nss_mysql.user_group VALUES (100,100);
  INSERT INTO nss_mysql.user_group VALUES (100,1);

Affectation à l'utilisateur d'un mot de passe

Pour cela on utilise la commande classique passwd

# passwd spencer

Création de la Home du compte crée

# cp -ax /etc/skel /home/spencer
# chown -R spencer:spencer /home/spencer

Voilà le compte est maintenant utilisable pour se connecter en SSH sur le serveur.

Configuration de Proftpd pour l'utilisation de l'authentification par PAM

Pour utiliser PAM avec Proftpd, il faut modifier le fichier de configuration de Proftpd comme suit :

  # Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
  PersistentPasswd                off
 
  # This is required to use both PAM-based authentication and local passwords
  AuthOrder                       mod_auth_pam.c* mod_auth_unix.c
 
  AuthPAM on
  AuthPAMConfig   proftpd

Relancer le proftpd, et maintenant vous pouvez vous connecter en FTP avec les utilisateurs présents dans la base de données.

Utilisation de l'authentification PAM avec Apache

Installation du package nécessaire

# apt-get install libapache2-mod-auth-pam

Ajout dans le Vhost

  <Directory /var/www/myrestrictedarea>
    AuthType Basic
    AuthName "Restricted area for My Server"
    AuthPAM_Enabled On
    Require group mygroup
  </Directory>

Puis relancer Apache

Utilisation de l'authentification PAM avec PHP

Installation du package nécessaire

# apt-get install php5-auth-pam

Copier ensuite le fichier

# cp /usr/share/doc/php5-auth-pam/examples/php /etc/pam.d/

Exemple de code

  <HTML>
  <?
  $username = $_POST['Login'];
  $password = $_POST['Password'];
  if (pam_auth($username, $password, &$error))
  {
          echo "Yeah baby, we're authenticated!";
  }
  else
  {
          echo "Error : $error";
  }
  ?>
  </HTML>