Firewall op CentOS 7

Bij mijn vorige webserver stond de firewall standaard uit. dat is natuurlijk niet zo verstandig, dus probeer ik het bij mijn huidige server aan te laten staan. Maar dat levert wel wat extra uitzoekwerk op, hier en daar. In deze blog verzamel ik de dingen die ik er over heb ontdekt. deze gaan dus specifiek over CentOS 7 en let op: maak een backup voordat je dingen probeert die ik hier opschrijf.

Status en aan/uitzetten

Om te zien of de firewall aan staat, gebruik:
systemctl status firewalld

De firewall helemaal uitzetten:
systemctl disable firewalld
systemctl stop firewalld

De firewall weer aanzetten:
systemctl enable firewalld
systemctl start firewalld

Zones

De firewall in CentOS maakt gebruik van Zones. De zone die voor mij interessant is is de Public zone. Dat is de zone waarop alle regels zijn ingesteld die voor de buitenwereld gelden. Om te zien welke poorten open staan van buitenaf:

firewall-cmd --zone=public --list-all

Poort toevoegen

  • Om een poort (bijvoorbeeld 1234) open te stellen van buitenaf:
    firewall-cmd --permanent --zone=public --add-port=1234/tcp
  • Daarna moet de firewall deze instelling ook gaan gebruiken:
    firewall-cmd --reload

Port verwijderen

  • Een poort afsluiten (bijvoorbeeld 1234) van buitenaf gaat zo:
    firewall-cmd --permanent --zone=public --remove-port=2222/tcp
  • Daarna moet de firewall deze instelling nog gaan gebruiken:
    firewall-cmd --reload

Een poort openstellen alleen voor een bepaald ipadres

Als je bijvoorbeeld MySQL wilt kunnen bereiken vanaf je thuisadres, dan moet je al in DirectAdmin je eigen ipadres toevoegen aan adressen die bij de database mogen. maar als je een firewall hebt dan ben je er dan nog niet. Een nette methode is een speciale zone aanmaken voor de locatie waar je toegang toe wilt verlenen. Je hebt dus Public, maar nu voeg je bijvoorbeeld twee zones toe: Work en Home.

  • Voeg een zone toe:
    firewall-cmd --permanent --new-zone=home
  • Reload de firewall om deze zone actief te maken:
    firewall-cmd --reload
  • Koppel een ipadres (bijvoorbeeld 1.2.3.4) aan deze zone:
    firewall-cmd --permanent --zone=home --add-source=1.2.3.4/32
  • Open nu een poort (bijvoorbeeld 1234):
    firewall-cmd --permanent --zone=home --add-port=1234/tcp

Beveiligen van DirectAdmin

DirectAdmin (DA) is een veelgebruikt beheersysteem op Linux-systemen. En terecht, want het is zeer gebruikersvriendelijk en compleet. Zeker in combinatie met Installatron. Maar in de bekendheid van DirectAdmin schuilt ook een gevaar. Eventuele kwaadwillenden (zijn die er dan?) weten hoe het systeem werkt. Daarom heb ik enkele maatregelen genomen en een paar daarvan wil ik met jullie delen. Voor alle aanpassingen geldt uiteraard dat je eerst een snapshot moet maken als extra backup.

Schakel root-access uit

Standaard wordt CentOS al geleverd zonder directe root access. Je kunt dus niet zondemeer via SSH inloggen van buitenaf, alleen via een ander account. Dus log in met een bestaand account (met weinig rechten) en gebruik het ‘su’ commando samen met een degelijk root-wachtwoord om root-access te verkrijgen. Zo vaak hoef je dankzij DirectAdmin nou ook weer niet als root in te loggen.

Gebruik sowieso nooit algemene accountnamen zoals info, mail, server oid. Maak de accountnaam al lang en specifiek en gebruik altijd een degelijk wachtwoord.

Suspend het Admin account

In DirectAdmin is er altijd een gebruiker Admin, lekker makkelijk voor hackers dat ze de naam alvast weten. Je kunt die naam niet eenvoudig wijzigen, althans ik niet. Wat ik heb gedaan is een nieuwe admin aanmaken met een naam die al bijna een wachtwoord is, met natuurlijk ook een sterk wachtwoord. Daarna heb ik de Admin van DA op suspended gezet, zorg wel dat je dit doet voordat je websites aanmaakt, of draag je websites eerst over aan de nieuwe Admin.

