Wir basteln den perfekten Webserver mit Ubuntu Server LTS (Apache/MariaDB)

Die Basis für eine erfolgreiche Webapplikation ist der Webserver an sich. Sie sollten auf einen sauberen und zuverlässigen Aufbau achten. Einen kleinen Leitpfaden für einen einfachen, schnellen und sicheren Webserver, möchten wir bei Was ist SEO für dich zur Verfügung stellen.

Wir nehmen uns als Betriebssystem Ubuntu Server LTS , weil Ubuntu die Update & Upgrade sowie Release Zyklen sehr überschaubar hält.
! Bitte nur bei Neuinstallation eines Webservers nutzen !

Ändere den „default“ Shell

dpkg-reconfigure dash

Use dash as the default system shell (/bin/sh)? <– No

Deaktiviere AppArmor

service apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

Synchronisiere System Uhr

apt-get -y install ntp

Postfix, Dovecot, MariaDB, Rkhunter & Binutils installieren

apt-get -y install postfix postfix-mysql postfix-doc mariadb-client mariadb-server openssl getmail4 rkhunter binutils dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-sieve dovecot-lmtpd sudo
General type of mail configuration: <-- Internet Site
 System mail name: <-- example.com
nano /etc/postfix/master.cf

Editiere die Datei master.cf wie folgt

 [...]
 submission inet n - - - - smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
[...]

[...]
 smtps inet n - - - - smtpd
 -o syslog_name=postfix/smtps
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 [...]

Postfix neustart

service postfix restart

Maria DB

Zu empfehlen ist es, das die Datenbank nur localhost angesprochen werden kann und nicht über Remote

nano /etc/mysql/mariadb.conf.d/50-server.cnf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address           = 127.0.0.1

[...]

Möchten Sie die MariaDB auch auf allen Interfaces nutzen? Dann editieren sie die 50-server.cnf wie folgt.

