Perfect Server CentOS 7

-------

The Perfect Server CentOS 7.4 with Apache, Postfix, Dovecot, Pure-FTPD, BIND and ISPConfig 3.1

This tutorial shows the installation of ISPConfig 3.1 on a CentOS 7.4 (64Bit) server. ISPConfig is a web hosting control panel that allows you to configure the following services through a web browser: Apache web server, Postfix mail server, MySQL, BIND nameserver, PureFTPd, SpamAssassin, ClamAV, Mailman, and many more.

1 Requirements

To install such a system you will need the following:

 

2 Preliminary Note

In this tutorial, I use the hostname server1.example.com with the IP address 192.168.0.100 and the gateway 192.168.0.1. These settings might differ for you, so you have to replace them where appropriate.

Please note that HHVM and XMPP are not supported in ISPConfig for the CentOS platform yet. If you like to manage an XMPP chat server from within ISPConfig or use HHVM (Hip Hop Virtual Machine) in an ISPConfig website, then please use Debian or Ubuntu 16.04 as server OS instead of CentOS 7.4.

3 Prepare the server

Set the keyboard layout

In case that the keyboard layout of the server does not match your keyboard, you can switch to the right keyboard (in my case "de" for a German keyboard layout, with the localectl command:

localectl set-keymap de

To get a list of all available keymaps, run:

localectl list-keymaps

I want to install ISPConfig at the end of this tutorial, ISPConfig ships with the Bastille firewall script that I will use as firewall, therefor I disable the default CentOS firewall now. Of course, you are free to leave the CentOS firewall on and configure it to your needs (but then you shouldn't use any other firewall later on as it will most probably interfere with the CentOS firewall).

Run...

yum -y install net-tools

systemctl stop firewalld.service

systemctl disable firewalld.service

to stop and disable the CentOS firewall. It is ok when you get errors here, this just indicates that the firewall was not installed.

Then you should check that the firewall has really been disabled. To do so, run the command:

iptables -L

The output should look like this:

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

Or use the firewall-cmd command:

firewall-cmd --state

[root@server1 ~]# 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:

yum -y install nano wget NetworkManager-tui

If you did not configure your network card during the installation, you can do that now. Run...

nmtui

... and go to Edit a connection:

Select your network interface:

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

and Quit to close the nmtui network configuration tool.

You should run

ifconfig

now to check if the installer got your IP address right:

[root@localhost ~]# ifconfig

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.0.100 netmask 255.255.255.0 broadcast 192.168.0.255

inet6 fe80::20c:29ff:fe1a:3d8e prefixlen 64 scopeid 0x20<link>

ether 00:0c:29:1a:3d:8e txqueuelen 1000 (Ethernet)

RX packets 184972 bytes 256696909 (244.8 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 62983 bytes 7236189 (6.9 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10<host>

loop txqueuelen 1 (Local Loopback)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@localhost ~]#

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

and set ONBOOT to yes:

[...]

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

If nameservers are missing, run

nmtui

and add the missing nameservers again.

Now, on to the configuration...

 

Adjusting /etc/hosts and /etc/hostname

Next, we will edit /etc/hosts. Make it look like this:

nano /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

192.168.1.100   server1.example.com     server1

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

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

And set the hostname in the file.

server1.example.com

Save the file and exit nano.

Disable SELinux

SELinux is a security extension of CentOS that should provide extended security. In my opinion you don't need it to configure a secure system, and it usually causes more problems than advantages (think of it after you have done a week of trouble-shooting because some service wasn't working as expected, and then you find out that everything was ok, only SELinux was causing the problem). Therefore I disable it (this is a must if you want to install ISPConfig later on).

Edit /etc/selinux/config and set SELINUX=disabled:

nano /etc/selinux/config

# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #     enforcing - SELinux security policy is enforced. #     permissive - SELinux prints warnings instead of enforcing. #     disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: #     targeted - Targeted processes are protected, #     mls - Multi Level Security protection. SELINUXTYPE=targeted

Afterwards we must reboot the system:

reboot

 

4 Enable Additional Repositories and Install Some Software

First, we import the GPG keys for software packages:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Then we enable the EPEL repository on our CentOS system as lots of the packages that we are going to install in the course of this tutorial are not available in the official CentOS 7 repository:

yum -y install epel-release

yum -y install yum-priorities

Edit /etc/yum.repos.d/epel.repo...

nano /etc/yum.repos.d/epel.repo

... and add the line priority=10 to the [epel] section:

[epel] name=Extra Packages for Enterprise Linux 7 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch failovermethod=priority enabled=1 priority=10 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 [...]

Then we update our existing packages on the system:

yum -y update

Now we install some software packages that are needed later on:

yum -y groupinstall 'Development Tools'

 

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.)

To install quota, we run this command:

yum -y install quota

Now we check if quota is already enabled for the filesystem 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 ' / ':

mount | grep ' / '

[root@server1 ~]# mount | grep ' / '

/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)