Schakel SSH uit voor websites die het niet nodig hebben

Of beter nog, schakel het aan voor sites die het wel nodig hebben. Ik heb dat gedaan door dat in te stellen in de standaard Reseller package. Nieuwe sites erven die package-instellingen.

Zorg dat je DirectAdmin enkel gebruikt via SSL

DirectAdmin gebruiken via SSL is erg belangrijk. Zonder SSL is het verkeer van jouw browser naar je server leesbaar door eventuele men-in-the-middle. Daarom is het slim om DirectAdmin alleen via SSL te gebruiken. Onderstaande werkwijze zorgt er ook voor dat apache, dovecot, exim en ftp via SSL gaan werken (bron).

  • maak verbinding als root (via Putty)
  • Zorg dat je voor server.domain.com jouw server-url neemt die DirectAdmin gebruikt!
  • Voer de volgende commando’s uit:
    cd /usr/local/directadmin/scripts
    ./letsencrypt.sh request server.domain.com 4096
    cd /usr/local/directadmin/conf
    perl -pi -e 's/SSL=0/SSL=1/' directadmin.conf
    echo "carootcert=/usr/local/directadmin/conf/carootcert.pem" >> directadmin.conf
    echo "force_hostname=server.domain.com" >> directadmin.conf
    echo "ssl_redirect_host=server.domain.com" >> directadmin.conf
    cd /usr/local/directadmin
    ./directadmin restart

Je kunt nu naar je server door voor het adres https:// te typen.

Zorg dat je DirectAdmin via een andere poort gebruikt dan de standaard poort

Standaard bereik je DirectAdmin via poort 2222. Het is een goed idee om een andere poort te gebruiken. Kwaadwillenden kunnen natuurlijk eenvoudig een poortscan uitvoeren en zo jouw alternatieve poort vinden, maar alle kleine beetjes helpen.

Als je net als ik CentOS 7 hebt en er is een firewall geïnstalleerd, dan is de poort aanpassen in DirectAdmin onvoldoende; de nieuwe poort zal wordt tegengehouden door de firewall. Je moet dus de nieuwe poort openzetten en later de standaard poort 2222 dichtzetten. De eerste stap gaat zo:

  • Maak contact als root (met Putty)
  • Bekijk welke poorten open staan vanaf buiten:
    firewall-cmd --zone=public --list-all
  • Voeg de nieuwe poort toe:
    firewall-cmd --permanent --zone=public --add-port=1234/tcp
    (1234 mag een andere poort zijn, die jij kiest)
  • Zorg dat de firewall deze nieuwe instellingen gaat gebruiken:
    firewall-cmd --reload

Instellen van een andere poort in DirectAdmin gaat (vreemd genoeg) het makkelijkst via DirectAdmin zelf.

  • Log in op DirectAdmin als (een) admin
  • Klik in het menu op File Editor
  • Open in het dropdownmenu ‘/usr/local/directadmin/conf/directadmin.conf’
  • Klik op Open File
  • Vul het root wachtwoord van je VPS onderaan het scherm in.
  • Zoek naar de regel ‘port=2222’, verander het portnummer, bijvoorbeeld in ‘1234’
  • Klik op Save
  • Het werkt pas wanneer DirectAdmin is herstart; klik op Home
  • Klik op Service Monitor
  • Klik op Restart op de regel van DirectAdmin
  • Binnen 1 minuut zal DirectAdmin beschikbaar zijn via de ingestelde poort.

Als je dit niet wilt doen met DirectAdmin, het kan ook met WinSCP. Bijvoorbeeld omdat je na bovenstaande actie niet meer bij je DirectAdmin kunt, bijvoorbeeld vanwege een firewall. (been there…)

  • Maak contact met je server als root met WinSCP
  • Zoek naar het bestand ‘/usr/local/directadmin/conf/directadmin.conf’
  • Pas de poort aan en sla op
  • Ga nu naar Putty en log in als root
  • Stop en start DirectAdmin:
    killall -9 directadmin
    cd /usr/local/directadmin
    ./directadmin d

