Postfix Admin konfigurace

1. Požadavky

2. Odkazy

3. Instalace Postfixadmin 2.x

Připojte se pomocí SSH k FreeBSD serveru, připojte se k vytvořenému jail, kde je již nainstalován NGINX server (jexec www tcsh) a nainstalujte Postfixadmin 2.x balíček pomocí správce balíčků pkg.

pkg update && pkg upgrade
pkg install postfixadmin2

4. Příprava SQL databáze for Postfixadmin

Připojte se k již vytvořenému jail s instalací PostgreSQL serveru (nebo nainstalujte SQL server do aktuálního jail) a vytvořte uživatele a databázi pro Postfixadmin.

su pgsql
createuser --pwprompt --encrypted --no-createrole --no-createdb postfix

psql template1
-- create group
CREATE ROLE mailman WITH USER postfix;

-- create database
CREATE DATABASE mail OWNER mailman;

-- enable crypto module for crypted passwords
\c mail
CREATE EXTENSION pgcrypto;
  • Poznámka: Nezapomeňte nastavit autentizační soubor '/mnt/sql/pgsql/data/pg_hba.conf' pro uživatele 'postfix' a znovu načíst konfiguraci PostgreSQL.

5. Nastavení Postfixadmin

Budeme upravovat soubor 'config.inc.php', kde přidáme nastavení spojení k PostgreSQL databázi.

$CONF['database_type'] = 'pgsql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'yourpassword';
$CONF['database_name'] = 'mail';

Nastavíme WWW adresu Postfixadmin instalace a výchozí e-mailové aliasy.

$CONF['postfix_admin_url'] = 'https://yourdomain.com';
$CONF['admin_email'] = 'postmaster@yourdomain.com';
$CONF['default_aliases'] = array (
    'abuse' => 'abuse@yourdomain.com',
    'hostmaster' => 'hostmaster@yourdomain.com',
    'postmaster' => 'postmaster@yourdomain.com',
    'webmaster' => 'webmaster@yourdomain.com'
);

Vybereme typ šifrování uživatelských hesel. V příkladu je použito MD5 šifrování kvůli jednoduššímu ladění v rámci kombinace Postfixadmin, Dovecot a Roundcube. Doporučuji použít lepší typ šifrování např. CRYPT-MD5, který je také podporován všemi zmíněnými aplikacemi. Protože Postfixadmin nepodporuje všechny typy šifrování, budete muset aplikovat připojený patch, který umožní použít typ šifry DES, Blowfish, SHA256 nebo SHA512.

$CONF['encrypt'] = 'md5';
  • Poznámka: Stejný typ šifrování musí být použit při konfiguraci postfix nebo dovecot!

A nakonec nastavíme v konfiguračním souboru, že konfigurace je dokončena.

$CONF['configured'] = true;

Postfixadmin nevyžaduje zápis do souborů, proto můžete nechat jako vlastníka souborů uživatele root (nebo jiného uživatele) nebo můžete nastavit vlastníka souborů stejného, jaký je použit pro web server (např. www-data nebo apache). Uživatel, nastavený pro web server, musí mít právo pro čtení těchto souborů.

6. Nastavení Postfixadmin v rámci NGINX serveru

Protože využijeme již existující instalaci NGINX serveru, bude postačující vytvořit pouze jeden nový konfigurační soubor pro Postfixadmin např. '/usr/local/etc/nginx/nginx.conf.postfixadmin'. V tomto příkladu je nastavena konfigurace WWW serveru tak, že veškeré příchoyí požadavky jsou přesměrovány na zabezpečené SSL spojení.

file /usr/local/etc/nginx/nginx.conf.postfixadmin

    server {
        listen       80;
        listen       443;
        server_name  postfix.yourdomain.com *.postfix.yourdomain.com;
        return 301   https://www.postfix.yourdomain.com$request_uri;
    }

    server {
        listen       443 ssl;
        server_name  www.postfix.yourdomain.com;
        add_header X-Frame-Options DENY;

        ssl                  on;
        ssl_certificate      /usr/local/etc/nginx/ssl/postfix.crt;
        ssl_certificate_key  /usr/local/etc/nginx/ssl/postfix.key;

        root /usr/local/www/postfixadmin;
        index index.php index.html index.htm;

        access_log /var/log/postfixadmin_access.log;
        error_log  /var/log/postfixadmin_error.log;

        error_page 404 /404.html;

        include /usr/local/etc/nginx/nginx.conf.php;
    }

Aktualizujte hlavní konfigurační soubor NGNIX přidáním řádky uvedené níže pře poslední uzavírací závorku '}'.

file /usr/local/etc/nginx/nginx.conf

        include /usr/local/etc/nginx/nginx.conf.postfixadmin;

SSL/TLS certifikáty se vytvoří následujícími příkazy (nebo můžete požít své vlastní SSL/TLS certifikáty).

