Obsah

Jednoduchý hostingový server

Rád bych popsal konfiguraci pro malý hostingový server, kterou jsem nedávno vymyslel. Apache2, Postfix, Dovecot a vsftp – žádný LDAP, SQL nebo ISPAdmin a podobné nesmysly. Není to kompletní howto návod copy&paste, spíše nasměrování, jak se to dá řešit.

Uživatelé

Bylo potřeba mít „virtuální“ domény, které bylo třeba omezovat na velikost dat. K tomuto jsem použil přirozeně diskové kvóty, které na svazku /home. Potřeboval jsem, aby se omezovala velikost na doménu za www prostor i poštu (tedy například 10 GB na www + pošta). Proto jsem mé řešení navrhl tak, že každá doména bude mít jednoho uživatele v systému.

Pro každou doménu tedy vytvořím systémového uživatele (přirozeně se zablokovaným shellem). Jména uživatelů musí být ve formátu domena.cz. Vytvoří se zároveň domovský adresář, ve kterém pomocí /etc/skel šablony vytvořím dva přednastavené adresáře: mails a web. A také jeden soubor hesla-posta.txt (vizte níže). Adresář skel může vypadat nějak takto:

# ll
total 20
-rw-r--r-- 1 root root  257 Jun 15 10:20 hesla-posta.txt
drwxr-xr-x 2 root root 4096 Jun 12 16:13 mails
drwxr-xr-x 3 root root 4096 Jun 12 16:22 web

# cat hesla-posta.txt

#
# Soubor s hesly pro POP3/IMAP pristup ke schrankam pro tuto domenu
#
# Format:
# uzivatel:{typ_kodu}heslo:domena:nobody::::
#
# Heslo muzete zakodovat programem dovecotpw
#
# Priklad (nezakodovane heslo):
# franta:{plain}franta123:domena.cz:nobody::::
#

Adresáře mails a web jsou prázdné. V adresáři web můžete například vytvořit soubor www/index.html s nějakou uvítací stránkou pro doménu www.domena.cz (Funguje to!).

Můj původní nápad byl, aby v domovském adresáři měl uživatel všechno – tedy www stránky i poštu. Podíváme se, jestli se mi toho podařilo docílit.

Přístup přes FTP

Tím, že jsou to systémoví uživatelé, se řeší FTP přístup. Stačí nastavit vsftp, aby FTP konexe chrootoval do jejich domovských adresářů. Pokud chcete, můžete také zakázat viditelnost adresáře mails, aby administrátoři domény nelezli do mailových schránek ve své doméně. Tuto vlastnost umí vsftp pomocí nějaké volby (hledejte slovo „hide“ v dokumentaci). Možná by bylo vhodné adresář pojmenovat jinak, aby byl název více jedinečný a nemohlo dojít ke schování nějakého adresáře u stránek. Další možností je použít místo adresáře mails skrytý adresář .mails – hodně FTP klientů implicitně tečkové soubory schovává.

Tak jako tak, FTP přístup je hotov. Jen si dejte pozor na to, až budete něco vytvářet jako root v domovských adresářích, abyste pak nastavili vlastníka na daného uživatele – jinak by s daným souborem nešlo přes FTP dále manipulovat.

Apache

Virtuální hosting v Apachi se nastaví triviálně. Konfigurace by mohla vypadat nějak takto:

<Directory "/home/*/web/">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

# this log format can be split per-virtual-host based on the first field
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon

# include the server name in the filenames used to satisfy requests
VirtualDocumentRoot /home/%2+/web/%1

Apache pochopitelně můžete obohatit o PHP, SSL a další moduly. Pokud chcete statistiky pro jednotlivé domény zvlášť, doporučuji AWStat. Ještě popis jak to funguje pro apache-neznalé čtenáře: abyste vytvořili doménu www.firma.cz, stačí nahrát do adresáře /home/firma.cz/web/www kýžené HTML soubory.

Tak, tohle bychom měli, nyní ta zajímavější část.

Postfix

Nebudu se zde zabývat nastavením antiviru, antispamu a podobných věcí. To si můžete u dělat, jak je libo, ostatně i na mém blogu je pár zápisků na toto téma. Věnuji se výhradně řešení virtuálních schránek.

Moje řešení je triviální – je třeba nastavit Postfix tak, aby doručoval do adresářů formátu /home/domena.cz/mails/uzivatel. A dále je nutné specifikovat, pro jaké domény a jaké uživatele má Postfix přijímat. Poslední vecí, kterou bylo třeba nastavit, byly práva. Postfix musí dodržet správné uživatele (poštu pro uzivatel@domena.cz musí doručovat s právy systémového účtu domena.cz). Všech těchto věcí snadno docílíte pomocí hash tabulek (nastavení main.cf):

