Ceci est une ancienne révision du document !


postfix cyrus mysql

Web-Cyradm

Ce chapitre est en cours d'actualisation. Le lecteur pourra donc rencontrer quelques incohérences en attendant la fin des travaux.

Nous utilisons une Debian Jessie, déjà pourvue de :

  1. Nginx version 1.6.2 ;
  2. php5-fpm version 5.6.29 ;
  3. MariaDB version 10.0.28.

Tout ceci est en état de marche.

Installation

Bien que cet outil ne semble plus maintenu, il reste récupérable sur le github sous la version 0.5.4-rc1:

  git clone https://github.com/web-cyradm/web-cyradm.git

Une version à peine plus récente (0.5.5) peut être récupérée ailleurs:

svn checkout svn://svn.code.sf.net/p/web-cyradm/code/branches/web-cyradm-svn-0.5.5

L'une comme l'autre de ces versions sont largement hors d'âge, mais offrent au moins une base de travail utilisable.

Création de la base

Nous retrouvons dans le répertoire scripts deux fichiers SQL qui vont (presque) nous permettre de créer la base de données MySQL.

insertuser_mysql.sql Va créer un utilisateur et une base de données pour notre système de messagerie. Il y a bien sûr quelques modifications à apporter de manière à ne pas utiliser les paramètres par défaut :

  • le nom de la base ;
  • le nom de l'utilisateur qui manipulera cette base ;
  • le mot de passe de cet utilisateur.