[root@server1 ~]#

If you have a separate /var partition, then use:

mount | grep ' /var '

instead. If the line contains the word "noquota", then proceed with the following steps to enable quota.

Enabling quota on the / (root) partition

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.

Edit the grub configuration file:

nano /etc/default/grub

search fole 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:

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet rootflags=uquota,gquota"

and apply the changes by running the following command.

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak

grub2-mkconfig -o /boot/grub2/grub.cfg

and reboot the server.

reboot

Now check if quota is enabled:

mount | grep ' / '

[root@server1 ~]# mount | grep ' / '

/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)

[root@server1 ~]#

When quota is active, we can see "usrquota,grpquota" in the mount option list.

 

Enabling quota on a separate /var partition

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

# Created by anaconda on Sun Sep 21 16:33:45 2014

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

/dev/mapper/centos-root /                       xfs     defaults        1 1

/dev/mapper/centos-var /var                     xfs     defaults,uquota,gquota        1 2

UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot                   xfs     defaults        1 3

/dev/mapper/centos-swap swap                    swap    defaults        0 0

Then run

mount -o remount /var

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.

 

6 Install Apache, MySQL, phpMyAdmin

We can install the needed packages with one single command:

yum -y install ntp httpd mod_ssl mariadb-server php php-mysql php-mbstring phpmyadmin

To ensure that the server can not be attacked trough 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:

echo "RequestHeader unset Proxy early" >> /etc/httpd/conf/httpd.conf

And restart httpd to apply the configuration change.

service httpd restart 

7 Install Dovecot

Dovecot can be installed as follows:

yum -y install dovecot dovecot-mysql dovecot-pigeonhole

Create a empty dovecot-sql.conf file and create symlinks:

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

Now create the system startup links and start Dovecot:

systemctl enable dovecot

systemctl start dovecot

8 Install Postfix

Postfix can be installed as follows:

yum -y install postfix

Then turn off Sendmail and start Postfix and MariaDB (MySQL):

systemctl enable mariadb.service

systemctl start mariadb.service

systemctl stop sendmail.service

systemctl disable sendmail.service

systemctl enable postfix.service

systemctl restart postfix.service

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.

 

9 Install Getmail

Getmail can be installed as follows:

yum -y install getmail

 

10 Set MySQL Passwords and Configure phpMyAdmin

Set passwords for the MySQL root account:

mysql_secure_installation

[root@server1 tmp]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

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,

so you should just press enter here.

Enter current password for root (enter for none):

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB

root user without the proper authorisation.

Set root password? [Y/n] <-- ENTER

New password: <-- yourrootsqlpassword

Re-enter new password: <-- yourrootsqlpassword

Password updated successfully!

Reloading privilege tables..

 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone

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

go a bit smoother. You should remove them before moving into a

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

before moving into a production environment.

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

installation should now be secure.

