Root-Server mit Ubuntu 16.04: Unterschied zwischen den Versionen
Lukas (Diskussion | Beiträge) |
Lukas (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Eine neuere Version dieses Artikels steht [[Root-Server_mit_Ubuntu_16.04-Hetzner|hier]] zur Verfügung. | |||
Das aktuelle Angebot an Strato-Servern hat sich kaum geändert. Allerdings bietet Strato nun auch Ubuntu 16.04 als Betriebssystem an. Mal sehen, was sich bei der Installation so alles geändert hat. | Das aktuelle Angebot an Strato-Servern hat sich kaum geändert. Allerdings bietet Strato nun auch Ubuntu 16.04 als Betriebssystem an. Mal sehen, was sich bei der Installation so alles geändert hat. | ||
Zeile 34: | Zeile 36: | ||
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen. | Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen. | ||
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis: | |||
mkdir /var/www/htdocs | |||
mkdir /var/www/vhosts | |||
mkdir /var/www/vhosts/default | |||
mv /var/www/html /var/www/vhosts/default/htdocs | |||
Wichtig ist, dass wir die Datei vorher einmal sichern: | Wichtig ist, dass wir die Datei vorher einmal sichern: | ||
Zeile 279: | Zeile 286: | ||
Das muss selbstverständlich auch mit der Standardkonfiguration gemacht werden, sofern das nicht schon standardmäßig passiert ist. | Das muss selbstverständlich auch mit der Standardkonfiguration gemacht werden, sofern das nicht schon standardmäßig passiert ist. | ||
Eine Beispiel-Konfiguration für VirtualHosts findet sich ebenfalls im [[d:Einzelheiten_zur_Apache-Konfiguration|Debacher-Wiki]] (CC-by-sa). Dabei muss <dummy> mit der Domain ersetzt werden. Die Verzeichnisse werden dann unterhalb von /var/www/vhosts/<dummy> angelegt. Hier ist es sinnig, nach Seiten mit aktiviertem SSL und Seiten ohne SSL zu unterscheiden. | Eine Beispiel-Konfiguration für VirtualHosts findet sich ebenfalls im [[d:Einzelheiten_zur_Apache-Konfiguration|Debacher-Wiki]] (CC-by-sa). Dabei muss <dummy> mit der Domain ersetzt werden (in VI durch :%s/<dummy>/example.org. Die Verzeichnisse werden dann unterhalb von /var/www/vhosts/<dummy> angelegt. Hier ist es sinnig, nach Seiten mit aktiviertem SSL und Seiten ohne SSL zu unterscheiden. Wichtig ist, dass alle Konfigurationsdateien mit .conf enden, da sie sonst von Apache ignoriert werden. | ||
=== /etc/apache/sites-available/dummy.conf === | === /etc/apache/sites-available/dummy.conf === | ||
Zeile 306: | Zeile 313: | ||
php_admin_flag engine on | php_admin_flag engine on | ||
php_admin_flag safe_mode off | php_admin_flag safe_mode off | ||
php_admin_value include_path "/var/www/vhosts/<dummy>/ | php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/" | ||
php_admin_value open_basedir "/var/www/vhosts/<dummy>/ | php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/" | ||
</IfModule> | </IfModule> | ||
Zeile 351: | Zeile 358: | ||
php_admin_flag engine on | php_admin_flag engine on | ||
php_admin_flag safe_mode off | php_admin_flag safe_mode off | ||
php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/ | php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/" | ||
php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/ | php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/" | ||
</IfModule> | </IfModule> | ||
Zeile 379: | Zeile 386: | ||
Header add Strict-Transport-Security "max-age=15768000" | Header add Strict-Transport-Security "max-age=15768000" | ||
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA | SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA | ||
SSLCertificateFile / | SSLCertificateFile /etc/letsencrypt/live/<dummy>/cert.pem | ||
SSLCertificateKeyFile / | SSLCertificateKeyFile /etc/letsencrypt/live/<dummy>/privkey.pem | ||
SSLCertificateChainFile / | SSLCertificateChainFile /etc/letsencrypt/live/<dummy>/chain.pem | ||
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown | SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown | ||
CustomLog /var/log/apache2 | CustomLog /var/log/apache2/<dummy>.ssl.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" | ||
</VirtualHost> | </VirtualHost> | ||
Zeile 426: | Zeile 432: | ||
append_dot_mydomain = no | append_dot_mydomain = no | ||
#delay_warning_time = 4h | #delay_warning_time = 4h | ||
myhostname = example.com | myhostname = mail.example.com | ||
myorigin = | myorigin = /etc/mailname | ||
mydestination = localhost | mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost | ||
relayhost = | relayhost = | ||
mynetworks = 127.0.0.0/8 [::1]/128 | mynetworks = 127.0.0.0/8 [::1]/128 | ||
Zeile 434: | Zeile 440: | ||
recipient_delimiter = + | recipient_delimiter = + | ||
inet_interfaces = all | inet_interfaces = all | ||
inet_protocols = ipv4 | |||
alias_maps = hash:/etc/aliases | alias_maps = hash:/etc/aliases | ||
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf | virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf | ||
Zeile 449: | Zeile 456: | ||
smtpd_helo_required = yes | smtpd_helo_required = yes | ||
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net | smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client | ||
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname | smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname | ||
Zeile 608: | Zeile 615: | ||
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden. | # Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden. | ||
ssl = no | ssl = no | ||
#ssl_cert = </etc/letsencrypt/live/ | #ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem | ||
#ssl_key = </etc/letsencrypt/live/ | #ssl_key = </etc/letsencrypt/live/example.org/privkey.pem | ||
userdb { | userdb { | ||
args = /etc/dovecot/dovecot-sql.conf | args = /etc/dovecot/dovecot-sql.conf | ||
Zeile 687: | Zeile 694: | ||
Im Postfix und im Dovecot stellen wir dann den Hostnamen um. Vorteil ist, dass der Server dann eine höhere Reputation bekommt, als unter der stratoserver.net-Domain. Zusätzlich klingt das natürlich auch professioneller. | Im Postfix und im Dovecot stellen wir dann den Hostnamen um. Vorteil ist, dass der Server dann eine höhere Reputation bekommt, als unter der stratoserver.net-Domain. Zusätzlich klingt das natürlich auch professioneller. | ||
== Nachtrag vom 19.10.2017 == | |||
Unsere Uni-Server erfordern eine verschlüsselte Verbindung zwischen Mailservern. Die o.g. Konfiguration nutzt zwar TLS für die Verbindung zwischen Client und Server, aber nicht für den Transport der Mails über den eigenen Server hinaus. Hierfür sind folgende Ergänzungen in der main.cf nötig | |||
smtpd_tls_security_level = may | |||
smtp_tls_security_level = may | |||
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku] |
Aktuelle Version vom 20. März 2019, 20:02 Uhr
Eine neuere Version dieses Artikels steht hier zur Verfügung.
Das aktuelle Angebot an Strato-Servern hat sich kaum geändert. Allerdings bietet Strato nun auch Ubuntu 16.04 als Betriebssystem an. Mal sehen, was sich bei der Installation so alles geändert hat.
Offensichtlich bietet Strato standardmäßig nun keinen Backup-Platz mehr an. Das ist schade, da das "Managed Backup" extra kostet. Früher konnte man einfach ein Skript laufen lassen, dass die Platten regelmäßig auf einen FTP-Server sichert. Der Rechner hat folgende Eckdaten:
- AMD Opteron 1385 mit 4 x 2,7 GHz (4x 5400.16 Bogomips)
- 4 GB Arbeitsspeicher
- 2 x 500 GB im RAID1-Verbund Festplattenspeicher
Den Rechner gibt es drei Monate für 11€, dann für 22€ im Monat. Einrichtungspreis ist 29€.
Smartmontools
Für Informationen über die Festplatte bieten sich die Smartmontools an:
sudo apt-get update sudo apt-get install smartmontools
Mit den Befehl folgenden Befehlen bekommen wir Informationen über die Fetplatten sda und sdb:
sudo smartctl -a /dev/sda sudo smartctl -a /dev/sdb
Die Platten sind mit 35705 und 35774 Stunden (~4 Jahre) definitiv nicht neu, weisen aber auch keine fatalen Fehler auf. Mein gebrauchter Root-Server als Serversondermodell lief schon 5 1/2 Jahre.
Webserver Apache2
Zur Bereitstellung von Webseiten benutzen wir den Apache-Webserver. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.
Die Installation läuft denkbar einfach über
sudo apt-get update sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear libapache2-mod-php7.0
Wir installieren also auch gleich PHP und PHP-PEAR mit. Apache kommt in der Version 2.4.18, bei PHP wird schon die neue Version 7 installiert. An den Konfigurationsdateien hat sich augenscheinlich nicht verändert. Die Standard-Seite ist aber ganz hübsch.
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem Debacher-Wiki entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen. Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:
mkdir /var/www/htdocs mkdir /var/www/vhosts mkdir /var/www/vhosts/default mv /var/www/html /var/www/vhosts/default/htdocs
Wichtig ist, dass wir die Datei vorher einmal sichern:
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org
/etc/apache2/sites-available/000-default.conf
ServerName default ServerAdmin webmaster@lukasthiel.de ServerTokens Major DocumentRoot /var/www/htdocs/ # Aliase werden einmal zentral gesetzt. Diese Aliase sind von allen Domains aus erreichbar. Alias /webmail /var/www/htdocs/roundcube Alias /ftp /var/www/htdocs/webftp <Directory "/var/www/vhosts"> AllowOverride All Options +FollowSymLinks Order allow,deny Allow from all <IfModule mod_php5.c> </IfModule> </Directory> <IfModule mod_userdir.c> UserDir disabled </IfModule> <VirtualHost *:80> ServerName default UseCanonicalName Off DocumentRoot /var/www/vhosts/default/htdocs/ ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" # Blocken der Anfragen an eingerichtete Dienste Alias /webmail /var/www/htdocs/dummy Alias /pma /var/www/htdocs/dummy Alias /webftp /var/www/htdocs/dummy Alias /roundcube /var/www/htdocs/dummy <IfDefine MAILMAN> ScriptAlias /mailman/ /var/www/htdocs/dummy Alias /mailmanicons/ /var/www/htdocs/dummy Alias /pipermail/ /var/www/htdocs/dummy </IfDefine> <IfModule mod_ssl.c> SSLEngine off </IfModule> # Deaktivieren des Zugriffs auf die CGI-Skripte von irgendwo <Directory "/var/www/cgi-bin/"> AllowOverride None Options None Order allow,deny Deny from all </Directory> <Directory /var/www/vhosts/default/htdocs> AllowOverride All Options None Order allow,deny Allow from all <IfModule mod_php5.c> php_admin_flag engine on php_admin_flag safe_mode off </IfModule> </Directory> </VirtualHost>
/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/htdocs <Directory /var/www/> Options -Indexes +FollowSymLinks +MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined # Blocken der Anfragen an eingerichtete Dienste Alias /webmail /var/www/htdocs/dummy Alias /pma /var/www/htdocs/dummy Alias /webftp /var/www/htdocs/dummy Alias /roundcube /var/www/htdocs/dummy <IfDefine MAILMAN> ScriptAlias /mailman/ /var/www/htdocs/dummy Alias /mailmanicons/ /var/www/htdocs/dummy Alias /pipermail/ /var/www/htdocs/dummy </IfDefine> Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCompression off # Add six earth month HSTS header for all users... Header add Strict-Transport-Security "max-age=15768000" SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
Entscheidend ist, dass die angegebenen Pfade tatsächlich existieren, sonst gibt Apache beim nächsten Start eine Fehlermeldung aus. Sollten die Verzeichnisrechte nicht richtig gesetzt sein, kann das mittels
sudo chown -R www-data.www-data /var/www/ sudo chmod -R 0770 /var/www/
nachgeholt werden.
Nun geht es an die Konfiguration der Strato-Adresse. Ruft man den Server über seinen hXXXXXXX.stratoserver.net auf, kann man so beeinflussen, was angezeigt wird.
/etc/apache2/sites-available/stratoserver.net.conf
<VirtualHost *:80> ServerName h1234xyz.stratoserver.net UseCanonicalName Off DocumentRoot /var/www/vhosts/default/htdocs CustomLog /var/log/apache2/access.log combined ErrorLog /var/log/apache2/error.log ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" # Soll PHPMyAdmin verfügbar sein, kann der Pfad hier aktiviert werden. # Alias /pma /var/www/htdocs/phpMyAdmin Alias /webstat /var/www/vhosts/default/webstat <IfModule mod_ssl.c> SSLEngine off </IfModule> <Directory "/var/www/cgi-bin/"> AllowOverride None Options None Order allow,deny Allow from all </Directory> <Directory /var/www/vhosts/default/htdocs> AllowOverride All Options None Order allow,deny Allow from all <IfModule mod_php5.c> php_admin_flag engine on php_admin_flag safe_mode off # php_admin_value include_path "/var/www/htdocs/horde/pear:/var/www/htdocs:./" # php_admin_value open_basedir "/var/www/htdocs:/tmp" </IfModule> </Directory> </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443 > ServerName h1234xyz.stratoserver.net UseCanonicalName Off DocumentRoot /var/www/vhosts/default/httpsdocs CustomLog /var/log/apache2/access.log combined ErrorLog /var/log/apache2/error.log ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" # Alias /pma /var/www/htdocs/phpMyAdmin # Alias /webftp /var/www/htdocs/webftp SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNUL SSLCertificateFile /var/www/vhosts/default/ssl/server.crt SSLCertificateKeyFile /var/www/vhosts/default/ssl/server.key SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCompression off # Add six earth month HSTS header for all users... Header add Strict-Transport-Security "max-age=15768000" SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA <Directory "/var/www/cgi-bin/"> AllowOverride None Options None Order allow,deny Allow from all </Directory> <Directory /var/www/vhosts/default/httpsdocs> SSLRequireSSL AllowOverride None Options None Order allow,deny Allow from all </Directory> </VirtualHost> </IfModule>
Damit ist die Grundkonfiguration von Apache abgeschlossen. Für jeden neuen VirtualHost legen wir ab dann eine Datei als /etc/apache2/sites-avaiable/<domain>.conf an.
Wichtig ist: Der Ubuntu-Apache unterscheidet zwischen aktivierten und verfügbaren Konfigurationen. Wir müssen also jede Datei noch einmal extra unter /etc/apache2/sites-enabled/ einbinden. Dazu einfach einen symbolischen Link erstellen:
sudo ln -s /etc/apache2/sites-available/<domain>.conf /etc/apache2/sites-enabled/<domain>.conf
Das muss selbstverständlich auch mit der Standardkonfiguration gemacht werden, sofern das nicht schon standardmäßig passiert ist.
Eine Beispiel-Konfiguration für VirtualHosts findet sich ebenfalls im Debacher-Wiki (CC-by-sa). Dabei muss <dummy> mit der Domain ersetzt werden (in VI durch :%s/<dummy>/example.org. Die Verzeichnisse werden dann unterhalb von /var/www/vhosts/<dummy> angelegt. Hier ist es sinnig, nach Seiten mit aktiviertem SSL und Seiten ohne SSL zu unterscheiden. Wichtig ist, dass alle Konfigurationsdateien mit .conf enden, da sie sonst von Apache ignoriert werden.
/etc/apache/sites-available/dummy.conf
<VirtualHost *:80> ServerName www.<dummy>:80 ServerAlias <dummy> UseCanonicalName Off DocumentRoot /var/www/vhosts/<dummy>/htdocs CustomLog /var/log/apache2/<dummy>.access.log combined ErrorLog /var/log/apache2/<dummy>.error.log CustomLog /var/log/apache2/vhosts.access.log vhost_combined ScriptAlias /cgi-bin/ /var/www/vhosts/<dummy>/cgi-bin/ Alias /webstat /var/www/vhosts/<dummy>/webstat <IfModule mod_ssl.c> SSLEngine off </IfModule> <Directory /var/www/vhosts/<dummy>/htdocs> <IfModule mod_php5.c> php_admin_flag engine on php_admin_flag safe_mode off php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/" php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/" </IfModule> <IfModule mod_python.c> <Files ~ (\.py$)> SetHandler python-program PythonHandler mod_python.cgihandler </Files> </IfModule> Options -Includes +ExecCGI </Directory> <Directory "/var/www/vhosts/<dummy>/cgi-bin"> AllowOverride None Options +ExecCGI -Includes Order allow,deny Allow from all </Directory> </VirtualHost>
/etc/apache/sites-available/dummy-ssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName www.<dummy>:443 ServerAlias <dummy> UseCanonicalName Off DocumentRoot /var/www/vhosts/<dummy>/htdocs CustomLog /var/log/apache2/<dummy>.access.log combined ErrorLog /var/log/apache2/<dummy>.error.log ScriptAlias /cgi-bin/ /var/www/vhosts/<dummy>/cgi-bin/ Alias /webstat /var/www/vhosts/<dummy>/webstat SSLEngine on <Directory /var/www/vhosts/<dummy>/htdocs> <IfModule mod_php5.c> php_admin_flag engine on php_admin_flag safe_mode off php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/" php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/" </IfModule> <IfModule mod_python.c> <Files ~ (\.py$)> SetHandler python-program PythonHandler mod_python.cgihandler </Files> </IfModule> Options -Includes +ExecCGI </Directory> <Directory "/var/www/vhosts/<dummy>/cgi-bin"> AllowOverride None Options +ExecCGI -Includes Order allow,deny Allow from all </Directory> SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM SSLHonorCipherOrder On SSLCompression off # Add six earth month HSTS header for all users... Header add Strict-Transport-Security "max-age=15768000" SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA SSLCertificateFile /etc/letsencrypt/live/<dummy>/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/<dummy>/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/<dummy>/chain.pem SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown CustomLog /var/log/apache2/<dummy>.ssl.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> </IfModule>
Damit ist die Einrichtung des Webservers abgeschlossen.
Datenbank-Server
Als Datenbank-Server benutzen wir MySQL. Diesen Server installieren wir ganz einfach per apt:
sudo apt-get install mysql-server mysql-client
Falls die Abfrage während der Installation nicht schon kommt, setzen wir dem root-Benutzer in MySQL ein neues Passwort:
sudo mysqladmin -u root password "newpwd"
Mailserver
Die Einrichtung des Mailservers ist immer wieder spannend, da bei Updates immer wieder kleine Änderungen durchgeführt werden. Wir verwenden Postfix als MTA und Dovecot als IMAP-Server. Zusätzlich arbeiten wir mit Virtuellen Hosts, damit ein Mailserver für mehrere Domains verantwortlich sein kann. Die Domains und ihre Mail-Accounts können dann über den Postfixadmin bequem im Netz verwaltet werden.
Zunächst installieren wir Postfix und dessen Anbindung an MySQL:
sudo apt-get install postfix postfix-mysql
Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.
Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:
root@server:/# mysql -u root -p mysql> CREATE DATABASE mail; mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail'; mysql> quit
Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf
root@server:/# cd /etc/postfix root@server:/# vi main.cf
Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen). Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert; das ist hier schon eingearbeitet:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no append_dot_mydomain = no #delay_warning_time = 4h myhostname = mail.example.com myorigin = /etc/mailname mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost relayhost = mynetworks = 127.0.0.0/8 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv4 alias_maps = hash:/etc/aliases virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf virtual_mailbox_base = /var/vmail virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf virtual_minimum_uid = 150 virtual_uid_maps = static:150 virtual_gid_maps = static:8 virtual_transport = dovecot smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_delay_reject = yes smtpd_helo_required = yes smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname smtpd_sender_restrictions = reject_unknown_sender_domain smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination # tls config #smtpd_use_tls = yes #smtp_tls_note_starttls_offer = yes #smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem #smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem #smtpd_tls_loglevel = 1 #smtpd_tls_received_header = yes #smtpd_tls_session_cache_timeout = 3600s #smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3 #tls_random_source = dev:/dev/urandom #tls_random_prng_update_period = 3600s # used for virtual vacation # transport_maps = hash:/etc/postfix/transport #dovecot_destination_recipient_limit = 1
Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail sudo mkdir /var/vmail sudo chmod 770 /var/vmail/ sudo chown vmail:mail /var/vmail/
Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:
sudo touch /etc/postfix/mysql_virtual_alias_maps.cf sudo touch /etc/postfix/mysql_virtual_domains_maps.cf sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf
/etc/postfix/mysql_virtual_alias_maps.cf
user = mail password = mail hosts = localhost dbname = mail table = alias select_field = goto where_field = address additional_conditions = and active = '1' #query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
/etc/postfix/mysql_virtual_domains_maps.cf
user = mail password = mail hosts = localhost dbname = mail table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '0' and active = '1' #query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = mail password = mail hosts = localhost dbname = mail table = mailbox select_field = quota where_field = username additional_conditions = and active = '1' #query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_maps.cf
user = mail password = mail hosts = localhost dbname = mail table = mailbox select_field = CONCAT(domain,'/',maildir) where_field = username additional_conditions = and active = '1' #query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.
Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient) submission inet n - - - - smtpd -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o smtpd_sasl_security_options=noanonymous -o smtpd_sasl_local_domain=$myhostname -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_sender_login_maps=hash:/etc/postfix/virtual -o smtpd_sender_restrictions=reject_sender_login_mismatch -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:
5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld
gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:
-o smtpd_sender_restrictions=reject_sender_login_mismatch
Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.
Gegen die Fehlermeldung, dass die /etc/aliases nicht gefunden wurde, führen wir einmal
sudo newaliases
aus.
Dovecot
Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:
sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql
Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.
Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.
Zur Sicherheit sichern wir die originale Konfigurationsdatei via
sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org
Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.
auth_mechanisms = plain login disable_plaintext_auth = no first_valid_uid = 150 hostname = mail.example.org last_valid_uid = 150 log_timestamp = "%Y-%m-%d %H:%M:%S " mail_location = maildir:/var/vmail/%d/%u passdb { args = /etc/dovecot/dovecot-sql.conf driver = sql } postmaster_address = xxx@example.com service auth { unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix } unix_listener auth-userdb { group = mail mode = 0600 user = vmail } } service imap-login { executable = imap-login inet_listener imap { port = 143 } } service pop3-login { executable = pop3-login inet_listener pop3 { port = 110 } } # Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden. ssl = no #ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem #ssl_key = </etc/letsencrypt/live/example.org/privkey.pem userdb { args = /etc/dovecot/dovecot-sql.conf driver = sql } protocol imap { mail_max_userip_connections = 10 } protocols = imap pop3
Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:
driver = mysql connect = host=localhost dbname=mail user=mail password=mail # The new name for MD5 is MD5-CRYPT so you might need to change this depending on version default_pass_scheme = MD5 # Get the mailbox user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1' # Get the password password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1' # If using client certificates for authentication, comment the above and uncomment the following #password_query = SELECT null AS password, '%u' AS user
Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.
Dann setzen wir noch die Rechte für Dovecot:
sudo chmod 600 /etc/dovecot/*.conf sudo chown vmail /etc/dovecot/*.conf
Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.
Postfix Admin
Zum Anlegen der Domains und Postfächer nutzen wir dden Postfixadmin, der passenderweise auch gleich das Datenbank-Schema für die gerade erstellte Konfiguration mitbringt.
Wir laden den PostfixAdmin von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)
sudo mkdir /var/www/vhosts/mail.<domain>/htdocs cd /var/www/vhosts/mail.<domain>/htdocs wget -O pfa.tgz https://sourceforge.net/projects/postfixadmin/files/latest/download tar xfz pfa.tgz
Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:
cd ./postfixadmin-X.X.X/ vi config.inc.php
Hier passen wir folgende Parameter an:
$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/'; $CONF['database_type'] = 'mysqli'; $CONF['database_user'] = 'mail'; $CONF['database_password'] = 'mail'; $CONF['database_name'] = 'mail';
(Natürlich an die eigenen Zwecke angepasst)
Sind wir mit der Konfiguration fertig, setzen wir den Parameter
$CONF['configured'] = false;
auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)
Hier müssen zwei PHP-Pakete nachinstalliert werden:
sudo apt-get install php-mbstring php-imap
Danach einmal Apache neu laden:
sudo service apache2 reload
Ist alles installiert, können wir einen Super-Admin einrichten, der alle Domains, Accounts und Administrator-Account im Postfixadmin konfigurieren kann.
Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:
service postfix restart service dovecot restart service apache2 restart service mysql restart
Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet.
DNS Reverse
Es empfiehlt sich, bei Strato einen Reverse DNS-Eintrag zu hinterlegen. Die DNS-Abfrage der IP-Adresse läuft dann nicht mehr auf den hXXXXXXX.stratoserver.net, sondern über einen eigenen DNS-Namen. Wichtig ist, dass der Name natürlich auch wieder in die IP-Adresse auflöst.
Im Postfix und im Dovecot stellen wir dann den Hostnamen um. Vorteil ist, dass der Server dann eine höhere Reputation bekommt, als unter der stratoserver.net-Domain. Zusätzlich klingt das natürlich auch professioneller.
Nachtrag vom 19.10.2017
Unsere Uni-Server erfordern eine verschlüsselte Verbindung zwischen Mailservern. Die o.g. Konfiguration nutzt zwar TLS für die Verbindung zwischen Client und Server, aber nicht für den Transport der Mails über den eigenen Server hinaus. Hierfür sind folgende Ergänzungen in der main.cf nötig
smtpd_tls_security_level = may smtp_tls_security_level = may
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. Postfix-Doku