virtual_mailbox_domains = hash:/etc/postfix/vdomain
virtual_mailbox_base = /home
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 500
virtual_uid_maps = hash:/etc/postfix/vuid
virtual_gid_maps = static:99
virtual_alias_maps = hash:/etc/postfix/virtual

Toto napíšete na konec souboru main.cf, Postfix ve většině distribucí je přednastaven a není vůbec třeba nic měnit. Pozastavím se jen u hodnoty virtual_minimum_uid, která specifikuje minimální UID, pod kterým se vyskytují uživatelé v systému. Red Hat distribuce používají pro normální uživatele UID větší než 500, SUSE třeba 1000. Nastavte podle svého systému.

A dále virtual_gid_maps specifikuje, pod jakou skupinou se bude doručovat. Já používám skupinu nobody, tedy číslo 99 v mém systému.

Nyní ukázka souborů s hash tabulkami. Tyto soubory jsou, jak je vidno, uloženy v adresáři /etc/postfix, ale kklidně je můžete dát i jinam. Nejprve vdomain, který obsahuje seznam domén, pro které Postfix poštu přijímá:

#
# Soubor obsahuje seznam domen, pro ktere server prijima postu.
# Pro pridani domeny pouzijte skript /usr/local/sbin/vadddomain
#
# Pokud tento soubor editujete rucne, na konci editace spustte
# skript /usr/local/sbin/vreload ktery provede rebuild db a restart
#
firma.cz domain
firma2.cz domain

Soubor vmailbox obsahuje vlastní schránky, do kterých server doručuje:

#
# Soubor obsahuje virtualni schranky, co radek to jedna schranka.
# Domena musi byt nejprve zanesena v souboru vdomain!
#
# Pokud tento soubor editujete rucne, na konci editace spustte
# skript /usr/local/sbin/vreload
#
# Soubor ma format:
# uzivatel@domena domena/mails/uzivatel/
# Kazdy radek _musi_ koncit lomitkem!
#
test@firma.cz firma.cz/mails/test/

Důležitý je také soubor vuid, který nastavuje uživatele (UID čísla systémových účtů), pod kterými Postfix provádí doručení:

#
# Soubor obsahuje virtualni schranky, co radek to jedna schranka
#
# Pokud tento soubor editujete rucne, na konci editace spustte
# skript /usr/local/sbin/vreload
#
@firma.cz 501
@firma2.cz 522

Soubor virtual obsahuje aliasy (přesměrování na jiné adresy). Mít jej nemusíte, pak ale smažte nastavení v souboru main.cf v Postfixu:

#
# Soubor obsahuje aliasy (presmerovani)
#
# Pokud tento soubor editujete rucne, na konci editace spustte
# skript /usr/local/sbin/vreload ktery provede rebuild tabulek
# a reload postfixu
#
lzap@firma.cz lukas.zapletal@uplnejinde.cz

Doporučuji u Postfixu povolit zabezpečený přístup.

Skripty na přidání domény a uživatele

Napsal jsem si skripty, které automaticky přidají doménu (resp. schránku) do systému a Postfixe. Jak je vidět, server spravuji přes ssh. Skripty umístěte do /usr/local/sbin/ třeba…

Skript vreload:

#!/bin/bash
#
# Restartuje sluzby a provede rehash Postfix databazi
#
 
cd /etc/postfix
postmap vdomain
postmap virtual
postmap vmailbox
postmap vuid
/etc/init.d/dovecot reload
/etc/init.d/postfix reload
/etc/init.d/httpd reload
 
echo `date`: $0 $* >> /var/log/virtual.log

Skript vadddomain:

#!/bin/bash
#
# Prida virtualni domenu do postfixu
#
# vadddomain domena.cz
#
# Skript se zepta na heslo k systemovemu uctu (FTP pristup)
#
 
if [ -z "$1" ]; then
  echo "Pouziti: vadduser domena.cz"
  echo "Skript se zepta na heslo pro FTP pristup"
  exit 0
fi
 
if [ -d "/home/$1" ]; then
  echo "Zadana domena jiz existuje!"
  exit 1
fi
 
# systemovy uzivatel
echo "Vytvarim systemoveho uzivatele $1"
useradd -m -s /sbin/nologin $1
passwd $1
chmod 755 /home/$1
 
# vytvoreni domeny pro postfix
echo "Pridavam domenu $1 do Postfixu"
echo "$1 domain" >> /etc/postfix/vdomain
U=$(id -u $1)
echo "@$1 $U" >> /etc/postfix/vuid
 
