Ispconfig-Specs - Version1.0
Ispconfig-Specs - Version1.0
Search...
Tutorial search
Home The Perfect Server CentOS 8 with Apache, PHP, Postfix, Dovecot, Pure-FTPD, B…
B…
Sign up now!
The Perfect Server CentOS 8 with Apache, PHP, Postfix, Dovecot, Pure-
1 Requirements
A Centos 8 minimal server system. This can be a server installed from scratch as described in our Centos 8 minimal server
tutorial or a virtual-server or root-server from a hosting company that has a minimal Centos 8 setup installed.
A fast Internet connection.
In case that the keyboard layout of the server does not match your keyboard, you can switch to the right keyboard (in my Share This Page
case "de" for a German keyboard layout, with the localectl command:
localectl set-keymap de
40.2k Followers
iptables -L
firewall-cmd --state
not running
[root@server1 ~]#
Now I will install the network configuration editor and the shell based editor "nano" that I will use in the next steps to edit the
config files:
If you did not configure your network card during the installation, you can do that now. Run...
nmtui
Advertisement
Then fill in your network details - disable DHCP and fill in a static IP address, a netmask, your gateway, and one or two
nameservers, then hit Ok:
Next select OK to confirm the changes that you made in the network settings
ifconfig
If your network card does not show up there, then it not be enabled on boot, In this case, open the file
/etc/sysconfig/network-scripts/ifcfg-eth0
nano /etc/sysconfig/network-scripts/ifcfg-ens33
[...]
ONBOOT=yes
[...]
and reboot the server.
Check your /etc/resolv.conf if it lists all nameservers that you've previously configured:
cat /etc/resolv.conf
nmtui
nano /etc/hosts
Set the hostname in the /etc/hostname file. The file shall contain the fully qualified domain name (e.g. server1.example.com
in my case) and not just the short name like "server1". Open the file with the nano editor:
nano /etc/hostname
server1.example.com
SELinux is a security extension of CentOS that should provide extended security. ISPConfig does not ship with an SELinux
rule set, therefore I set it to permissive (this is a must if you want to install ISPConfig later on).
nano /etc/selinux/config
SELINUX=permissive
SELINUXTYPE=targeted
reboot
dnf -y update
Now we install some software packages that are needed later on:
5 Quota
(If you have chosen a different partitioning scheme than I did, you must adjust this chapter so that quota applies to the
partitions where you need it.)
Now we check if the quota is already enabled for the file system where the website (/var/www) and Maildir data (var/vmail) is
stored. In this example setup, I have one big root partition, so I search for ' / ':
[root@server1 ~]#
instead. If the line contains the word "noquota", then proceed with the following steps to enable quota.
Normally you would enable quota in the /etc/fstab file, but if the filesystem is the root filesystem "/", then quota has to be
enabled by a boot parameter of the Linux Kernel.
nano /etc/default/grub
Search for the line that starts with GRUB_CMDLINE_LINUX and add rootflags=uquota,gquota to the commandline
parameters so that the resulting line looks like this:
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak
grub2-mkconfig -o /boot/grub2/grub.cfg
[root@server1 ~]#
When quota is active, we can see "usrquota,grpquota" in the mount option list.
If you have a separate /var partition, then edit /etc/fstab and add ,uquota,gquota to the / partition
(/dev/mapper/centos-var):
nano /etc/fstab
# /etc/fstab
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
Then run
quotacheck -avugm
quotaon -avug
to enable quota. When you get an error that there is no partition with quota enabled, then reboot the server before you
proceed.
Enable the Remi repository to get newer PHP versions (currently PHP 7.4):
dnf update
To ensure that the server cannot be attacked through the HTTPOXY vulnerability, we will disable the HTTP_PROXY header
in apache globally.
Add the apache header rule at the end of the httpd.conf file:
Install phpMyAdmin:
cd /tmp
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
mkdir /usr/share/phpmyadmin
mv phpMyAdmin-5.0.2-all-languages/* /usr/share/phpmyadmin/
mkdir /usr/share/phpmyadmin/tmp
CentOS 8 uses the Apache MPM Event module by default, this is good on one side, as it allows you to use HTTP/2 protocol.
On the other hand, it does not allow you to use the apache mod_php module. In general, one should use PHP-FPM as
default today and ISPConfig supports that. In case you need the old mod_php mode for compatibility reasons, then you can
switch the Apache MPM like this:
nano /etc/httpd/conf.modules.d/00-mpm.conf
Then remove the # in from of the MPM Prefork line, so it looks like this:
7 Install Dovecot
touch /etc/dovecot/dovecot-sql.conf
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf
ln -s /etc/dovecot/dovecot.conf /etc/dovecot.conf
8 Install Postfix
nano /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!
[...]
-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
# -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
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=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
[...]
Then turn off Sendmail and start Postfix and MariaDB (MySQL):
We disable sendmail to ensure that it does not get started in case it is installed on your server. So the error message "Failed
to issue method call: Unit sendmail.service not loaded." can be ignored.
To enable support for old/outdated devices, run this command (optional, only use when you want old mail devices to connect
as it weakens the SSL/TLS setup by allowing less secure ciphers):
9 Install Getmail
cd /tmp
wget http://pyropus.ca/software/getmail/old-versions/getmail-5.14.tar.gz
tar xvfz getmail-5.14.tar.gz
cd getmail-5.14
mysql_secure_installation
[root@server1 tmp]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
Setting the root password ensures that nobody can log into the MariaDB
Set root password? [Y/n] <-- ENTER
New password: <-- yourrootsqlpassword
Re-enter new password: <-- yourrootsqlpassword
Password updated successfully!
Reloading privilege tables..
... Success!
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
production environment.
Remove anonymous users? [Y/n] <-- ENTER
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] <-- ENTER
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
Remove test database and access to it? [Y/n] <-- ENTER
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] <-- ENTER
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
[root@server1 tmp]#
nano /etc/httpd/conf.d/phpmyadmin.conf
<Directory /usr/share/phpmyadmin/>
<IfModule mod_authz_core.c>
# Apache 2.4
# <RequireAny>
# Require ip 127.0.0.1
# Require ip ::1
# </RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
</IfModule>
</Directory>
nano /usr/share/phpmyadmin/config.inc.php
[...]
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';
[...]
Then we create the system startup links for Apache and start it:
systemctl enable httpd
sa-update
freshclam
In the next step, we configure postgrey. Open the file /etc/sysconfig/postgrey in an editor:
nano /etc/sysconfig/postgrey
POSTGREY_TYPE="--unix=/var/spool/postfix/postgrey/socket"
to
POSTGREY_TYPE="--inet=10023"
nano /etc/clamd.d/amavisd.conf
LocalSocket /run/clamd.amavisd/clamd.sock
to
LocalSocket /var/spool/amavisd/clamd.sock
Now we have to create a system unit for the freshclam service. Create a new file /usr/lib/systemd/system/freshclam.service:
nano /usr/lib/systemd/system/freshclam.service
[Unit]
After = network.target
[Service]
Type = forking
# if you want to scan more than one in a day change the number 1 with your desired number in
below line.
ExecStart = /usr/bin/freshclam -d -c 1
Restart = on-failure
PrivateTmp =true
[Install]
WantedBy=multi-user.target
Save the file and then enable and start the service.
ISPConfig 3 allows you to use mod_php, mod_fcgi/PHP, cgi/PHP, and PHP-FPM on a per website basis.
dnf -y install php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml p
hp-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-snmp php-soap php-tidy curl curl-devel p
erl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpm php
-intl php-imagick php-pspell wget
nano /etc/php.ini
... and change the error reporting (so that notices aren't shown any longer), set the timezone and uncomment
cgi.fix_pathinfo=1:
[...]
[...]
; what PATH_INFO is. For more information on PAppp.tldTH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]
date.timezone = 'Europe/Berlin'
[...]
Enable httpd and PHP-FPM to get started at boot time and start the PHP-FPM service.
Now we will add support for Let's encrypt. ISPConfig is using acme.sh now as Let's Encrypt client. Install acme.sh using the
following command:
curl https://get.acme.sh | sh -s
13 Installation of mod_python
The Apache module mod_python is not available as RPM package, therefore we will compile it from source. The first step is
to install the python development files and download the current mod_python version as .tar.gz file
wget http://dist.modpython.org/dist/mod_python-3.5.0.tgz
cd mod_python-3.5.0
./configure --with-python=/usr/bin/python3
make
There is an error in the compiled module that will cause the installation to fail with the error "version = "fatal: Not a git
repository (or any of the parent directories): .git". To fix that, run this sed command (the command is one line!).
make install
14 Install PureFTPd
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.
Open /etc/pure-ftpd/pure-ftpd.conf...
nano /etc/pure-ftpd/pure-ftpd.conf
If you want to allow FTP and TLS sessions, set TLS to 1 by removing the # in front of the TLS line. It is highly recommended
to enable TLS.
[...]
TLS 1
[...]
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/
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) [XX]: <-- Enter your Country Name (e.g., "DE").
State or Province Name (full name) []:<-- Enter your State or Province Name.
Organization Name (eg, company) [Default Company 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 or your server's hostname) []:<-- Enter the Fully Qualified Domain Name of
the system (e.g. "server1.example.com").
That's it. You can now try to connect using your FTP client; however, you should configure your FTP client to use TLS.
15 Install BIND
Make a backup of the existing /etc/named.conf file and create a new one as follows:
cp /etc/named.conf /etc/named.conf_bak
nano /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
//
//
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
allow-recursion {"none";};
recursion no;
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.conf.local";
Create the file /etc/named.conf.local that is included at the end of /etc/named.conf (/etc/named.conf.local
will later on get populated by ISPConfig if you create DNS zones in ISPConfig):
touch /etc/named.conf.local
systemctl enable haveged.service
16 Install AWStats
The alternative web statistics application 'webalizer' is not available for CentOS 8 anymore, so you will only be able to use
AWStats.
17 Install Jailkit
Jailkit is used to chroot SSH users and cronjobs. It can be installed as follows:
ln -s /usr/bin/python2 /usr/bin/python
cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.21.tar.gz
cd jailkit-2.21
./configure
make
make install
cd ..
rm -rf jailkit-2.21*
18 Install Fail2Ban
This is optional but recommended, because the ISPConfig monitor tries to show the log.
Next we create the /etc/fail2ban/jail.local file and enable monitoring for ssh, email and ftp service.
nano /etc/fail2ban/jail.local
[sshd]
enabled = true
[pure-ftpd]
enabled = true
maxretry = 3
[dovecot]
enabled = true
maxretry = 5
[postfix-sasl]
enabled = true
maxretry = 3
Then create the system startup links for fail2ban and start it:
systemctl enable fail2ban.service
19 Install rkhunter
20 Install Mailman
If you like to manage mailing lists with Mailman on your server, then install mailman now. Mailman is supported by
ISPConfig, so you will be able to create new mailing lists trough ISPConfig later.
Before we can start Mailman, a first mailing list called mailman must be created:
touch /var/lib/mailman/data/aliases
postmap /var/lib/mailman/data/aliases
/usr/lib/mailman/bin/newlist mailman
ln -s /usr/lib/mailman/mail/mailman /usr/bin/mailman
[root@server1 tmp]# /usr/lib/mailman/bin/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: "|/usr/lib/mailman/mail/mailman post mailman"
mailman-admin: "|/usr/lib/mailman/mail/mailman admin mailman"
mailman-bounces: "|/usr/lib/mailman/mail/mailman bounces mailman"
mailman-confirm: "|/usr/lib/mailman/mail/mailman confirm mailman"
mailman-join: "|/usr/lib/mailman/mail/mailman join mailman"
mailman-leave: "|/usr/lib/mailman/mail/mailman leave mailman"
mailman-owner: "|/usr/lib/mailman/mail/mailman owner mailman"
mailman-request: "|/usr/lib/mailman/mail/mailman request mailman"
mailman-subscribe: "|/usr/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe: "|/usr/lib/mailman/mail/mailman unsubscribe mailman"
Hit enter to notify mailman owner... <-- ENTER
[root@server1 tmp]#
nano /etc/aliases
[...]
Run
newaliases
nano /etc/httpd/conf.d/mailman.conf
... and add the line ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/. Comment out Alias
/pipermail/ /var/lib/mailman/archives/public/ and add the line Alias /pipermail
/var/lib/mailman/archives/public/:
<Directory /usr/lib/mailman/cgi-bin/>
AllowOverride None
Options ExecCGI
Order allow,deny
</Directory>
<Directory /var/lib/mailman/archives/public>
AllowOverride None
Order allow,deny
AddDefaultCharset Off
</Directory>
Restart Apache:
Create the system startup links for Mailman and start it:
After you have installed ISPConfig 3, you can access Mailman as follows:
You can use the alias /cgi-bin/mailman for all Apache vhosts (please note that suExec and CGI must be disabled for all
vhosts from which you want to access Mailman!), which means you can access the Mailman admin interface for a list at
http://<vhost>/cgi-bin/mailman/admin/<listname>, and the web page for users of a mailing list can be found at
http://<vhost>/cgi-bin/mailman/listinfo/<listname>.
To install the RoundCube webmail client, download the latest version with wget to the /tmp folder:
cd /tmp
wget https://github.com/roundcube/roundcubemail/releases/download/1.4.3/roundcubemail-1.4.3
-complete.tar.gz
Unpack the tar.gz archive and move the RoundCube source to /usr/share/roundcubemail
mkdir /usr/share/roundcubemail
mv /tmp/roundcubemail-1.4.3/* /usr/share/roundcubemail/
chown -R root:root /usr/share/roundcubemail
<Directory /usr/share/roundcubemail/>
Options none
AllowOverride Limit
</Directory>
<Directory /usr/share/roundcubemail/installer>
Options none
AllowOverride Limit
</Directory>
<Directory /usr/share/roundcubemail/bin/>
Order Allow,Deny
</Directory>
<Directory /usr/share/roundcubemail/plugins/enigma/home/>
Order Allow,Deny
</Directory>
Restart Apache:
mysql -u root -p
FLUSH PRIVILEGES;
exit
I am using the details for the RoundCube database as an example, please replace the values as per your choice for security
reasons.
nano /usr/share/roundcubemail/config/config.inc.php
<?php
// ----------------------------------
// SQL DATABASE
// ----------------------------------
// or (Windows): 'sqlite:///C:/full/path/to/sqlite.db'
$config['db_dsnw'] = 'mysql://roundcubeuser:roundcubepassword@localhost/roundcubedb';
// ----------------------------------
// IMAP
// ----------------------------------
// %n - hostname ($_SERVER['SERVER_NAME'])
// %s - domain name after the '@' from e-mail address provided at login screen
// required to match old user data records with the new host.
$config['default_host'] = 'localhost';
$config['smtp_server'] = 'localhost';
$config['smtp_port'] = 25;
// provide an URL where a user can get support for this Roundcube installation
$config['support_url'] = '';
// This key is used for encrypting purposes, like storing of imap password
// in the session. For historical reasons it's called DES_key, but it's used
$config['des_key'] = 'pb0UucO0eqjgvhrqYlFTBVjE';
// ----------------------------------
// PLUGINS
// ----------------------------------
$config['plugins'] = array();
// - 'googie' - the default (also used for connecting to Nox Spell Server, see 'spellcheck_ur
i' setting)
// - 'atd' - install your own After the Deadline server or check with the people at http://ww
w.afterthedeadline.com before using their API
// Since Google shut down their public spell checking service, the default settings
// You can connect to any other googie-compliant service by setting 'spellcheck_uri' accordin
gly.
$config['spellcheck_engine'] = 'pspell';
$config['enable_installer'] = true;
Then press "continue" in the web installer. On the following page, press on the button "Initialize database".
Finally, disable the Roundecubemail installer. Change the RoundCube config.inc.php configuration file
nano /usr/share/roundcubemail/config/config.inc.php
$config['enable_installer'] = true;
to:
$config['enable_installer'] = false;
Roundcube is available now under the aliases /webmail and /roundcubemail on your server:
http://192.168.0.100/webmail
The RoundCube login is the email address and password of an email account that you create later in ISPConfig.
The ISPConfig installer will configure all services like Postfix, Dovecot, etc. for you.
You now also have the possibility to let the installer create an SSL vhost for the ISPConfig control panel so that ISPConfig
can be accessed using https:// instead of http://. To achieve this, just press ENTER when you see this question: Do
you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]:.
cd /tmp
cd ispconfig3*/install/
php -q install.php
This will start the ISPConfig 3 installer. The installer will configure all services like Postfix, Dovecot, etc. for you.
--------------------------------------------------------------------------------
__/ |
|___/
--------------------------------------------------------------------------------
MySQL root password []: <-- Ente the MySQL root password here
Configuring Postgrey
Configuring Postfix
................................++
..............................................................................................
++
-----
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
-----
Country Name (2 letter code) [XX]: <-- Enter 2 Letter country code, e.g. US
State or Province Name (full name) []: <-- Enter anme of State or Province
Organization Name (eg, company) [Default Company Ltd]: <-- Company name