Thanks for using MariaDB!

[root@server1 tmp]#

Now we configure phpMyAdmin. We change the Apache configuration so that phpMyAdmin allows connections not just from localhost (by commenting out the two "Require ip" lines and adding the new line "Require all granted" in the <Directory /usr/share/phpMyAdmin/> stanza):

nano /etc/httpd/conf.d/phpMyAdmin.conf

# phpMyAdmin - Web based MySQL browser written in php # # Allows only localhost by default # # But allowing phpMyAdmin to anyone other than localhost should be considered # dangerous unless properly secured by SSL  Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin  <Directory /usr/share/phpMyAdmin/>    <IfModule mod_authz_core.c>      # Apache 2.4      <RequireAny>     #  Require ip 127.0.0.1      #  Require ip ::1

       Require all granted      </RequireAny>    </IfModule>    <IfModule !mod_authz_core.c>      # Apache 2.2      Order Deny,Allow      Deny from All      Allow from 127.0.0.1      Allow from ::1    </IfModule> </Directory>            

Next, we change the authentication in phpMyAdmin from cookie to http:

nano /etc/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.service

systemctl restart  httpd.service

Now you can direct your browser to http://server1.example.com/phpmyadmin/ or http://192.168.1.100/phpmyadmin/ and log in with the user name root and your new root MySQL password.

 

11 Install Amavisd-new, SpamAssassin, ClamAV, and Postgrey

To install amavisd-new, SpamAssassin and ClamAV, run the following command:

yum -y install amavisd-new spamassassin clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd unzip bzip2 perl-DBD-mysql postgrey re2c

Edit the freshclam configuration file /etc/freshclam.conf

nano /etc/freshclam.conf

and check that the line "Example" is commented out as shown below:

[....]

# Example

[....]

To enable automatic ClamAV signature updates with freshclam, edit the file /etc/sysconfig/freshclam:

nano /etc/sysconfig/freshclam

and put a # in front of the last line so that it looks like this in case that's not the case yet:

# FRESHCLAM_DELAY=

Then we start freshclam, amavisd, and clamd.amavisd:

sa-update

freshclam

systemctl enable amavisd.service

systemctl start amavisd.service

systemctl start clamd@amavisd.service

systemctl enable postgrey.service

systemctl start postgrey.service

 

12 Installing Apache with mod_php, mod_fcgi/PHP, PHP-FPM

ISPConfig 3 allows you to use mod_php, mod_fcgi/PHP, cgi/PHP, and PHP-FPM on a per website basis.

We can install Apache2 with mod_php, mod_fcgid, and PHP as follows:

yum -y install php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpm wget

Next we open /etc/php.ini...

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:

[...] ;error_reporting = E_ALL & ~E_DEPRECATED error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT [...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; 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 ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; 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.

systemctl start php-fpm.service

systemctl enable php-fpm.service

systemctl enable httpd.service

Finally, we restart Apache:

systemctl restart httpd.service

Now we will add support for Let's encrypt.

mkdir /opt/certbot

cd /opt/certbot

wget https://dl.eff.org/certbot-auto

chmod a+x ./certbot-auto

Now run the certboot-auto command which will downlaod and install the software and it's dependencies.

./certbot-auto

The command will then tell you that "no names were found in your configuration files" and asks if it shall continue, please chose "c" to cancel here as the certs will be created by ispconfig.

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

yum -y install python-devel

cd /usr/local/src/

wget http://dist.modpython.org/dist/mod_python-3.5.0.tgz

tar xfz mod_python-3.5.0.tgz

cd mod_python-3.5.0

and then configure and compile the module.

./configure

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!).

sed -e 's/(git describe --always)/(git describe --always 2>\/dev\/null)/g' -e 's/`git describe --always`/`git describe --always 2>\/dev\/null`/g' -i $( find . -type f -name Makefile\* -o -name version.sh )

Then install the module with this command.

make install

