Linux/Server/Dienste: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
K Textersetzung - „Apache:“ durch „Apache/“
 
(76 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Postfix, Dovecot, MariaDB, Rkhunter, and Binutils ==
== Postfix, Dovecot, MariaDB, rkhunter, and Binutils ==
=== Installation ===
 
We can install Postfix, Dovecot, MariaDB as MySQL alternative, rkhunter, and Binutils with a single command:
 
  # apt 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
  # apt 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


You will be asked the following questions:
=== Postfix Konfiguration ===
 
'''General type of mail configuration'''
 
┌─────────────────────────────────────────────────────────────────────────────────Postfix Configuration────────────────────────────────────────────────────────────────────────────────────┐
│ Der »E-Mail-Name« ist der Domainname, der für alle E-Mail-Adressen ohne Domainnamen herangezogen wird. Darunter fallen E-Mails von und an root: Bitte lassen Sie Ihre Maschine keine    │ 
│ E-Mails von root@example.org versenden, es sei denn, root@example.org hat Ihnen das gesagt.                                                                                              │ 
│                                                                                                                                                                                          │ 
│ Dieser Name wird auch von anderen Programmen genutzt, es sollte der eindeutige voll-qualifizierte Domainname (FQDN) sein.                                                                │ 
│                                                                                                                                                                                          │ 
│ Falls eine E-Mail-Adresse auf dem lokalen Host foo@example.org lautet, wäre für diese Option example.org einzugeben.                                                                    │ 
│                                                                                                                                                                                          │ 
│ E-Mail-Name des Systems:                                                                                                                                                                │ 
│ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 
│ │mx20.foxtom.de                                                                                                                                                                        │ │ 
├─└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘─┤ 
│                                                                <  OK    >                                <Abbrechen>                                                                  │ 
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 
 


'''Internet Site'''


General type of mail configuration: <-- Internet SiteSystem mail name: <-- server1.example.com
''' System mail name '''


To secure the MariaDB installation and to disable the test database, run this command:
'''server1.example.com'''


  # mysql_secure_installation
=== Secure MariaDB ===
  # '''mysql_secure_installation'''


Answer the questions as follows:
Answer the questions as follows:
Change the root password? [Y/n] '''Y'''
New password: '''<New MariaDB root password>'''
Re-enter new password: '''<New MariaDB root password>'''
Remove anonymous users? [Y/n] '''Y'''
Disallow root login remotely? [Y/n] '''Y'''
Remove test database and access to it? [Y/n] '''Y'''
Reload privilege tables now? [Y/n] '''Y'''


Change the root password? [Y/n] <-- y
=== Postfix-Ports öffnen ===
New password: <-- Enter a new MariaDB root password
  # vi /etc/postfix/master.cf
  Re-enter new password: <-- Repeat the MariaDB root password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Remove test database and access to it? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y


Next, open the TLS/SSL and submission ports in Postfix:
Uncomment the submission and smtps sections as follows and add lines where necessary so that this section of the master.cf file looks exactly like the one below.


# vi /etc/postfix/master.cf
''IMPORTANT:''' Remove the # in front of the lines that start with smtps and submission too and not just from the -o lines after these lines!4


Uncomment the submission and smtps sections as follows and add lines where necessary so that this section of the master.cf file looks exactly like the one below. <br>'''IMPORTANT:''' Remove the # in front of the lines that start with smtps and submission too and not just from the -o lines after these lines!
[...]
  submission inet n - - - - smtpd
  submission inet n - - - - smtpd
   -o syslog_name=postfix/submission
   -o syslog_name=postfix/submission
Zeile 54: Zeile 36:
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  # -o smtpd_reject_unlisted_recipient=no
 
  # -o smtpd_client_restrictions=$mua_client_restrictions
  # -o smtpd_helo_restrictions=$mua_helo_restrictions
  # -o smtpd_sender_restrictions=$mua_sender_restrictions
  # -o smtpd_recipient_restrictions=
  # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  # -o milter_macro_daemon_name=ORIGINATING
   smtps inet n - - - - smtpd
   smtps inet n - - - - smtpd
   -o syslog_name=postfix/smtps
   -o syslog_name=postfix/smtps
   -o smtpd_tls_wrappermode=yes
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  # -o smtpd_reject_unlisted_recipient=no
  # -o smtpd_client_restrictions=$mua_client_restrictions
  # -o smtpd_helo_restrictions=$mua_helo_restrictions
  # -o smtpd_sender_restrictions=$mua_sender_restrictions
  # -o smtpd_recipient_restrictions=
  # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  # -o milter_macro_daemon_name=ORIGINATING
  [...]


Restart Postfix
=== Postfix neu starten ===
  # systemctl restart postfix
  # '''systemctl restart postfix'''


We want MySQL to listen on all interfaces, not just localhost. Therefore, we edit /etc/mysql/mariadb.conf.d/50-server.cnf and comment out the line bind-address = 127.0.0.1 by adding a # in front of it.
=== MariaDB konfigurieren ===
'''Netzwerkschnittstelle'''


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


Set the password authentication method in MariaDB to native so we can use PHPMyAdmin later to connect as root user:
Set the password authentication method in MariaDB to native so we can use PHPMyAdmin later to connect as root user:
Zeile 93: Zeile 65:
  # vi /etc/mysql/debian.cnf
  # vi /etc/mysql/debian.cnf


The MySQL root password that needs to be added is shown in red. In this example, the password is "howtoforge".
The MySQL root password that needs to be added is shown in red. In this example, the password is "uLVZsW2eLM9Ir".
 
  password = uLVZsW2eLM9Ir
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
  password = howtoforge
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = howtoforge
socket = /var/run/mysqld/mysqld.sock
basedir = /usr


=== Security Limits ===
To prevent the error ''''''Error in accept: Too many open files'''''' we will set higher open file limits for MariaDB now.
To prevent the error ''''''Error in accept: Too many open files'''''' we will set higher open file limits for MariaDB now.
Open the file /etc/security/limits.conf with an editor:
Open the file /etc/security/limits.conf with an editor:
  # vi /etc/security/limits.conf
  # vi /etc/security/limits.conf
Zeile 128: Zeile 88:
Save the file and close the vi editor.
Save the file and close the vi editor.


=== Dienste neu starten ===
Then we reload systemd and restart MariaDB:
Then we reload systemd and restart MariaDB:
  # systemctl daemon-reload
  # systemctl daemon-reload
  # systemctl restart mariadb
  # systemctl restart mariadb


=== Offen Ports prüfen ===
Now check that networking is enabled. Run
Now check that networking is enabled. Run
  # netstat -tap | grep mysql
  # netstat -tap | grep mysql
Zeile 140: Zeile 102:


== Amavisd-new, SpamAssassin, and ClamAV ==
== Amavisd-new, SpamAssassin, and ClamAV ==
To install amavisd-new, SpamAssassin and ClamAV, we run
To install amavisd-new, SpamAssassin and ClamAV, we run
  # apt install amavisd-new spamassassin clamav clamav-daemon unzip bzip2 arj nomarch lzop cabextract p7zip p7zip-full unrar lrzip 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 libdbd-mysql-perl postgrey
  # apt -y install amavisd-new spamassassin clamav clamav-daemon unzip bzip2 arj nomarch lzop cabextract p7zip p7zip-full unrar lrzip 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 libdbd-mysql-perl postgrey


The ISPConfig 3 setup uses amavisd which loads the SpamAssassin filter library internally, so we can stop SpamAssassin to free up some RAM:
The ISPConfig 3 setup uses amavisd which loads the SpamAssassin filter library internally, so we can stop SpamAssassin to free up some RAM:
Zeile 149: Zeile 110:


== Apache Web Server and PHP ==
== Apache Web Server and PHP ==
Apache2, PHP, FCGI, suExec, Pear, and mcrypt can be installed as follows:
=== Installation ===
 
  # apt -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.3 php7.3-common php7.3-gd php7.3-mysql php7.3-imap php7.3-cli php7.3-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt  imagemagick libruby libapache2-mod-python php7.3-curl php7.3-intl php7.3-pspell php7.3-recode php7.3-sqlite3 php7.3-tidy php7.3-xmlrpc php7.3-xsl memcached php-memcache php-imagick php-gettext php7.3-zip php7.3-mbstring memcached libapache2-mod-passenger php7.3-soap php7.3-fpm php7.3-opcache php-apcu
  # apt -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.3 php7.3-common php7.3-gd php7.3-mysql php7.3-imap php7.3-cli php7.3-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt  imagemagick libruby libapache2-mod-python php7.3-curl php7.3-intl php7.3-pspell php7.3-recode php7.3-sqlite3 php7.3-tidy php7.3-xmlrpc php7.3-xsl memcached php-memcache php-imagick php-gettext php7.3-zip php7.3-mbstring memcached libapache2-mod-passenger php7.3-soap php7.3-fpm php7.3-opcache php-apcu


=== Enable Apache modules ===
Then run the following command to enable the Apache modules suexec, rewrite, ssl, actions, and include (plus dav, dav_fs, and auth_digest if you want to use WebDAV):
Then run the following command to enable the Apache modules suexec, rewrite, ssl, actions, and include (plus dav, dav_fs, and auth_digest if you want to use WebDAV):
  # a2enmod suexec rewrite ssl actions include dav_fs dav auth_digest cgi headers actions proxy_fcgi alias
  # a2enmod suexec rewrite ssl actions include dav_fs dav auth_digest cgi headers actions proxy_fcgi alias
Zeile 171: Zeile 132:


== Let's Encrypt ==
== Let's Encrypt ==
; ISPConfig support for Let's encrypt
* The Let's Encrypt function allows you to create free SSL certificates for your website from within ISPConfig.


ISPConfig 3.1 has support for the free SSL Certificate authority Let's encrypt. The Let's Encrypt function allows you to create free SSL certificates for your website from within ISPConfig.
; Installation
 
  # apt install certbot
Now we will add support for Let's encrypt.
  # cd /usr/local/bin
# wget https://dl.eff.org/certbot-auto
# chmod a+x certbot-auto
# ./certbot-auto --install-only


There are no further steps required than installing LE. The website SSL certificates are created by ISPConfig when you add the web sites.
; Website certificates are created by ISPConfig when you add the web sites
* There are no further steps required than installing LE


== Mailman ==
== Mailman ==
Zeile 248: Zeile 207:


== PureFTPd and Quota ==
== PureFTPd and Quota ==
 
=== Installation ===
PureFTPd and quota can be installed with the following command:
  # apt install pure-ftpd-common pure-ftpd-mysql quota quotatool
  # apt install pure-ftpd-common pure-ftpd-mysql quota quotatool


Create the dhparam file for pure-ftpd:
=== Create the dhparam ===
  # openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048
  # openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048


Edit the file /etc/default/pure-ftpd-common...
=== Konfiguration anpassen ===
Make sure that the start mode is set to standalone and set VIRTUALCHROOT=true:
  # vi /etc/default/pure-ftpd-common
  # vi /etc/default/pure-ftpd-common
... and make sure that the start mode is set to standalone and set VIRTUALCHROOT=true:
  [...]
  [...]
  STANDALONE_OR_INETD=standalone
  STANDALONE_OR_INETD=standalone
Zeile 266: Zeile 222:
  [...]
  [...]


Now we configure PureFTPd to allow FTP and TLS sessions. FTP is a very insecure protocol because all passwords and all data are transferred in clear text. By using TLS, the whole communication can be encrypted, thus making FTP much more secure.
'''Allow FTP and TLS sessions'''
 
* FTP is a very insecure protocol because all passwords and all data are transferred in clear text.  
* By using TLS, the whole communication can be encrypted, thus making FTP much more secure.


If you want to allow FTP and TLS sessions, run
If you want to allow FTP and TLS sessions, run
Zeile 274: Zeile 233:
  # mkdir -p /etc/ssl/private/
  # mkdir -p /etc/ssl/private/


Afterwards, we can generate the SSL certificate as follows:
'''Generate the SSL certificate'''
  # openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
  # '''openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem'''
  Country Name (2 letter code) [AU]: <-- Enter your Country Name (e.g., "DE").
  Country Name (2 letter code) [AU]: <-- Enter your Country Name (e.g., "DE").
  State or Province Name (full name) [Some-State]: <-- Enter your State or Province Name.
  State or Province Name (full name) [Some-State]: <-- Enter your State or Province Name.
Zeile 284: Zeile 243:
  Email Address []: <-- Enter your Email Address.
  Email Address []: <-- Enter your Email Address.


Change the permissions of the SSL certificate:
'''Change the permissions of the SSL certificate'''
 
  # '''chmod 600 /etc/ssl/private/pure-ftpd.pem'''
  # chmod 600 /etc/ssl/private/pure-ftpd.pem


Then restart PureFTPd:
Then restart PureFTPd:
  # systemctl restart pure-ftpd-mysql
  # '''systemctl restart pure-ftpd-mysql'''


Edit /etc/fstab. Mine looks like this (I added ,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 to the partition with the mount point /):
=== Edit /etc/fstab ===
Mine looks like this (I added ,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 to the partition with the mount point /):
# '''vi /etc/fstab'''


# vi /etc/fstab
  # /etc/fstab: static file system information.
  # /etc/fstab: static file system information.
  #
  #
Zeile 308: Zeile 267:


To enable quota, run these commands:
To enable quota, run these commands:
  # mount -o remount /
  # '''mount -o remount /'''
  quotacheck -avugm
  # '''quotacheck -avugm'''
  # quotaon -avug
  # '''quotaon -avug'''


== BIND DNS Server ==
== BIND DNS Server ==
 
=== Installation ===
BIND can be installed as follows:
  # apt -y install bind9 dnsutils haveged
  # apt install bind9 dnsutils
 
If your server is a virtual machine, then it is highly recommended to install the haveged daemon to get a higher entropy for DNSSEC signing. You can install haveged on nonvirtual servers as well, it should not hurt.
# apt install haveged
 
An explanation on that topic can be found [https://git.ispconfig.org/ispconfig/ispconfig3/merge_requests/313#note_54975 here].


== Webalizer and AWStats ==
== Webalizer and AWStats ==
Webalizer and AWStats can be installed as follows:
=== Installation ===
  # apt install webalizer awstats geoip-database libclass-dbi-mysql-perl libtimedate-perl
  # apt -y install webalizer awstats geoip-database libclass-dbi-mysql-perl libtimedate-perl


Open /etc/cron.d/awstats afterwards...
Open /etc/cron.d/awstats afterwards...
Zeile 337: Zeile 290:


== Jailkit ==
== Jailkit ==
siehe [[Linux:Server:Jailkit#Installation]]
siehe [[Linux/Server:Jailkit#Installation]]


== fail2ban and UFW Firewall ==
== fail2ban and UFW Firewall ==
Zeile 370: Zeile 323:
  # apt install ufw
  # apt install ufw


== RoundCube Webmail (optional) ==
# ufw allow http
# ufw allow https
# ufw allow ssh
# ufw allow 8080
 
== RoundCube Webmail ==
In this chapter, we will install the RoundCube webmail client. First, we have to create the database for Roundcube manually as there is currently an issue in the RoundCube Debian installer which causes it to fail to create the database automatically. Run this command to create the database:
In this chapter, we will install the RoundCube webmail client. First, we have to create the database for Roundcube manually as there is currently an issue in the RoundCube Debian installer which causes it to fail to create the database automatically. Run this command to create the database:
  echo "CREATE DATABASE roundcube;" | mysql --defaults-file=/etc/mysql/debian.cnf
  echo "CREATE DATABASE roundcube;" | mysql --defaults-file=/etc/mysql/debian.cnf
Zeile 395: Zeile 353:
  Alias /webmail /var/lib/roundcube
  Alias /webmail /var/lib/roundcube


Then reload Apache:
Then reload Apache/
  systemctl reload apache2
  systemctl reload apache2


Zeile 405: Zeile 363:
[[Image:Bild2.png|top]]
[[Image:Bild2.png|top]]


== Download ISPConfig 3 ==
== ISPConfig ==
 
=== Download ===
=== Download the stable release (recommended) ===
 
To install ISPConfig 3.1
To install ISPConfig 3.1
  cd /tmp
  # '''cd /tmp'''
  wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
  # '''wget https://ispconfig.org/downloads/ISPConfig-3.1.15p3.tar.gz'''
  tar xfz ISPConfig-3-stable.tar.gz
  # '''tar xfz ISPConfig-3.1.15p3.tar.gz'''
  cd ispconfig3_install/install/
  # '''cd ispconfig3_install/install/'''


== Install ISPConfig ==
== Install ISPConfig ==
Zeile 553: Zeile 509:
== Links ==
== Links ==
* Debian: [http://www.debian.org/ http://www.debian.org/]  
* Debian: [http://www.debian.org/ http://www.debian.org/]  
* ISPConfig: [http://www.ispconfig.org/ http://www.ispconfig.org/]
* ISPConfig/ [http://www.ispconfig.org/ http://www.ispconfig.org/]


[[Category:Linux:Server]]
[[Kategorie:Linux/Server]]
[[Category:Linux:Server:ISPConfig]]
[[Kategorie:ISPConfig]]
[[Kategorie:Postfix]]

Aktuelle Version vom 31. März 2023, 12:15 Uhr

Postfix, Dovecot, MariaDB, Rkhunter, and Binutils

Installation

# apt 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

Postfix Konfiguration

General type of mail configuration

Internet Site

System mail name

server1.example.com

Secure MariaDB

# mysql_secure_installation

Answer the questions as follows:

Change the root password? [Y/n] Y
New password: <New MariaDB root password>
Re-enter new password: <New MariaDB root password>
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Postfix-Ports öffnen

# vi /etc/postfix/master.cf

Uncomment the submission and smtps sections as follows and add lines where necessary so that this section of the master.cf file looks exactly like the one below.

IMPORTANT:' Remove the # in front of the lines that start with smtps and submission too and not just from the -o lines after these lines!4

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

Postfix neu starten

# systemctl restart postfix

MariaDB konfigurieren

Netzwerkschnittstelle

/etc/mysql/mariadb.conf.d/50-server.cnf

  • Zeile 'bind-address = 127.0.0.1' auskommentieren
vi /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
[...]

Authentication

Set the password authentication method in MariaDB to native so we can use PHPMyAdmin later to connect as root user:

# echo "update mysql.user set plugin = 'mysql_native_password' where user='root';" | mysql -u root

Edit the file /etc/mysql/debian.cnf and set the MYSQL / MariaDB root password there twice in the rows that start with the word password.

# vi /etc/mysql/debian.cnf

The MySQL root password that needs to be added is shown in red. In this example, the password is "uLVZsW2eLM9Ir".

password = uLVZsW2eLM9Ir

Security Limits

To prevent the error 'Error in accept: Too many open files' we will set higher open file limits for MariaDB now. Open the file /etc/security/limits.conf with an editor:

# vi /etc/security/limits.conf

and add these lines at the end of the file.

mysql soft nofile 65535
mysql hard nofile 65535

Next, create a new directory /etc/systemd/system/mysql.service.d/ with the mkdir command.

# mkdir -p /etc/systemd/system/mysql.service.d/

and add a new file inside:

# vi /etc/systemd/system/mysql.service.d/limits.conf

paste the following lines into that file:

[Service]
LimitNOFILE=infinity

Save the file and close the vi editor.

Dienste neu starten

Then we reload systemd and restart MariaDB:

# systemctl daemon-reload
# systemctl restart mariadb

Offen Ports prüfen

Now check that networking is enabled. Run

# netstat -tap | grep mysql

The output should look like this:

# netstat -tap | grep mysql
tcp6 0 0 [::]:mysql [::]:* LISTEN 16623/mysqld

Amavisd-new, SpamAssassin, and ClamAV

To install amavisd-new, SpamAssassin and ClamAV, we run

# apt -y install amavisd-new spamassassin clamav clamav-daemon unzip bzip2 arj nomarch lzop cabextract p7zip p7zip-full unrar lrzip 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 libdbd-mysql-perl postgrey

The ISPConfig 3 setup uses amavisd which loads the SpamAssassin filter library internally, so we can stop SpamAssassin to free up some RAM:

# systemctl stop spamassassin
# systemctl disable spamassassin

Apache Web Server and PHP

Installation

# apt -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.3 php7.3-common php7.3-gd php7.3-mysql php7.3-imap php7.3-cli php7.3-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt  imagemagick libruby libapache2-mod-python php7.3-curl php7.3-intl php7.3-pspell php7.3-recode php7.3-sqlite3 php7.3-tidy php7.3-xmlrpc php7.3-xsl memcached php-memcache php-imagick php-gettext php7.3-zip php7.3-mbstring memcached libapache2-mod-passenger php7.3-soap php7.3-fpm php7.3-opcache php-apcu

Enable Apache modules

Then run the following command to enable the Apache modules suexec, rewrite, ssl, actions, and include (plus dav, dav_fs, and auth_digest if you want to use WebDAV):

# a2enmod suexec rewrite ssl actions include dav_fs dav auth_digest cgi headers actions proxy_fcgi alias

To ensure that the server cannot be attacked through the HTTPOXY vulnerability, we will disable the HTTP_PROXY header in apache globally by adding the configuration file /etc/apache2/conf-available/httpoxy.conf.

Note: The vulnerability is named httpoxy (without 'r') and therefore the file where we add the config to prevent it is named httpoxy.conf and not httproxy.conf, so there is no 'r' missing in the filename.

# vi /etc/apache2/conf-available/httpoxy.conf

Paste the following content to the file:

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

And enable the module by running:

# a2enconf httpoxy
# systemctl restart apache2

Let's Encrypt

ISPConfig support for Let's encrypt
  • The Let's Encrypt function allows you to create free SSL certificates for your website from within ISPConfig.
Installation
# apt install certbot
Website certificates are created by ISPConfig when you add the web sites
  • There are no further steps required than installing LE

Mailman

ISPConfig allows you to manage (create/modify/delete) Mailman mailing lists. If you want to make use of this feature, install Mailman as follows:

# apt install mailman
Select at least one language, e.g.:
Languages to support: <-- en (English)
Missing site list <-- Ok

Before we can start Mailman, a first mailing list called mailman must be created:

# newlist mailman
Enter the email of the person running the list: <-- admin email address, e.g. listadmin@example.com
Initial mailman password: <-- admin password for the mailman list
To finish creating your mailing list, you must edit your /etc/aliases (or
equivalent) file by adding the following lines, and possibly running the
`newaliases' program:

## mailman mailing list
mailman:              "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"

Hit enter to notify mailman owner... <-- ENTER

Open /etc/aliases afterwards...

# vi /etc/aliases

... and add the following lines:

[...]
## mailman mailing list
mailman:              "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"

Run:

# newaliases

and restart Postfix:

# systemctl restart postfix

Finally, we must enable the Mailman Apache configuration:

# ln -s /etc/mailman/apache.conf /etc/apache2/conf-enabled/mailman.conf

This defines the alias /cgi-bin/mailman/ for all Apache vhosts, which means you can access the Mailman admin interface for a list at http://server1.example.com/cgi-bin/mailman/admin/, and the web page for users of a mailing list can be found at http://server1.example.com/cgi-bin/mailman/listinfo/.

Under http://server1.example.com/pipermail you can find the mailing list archives.

Restart Apache afterwards:

# systemctl restart apache2

Then start the Mailman daemon:

# systemctl restart mailman

PureFTPd and Quota

Installation

# apt install pure-ftpd-common pure-ftpd-mysql quota quotatool

Create the dhparam

# openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048

Konfiguration anpassen

Make sure that the start mode is set to standalone and set VIRTUALCHROOT=true:

# vi /etc/default/pure-ftpd-common
[...]
STANDALONE_OR_INETD=standalone
[...]
VIRTUALCHROOT=true
[...]

Allow FTP and TLS sessions

  • FTP is a very insecure protocol because all passwords and all data are transferred in clear text.
  • By using TLS, the whole communication can be encrypted, thus making FTP much more secure.

If you want to allow FTP and TLS sessions, run

# echo 1 > /etc/pure-ftpd/conf/TLS

In order to use TLS, we must create an SSL certificate. I create it in /etc/ssl/private/, therefore I create that directory first:

# mkdir -p /etc/ssl/private/

Generate the SSL certificate

# openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
Country Name (2 letter code) [AU]: <-- Enter your Country Name (e.g., "DE").
State or Province Name (full name) [Some-State]: <-- Enter your State or Province Name.
Locality Name (eg, city) []: <-- Enter your City.
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Enter your Organization Name (e.g., the name of your company).
Organizational Unit Name (eg, section) []: <-- Enter your Organizational Unit Name (e.g. "IT Department").
Common Name (eg, YOUR name) []: <-- Enter the Fully Qualified Domain Name of the system (e.g. "server1.example.com").
Email Address []: <-- Enter your Email Address.

Change the permissions of the SSL certificate

# chmod 600 /etc/ssl/private/pure-ftpd.pem

Then restart PureFTPd:

# systemctl restart pure-ftpd-mysql

Edit /etc/fstab

Mine looks like this (I added ,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 to the partition with the mount point /):

# vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=45576b38-39e8-4994-b8c1-ea4870e2e614 / ext4 errors=remount-ro,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 0 1
# swap was on /dev/sda5 during installation
UUID=8bea0d1e-ec37-4b20-9976-4b7daaa3eb69 none swap sw 0 0
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0

To enable quota, run these commands:

# mount -o remount /
# quotacheck -avugm
# quotaon -avug

BIND DNS Server

Installation

# apt -y install bind9 dnsutils haveged

Webalizer and AWStats

Installation

# apt -y install webalizer awstats geoip-database libclass-dbi-mysql-perl libtimedate-perl

Open /etc/cron.d/awstats afterwards...

# vi /etc/cron.d/awstats

... and comment out everything in that file:

#MAILTO=root
#*/10 * * * * www-data [ -x /usr/share/awstats/tools/update.sh ] && /usr/share/awstats/tools/update.sh
# Generate static reports:
#10 03 * * * www-data [ -x /usr/share/awstats/tools/buildstatic.sh ] && /usr/share/awstats/tools/buildstatic.sh

Jailkit

siehe Linux/Server:Jailkit#Installation

fail2ban and UFW Firewall

# apt install fail2ban

To make fail2ban monitor PureFTPd and Dovecot, create the file /etc/fail2ban/jail.local:

# vi /etc/fail2ban/jail.local

And add the following configuration to it.

[pure-ftpd]
enabled = true
port = ftp
filter = pure-ftpd
logpath = /var/log/syslog
maxretry = 3
[dovecot]
enabled = true
filter = dovecot
logpath = /var/log/mail.log
maxretry = 5
[postfix-sasl]
enabled = true
port = smtp
filter = postfix[mode=auth]
logpath = /var/log/mail.log
maxretry = 3 

Restart fail2ban:

# systemctl restart fail2ban

To install the UFW firewall, run this apt command:

# apt install ufw
# ufw allow http
# ufw allow https
# ufw allow ssh
# ufw allow 8080

RoundCube Webmail

In this chapter, we will install the RoundCube webmail client. First, we have to create the database for Roundcube manually as there is currently an issue in the RoundCube Debian installer which causes it to fail to create the database automatically. Run this command to create the database:

echo "CREATE DATABASE roundcube;" | mysql --defaults-file=/etc/mysql/debian.cnf

Then install RoundCube with this command:

apt install roundcube roundcube-core roundcube-mysql roundcube-plugins

The installer will ask the following questions:

Configure database for roundcube with dbconfig.common? <-- yes
MySQL application password for roundcube: <-- press enter

Then edit the RoundCube /etc/roundcube/config.inc.php file and adjust a few settings:

vi /etc/roundcube/config.inc.php

Set the default_host and smtp_server to localhost.

$config['default_host'] = 'localhost';
$config['smtp_server'] = 'localhost';    

Then edit the Apache roundcube configuration file /etc/apache2/conf-enabled/roundcube.conf:

vi /etc/apache2/conf-enabled/roundcube.conf

And add an alias line for the apache /webmail alias and one for /roundcube, you can add the line right at the beginning of the file. NOTE: Do not use /mail as alias or the ispconfig email module will stop working!

Alias /roundcube /var/lib/roundcube
Alias /webmail /var/lib/roundcube

Then reload Apache/

systemctl reload apache2

Now you can access RoundCube as follows:

http://192.168.0.100/webmail
http://www.example.com/webmail
http://server1.example.com:8080/webmail (after you have installed ISPConfig, see the next chapter)

Datei:Bild2.png

ISPConfig

Download

To install ISPConfig 3.1

# cd /tmp
# wget https://ispconfig.org/downloads/ISPConfig-3.1.15p3.tar.gz
# tar xfz ISPConfig-3.1.15p3.tar.gz
# cd ispconfig3_install/install/

Install ISPConfig

The next step is to run the ISPConfig installer.

# php -q install.php

This will start the ISPConfig 3 installer. The installer will configure all services like Postfix, Dovecot, etc. for you. A manual setup as required for ISPConfig 2 (perfect setup guides) is not necessary.

# php -q install.php
--------------------------------------------------------------------------------
 _____ ___________   _____              __ _         ____
|_   _/  ___| ___ \ /  __ \            / _(_)       /__  \
  | | \ `--.| |_/ / | /  \/ ___  _ __ | |_ _  __ _    _/ /
  | |  `--. \  __/  | |    / _ \| '_ \|  _| |/ _` |  |_ |
 _| |_/\__/ / |     | \__/\ (_) | | | | | | | (_| | ___\ \
 \___/\____/\_|      \____/\___/|_| |_|_| |_|\__, | \____/
                                              __/ |
                                             |___/
--------------------------------------------------------------------------------
>> Initial configuration
Operating System: Debian 10.0 (Buster) or compatible
Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with <ENTER>.
Tap in "quit" (without the quotes) to stop the installer.
Select language (en,de) [en]: <-- Hit Enter
Installation mode (standard,expert) [standard]: <-- Hit Enter
Full qualified hostname (FQDN) of the server, eg server1.domain.tld [server1.example.com]: <-- Hit Enter
MySQL server hostname [localhost]: <-- Hit Enter
MySQL server port [3306]: <-- Hit Enter
MySQL root username [root]: <-- Hit Enter
MySQL root password []: <-- Enter your MySQL root password
MySQL database to create [dbispconfig]: <-- Hit Enter
MySQL charset [utf8]: <-- Hit Enter
Configuring Postgrey
Configuring Postfix
Generating a 4096 bit RSA private key
.......................................................................++
........................................................................................................................................++
writing new private key to 'smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: <-- Enter 2 letter country code
State or Province Name (full name) [Some-State]: <-- Enter the name of the  state
Locality Name (eg, city) []: <-- Enter your city
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Enter company name or press enter
Organizational Unit Name (eg, section) []: <-- Hit Enter
Common Name (e.g. server FQDN or YOUR name) []: <-- Enter the server hostname, in my case: server1.example.com
Email Address []: <-- Hit Enter
Configuring Mailman
Configuring Dovecot
Configuring Spamassassin
Configuring Amavisd
Configuring Getmail
Configuring BIND
Configuring Jailkit
Configuring Pureftpd
Configuring Apache
Configuring vlogger
[INFO] service Metronome XMPP Server not detected
Configuring Ubuntu Firewall
Configuring Fail2ban
[INFO] service OpenVZ not detected
Configuring Apps vhost
Installing ISPConfig
ISPConfig Port [8080]:
Admin password [admin]:
Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]: <-- Hit Enter
Generating RSA private key, 4096 bit long modulus
.......................++
................................................................................................................................++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: <-- Enter 2 letter country code
State or Province Name (full name) [Some-State]: <-- Enter the name of the  state
Locality Name (eg, city) []: <-- Enter your city
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Enter company name or press enter
Organizational Unit Name (eg, section) []: <-- Hit Enter
Common Name (e.g. server FQDN or YOUR name) []: <-- Enter the server hostname, in my case: server1.example.com
Email Address []: <-- Hit Enter
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: <-- Hit Enter
An optional company name []: <-- Hit Enter
writing RSA key
Configuring DBServer
Installing ISPConfig crontab
no crontab for root
no crontab for getmail
Detect IP addresses
Restarting services ...
Installation completed.

The installer automatically configures all underlying services, so no manual configuration is needed.

Afterwards you can access ISPConfig 3 under http(s)://server1.example.com:8080/ or http(s)://192.168.0.100:8080/ ( http or https depends on what you chose during installation). Log in with the username admin and the password admin (you should change the default password after your first login):

"ISPConfig Login on Debian 10"

"ISPConfig Dashboard on Debian 10"

The system is now ready to be used.

ISPConfig 3 Manual

In order to learn how to use ISPConfig 3, I strongly recommend downloading the ISPConfig 3 Manual.

On more than 300 pages, it covers the concept behind ISPConfig (admin, resellers, clients), explains how to install and update ISPConfig 3, includes a reference for all forms and form fields in ISPConfig together with examples of valid inputs, and provides tutorials for the most common tasks in ISPConfig 3. It also lines out how to make your server more secure and comes with a troubleshooting section at the end.

Virtual Machine Image Download of this Tutorial

This tutorial is available as ready to use virtual machine image in ovf/ova format that is compatible with VMWare and Virtualbox. The virtual machine image uses the following login details:

SSH / Shell Login

Username: administrator
Password: howtoforge
Username: root
Password: howtoforge

ISPConfig Login

Username: admin
Password: admin

MySQL Login

Username: root
Password: howtoforge

The IP of the VM is 192.168.0.100, it can be changed in the file /etc/network/interfaces. Please change all the above passwords to secure the virtual machine.

Links