[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
sql-mode="NO_ENGINE_SUBSTITUTION"
[...]

Datenbank absichern

mysql_secure_installation
Enter current password for root (enter for none): <-- press enter
Set root password? [Y/n] <-- y
New password: <-- Enter the new MariaDB root password here
Re-enter new password: <-- Repeat the password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y
service mysql restart

Amavisd-new, SpamAssassin & ClamAv installieren

apt-get -y install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl postgrey
freshclam
service clamav-daemon start

Apache2, PHP-7, phpMyAdmin, FCGI, SuExec, Pear & Mcrypt installieren

apt-get -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.0 php7.0-common php7.0-gd php7.0-mysql php7.0-imap phpmyadmin php7.0-cli php7.0-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear php7.0-mcrypt mcrypt  imagemagick libruby libapache2-mod-python php7.0-curl php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl memcached php-memcache php-imagick php-gettext php7.0-zip php7.0-mbstring
Web server to reconfigure automatically: <-- apache2
Configure database for phpmyadmin with dbconfig-common? <-- Yes
MySQL application password for phpmyadmin: <-- Press enter
a2enmod suexec rewrite ssl actions include cgi
a2enmod suexec rewrite ssl actions include cgi

HTTP Proxy Header in Apache verstecken

Apache httpoxy.conf aufrufen.

nano /etc/apache2/conf-available/httpoxy.conf

Bitte folgendes in die httpoxy.conf einfügen und  speichern.

<IfModule mod_headers.c>
 RequestHeader unset Proxy early
</IfModule>

Aktivieren und Neustart

a2enconf httpoxy
service apache2 restart

PHP richtig schnell & knackig 😀

PHP Opcode cache

apt-get -y install php7.0-opcache php-apcu
service apache2 restart

PHP-FPM installieren

apt-get -y install php7.0-fpm
a2enmod actions proxy_fcgi alias
service apache2 restart

Optional noch HHVM (HipHop Virtual Machine) installieren

apt-get -y install hhvm

Roundcube Webmail installieren

apt-get -y install roundcube roundcube-core roundcube-mysql roundcube-plugins roundcube-plugins-extra javascript-common libjs-jquery-mousewheel php-net-sieve tinymce
Configure database for roundcube with dbconfig-common? <-- Yes
MySQL application password for roundcube: <-- Press enter
nano /etc/apache2/conf-enabled/roundcube.conf
Lösche >#< und füge hinzu 
AddType application/x-httpd-php .php
# Those aliases do not work properly with several hosts on your apache server
# Uncomment them to use it or adapt them to your configuration
#Alias /roundcube /var/lib/roundcube
[...]
<Directory /var/lib/roundcube>
AddType application/x-httpd-php .php
[...]
service apache2 restart
nano /etc/roundcube/config.inc.php

Default_Host zu Localhost zum sichern

$config['default_host'] = 'localhost';
service apache2 restart

Ubuntu Server Sicherheit

Die Sicherheit des Servers ist von großer Bedeutung, wenn nur 1 Admin Zugriff auf den Kern des Systems hat, ist es leichter, als wenn mehre Nutzer Zugriffe wie SSH oder FTP haben.



Basis Sicherheit (MUST HAVE!)

Fail2Bain installieren und editieren

apt-get -y install fail2ban

Jail.local erstellen

nano /etc/fail2ban/jail.local
[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/mail.log
maxretry = 5

[postfix-sasl]
enabled  = true
port     = smtp
filter   = postfix-sasl
logpath  = /var/log/mail.log
maxretry = 3

Falls noch pulreftpd installiert wird, 
dann noch folgendes in die jail.local einfügen.

[pureftpd]
enabled  = true
port     = ftp
filter   = pureftpd
logpath  = /var/log/syslog
maxretry = 3

Fail2Bain Filter erstellen

POP3/IMAP

nano /etc/fail2ban/filter.d/dovecot-pop3imap.conf
[Definition]
failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed|Aborted login \(\d+ authentication attempts).*rip=(?P<host>\S*),.*
ignoreregex =

Speichern!

echo "ignoreregex =" >> /etc/fail2ban/filter.d/postfix-sasl.conf

FTP

nano /etc/fail2ban/filter.d/pureftpd.conf
[Definition]
failregex = .*pure-ftpd: \(.*@<HOST>\) \[WARNING\] Authentication failed for user.*
ignoreregex =

Speichern!

Check!
chmod 775 /var/log
service postfix restart
service fail2ban restart

UFW (Firewall) installieren & einstellen

apt-get install ufw
ufw allow http
ufw allow https

Für SSH & FTP:

ufw allow ssh
ufw allow ftp
sudo ufw enable
Statuscheck: 
sudo ufw Status

Shared memory absichern in /etc/fstab

sudo nano /etc/fstab
tmpfs /run/shm tmpfs defaults,noexec,nosuid 0 0

Speichern!

Netzwerk gegen eingehende Pakete absichern

Auskommentieren oder hinzufügen von X  unter sysctl.conf

nano /etc/sysctl.conf
# IP Spoofing protection
​net.ipv4.conf.all.rp_filter = 1
​net.ipv4.conf.default.rp_filter = 1
​
​# Ignore ICMP broadcast requests
​net.ipv4.icmp_echo_ignore_broadcasts = 1
​
​# Disable source packet routing
​net.ipv4.conf.all.accept_source_route = 0
​net.ipv6.conf.all.accept_source_route = 0 
​net.ipv4.conf.default.accept_source_route = 0
​net.ipv6.conf.default.accept_source_route = 0
​
​# Ignore send redirects
​net.ipv4.conf.all.send_redirects = 0
​net.ipv4.conf.default.send_redirects = 0
​
​# Block SYN attacks
​net.ipv4.tcp_syncookies = 1
​net.ipv4.tcp_max_syn_backlog = 2048
​net.ipv4.tcp_synack_retries = 2
​net.ipv4.tcp_syn_retries = 5
​
​# Log Martians
​net.ipv4.conf.all.log_martians = 1
​net.ipv4.icmp_ignore_bogus_error_responses = 1
​
​# Ignore ICMP redirects
​net.ipv4.conf.all.accept_redirects = 0
​net.ipv6.conf.all.accept_redirects = 0
​net.ipv4.conf.default.accept_redirects = 0 
​net.ipv6.conf.default.accept_redirects = 0
​
​# Ignore Directed pings
​net.ipv4.icmp_echo_ignore_all = 1

ISP Spoofing uterbinden

# The "order" line is only used by old versions of the C library.
​order hosts,bind
​multi on

 ändern in:

# The "order" line is only used by old versions of the C library.
​order bind,hosts
​nospoof on

SSH zugang sichern

nano /etc/ssh/sshd_config
PermitRootLogin no
sudo /etc/init.d/ssh restart

PHP7 absichern

nano /etc/php7/apache2/php.ini

Folgende suchen mit Strg+W mit Nano

disable_functions = exec,system,shell_exec,passthru
register_globals = Off
expose_php = Off
display_errors = Off
track_errors = Off
html_errors = Off
magic_quotes_gpc = Off
sudo /etc/init.d/apache2 restart

Apache Server Informationen ausblenden (Signaturen)

nano /etc/apache2/conf.d/security
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Header unset ETag
FileETag None
sudo /etc/init.d/apache2 restart

Fertig! Wer noch möchte, kann sich diverse kostenlose Webinterfaces wie Zpanel, Webmin oder ISPconfig installieren um  Server Backend Arbeiten durchzuführen.  Achte auf nötige Ports die geöffnet werden müssen.

Wichtig! Wer noch Let’s Encrypt installieren und nutzen möchte, sollte diesen Artikel folgen und anschließend erst einen Panel installieren.

Tipp:  SSH ist heutzutage durch perfekte Technik nur noch Sitzungsweise möglich (z.b. durch VNC Remotekonsole die heutzutage angeboten wird, kann man sich SSH für die kurze Arbeit erlauben, und nach ende der Arbeit wieder schließen. Auf vielen reinen Webservern ist nur noch Port 80 & 443 offen, alle anderen Ports werden nur bei Nutzung geöffnet. Diese bietet eine erhöhte Sicherheit für den Webserver.

Noch mehr Knette ins Hirn?

  • SSH Sichern für Dauerbetrieb/Dauerzugang
  • FTP installieren und absichern
  • Mehr Webserver Sicherheit (Apache/Nginx)
  • Let’s Encrypt installieren & nutzen

Über Kommentar, Tipps und Kritik würde ich mich sehr freuen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.