and enable the module in Apache:

echo 'LoadModule python_module modules/mod_python.so' > /etc/httpd/conf.modules.d/10-python.conf

systemctl restart httpd.service

 

14 Install PureFTPd

PureFTPd can be installed with the following command:

yum -y install pure-ftpd

Then create the system startup links and start PureFTPd:

systemctl enable pure-ftpd.service

systemctl start pure-ftpd.service

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.

OpenSSL is needed by TLS; to install OpenSSL, we simply run:

yum install openssl

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.

[...] # This option can accept three values : # 0 : disable SSL/TLS encryption layer (default). # 1 : accept both traditional and encrypted sessions. # 2 : refuse connections that don't use SSL/TLS security mechanisms, #     including anonymous sessions. # Do _not_ uncomment this blindly. Be sure that : # 1) Your server has been compiled with SSL/TLS support (--with-tls), # 2) A valid certificate is in place, # 3) Only compatible clients will log in.  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/

Afterwards, we can generate the SSL certificate as follows:

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.

Locality Name (eg, city) [Default City]:<-- Enter your City.

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").

Email Address []:<-- Enter your Email Address.

Change the permissions of the SSL certificate:

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

Finally, restart PureFTPd:

systemctl restart pure-ftpd.service

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

We can install BIND as follows:

yum -y install bind bind-utils haveged

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

cat /dev/null > /etc/named.conf

nano /etc/named.conf

// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options {         listen-on port 53 { any; };         listen-on-v6 port 53 { any; };         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

Then we create the startup links and start BIND:

systemctl enable named.service

systemctl start named.service

systemctl enable haveged.service

systemctl start haveged.service

 

16 Install Webalizer, and AWStats

AWStats can be installed as follows:

yum -y install webalizer awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder

Edit the file /etc/httpd/conf.d/awstats.conf:

nano /etc/httpd/conf.d/awstats.conf

and change the line:

Require local

to:

Require all granted

And restart apache:

systemctl restart httpd.service

17 Install Jailkit

Jailkit is used to chroot SSH users and cronjobs. It can be installed as follows (important: Jailkit must be installed before ISPConfig - it cannot be installed afterwards!):

cd /tmp

wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz

tar xvfz jailkit-2.19.tar.gz

cd jailkit-2.19

./configure

make

make install

cd ..

rm -rf jailkit-2.19*

 

18 Install Fail2Ban

This is optional but recommended, because the ISPConfig monitor tries to show the log.

yum -y install iptables-services fail2ban fail2ban-systemd

systemctl stop firewalld.service

systemctl mask firewalld.service

systemctl disable firewalld.service

systemctl stop firewalld.service

Next we create the /etc/fail2ban/jail.local file and enable monitoring for ssh, email and ftp service.

nano /etc/fail2ban/jail.local

Add the following content to the jail.local file:

[sshd]

enabled = true

action = iptables[name=sshd, port=ssh, protocol=tcp]

[pure-ftpd]

enabled = true

action = iptables[name=FTP, port=ftp, protocol=tcp]

maxretry = 3

[dovecot]

enabled = true

action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]

maxretry = 5

[postfix-sasl]

enabled = true

action = iptables-multiport[name=postfix-sasl, port="smtp,smtps,submission", protocol=tcp]

maxretry = 3

Then create the system startup links for fail2ban and start it:

mkdir /var/run/fail2ban

systemctl enable fail2ban.service

systemctl start fail2ban.service

 

19 Install rkhunter

rkhunter can be installed as follows:

yum -y 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.

yum -y install mailman

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

Open /etc/aliases afterwards...

nano /etc/aliases

... and add the following lines:

[...] 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"

Run

newaliases

afterwards and restart Postfix:

systemctl restart postfix.service

Now open the Mailman Apache configuration file /etc/httpd/conf.d/mailman.conf...

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/:

