Hi, nach langer Zeit mal wieder etwas aktivität auf dem Blog 🙂
Im heutigen Beitrag geht es darum Server Dienste an eine IP zu binden.
Warum ist das Wichtig ?
Wie in älteren Beiträgen schon geschrieben ist es Wichtig sein Netzwerk zu trennen, deshalb sollte man immer 2 IPs auf seinem Server haben.
Eine IP ist Öffentlich und die zweite IP ist nur zur Administration. Der Standard ist aber das alle Dienste auf dem Server meisten als Interface oder IP nur ein „*“ konfiguriert haben, das bedeutet der Dienst „lauchst“ auf allen Netzwerkkarten bzw konfigurierten IPs die der Server hat und das will man nicht, da nur eine IP Öffentlich sein soll.
Man kann das auch über die Firewall machen, was man zusätzlich sowieso macht, aber man weiß ja nie was mal passiert und um sicher zu gehen das Dienste nur auf der IP „lauschen“ die man haben will, erkläre ich hier wie man das für verschiedene Dienste macht.
Hier werde ich beschreiben wie man Folgende Dienste auf eine IP bindet:
Apache2, Postfix, Dovecot, SSH, Plesk, ProFTPD unter Debian 10.
Apache 2
Apache2 Web Server Dienst auf eine IP binden:
Erstmal via SSH auf den Server verbinden, wie immer mit Putty oder wie ich mit Secure CRT. SecureCRT ist ähnlich wie MRemote aber besser 🙂
Dann wechselt man in den Ordner /ect/apache2 mit
cd /etc/apache2
Dort gibt es eine Datei mit dem Namen ports.conf
In dieser Datei werden die Ports und IPs konfiguriert auf die der Webserver Apache2 „lauscht“
Öffnet die Datei mit eurem lieblings Editor, ich nutze noch immer nano
nano ports.conf
Im Original sieht die Datei wie folgt aus:
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Wir ändern die Datei jetzt damit Apache2 nicht mehr auf alle IPs „lauscht“ sondern nur noch auf unsere Öffentliche IP.
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 62.138.16.205:80
Listen 127.0.0.1:80
<IfModule ssl_module>
Listen 62.138.16.205:443
Listen 127.0.0.1:443
</IfModule>
<IfModule mod_gnutls.c>
Listen 127.0.0.1:443
Listen 62.138.16.205:443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Was wurde geändert ?
Wir haben für Port 80 ganz klassisch die IP vor den Port gesetzt genauso für den Port 443 und Apache2 „lauscht“ nicht nur auf die Öffentliche IP nein auch auf 127.0.0.1 sprich Localhost.
Nach den bearbeiten mit STRG + X die Datei speichern und mit STRG + O schliessen.
Danach Apache2 neu starten, das kann man klassisch mit init.d oder Systemd.
service apache2 restart (Systemd)
/etc/init.d/apache2 restart
Wenn man dies gemacht hat kann man mit netstat prüfen ob das erfolgreich war.
netstat -taupen | grep apache2
tcp 0 0 127.0.0.1:443 0.0.0.0:* LISTEN 0 63555884 55515/apache2
tcp 0 0 62.138.16.205:443 0.0.0.0:* LISTEN 0 63555882 55515/apache2
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 0 63555880 55515/apache2
tcp 0 0 62.138.16.205:80 0.0.0.0:* LISTEN 0 63555878 55515/apache2
Wie man sehen kann „lauscht“ jetzt mein Apache2 Server nur noch auf meiner Öffentlichen IP und Localhost.
Damit ist dieser Bereich abgeschlossen.
Postfix
Jetzt kommen wir zu Postfix.
Bei Postfix gehen wir ähnlich vor, einloggen mit SSH und wechseln in das Verzeichniss /etc/postfix
cd /etc/postfix
Dort öffnen wir die Datei main.cf wie immer mit unserem liebligs Editor.
nano main.cf
Eine original datei konnte ich jetzt nicht finden bzw. machen haben über 800 Zeilen, das wäre etwas zu groß bzw zuviel unnötiger Text.
Ich beschränke mich nur auf die Änderung.
Erstmal überprüfen wir wie das vor der Änderung aussieht
netstat -taupen | grep master
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 82767 37527/master
tcp 0 0 127.0.0.1:12346 0.0.0.0:* LISTEN 0 82865 37527/master
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 0 82861 37527/master
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 0 82858 37527/master
Öffnet die Datei main.cf und sucht nach der Zeile: inet_interfaces = all
Diese muss geändert werden auf eure Öffentliche IP und Loaclhost.
inet_interfaces = 62.138.16.205 127.0.0.1
Stellt sicher das inet_protocols = ipv4 sofern ihr KEIN IPv6 habt, wenn doch müsst ihr IPv4 und IPv6 einschalten und beides Konfigurieren.
Das ist einer der gründe warum viele immer noch kein IPv6 nutzen, da alles dopplet arbeitet ist.
Jetzt muss Postfix neu gestartet werden.
service postfix restart
/ect/init.d/postfix restart
Danach überprüfen wir wieder ob die Änderung erfolgreich war.
netstat -taupen | grep master
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 63569955 57558/master
tcp 0 0 62.138.16.205:25 0.0.0.0:* LISTEN 0 63569954 57558/master
tcp 0 0 127.0.0.1:12346 0.0.0.0:* LISTEN 0 63570055 57558/master
tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN 0 63570051 57558/master
tcp 0 0 62.138.16.205:587 0.0.0.0:* LISTEN 0 63570050 57558/master
tcp 0 0 127.0.0.1:465 0.0.0.0:* LISTEN 0 63570047 57558/master
tcp 0 0 62.138.16.205:465 0.0.0.0:* LISTEN 0 63570046 57558/maste
Vorher „lauschte“ der Dienst auf 0.0.0.0 was bedeutet das er über jede IP erreichbar ist, aber jetzt nur noch über meine Öffentliche und Localhost.
Wer sich Fragt warum Localhost, es kann immer sein das man anderen Dienste/Scripte am laufen hat die diese Dienste nutzen müssen/wollen und wenn diese dann nicht auf Localhost reagieren gehen diese auch nicht.
Damit ist auch Postfix abgeschlossen, nun geht es zu Dovecot.
Dovecot
Dovecot ist etwas anders, wenn man bei dovecot.org schaut findet man den Befehl zum einstellen der IP in der dovecot.conf in der Zeile listen = *, wobei der # dafür sorgt das dies ignoriert und dafür sorgt das Dovecot auf alle IPs reagiert, wenn man aber den # weg nimmt ändert sich nichts da immer noch keine IP eingetragen ist sondern ein * der dafür sorgt das Dovecot noch immer auf alle IPs reagiert. Man muss also den # entfernen und den * und anstatt des * eine IP eintragen.
Mit Plesk wird das durch eine include gelöst und liegt in einer extra Datei, bei mit ist das Pfad
/ect/dovecot/config.d/12-plesk-listen.conf
Auf dovecot.org sieht die Original Datei so aus:
# A space separated list of IP or host addresses where to listen in for
# connections. "*" listens in all IPv4 interfaces. "[::]" listens in all IPv6
# interfaces. Use "*, [::]" for listening both IPv4 and IPv6.
#
# If you want to specify ports for each service, you will need to configure
# these settings inside the protocol imap/pop3 { ... } section, so you can
# specify different ports for IMAP/POP3. For example:
# protocol imap {
# listen = *:10143
# ssl_listen = *:10943
# ..
# }
# protocol pop3 {
# listen = *:10100
# ..
# }
#listen = *
Wie oben Beschreiben muss man dies ändern auf:
listen = 62.138.16.205 127.0.0.1
Der # ist weg un der *, somit wird diese Zeile jetzt genutzt und Dovecot ist an meine Öffentliche IP und Localhost gebunden und nicht mehr an alle IPs.
Bei Plesk geht man in den Ordner /etc/dovecot/conf.d und öffnet die Datei 12-plesk-listen.conf
Ein Original habe ich nicht mehr und habe auch keins gefunden, daher nur die geänderte Version.
#ATTENTION!
#
#DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY,
#SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED.
# listen to all IPv4 interfaces
listen = 62.138.16.205 127.0.0.1
Anhand der Warnung kann es sein das wenn Plesk eine neue Version der Datei bereit stellt kann diese über schrieben werden. Meine Date wurde das letztemal 2018 geändert, also vor gut 5 Jahren. Ich denek das ist OK. Wer auf ganz sicher gehen will, erstellt sich im Ordner conf.d seine Eigene Datei und kopiert den Befehl einfach in die Datei.
Sollt Plesk mal die Datei ändern, habt ihr immer noch Eure eigene Datei.
Man kann das auch in seine dovecot.conf schreiben, diese wird aber gern öfters mal überarbietet und das Riskio ist größer das man dies wieder korrigieren muss.
An der stell muss ich aber auch sagen, nach jedem Server/Plesk update sollte man mit
netstat - taupen
Prüfen ob Dienste auf 0.0.0.0 „lauschen“ und wenn ja sollte man dies wieder ändern.
Nun wird geprüft ob Dovecot auch wirklich auf unsere IP und Localhost „lauscht“
netstat -taupen | grep dovecot
tcp 0 0 127.0.0.1:993 0.0.0.0:* LISTEN 0 63575747 58773/dovecot
tcp 0 0 62.138.16.205:993 0.0.0.0:* LISTEN 0 63575746 58773/dovecot
tcp 0 0 127.0.0.1:995 0.0.0.0:* LISTEN 0 63575703 58773/dovecot
tcp 0 0 62.138.16.205:995 0.0.0.0:* LISTEN 0 63575702 58773/dovecot
tcp 0 0 127.0.0.1:110 0.0.0.0:* LISTEN 0 63575701 58773/dovecot
tcp 0 0 62.138.16.205:110 0.0.0.0:* LISTEN 0 63575700 58773/dovecot
tcp 0 0 127.0.0.1:143 0.0.0.0:* LISTEN 0 63575745 58773/dovecot
tcp 0 0 62.138.16.205:143 0.0.0.0:* LISTEN 0 63575744 58773/dovecot
Das war es dann auch wieder mit Dovecot und es geht mit SSH weiter.
SSH
SSH ist hier super einfach, man öffnet unter /etc/ssh die sshd.conf.
Dort gibt es eine Zeile ListenAddress dies ist glaube ich im Original leer und damit „lauscht“ SSH auf alle IPs dies kann man aber einfach ändern.
Laut Manpage hat man hier einige Optionen die man nutzen kann.
ListenAddress host|IPv4_addr|IPv6_addr
ListenAddress host|IPv4_addr:port
ListenAddress [host|IPv6_addr]:port
Man kann also SSH nicht nur an eine IP bzw. Hostnamen binden sondern auch direkt den Port ändern.
ListenAddress 70.5.1.1
ListenAddress 10.1.5.1
Oder
ListenAddress 70.5.1.1:2222
ListenAddress 10.1.5.1:22
In dem beispiel wurde einmal SSH an 2 verschiede IPs gebunden und in 2 Beispiel wurden die beiden IPs an verschiede Ports gebunden.
Hier ist zu beachten das man seine Firewall anpasst, sonst geht nichts.
Das 2 Beispiel gefällt mir sehr gut und ich kläre kurz warum dies so gemacht wurde, auch wenn das mit unserem Thema nichts zu tun hat.
Stellen wir uns vor ListenAddress 70.5.1.1 ist die Öffentliche IP und 10.1.5.1 eine Intere IP die von aussen nicht erreichbar ist.
Was wird gemacht ?
Mit dem Eintrag 70.5.1.1:2222 wird der SSH Server auf die IP und den Port gebunden.
Dies wird auch so inder Firewall konfiguriert damit dieser Port von aussen erreichbar ist.
Jetzt macht man in seiner Firewall ein NAT von 70.5.1.1:2222 auf 10.1.5.1:22.
Da der SSH Server auch an 10.1.5.1:22 gebunden ist und man will jetzt auf seinen SSH via 70.5.1.1:2222 zugreiffen landet man automatisch auf 10.1.5.1:22.
Für jemanden der einen Portscan macht ist Port 22 nicht offen, intern läuft der Server aber immer noch auf Port 22 und man muss Interne Dienste nicht auf den Externen Port 2222 umkonfiguieren, wie zum Beispiel SFTP.
Hat man die sshd.conf umgestellt und SSH neu gestartet kann man mit netstat prüfen ob dies erfolreich war.
service ssh restart
/ect/init.d/ssh restart
netstat -taupen | grep ssh
tcp 0 0 x.x.x.x:yyyy 0.0.0.0:* LISTEN 0 36985 4394/sshd
Natürlich zeige ich Euch weder meine nicht Öffentliche IP noch meinen SSH port 🙂
Jetzt machen wir noch ProFTPD und Plesk.
ProFTPD
Bei ProFTPD habe ich auf der Offiziellen Seite leider nichte gefunden wie man eine IP an den Serverdienst bindet, nur eine VirtualHost config mit der man das machen kann, woher ich meine Infos abe weiß ich nicht mehr aber ich weiß das es geht 🙂
Da ich auch auf meiner Arbeit einen ProFTPD betreibe weiß ich das diese Konfiguration Plesk unabhänig ist.
Bei proFTPD gibt es eine Datei unter /eTC mit dem Namen proftpd.conf in dieser wird aber nicht geändert wenn man Plesk nutzt, wenn man kein Plesk nutzt kann man die Zeilen einfach in diese Datei rein kopieren und den Dienst neustarten um die Änderungen wirksam werden zu lassen.
Unter Plesk gibt es unter /etc den Ordner proftpd.d, geht man dort rein mit cd /etc/proftpd.d sollte sich dort eine Datei mit dem Namen server befinden.
Öffnet man dies kann man folgedes Eintrage (Ich bin mir echt nicht sicher ob die Orginal ist oder ob ich die selbst erstellt habe).
service ftp
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
instances = UNLIMITED
server = /usr/sbin/in.proftpd
server_args = -c /etc/proftpd.conf
Bind = 62.138.16.205
Bind = 127.0.0.1
}
Wichtig sind die beiden letzten Zeile mit dem Bind, damit wird ProFTPD an diese IPs gebunden und noch über diese Erreichbar.
Prüfen wir das wieder mit netstat
netstat -taupen | grep xinetd
tcp 0 0 62.138.16.205:21 0.0.0.0:* LISTEN 0 23618 965/xinetd
Wie man sehen kann wartet der Server auf eine Eingehende Verbindung.
Und keine Sorge der Dienst ist mit Zusätzlichen Sicherheitmerkmalen gesichert 🙂
Damit haben wir ProFTPs auch erledigt und kommen nun zu Plesk.
Plesk
Ich glaube ich habe dazu schon mal etwas geschrieben, wie man den Port konfiguration von Plesk ändern kann, die infos hat man damal nur schwer gefunden und damit kann man auch dafür Sorgen das Plesk nur noch über die nicht Öffentliche IP zu erreichen ist.
Man muss aber dazu noch Sagen, wenn man hat mit kleinen einbuse zu tun wenn man hier Änderungen vornimmt.
Wenn man den Standrad Port 8080 aus der Konfiguration nimmt wird Plesk nicht mehr Automatisch Aktualisiert und muss dies manuel machen, man bekommt aber eine EMail vom Server das was schief lief.
Macht man dann das Update muss man extra Bestätigen das es OK ist wenn Plesk nicht via Port 8080 zu erreichen ist. Danach läuft das Update durch.
Das 2 Problem ist, sofern man seine nicht Öffentliche IP richtig abgesichert hat, das SSL Zertifikat geht nicht mehr und der Browser gibt einem eine Sicherheitwarnung, für einen Selbst ist das kein Problem weil man ja weiß was man macht, aber Kunden haben dann oft Angst etwas zu machen und muss dies seinen Kunden erklären bzw darauf hinweise.
Jetzt geht es aber LOS!
Wir müssen in den Ordner /etc/sw-cp-server/conf.d dort öffnen wir die Datei plesk.conf zum letztenmal mit unseren lieblings Editor.
server_names_hash_bucket_size 64;
server {
listen x.x.x.x:8443 ssl;
listen 127.0.0.1:8443 default_server;
include conf.d/*ipv6_ports.inc;
ssl_certificate /opt/psa/admin/conf/httpsd.pem;
ssl_certificate_key /opt/psa/admin/conf/httpsd.pem;
include conf.d/*plesk.inc;
include conf.d/*wpb.inc;
}
Im Original sind hier noch die Einträge für Port 8080 zu finden, wenn man das nicht möchste kann man wie ich diese Löschen. x.x.x.x wird durch die nicht Öffentliche IP ersetzt.
Danach Speichert man die Datei und startet Plesk neu.
/etc/init.d/psa restart
/etc/init.d/sw-cp-server restart
Das war es dann auch schon wieder. Ich hoffe der Beitrag ist hilfreich und ich habe noch einiges in der Pipline wie zum Beispiel: von Fail2ban zu SSH Guard, Debain 10, Plesk und Server Sicherheit (neu), meine neue Postfix config und Umstellung von Iptables zu nftables.
Bis bald, Euer Doc!