mkdir -p /usr/local/etc/nginx/ssl/
cd /usr/local/etc/nginx/ssl/
openssl req -new -x509 -nodes -out postfix.crt -keyout postfix.key -days 3650
chmod 640 /usr/local/etc/nginx/ssl/*

A nakonec znovu načtěte NGIX konfiguraci.

service nginx reload

7. Nastavení MX domén a e-mailů v Postfixadmin

Nyní otevřete WWW prohlížeč, připojte se na adresu 'https://www.postfix.yourdomain.com/setup.php' a vytvořte uživatele administrátor. Podle instrukcí pak aktualizujte soubor 'config.inc.php'. Po aktualizaci konfiguračního souboru se můžete přihlasit jako administrátor na adrese 'https://www.postfix.yourdomain.com/' a vytvořit pomocí webového rozhraní MX domény a e-mailové adresy uživatelů podle potřeby.

8. Postfixadmin patch.

Tento patch řeší problémy s PostgreSQL SQL dotazy a přidává podporu dalších šifrovacích metod DES, Blowfish, SHA256 and SHA512. Je vytořen na základě http://sourceforge.net/p/postfixadmin/patches/121/. Změnou je pouze aktualizace u šifrování Blowfish, kdy je podporován pouze starý algoritmus.

Pro použití nových šifrovacích metod aktulizujte konfigurační soubor 'config.inc.php' nasledujícími řádky.

// php_crypt = patched functions,inc.php to support PHPs crypt() functions:
//             CRYPT_STD_DES, CRYPT_MD5, CRYPT_BLOWFISH, CRYPT_SHA256, CRYPT_SHA512
$CONF['encrypt'] = 'php_crypt';
$CONF['encrypt_php_crypt_hash'] = 'CRYPT_SHA512';

Patch nainstalujete následujícím způsobem. Vytvořte nový soubor 'functions.inc.php.patch' v adresáři '/usr/local/www/postfixadmin' s níže uvedeným obsahem a napište následující příkaz 'patch < functions.inc.php.patch' v tomto adresáři.

--- functions.inc.php.orig  2014-02-19 13:27:02.000000000 +0100
+++ functions.inc.php   2015-04-22 11:08:00.000000000 +0200
@@ -1134,6 +1134,61 @@
     return $password;
 }
 
+function random_string($characters, $length) {
+  $string = '';
+  for ($p = 0; $p < $length; $p++) {
+    // should really use a stronger randomness source
+    $string .= $characters[mt_rand(0, strlen($characters)-1)];
+  }
+  return $string;
+}
+
+function generate_crypt_salt($hash_type='CRYPT_MD5') {
+  // generate a salt (with magic matching chosen hash algorithm) for the PHP crypt() function
+
+  // most commonly used alphabet
+  $alphabet = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+
+  switch ($hash_type) {
+  case 'CRYPT_STD_DES':
+    $alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+    $length = 2;
+    $salt = random_string($alphabet, $length);
+    return $salt;
+
+  case 'CRYPT_MD5':
+    $length = 12;
+    $algorithm = '1';
+    $salt = random_string($alphabet, $length);
+    return sprintf('$%s$%s', $algorithm, $salt);
+
+  case 'CRYPT_BLOWFISH':
+    $length = 22;
+    $cost = 10;
+//    if (version_compare(PHP_VERSION, '5.3.7') >= 0) {
+//      $algorithm = '2y'; // bcrypt, with fixed unicode problem
+//    } else {
+      $algorithm = '2a'; // bcrypt
+//    }
+    $salt = random_string($alphabet, $length);
+    return sprintf('$%s$%02d$%s', $algorithm, $cost, $salt);
+
+  case 'CRYPT_SHA256':
+    $length = 16;
+    $algorithm = '5';
+    $salt = random_string($alphabet, $length);
+    return sprintf('$%s$%s', $algorithm, $salt);
+
+  case 'CRYPT_SHA512':
+    $length = 16;
+    $algorithm = '6';
+    $salt = random_string($alphabet, $length);
+    return sprintf('$%s$%s', $algorithm, $salt);
+
+  default:
+    die("unknown hash type: '$hash_type'");
+  }
+}
 
 
 /**
@@ -1181,6 +1236,30 @@
         $password = crypt ($pw, $salt);
     }
 
+    elseif ($CONF['encrypt'] == 'php_crypt') {
+      // use PHPs crypt(), which uses the system's crypt()
+      // same algorithms as used in /etc/shadow
+      // algorithm is chosen by specifying salt with correct magic
+      // tested on linux
+      if (strlen($pw_db) > 0) {
+   // salt provided. send entire password hash for crypt() to figure out
+   $salt = $pw_db;
+      }
+      else {
+   // no salt; create new password hash
+   if(isset($CONF['encrypt_php_crypt_hash'])) {
+     // user preferred crypt type
+     $salt_type = $CONF['encrypt_php_crypt_hash'];
+   } else {
+     $salt_type = 'CRYPT_MD5';
+   }
+   // get salt for preferred hash type
+   $salt = generate_crypt_salt($salt_type);
+      }
+      // send it to PHPs crypt()
+      $password = crypt($pw, $salt);
+    }
+    
     elseif ($CONF['encrypt'] == 'cleartext') {
         $password = $pw;
     }
@@ -1569,9 +1648,9 @@
     if($CONF['database_type']=='pgsql') {
         // return either true or false (unquoted strings)
         if($bool) {
-            return 't';
-        }  
-        return 'f';
+            return 'true';
+        }
+        return 'false';
     }
     elseif($CONF['database_type'] == 'mysql' || $CONF['database_type'] == 'mysqli') {
         if($bool) {

Komentáře