# #  httpd configuration settings for use with mailman. #  ScriptAlias /mailman/ /usr/lib/mailman/cgi-bin/ ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/ <Directory /usr/lib/mailman/cgi-bin/>     AllowOverride None     Options ExecCGI     Order allow,deny     Allow from all </Directory>   #Alias /pipermail/ /var/lib/mailman/archives/public/ Alias /pipermail /var/lib/mailman/archives/public/ <Directory /var/lib/mailman/archives/public>     Options Indexes MultiViews FollowSymLinks     AllowOverride None     Order allow,deny     Allow from all     AddDefaultCharset Off </Directory>  # Uncomment the following line, to redirect queries to /mailman to the # listinfo page (recommended).  # RedirectMatch ^/mailman[/]*$ /mailman/listinfo

Restart Apache:

systemctl restart httpd.service

Create the system startup links for Mailman and start it:

systemctl enable mailman.service

systemctl start mailman.service

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>.

Under http://<vhost>/pipermail/<listname> you can find the mailing list archives.

21 Install Roundcube webmail

To install the RoundCube webmail client, run...

yum -y install roundcubemail

Change the roundcubemail.conf configuration file as follows:

nano /etc/httpd/conf.d/roundcubemail.conf

# # Round Cube Webmail is a browser-based multilingual IMAP client #  Alias /roundcubemail /usr/share/roundcubemail

Alias /webmail /usr/share/roundcubemail  # Define who can access the Webmail # You can enlarge permissions once configured  #<Directory /usr/share/roundcubemail/> #    <IfModule mod_authz_core.c> #        # Apache 2.4 #        Require local #    </IfModule> #    <IfModule !mod_authz_core.c> #        # Apache 2.2 #        Order Deny,Allow #        Deny from all #        Allow from 127.0.0.1 #        Allow from ::1 #    </IfModule> #</Directory>  <Directory /usr/share/roundcubemail/>         Options none         AllowOverride Limit         Require all granted </Directory>  # Define who can access the installer # keep this secured once configured  #<Directory /usr/share/roundcubemail/installer/> #    <IfModule mod_authz_core.c> #        # Apache 2.4 #        Require local #    </IfModule> #    <IfModule !mod_authz_core.c> #        # Apache 2.2 #        Order Deny,Allow #        Deny from all #        Allow from 127.0.0.1 #        Allow from ::1 #    </IfModule> #</Directory>  <Directory /usr/share/roundcubemail/installer>         Options none         AllowOverride Limit         Require all granted </Directory>   # Those directories should not be viewed by Web clients. <Directory /usr/share/roundcubemail/bin/>     Order Allow,Deny     Deny from all </Directory> <Directory /usr/share/roundcubemail/plugins/enigma/home/>     Order Allow,Deny     Deny from all </Directory>

Restart Apache:

systemctl restart httpd.service

Now we need a database for RoundCube mail, we will initialize it as follows:

mysql -u root -p

At MariaDB prompt use:

CREATE DATABASE roundcubedb;

CREATE USER roundcubeuser@localhost IDENTIFIED BY 'roundcubepassword';

GRANT ALL PRIVILEGES on roundcubedb.* to roundcubeuser@localhost ;

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.

Now we will install RoundCube in the browser at http://192.168.0.100/roundcubemail/installer

Now fill the entries for the

nano /etc/roundcubemail/config.inc.php