use mysql;
# Crée l'utilisateur et son mot de passe, sans aucun droit en général
INSERT INTO user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES ('localhost', 'mail', PASSWORD('epikoi'), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N');

# Accorde à l'utilisateur les droits nécessaires sur la base
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES ('localhost', 'mail', 'mail', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y ');
flush privileges;

# Crée la base et l'utilisateur associé
create database mail;

Nous sommes restés très imaginatifs, la base et l'utilisateur s'appellent mail, avec un mot de passe désormais classique : epikoi.

create_mysql.sql va construire les tables de la base et y mettre quelques informations vitales (rendrez-vous à la fin du script) :

# phpMyAdmin MySQL-Dump
# version 2.2.6
# http://phpwizard.net/phpMyAdmin/
# http://www.phpmyadmin.net/ (download page)
#
# Host: localhost
# Generation Time: Nov 04, 2002 at 01:44 AM
# Server version: 3.23.52
# PHP Version: 4.2.3
# Database : `mail`
# --------------------------------------------------------

#
# Table structure for table `accountuser`
#

CREATE TABLE accountuser (
  username varchar(255) binary NOT NULL default '',
  password varchar(50) binary NOT NULL default '',
  prefix varchar(50) NOT NULL default '',
  domain_name varchar(255) NOT NULL default '',
  imap int(10) NOT NULL default '1',
  pop int(10) NOT NULL default '1',
  sieve int(10) NOT NULL default '1',
  smtpauth int(10) NOT NULL default '1',
  UNIQUE KEY username (username)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `adminuser`
#

CREATE TABLE adminuser (
  username varchar(50) binary NOT NULL default '',
  password varchar(50) binary NOT NULL default '',
  type int(11) NOT NULL default '0',
  SID varchar(255) NOT NULL default '',
  home varchar(255) NOT NULL default '',
  PRIMARY KEY  (username)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `settings`
#

CREATE TABLE settings (
  `username` varchar(50) binary NOT NULL default '',
  `style` varchar(50) NOT NULL default 'default',
  `maxdisplay` int(4) NOT NULL default '15',
  `warnlevel` int(3) NOT NULL default '90',
  PRIMARY KEY  (username)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `alias`
#

CREATE TABLE alias (
  alias varchar(255) NOT NULL default '',
  dest longtext,
  username varchar(50) NOT NULL default '',
  status int(11) NOT NULL default '1',
  PRIMARY KEY  (alias)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `domain`
#

CREATE TABLE domain (
  domain_name varchar(255) NOT NULL default '',
  prefix varchar(50) NOT NULL default '',
  maxaccounts int(11) NOT NULL default '20',
  quota int(10) NOT NULL default '20000',
  domainquota int(10) NOT NULL default '0',







  transport varchar(255) NOT NULL default 'cyrus',
  freenames enum('YES','NO') NOT NULL default 'NO',
  freeaddress enum('YES','NO') NOT NULL default 'NO',
  folders varchar(255) NOT NULL default '',
  PRIMARY KEY  (domain_name),
  UNIQUE KEY prefix (prefix)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `domainadmin`
#

CREATE TABLE domainadmin (
  domain_name varchar(255) NOT NULL default '',
  adminuser varchar(255) NOT NULL default ''
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `search`
#

CREATE TABLE search (
  search_id varchar(255) NOT NULL default '',
  search_sql text NOT NULL,
  perpage int(11) NOT NULL default '0',
  timestamp timestamp(14) NOT NULL,
  PRIMARY KEY  (search_id),
  KEY search_id (search_id)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Table structure for table `virtual`
#

CREATE TABLE virtual (
  alias varchar(255) NOT NULL default '',
  dest longtext,
  username varchar(50) NOT NULL default '',
  status int(11) NOT NULL default '1',
  KEY alias (alias)
) TYPE=MyISAM;

CREATE TABLE log (
  id int(11) NOT NULL auto_increment,
  msg text NOT NULL,
  user varchar(255) NOT NULL default '',
  host varchar(255) NOT NULL default '',
  time datetime NOT NULL default '2000-00-00 00:00:00',
  pid varchar(255) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

INSERT INTO adminuser (username, password) VALUES ('admin', ENCRYPT('epikoi'));
INSERT INTO domainadmin (domain_name,adminuser) VALUES ('*','admin');
INSERT INTO accountuser (username, password) VALUES ('cyrus', ENCRYPT('epikoi'));
INSERT INTO `settings` ( `username` , `style` , `maxdisplay` , `warnlevel` ) VALUES ( 'admin', 'default', '15', '90');

ALTER TABLE `log` ADD INDEX `idx_log_user` ( `user` ); 

Dans adminuser nous plaçons ce qu'il faut pour pouvoir par la suite ouvrir une session sur web-cyradm. Le couple admin/epikoi n'a aucun rapport avec un quelconque utilisateur de la messagerie, c'est juste un « loggin » qui permet d'utiliser web-cyradm.

Dans accountuser nous créons cyrus/epikoi. Ce loggin va permettre l'administration de cyrus. Il est en principe inconnu de tous, c'est une affaire entre web-cyradm et cyrus.

Bien entendu, ces loggins sont à personnaliser avant de créer la base.

Il suffit maintenant de faire :

mysql -u root -p < insertuser_mysql.sql

pour créer l'utilisateur mail et sa base associée, puis

mysql mail -u mail -p < create_mysql.sql

pour peupler un minimum cette base.

Accès à la base

web-cyradm pouvant utiliser aussi bien MySQL que PostgreSQL, le concepteur a utilisé une couche d'abstraction (hélas obsolète aujourd'hui), mais qui est pour l'instant encore disponible, il s'agit de Pear::DB. Un :

aptitude install php-pear
pear install DB

Résoudra le problème (avec le « warning » qui va bien), si vous avez bien entendu installé ce qu'il faut pour utiliser Pear.

Configuration de web-cyradm

Il faut encore configurer l'interface. Dans /var/www/wc/config, il y a un fichier conf.php.dist, qu'il va falloir copier en conf.php et modifier quelque peu :

# The Cyrus login stuff
$CYRUS = array(
	'HOST'	=> 'localhost',
	'PORT'	=> 143,
	'ADMIN'	=> 'cyrus',
	'PASS'	=> 'epikoi'
);

/* DB_TYPE

 Possible Values are:
 o mysql
 o pgsql

 To operate a mailsystem with postgreSQL you will need a patch for
 Postfix.
 
 Other Databases need to be supported by PAM and postfix
*/

$DB = array(
	'TYPE'	=> 'mysql',
	'USER'	=> 'mail',
	'PASS'	=> 'epikoi',
	'PROTO'	=> 'unix',	// set to "tcp" for TCP/IP
	'HOST'	=> 'localhost',
	'NAME'	=> 'mail'
);

$DB['DSN'] = sprintf('%s://%s:%s@%s+%s/%s', 	$DB['TYPE'], $DB['USER'],
						$DB['PASS'], $DB['PROTO'],
						$DB['HOST'], $DB['NAME']);

# Where should web-cyradm write its log to?
$LOG_DIR = "/var/log/web-cyradm/";

/* Log level
Possible values are (from quiet to verbose):
 ERR	- only internal errors
 WARN	- failed login, security violation
 INFO	- all login and logout
 DEBUG	- all possible information
*/
$LOG_LEVEL = "INFO";

# The default timeout in seconds for a session, after that you have to login again
$SESS_TIMEOUT = 1000;

# The default quota sets the default quota for new accounts
$DEFAULT_QUOTA = 2000000;

# The default domain quota sets the quota for new domains
# 0 = No quota
$DEFAULT_DOMAIN_QUOTA = 0;

# On what quota level mark accounts on accounts list (in %)
$QUOTA_WARN_LEVEL = 90;

# Defines if passwords are encrypted or not.
# Valid Values:
#  - plain 0 No encription is used
#  - crypt 1 (shadow compatible encription)
#  - mysql 2 (MySQL PASSWORD function)
#  - md5 3 (MD5 digest)
$CRYPT = "crypt";

# web-cyradm is compatible with cyrus-imapd-2.0.16 (and earlier?)
# however, if you are using 2.1.x and wish to use email addresses 
# with .'s in them such as 'john.doe@mydomain.com' you can set this
# option DOMAIN_AS_PREFIX to '1'.  NOTE: you also have to add this
# line to your imapd.conf file:
#### imapd.conf: ####
#unixhierarchysep: yes

####
$DOMAIN_AS_PREFIX = 1;


# EXPERIMENTAL
# If you are using cyrus imap 2.2.x and wish to use usernames like
# email addresses you can set option DOMAIN_AS_PREFIX to '1' and
# FQUN to '1'. NOTE: you also have to add this lines to your
# imapd.conf file:
#### imapd.conf: ####
# unixhierarchysep: yes
# virtdomains: yes
####
$FQUN = 1;

# At the moment, web-cyradm supports two methods of password change:
# - through sql
# - poppassd
# sql is the default
$PASSWORD_CHANGE_METHOD = "sql"; 

# Turn up error reporting level. This overrides settings in your php.ini
#
# E_ALL             - All errors and warnings
# E_ERROR           - fatal run-time errors
# E_WARNING         - run-time warnings (non-fatal errors)
# E_PARSE           - compile-time parse errors
# E_NOTICE          - run-time notices (these are warnings which often result
#                     from a bug in your code, but it's possible that it was
#                     intentional (e.g., using an uninitialized variable and
#                     relying on the fact it's automatically initialized to an
#                     empty string)
# E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
# E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
#                     initial startup
# E_COMPILE_ERROR   - fatal compile-time errors
# E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
# E_USER_ERROR      - user-generated error message
# E_USER_WARNING    - user-generated warning message
# E_USER_NOTICE     - user-generated notice message

error_reporting(E_ERROR);

$VERSION="0.5.5-Beta1";

# Define reserved Emailadresses (Separated by comma):
$RESERVED="postmaster,root";

$TEMPLATE[0]="default";
$TEMPLATE[1]="green";

Nous allons utiliser cyrus 2.2 et ses possibilités natives de gestion des domaines virtuels. Il existe en effet deux possibilités pour gérer ces domaines virtuels :

  1. demander à Cyrus (2.2) de le faire lui-même. Dans ce cas, un utilisateur aura comme nom d'utilisateur son adresse e-mail complète, à la manière de Qmail-Vpopmail ;
  2. faire « à l'ancienne » avec tous les comptes dans un seul domaine, et des alias qui iront pointer dessus. Dans ce cas, l'utilisateur qui aurait par exemple l'adresse machin@chose.tld n'aurait en fait qu'un alias, pointant sur une « vraie » boîte d'adresse, disons, chose.tld-machin@domaineunique.tld et son nom d'utilisateur serait dans ce cas chose.tld-machin.

Nous choisissons la première solution.

Notre web-cyradm n'est pas encore en état de fonctionner, mais nous pouvons déjà vérifier que l'interface fonctionne : Loggin web-cyradm

Puis une fois la session ouverte : Encore vierge

A ce niveau, nous ne pouvons pas faire grand chose de plus, puisque cyrus n'est pas encore en place.