Als je bij de eerste stap de nieuwe poort hebt opengezet en je hebt nu getest dat de nieuwe poort werkt, dan wil je misschien de oude poort (2222) weer netjes dichtzetten in de firewall. Dat gaat zo:

  • Sluit de oude poort:
    firewall-cmd --permanent --zone=public --remove-port=2222/tcp
  • Zorg dat de firewall deze nieuwe instellingen gaat gebruiken:
    firewall-cmd --reload
  • Test of het is gelukt:
    firewall-cmd --zone=public --list-all
    Als het goed is zie je nu de nieuwe poort wèl en de oude poort nièt in het rijtje.
  • Log in op DirectAdmin via de nieuwe poort voor een laatste controle.

PHP 7 met DirectAdmin

Als je DirectAdmin hebt, heb je wat meer mogelijkheden om zaken aan te passen door de Custom Build 2.0 versie te gebruiken. Je kunt dan bijvoorbeeld PHP 7.0 als standaard PHP installeren, maar op het moment van schrijven werkt nog lang niet alles met deze versie is mijn ervaring. Bijvoorbeeld Installatron overleeft de upgrade niet.

Welke versie van CustomBuild heb je?

  • Check dit zo:

    cd /usr/local/directadmin/custombuild
    ./build version

CustomBuild updaten/installeren

  • Maak vooraf een backup of snapshot van je server!
  • Omdat ik CentOS 7 heb, heb ik eerst deze update gedraaid:

    yum install psmisc net-tools systemd-devel libdb-devel perl-DBI xfsprogs

    Dit ging ondanks dat ik nu een verse VPS heb, toch een aantal zaken updaten.

  • Vervolgens voer je onderstaande regels uit:

    cd /usr/local/directadmin
    mv custombuild custombuild_1.x
    wget -O custombuild.tar.gz http://files.directadmin.com/services/custombuild/2.0/custombuild.tar.gz
    tar xvzf custombuild.tar.gz
    cd custombuild
    ./build

Het updaten van PHP naar 7.0

  • Als je CustomBuild 2.0 hebt (zie boven) dan kun je uitvoeren:

    ./build set php1_release 7.0

    Daarmee wordt een aanpassing gedaan in het bestand options.conf. De variabele php1_release wordt daarmee ingesteld op 7.0

  • Daarna voer je uit:

    ./build all d
    ./build rewrite_confs

    Dit duurt ongeveer een kwartiertje. DirectAdmin is nu gecompileerd met PHP 7.0.

  • Controleer of alles op je server nog naar wens werkt. Denk aan Installatron (deze doet het bij mij niet meer waardoor ik nu weer op PHP 5.5 zit), websites etc.

Installatron bij Transip

Ik wilde graag Installatron gebruiken op mijn DirectAdmin account bij Transip. Helaas kunnen zij dat nog niet leveren, dus heb ik het zelf geïnstalleerd.

Heel simpel:

  • Eerst via ssh toegang tot root account verkrijgen. Omdat je bij een behoorlijk beveiligde server nooit rechtstreeks in kunt loggen met root-credentials, doe je dat via een omweg. Dat kan door met een ander ssh-account in te loggen met bv putty, dan met ‘su’ root access verwerven (je hebt daarvoor uiteraard het root-wachtwoord nodig).
  • Dan deze drie regels uitvoeren

    wget https://data.installatron.com/installatron-plugin.sh
    chmod +x installatron-plugin.sh
    ./installatron-plugin.sh -f

    Dat is alles, Installatron zit in je DirectAdmin dashboard. Eén website aanmaken is gratis (geen licentie nodig), dus dat is al leuk.
    Voor licenties zie: https://secure.installatron.com/account/licenses

  • Als je een licentie hebt aangeschaft en op de Installatron-site je ip-adres hebt ingevoerd, zal Installatron zelf de licentie ontdekken.


Verwijderen van Installatron

Mocht het nodig zijn Installatron weer te verwijderen, dat gaat zo:

  • Verwijderen uit de GUI:

    rm -fr /usr/local/directadmin/plugins/installatron

  • Delete de kern van Installatron:

    rm -fr /usr/local/installatron
    rm -fr /var/installatron
    rm -f /etc/cron.d/installatron

  • Delete alle installatiedata (van de users, dus pas op):

    rm -fr /home/*/.installatron