echo "Ucet vytvoren, FTP pristup aktivni."
 
echo `date`: $0 $* >> /var/log/virtual.log
 
/usr/local/sbin/vreload

A skript vadduser:

#!/bin/bash
#
# Prida virtualni schranku a vytvori POP3/IMAP pristup
#
# vadduser domena.cz uzivatel [heslo]
#
 
if [ -z "$1" -o -z "$2" ]; then
  echo "Pouziti: vadduser domena.cz uzivatel [heslo]"
  exit 0
fi
 
# heslo nezadano -> vygenerujeme
if [ -z "$3" ]; then
  PASS=$(cat /dev/urandom | tr -cd A-Za-z0-9 | fold -w8 | head -n 1)
else
  PASS=$3
fi
 
if [ ! -d "/home/$1" ]; then
  echo "Zadana domena neexistuje!"
  exit 1
fi
 
echo "Schranka $2@$1 s heslem $PASS vytvorena"
 
# pridej uzivatele do postfixu
echo "$2@$1 $1/mails/$2/" >> /etc/postfix/vmailbox
 
# pridej uzivatele do dovecotu
echo "$2:{plain}$PASS:$1:nobody::::" >> /home/$1/hesla-posta.txt
 
echo `date`: $0 $* >> /var/log/virtual.log
 
/usr/local/sbin/vreload

Po přidání domény a virtuálního účtu se Postfix reloadne a jakmile přijde první e-mail do schránky, vytvoří se (se správnými právy) adresář (maildir) a dopis se doručí. Díky diskovým kvótám na svazku /home je zajištěno, aby jedna doména nezabrala víc, než je povoleno. Jak aktivovat diskové kvóty v systému zde popisovat nebudu. Kvótu na schránku je možné nastavit pomocí souboru maildirsize (více info na http://wiki.dovecot.org/Quota/Maildir).

Smazání schránek a účtu

Smazání jedné schránky je snadné, stačí smazat záznam z vmailbox a poté smazat i vlastní adresář s poštou a řádek v souboru s hesly. Poté je nutné provést vreload!

Smazání domény je taktéž jednoduché, nejprve vymažeme ze souboru vmailbox všechny schránky spojené s touto doménou, poté smažeme doménu z vdomain a vuid. Nakonec smažeme samotného uživatele ze systému příkazem userdel -r domena.cz a provedeme reload služeb příkazem vreload.

Dovecot

Konfigurace Dovecotu by mohla vypadat asi nějak takhle

# zapneme vsechny protokoly
protocols = imap imaps pop3 pop3s

# tady najde Dovecot schranky uzivatelu
mail_location = maildir:/home/%d/mails/%n

# cache pro hesla bych doporucil vypnout (toto je implicitni)
auth_cache_size = 0

# a hesla ke schrankam najde Dovecot v techto souborech
auth default {
  mechanisms = plain login digest-md5 cram-md5 apop
  passdb passwd-file {
    args = /home/%d/hesla-posta.txt
  }
  userdb passwd-file {
    args = /home/%d/hesla-posta.txt
  }
  # hesla cteme pod timto uctem
  user = root
  # a vytvorime autentifikacni socket pro Postfix (vizte nize)
  socket listen {
   client {
     path = /var/spool/postfix/private/auth
     mode = 0660
     user = postfix
     group = postfix
   }
  }
}

# a konecne povolime quotas na schranky
plugin {
  quota = maildir
}

SMTP AUTH

Pro odesílání pošty je nutno povolit SMTP AUTH v Postfixu (relay všem doporučuji zakázat). Nejprve jsem myslel, že budu potřebovat SASL2 knihovnu a nějak jí vnucovat hesla z textových souborů pro Dovecot. Jenže Dovecot je super, v konfiguraci výše v textu jsme vytvořili socket /var/spool/postfix/private/auth (toto je cesta v systémech Red Hat), který umožňuje autentifikovat uživatele přes databáze Dovecotu. V Postfixu tedy stačí nastavit:

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

Ostatně toto jsem popsal v mém vyčerpávajícím příspěvku již dříve.

Závěr

Takto jsem si udělal jednoduchý web/mail hostingový servřík. Manipulace s účty, nastavování kvót a ostatní věci lze dělat přes ssh. Doporučuji nainstalovat další služby, například pro DNS je výbornou kombinací MySQL+MyDNS (autoritativní), djbdns (nebo dnsmasq) jako caching server, phpMyAdmin, SquirrelMail a podobně.

Prosím, podělte se v diskusi o vaše názory, jak by se to dalo vylepšit, případně napište, jak to řešíte vy!