<?php  /* Local configuration for Roundcube Webmail */  // ---------------------------------- // SQL DATABASE // ---------------------------------- // Database connection string (DSN) for read+write operations // Format (compatible with PEAR MDB2): db_provider://user:password@host/database // Currently supported db_providers: mysql, pgsql, sqlite, mssql or sqlsrv // For examples see http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php // NOTE: for SQLite use absolute path: 'sqlite:////full/path/to/sqlite.db?mode=0646' $config['db_dsnw'] = 'mysql://roundcubeuser:roundcubepassword@localhost/roundcubedb';  // ---------------------------------- // IMAP // ---------------------------------- // The mail host chosen to perform the log-in. // Leave blank to show a textbox at login, give a list of hosts // to display a pulldown menu or set one host as string. // To use SSL/TLS connection, enter hostname with prefix ssl:// or tls:// // Supported replacement variables: // %n - hostname ($_SERVER['SERVER_NAME']) // %t - hostname without the first part // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part) // %s - domain name after the '@' from e-mail address provided at login screen // For example %n = mail.domain.tld, %t = domain.tld // WARNING: After hostname change update of mail_host column in users table is //          required to match old user data records with the new host. $config['default_host'] = 'localhost';  // provide an URL where a user can get support for this Roundcube installation // PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE! $config['support_url'] = '';  // this key is used to encrypt the users imap password which is stored // in the session record (and the client cookie if remember password is enabled). // please provide a string of exactly 24 chars. $config['des_key'] = 'FHgaM7ihtMkM1cBwckOcxPdT';  // ---------------------------------- // PLUGINS // ---------------------------------- // List of active plugins (in plugins/ directory) $config['plugins'] = array();  // Set the spell checking engine. Possible values: // - 'googie'  - the default // - 'pspell'  - requires the PHP Pspell module and aspell installed // - 'enchant' - requires the PHP Enchant module // - 'atd'     - install your own After the Deadline server or check with the people at http://www.afterthedeadline.com before using their API // Since Google shut down their public spell checking service, you need to  // connect to a Nox Spell Server when using 'googie' here. Therefore specify the 'spellcheck_uri' $config['spellcheck_engine'] = 'pspell';

Then press "continue" in the web installer. On the following page, press on the button "Initialize database".

Finally, disable the Roundecubemail installer. Change the apache roundcubemail.conf configuration file:

nano /etc/httpd/conf.d/roundcubemail.conf

# # Round Cube Webmail is a browser-based multilingual IMAP client #  Alias /roundcubemail /usr/share/roundcubemail

Alias /webmail /usr/share/roundcubemail  # Define who can access the Webmail # You can enlarge permissions once configured  #<Directory /usr/share/roundcubemail/> #    <IfModule mod_authz_core.c> #        # Apache 2.4 #        Require local #    </IfModule> #    <IfModule !mod_authz_core.c> #       # Apache 2.2 #        Order Deny,Allow #        Deny from all #        Allow from 127.0.0.1 #        Allow from ::1 #    </IfModule> #</Directory>  <Directory /usr/share/roundcubemail/>         Options none         AllowOverride Limit         Require all granted </Directory>  # Define who can access the installer # keep this secured once configured  <Directory /usr/share/roundcubemail/installer/>     <IfModule mod_authz_core.c>         # Apache 2.4        Require local    </IfModule>     <IfModule !mod_authz_core.c>         # Apache 2.2         Order Deny,Allow         Deny from all        Allow from 127.0.0.1         Allow from ::1     </IfModule> </Directory>  # Those directories should not be viewed by Web clients. <Directory /usr/share/roundcubemail/bin/>     Order Allow,Deny     Deny from all </Directory> <Directory /usr/share/roundcubemail/plugins/enigma/home/>     Order Allow,Deny     Deny from all </Directory>           

Restart Apache:

systemctl restart httpd.service

22 Install ISPConfig 3.1

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]:.

To install ISPConfig 3.1 from GIT stable branch, do this:

cd /tmp 

wget -O ispconfig.tar.gz https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.1

tar xfz ispconfig.tar.gz

cd ispconfig3*/install/

The next step is to run:

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: CentOS 7.4

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.canomi.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

Configuring Bastille 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 there is no manual configuration needed.

23 First ISPConfig Login

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):

 

23.1 The 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.

24 Download as a virtual machine

This setup is available as virtual machine download in ova/ovf format (compatible with VMWare and Virtualbox) for howtoforge subscribers.

Login details for the VM

Please change both passwords on the first login.

------