Linux und die Segmentierung des Heimnetzwerks – I

Freunde von uns wissen, dass wir in Sachen Sicherheit individuell analysieren und beraten. Und wir sind dabei sehr zurückhaltend mit pauschalen Rezepten. In einem Blog Artikel zu sicherheitsrelevanten Themen zu starten, beinhaltet daher viele Risiken. Ausschlaggebend für diesen Artikel war die für uns doch etwas schockierende Erfahrung, wie gering auch unter Linux-Freunden die Bereitschaft ist, sich über die Grenzen des eigenen PCs hinaus mit dem Thema Sicherheit des eigenen Netzwerkes zu befassen.

Auch Linux-Freunde haben aber Heimnetzwerke und greifen bzgl. ihrer Internetanbindung auf irgendwelche kommerziellen Router zurück (z.B. von der Telekom, von D-Link, Netgear oder AVM). Etliche dieser Router haben integrierte elementare Firewall-Funktionalitäten auf der Ebene von Paketfiltern mit Stateful Inspection [SI].

Viele Menschen – auch Linuxer – vertrauen die Sicherheit Ihrer PCs, Laptops und mobiler Geräte im Heimnetzwerk dem Schutz durch solche Router an. Aber spätestens nachdem man sich im Internet ein wenig über faktisch aufgetretene Sicherheitsprobleme mit solchen Produkten und/oder entsprechende Begründungen für erforderliche Firmware-Upgrades eingelesen hat, schwindet das Vertrauen in die herstellerabhängigen Technologie ein wenig. Der eine oder andere mag auch – nicht ganz zu Unrecht – fürchten, dass gerade ein Massenware-Produkt kommerzieller DSL-Router-Hersteller ein Objekt ausgiebiger Hacking-Forschungsprojekte von bösen Zeitgenossen und anderen interessierten Datensammlern sein dürfte.

Als Linuxer weiß man dann, dass man sich mit Bordmitteln und ein wenig HW ein Plus an Sicherheit schaffen können müsste. Wie aber den Einstieg finden?

Motive für eine sicherheitsorientierte Auseinandersetzung mit dem Heimnetzwerk

In der heutigen Welt braucht es gar nicht mal Hrn. Snowden oder eine Paranoia, um sich z.B. als Familienvater mit der Sicherheit im Heimnetzwerk auseinanderzusetzen. Es reichen einfache Überlegungen wie :

Wie gehe ich eigentlich mit den ganzen Mobile-Geräten meiner Kinder um? Und jenen von Gästen? Darf eigentlich ein Smartphone mein teures NAS-System mit vielen Services und all meinen Dokumenten und Photos zugreifen?

Wer in seinem IT-Leben zudem mal ganz real mit Viren und Trojanern konfrontiert war und wer sich mal Logs einer Firewall eines im Internet exponierten Systems angesehen hat, ahnt zumindest, dass das Netz nicht wirklich dein Freund ist. So auch ein (ambitionierter) Linux-Fan und Freund von uns, dessen Kinder inzwischen ihr eigenes (hoffentlich betreutes) IT-Leben auf PCs, Tablet PCs und Smartphones leben. Die Kids sollen sich aber natürlich nicht auf den Rechnern der Eltern, die z.T. ja auch zuhause professionell genutzt werden, tummeln. Das Gleiche gilt natürlich auch für die elektronischen Begleiter von Gästen. Es gehört inzwischen ja (leider !) zum guten Ton, dass fast jedermann bei Besuchen auf das hauseigene WLAN Zugriff bekommt. Leider können die Folgen solcher Freizügigkeit schlimm sein …

Der erste Schritt – Netzwerk-Segmentierung

Wie kann man also als Linux-Anhänger sein Heimnetzwerk mit relativ geringen Investitionsmittel und “etwas” Gehirnschmalz sicherer machen? Darüber hatte ich mit unserem Bekannten einige z.T. heftige Diskussionen. Auffällig war dabei für mich, wie wenig eigentlich auch Linux-affine Menschen im privaten Bereich über ihre Netzwerk-Gestaltung nachdenken oder nachdenken wollen. Da kommen dann in mehrfacher Hinsicht falsche und auch irrelevante Argumente wie : Virenschutz braucht man ja nicht auf Linux-Systemen! Die Lageeinschätzung ändert sich meist erst dann, wenn man mal (u.a.) visualisiert,

  • welche Verbindungen die liebgewonnen smarten elektronischen Begleiter z.T. ungefragt aus dem eigenen Netz heraus zu Servern im Internet (und
    in anderen Ländern mit anderen Gesetzen) aufmachen,
  • welche Broadcasts und Multicast-Pakete im Netz herumschwirren und nach Antworten suchen und sie möglicherweise auch von einem Linux-System bekommen
  • und welchem Ansturm der DSL-Router von außen so ausgesetzt ist.

Schöne Aha-Effekte erhält man auch, wenn man das Ergebnis von Scans mit “nmap/zenmap” graphisch aufbereitet darstellt oder einen gezielten (und vom Hausherrn erlaubten) Angriff mittels Metasploit auf einen Windows-PC demonstriert.
Neben dem Risiko, das von WLAN-Gästen ausgeht, kann man natürlich auch diskutieren, dass und wie ein Windows-Rootkit beginnen kann, die Netzwerk-Umgebung samt den offenen Ports auf den Linux-Systemen auszuforschen. Mit nachfolgenden Konsequenzen …

Plötzlich tritt dann die gefürchtete Komplexität der zu planenden Punkte wieder in relatives Gleichgewicht mit den erkannten Risiken. Z.B. Risiken durch den Windows-Laptop des Freundes des Tochter, auf dem ja “nur” im Internet gespielt oder gechattet wird. [Oder im Betriebsnetz: Risiken durch den netten externen Berater, der sich selbstverständlich an das Firmennetz ankoppeln darf.]

Aus meiner Sicht ist (trotz des Protests unseres Bekannten) eine ordentliche Segmentierung des Heimnetzwerks ein erster wichtiger Schritt in Richtung organisierter Verbesserung von Sicherheit. Wieso muss hinter einem DSL-Router eigentlich jedes am WLAN angemeldete (Android-) oder Windows-Gerät jeden PC, jedes NAS-System oder gar Server im heimischen Netz sehen können? Persönlich orientiere ich mich bei Sec-Themen immer an der folgenden Reihenfolge von Fragen:

  1. Wer darf denn überhaupt mit wem ?
  2. Mit welcher Netzwerkanbindung? Auf welchem Kanal/Port und mit welchem Protokoll?
  3. Welche Kriterien muss die Nutzlast der Kommunikation ggf. erfüllen?
  4. Was muss ich dann tun, um das einzelne System gegenüber spezifischen, z.T. betriebssystem- und applikationsspezifischen Bedrohungen und gegenüber Malware abzusichern?

Warum in dieser (diskutierbaren) Reihenfolge? Schlicht und einfach: Ein kompromittiertes System darf zumindest nicht “kampflos” zum Risiko für andere Systeme werden.

In dieser Artikelserie geht es mir lediglich um Punkt 1. Dabei habe ich jedoch fast ein schlechtes Gewissen – denn Sicherheit umfasst auch und gerade im heterogenen Heimnetzwerk wahrlich mehr als Netzwerk-Segmentierung. Aber irgendwo muss ja auch der ambitionierte Linux-Heimwerker anfangen …

Vielleicht ist der folgende Überblick über den entstehenden Segmentierungsansatz bei unserem Bekannten ja auch für andere interessant. Ein Anwendungsfall könnten z.B. Heimnetzwerke von Freiberuflern oder Ärzten, Psychologen und Rechtsanwälten sein, die auch zu Hause Ihrer Arbeit nachgehen und für deren Patientendaten schon wegen einschlägiger Datenschutzrichtlinien ein hoher Schutzbedarf besteht.

Ich gehe in zwei Artikeln dieser kleinen Serie wie gesagt nur auf eine mögliche, grundsätzliche Netzsegmentierung ein. Alles weitere würde uns dann in die Detail-Konfiguration einiger Netzwerkdienste (wie etwa DHCP, DNS und ggf. Samba) und vor allem aber das Aufsetzen hinreichender iptables-Regeln führen. Ich kann entsprechende Details leider schlecht in einem Blog diskutieren. Das Gleiche gilt für IDS-Verfahren. Wer daran ernsthaft interessiert ist, mag – wie unser Bekannter – ein kleines Projektchen mit mir aufsetzen. Ich gehe hier auch nicht auf Anonymisierungsverfahren bzgl. des Surfens im Internet ein. Das mag enttäuschend für den einen oder anderen Leser sein, aber meine verfügbare Zeit für den Blog ist schlicht und einfach begrenzt.

(Alte) HW für ein zusätzliches Gateway-System mit Firewall aktivieren

Als Linuxfreund zieht man
ggf. eine betagte PC-Kiste aus der Versenkung und überlegt sich, den anderen Systemen im Heimnetzwerk (wie PCs, Laptops u.a.) mit Hilfe dieses Geräts noch eine Linux-Firewall als zusätzliche Barriere im Umgang mit dem Internet zu spendieren. Die Kosten für ein bis zwei zusätzliche Netzwerkkarten sind ja relativ gering. Hat man noch ein wenig mehr Geld, so kann man auch auf den Gedanken kommen, neben dem WLAN, das auf heutigen DSL-Routern mit angeboten wird, ein weiteres WLAN zu etablieren, auf das z.B. Gäste keinen Zugriff erhalten. Dazu braucht es dann einen separaten WPA2-gesicherten WLAN-Router oder besser WLAN-Access-Point.

Netzwerk-Segmentierung

In der Diskussion mit meinem Bekannten entstand dann das folgende Bild seines künftigen Heimnetzwerkes mit einer Reihe von erkennbaren Segmenten:

netz2

Ich habe das Bild gegenüber der Realität etwas angereichert, um zu verdeutlichen, dass man es in einem z.T. professionell genutzten Heimnetzwerk oder in einer kleinen Firma auch ganz schnell mal mit Systemen zu tun haben kann, die auf Virtualisierungshosts laufen. Der eine Server steht dann stellvertretend für mehrere (spezialisierte) Server und auch die zwei PCs sind nur Stellvertreter für mehr Geräte ihrer Klasse.

Das Ganze ist dann doch schon relativ komplex und nähert sich der Struktur eines kleinen Firmennetzes an. Ich kenne einige kleinere Firmen, für die das Bild strukturell ziemlich ähnlich wäre. Allerdings sind bestimmte Systeme dann durch gewartete Sicherheits-Appliances ersetzt oder ergänzt und zudem spielen VPNs eine große Rolle. Der Linux-Heimwerker kann sich teure Appliances jedoch nicht ohne weiteres leisten.

Die Crux des Ganzen – Was nützen Segmente ohne Kommunikations- und Filterregeln?

Ehrlich gesagt: wenig. Damit sind wir auch bei dem Punkt, durch den sich auch unser Bekannter in unseren Diskussionen abgeschreckt gefühlt haben dürfte. Wer wie mit wem in dem oben darzustellenden Netzwerk kommunizieren und wer welchen Service nutzen darf, ist zum großen Teil ein Sache sinnvoll und sicher aufgesetzter Paketfilter-Regeln. Hierbei kommt dem Paketfilter auf dem inneren Router-System eine besondere Bedeutung zu. Aber auch einfache, zusätzlich aktivierte “vereinfachte” Firewalls wie etwa die “SuseFirewall2” kann einem auf dem einen oder anderen System innerhalb des inneren Netzwerks schon mal gehöriges Kopfzerbrechen bereiten.

Die Logik ineinandergreifender iptables-Regeln auf verschiedenen Systemen mit speziellen betriebssystem-spezifischen “Personal Firewalls” (z.B. auf Windows-Laptops) kann je nach Situation beliebig komplex werden und ist sicher nicht jedermanns Sache. Das ist keine Abschreckung sondern eine auf Erfahrung gegründete vorsichtige Warnung:

In iptables – und erst Recht das Zusammenspiel von iptables-Regeln mit Firewall-Settings auf anderen Systemen – muss man sich reinknien.

Man kann dabei zudem Fehler machen. Speziell, wenn man bestimmte Linux-, Windows und ggf. Android-Systeme an so schöne Dinge wie File-, Mail und Web-Dienste auf einem zentralen Heimserver ranlassen will. Geht es wirklich um erhöhten Sicherheitsbedarf, so ist das Regelwerk ferner durch Analyse- und Penetrationswerkzeuge einem Belastungstest auszusetzen. Ferner kommt gerade bei Android und Windows Punkt 4 unser obigen Checkliste und die Konfiguration spezieller kommerzieller Produkte zum Tragen. Spätestens dann werden Grenzen für den Hobby-Linux-Bastler erkennbar.

Ich kann und will die iptables-Regeln für die einzelnen Maschinen des nachfolgend skizzierten Netzes nicht im
Rahmen der dieses und des kommenden Blog-Beitrags diskutieren. Das heißt aber nicht, dass man als Linux-Interessierter gleich die Segel streichen müsste. Zu iptables gibt es am Markt sehr gute Bücher. Ferner gibt es graphische Hilfsmittel. Obwohl ich den aktuellen Pflegestatus des SW-Pakets nicht so richtig einschätzen kann, empfinde ich “FWBuilder” nach wie vor als ein Opensource Programm, das den iptables-Einstieg doch sehr erleichtert – auch wenn die generierten Regelsätze manchmal im Internet und in Fachartikeln kritisiert wurden. Die durch FWBuilder generierten Chains und Regeln stellen aus meiner Sicht jedenfalls eine brauchbare Grundlage für evtl. weitergehende Verbesserungsarbeiten dar.

Also -liebe Linux-Heimwerker: Kauft euch ein iptables-Buch, fangt mit FWBuilder an und habt vor allem Spaß an eurem privaten Sicherheitsprojekt !

iptables scripts und systemd?

Nun hat man es wegen “systemd” im Moment leider nicht mehr ganz so leicht, seine mit welchem Tool auch immer erstellten iptables-Regeln beim Systemstart auch zu aktivieren. Deshalb werde ich in einem dritten Beitrag dieser kleinen Serie kurz darauf eingehen, wie man ein iptables-Generator-Skript auf einfach Weise in den systemd-gesteuerten Startablauf einbauen kann.

Im nächsten Beitrag gehe ich zunächst auf die vorgeschlagenen Segmente und Gründe für deren Abtrennung ein. Bis dann!

Hosted Strato server – backups and chained firewall tunneling via SSH and shell

I administer several Linux web servers for partner and customer companies. Most of these servers are V-servers hosted at the German Telekom daughter Strato.

[I have described some reasonable security measures for a Strato server with Opensuse in some articles in this blog. See e.g.:
Strato-V-Server mit Opensuse 12.3 – IV – SSH Key Authentication
Strato-V-Server mit Opensuse 12.3 – III – Stop SSH Root Login
and previous articles referenced there.]

When you work with a hosted server, of course, you want to perform periodic backups. If you – for whatever reasons – do not want to pay for the backup facilities Strato offers, a backup requires that you transfer data from the remote server into your own company network through (encrypted) SSH tunnels. Depending on your specific situation you may wish to create a complete backup or a backup of selected directories on the server. During the backup you want to preserve user-rights and mode settings.

In addition to the topic of creating tunnels across firewalls, the question arises what Linux tool might be convenient to perform the backup task if you work with a shell based connection only. Therefore, I shall briefly discuss what I normally do to perform a manually controlled backup from a hosted Strato server. You can combine the methods described of course with some scripting. The described firewall tunneling by SSH is independent of a specific provider.

Tunneling firewalls with SSH

We presume that our company network has a DMZ with two firewalls – a perimeter firewall “PFW” protecting the DMZ and its hosts against the Internet and one or several inner firewalls “IFW(s)” separating the DMZ from inner network segments. Creating firewall tunnels on the outer and/or inner side of the DMZ is always a critical issue.

Our own backup server system for customer data – let us call it “bup” – is e.g. located in an inner segment of our network. The perimeter firewall “PFW” to the Internet resides on a router and can be configured to forward external WAN ports to ports of special hosts inside the DMZ. Servers inside an inner network segment are allowed to build up SSH connections to hosts in the DMZ across their “IFW(s)”; however the servers in the DMZ are not allowed to initiate SSH connections to the servers in the inner segments. For security reasons we poll data from the servers in the DMZ; we do not forward or push from the DMZ to inner segments. For our scenaio we assume that there is only one inner segment and that we only have to deal with a single “IFW”.

I personally prefer a 2-step process to get the data from the hosted server to the backup destination server “bup”:

  • Step 1: I open a reverse SSH tunnel from a special host “intmid” in our DMZ to the Strato server on the Internet and transfer the data from the Strato server to “intmid”. There, I first of all scan the backup files for viruses and malware.
  • Step 2: Afterwards I stop the reverse tunnel and disallow any incoming connections to “intmid”. I then open a ssh reverse tunnel from my destination server “bup” to “intmid” across the IFW, transfer the files to “bup” and encapsulate them there in an encrypted container.

Some readers may think a 2 step procedure may be exaggerated. If you prefer direct connections from the hosted Strato server to “bup” inside your network you may

  • either use a chain of two reverse SSH tunnels (one tunnel per firewall)
  • or a combination of port forwarding on the “PFW” with
    a reverse tunnel across the “IFW”

Both solutions provide a complete connection from the Strato server to “bup” passing both firewalls of your DMZ. Below I describe both methods briefly.

In both of the following methods we need a reverse SSH tunnel from the backup destination server “bup” (inner segment) to the DMZ host “intmid”. I.e., we export a SSH port of server “bup” temporarily to the host “intmid” in the DMZ. This you may e.g. achieve by entering the command

ssh -R 19999:localhost:22 ssh_user_on_intmid@intmid

at your prompt on host “bup”. The “-R” option triggers the creation of a “reverse” tunnel. Port 19999 is assumed to be unused on “intmid”; port 22 is your local port on “bup” for the SSH daemon sshd. “ssh_user_on_intmid” represents a user for SSH connections on “intmid” with sufficient privileges.

Note: If you just want to build the tunnel in the background without using a terminal or executing remote commands you may use the following combination of options for SSH (instead of a plain “-R”) : ssh -nNTfR …...
Please see the man pages of ssh. These options may be especially helpful when using scripts. So, a more general form of the command could be

ssh -p<sshd port server> -nNTfR <forwarded port server>:localhost:<sshd port local> <username>@<ip server>

Note 1: If and when you really work with background SSH tunnels: Take care not to forget to stop the processes for the background tunnels at the end of your backup operation! In scripts this requires some “pid” determination operations for the running ssh processes.

Note 2: Depending on your sshd configuration you may need to have root rights to build the tunnel.

You can test your reverse tunnel through the inner firewall “IFW” by entering

ssh -p 19999 userid_on_bup@localhost

at the prompt of the “intmid” host. You will of course be asked for the password of a valid user “userid_on_bup” on server “bup” and should then get a prompt on “bup”.

Method 1: Chaining two reverse tunnels

The hosted Strato server allows for a ssh connection on a specific port as this is your only way to work on it. You can use this SSH-connection to build up a reverse tunnel from your DMZ host “intmid” to the Strato server. I.e., the SSH port of your DMZ host shall be exported e.g. as port 19999 on the hosted Strato server. By issuing the following command on “intmid” we tunnel the perimeter firewall “PFW”:

ssh -R 19999:localhost:19999 strato_user@ip_of_your_Strato-server -p 61111

Note: Here we have assumed that the Strato-Server listens on port 61111 as its configured SSH port. (Normally, I change the standard port 22 to a high port number. See:
Strato-V-Server mit Opensuse 12.3 – II – Installation / SSH-Port ändern)

You will of course have to give the password for your “strato_user” on the hosted Strato server before entering the shell there.

Why did we use port 19999 on the DMZ host “intmid”? Because we want to chain the two tunnels – the one from “bup” to “intmid” in the DMZ across firewall “IFW” and the one from “intmid” to our Strato server on the Internet across firewall “PFW” to get a complete encrypted connection from the Strato server to “bup”. Both tunnels “meet” at port 19999 on host “intmid”.

Now, at the prompt of the Strato server you can test the combined (reverse) SSH tunnels by entering

ssh -p 19999 userid_on_bup@localhost

Note: Do not get confused by “localhost” in the command above. You must provide the password for user “userid_on_bup” on the server “bup” (!) inside our inner network segment. Our connected tunnels end up there!

You then should get a prompt for user “user_id_on_bup” on our server “bup”. Ok, we now can successfully tunnel two firewalls at the same time by making use of 2 chained reverse SSH tunnels!

Method 2: Port forwarding on the perimeter firewall

Port forwarding on the perimeter firewall could be an alternative to chaining two tunnels. Having build our obligatory reverse tunnel from “bup” to “intmid” we could in addition change the behavior of our PFW – provided of course that it is configurable. In my case I can establish port forwarding for incoming connections on an some external (WAN) port from a defined IP address on the Internet to a definable port of any host at the other (DMZ) side of the perimeter firewall. E.g I could forward a connection from the Strato server trying to reach the WAN side of the perimeter firewall on port 19999 to port 19999 on “intmid” in the DMZ.

Note: If you really do something like this on your firewall you have to be careful to restrict the forwarding to a defined server on the Internet and to close this firewall hole again after the backup procedure. [It makes no sense here to give commands or details as the configuration procedure varies with the type of firewall used.]

However, for this approach to work with openSSH you in addition have to set a parameter for your sshd configuration in the file “/etc/ssh/sshd_config” on “intmid”:

GatewayPorts yes

Otherwise external hosts will not be allowed to use the reverse tunnel. This setting is somewhat dangerous and you should not forget to change it back.

In this approach we couple (local) port forwarding on the PFW with a reverse tunnel from “bup” to “intmid”. The result is basically the same as with two chained reverse tunnels. However, you have to modify your commands on the Strato server somewhat to use port 19999 at the WAN side of your “PFW”. To test the forwarding plus reverse tunnel on the Strato server you would enter:

ssh userid_on_bup@ip_address_of_your_routers_WAN_interface -p 19999

You have to provide the IP address of the WAN interface of your router. Depending on your DSL provider this may change on a daily basis. So you have to find out what it presently is – e.g by the admin interface of your PFW (router) or by asking an external service (e.g. curl icanhazip.com).

All in all I regard the second method as more complicated and potentially also more dangerous than method 1 – because you must not forget to change and change back your sshd configuration on the DMZ host “intmid” and also to reset your PFW configuration. Therefore, I shall only follow the first approach below.

Use rsync to perform the backup

As we have successfully build up tunnels across our firewalls one may think of using “scp” to perform a backup of the server directories. Actually this is not a good idea if you want to make backups of all server directories including system directories. The reason is:

“scp” follows all symbolic links! At least on Opensuse systems this may lead to infinite loops for certain directories whilst copying!

Therefore it is better to use “tar” or “rsync”. See: http://stackoverflow.com/questions/11030394/is-it-possible-to-make-scp-ignore-symbolic-links-during-copy

Personally, I find “rsync” most convenient. And you can combine it
quite easily with SSH! To use the ports defined for our method 1 (with the two chained reverse SSH tunnels) the right syntax for making a backup of e.g. the directory “/var” would be

rsync -avz -e ‘ssh -p 19999’ /var userid_on_bup@localhost:/backups/bup_strato/server_name/

This command has to be performed on the Strato server. Again: Do not get confused by “localhost” – that’s how SSH tunneling works! The “-a” option of the rsync command means “archive mode”. This preserves the mode and user settings of all files and directories throughout the data copying and performs recursions. “z” leads to a transfer of compressed data which will save you time. “/backups/bup_strato/server_name/” represents an example directory on server “bup” where you want to place the backup files of your special Strato server. Of course you should replace it by your own path on your backup server.

Note 1: You have to issue this commands as root on your Strato server to get access to all of the directories there.
Note 2: Please, note that slash “/” at the end of the directory path on the destination system! And note the missing “/” after the local directory “/var”.
Note 3: Please, note the masking of ssh -p 19999 by single quotation marks! [To specify the port by “-p 19999” at the end of the ssh command would not work as you would mix rsync and ssh parameters].
Note 4: The big advantage of rsync naturally is that you only would exchange changed files at the next backup.

Have much fun now with your Strato server and making backups through SSH tunnels!

phpMyAdmin – Versionscheck – Firewalls

Gerade arbeite ich an einem Projekt, in dem die Anzahl der Tabellen auf einem MySQL-Server mit mehreren Datenbanken rasant steigt. Zur Verwaltung nutze ich u.a. phpMyAdmin in der Version 4.0.1. Nun haben wir kürzlich die ersten Testsysteme auf einen größeren Server mit einer restriktiven Firewall verlagert. Danach fiel mir auf, dass phpMyAdmin unmittelbar nach dem Login für ca. 1 Minute nicht reagiert, wenn man sich die Tabellen der angelegten Datenbanken auflisten lassen will. Irgendwann kommt dann jedoch die erwartet Übersicht über die Tabellen. Und danach funktioniert auch alles wieder so rasch wie erwartet.

Diese initale Verlangsamung von phpMyAdmin – besser dieses initiale Hängenbleiben – machte mich total nervös. Zumal dieses Verhalten für mich neu war, und ich es auf anderen Systemen bislang nicht beobachtet hatte. Wartezeiten von 1 Minute sind während hektischer Entwicklungsarbeiten nicht tolerierbar. Das beschriebene Verhalten tritt nämlich immer wieder auf, wenn die maximale Inaktivitätszeit, die in phpMyAdmin oder in den php-Einstellungen des Servers gesetzt ist, abläuft und man sich erneut einloggen muss. Und dann will man natürlich keine zusätzliche Verzögerung bei der Abfrage nach den vorhandenen Tabellen im Minutenbereich erleben.

Also hieß es: Logs einsehen. Die Firewall zeigte denn auch tatsächlich, dass der Server, auf dem phpMyAdmin installiert war, versucht, eine HTTP-Verbindung zu der Adresse 216.34.181.97 aufzubauen. Solche aktiven HTTP- Verbindungen in die weite Welt werden von unserem Server aus aber nicht zugelassen.

Ein Nachforschen mit “whois” zeigt, dass diese Adresse möglicherweise unter der Hoheit von SourceForge steht. Oder aber etwas mit phpmyadmin.net zu tun hat. Ok – für einen Test mal die Firewall-Regeln abändern und die Verbindung vorübergehend zulassen. Und siehe da:

Keine initiale Verlangsamung mehr, sondern ein gewohnt spritzig reagierendes phpMyAdmin. Reproduzierbar! Dass phpMyAdmin nach dem Startup so langsam reagierte, rührte also daher, dass das Programm die genannte HTTP-Verbindung erwartete, aber nicht bekam – und den Verbindungsversuch in einer solchen Situation vermutlich mehrfach startete, bis es schließlich aufgab.

Es ergeben sich mehrere Fragen:

Frage 1: Wozu dient dieser Verbindungsversuch von phpMyAdmin ?
Vermutlich(!) zur Abfrage von Update-Informationen (neue Versionen, …). Siehe hierzu den Informationsbereich auf der ersten Seite nach dem Öffnen von phpMyAdmin. Dort wird dargestellt, welche Version man gerade im Einsatz und ob es eine neuere gibt. Aber wer weiß …. in diesen Zeiten …. Ich habe es jedenfalls nicht persönlich im Code überprüft.

Frage 2: Gibt es einen Parameter, um das abzustellen ? Oder muss man mit einem initial sehr langsamen phpMyAdmin hinter einer Firewall leben ?
Nein, muss man nicht – und ja, es gibt einen Parameter. Siehe :
http://wiki.phpmyadmin.net/pma/Config#VersionCheck

In meiner Situation half es demzufolge, in der Datei “config.inc.php” folgende Einstellung einzufügen:

$cfg[‘VersionCheck’] = false;

Das fand ich dann doch sehr beruhigend. Und es löste mein Problem – die http-Anfrage findet danach nicht mehr statt. Und phpMyAdmin läuft dann trotz restriktiver Firewall-Einstellungen performant.

Ich habe das Thema auch im phpMyAdmin-Bereich unter “Stackoverflow” angesprochen.
http://stackoverflow.com/questions/18766123/required-but-not-granted-http-access-to-216-34-181-97-slows-phpmyadmin-down
Wurde wirklich sehr schnell beantwortet. Das Verhalten wurde von einem interessierten Zeitgenossen bestätigt. Dort kam dann noch der Tipp, dass man die Abfrage auch über einen Proxy abarbeiten kann. Siehe
https:
//phpmyadmin.readthedocs.org/en/latest/config.html#cfg_VersionCheckProxyUrl

Danke hierfür an M. Delisle.

Abschließend bleiben folgende Fragen an die phpMyAdmin-Entwickler offen:
Könnte man das Thema mit dem Versionscheck nicht auch anders lösen? Wieso muss diese Abfrage überhaupt automatisiert ablaufen? Und wenn schon – warum nicht dezent und asynchron im Hintergrund (Ajax) mit Einstellungen, die den User nicht blockieren ?

Ich bin daher schon gespannt auf die nächste Version dieses wichtigen und nützlichen Tools.

FWBuilder – conntrack – Warnungen

Ich nutzte in der Vergangenheit sehr gerne FWBuilder, um iptables-Regeln zu generieren. Mit den aktuellen Paketen aus dem Repository

http://download.opensuse.org/repositories/security/openSUSE_12.3/

ergeben sich jedoch Schwierigkeiten. So erhält man – je nach Zustand des Zielsystems – Warnungen der Art

WARNING: The state match is obsolete. Use conntrack instead.

Dies gilt insbesondere für Server, die auf Basis von Opensuse 12.3 eingerichtet wurden. Dort wird iptables in einer Version > 1.4.16 verwendet. FWBuilder ist damit nicht kompatibel. Siehe hierzu u.a.:

http://www.mbse.eu/2012/11/iptables-1-4-16-and-fwbuilder-doesnt-work/

Der Bug ist auch schon seit einer ganzen Weile bekannt. Siehe:

http://sourceforge.net/p/fwbuilder/bug-reports-current-version/245/
http://sourceforge.net/p/fwbuilder/discussion/16372/thread/8789d909/

Die schlechte Nachricht

FWBuilder ist aus meiner bescheidenen Anwender-Sicht eine Perle von einem Programm gewesen. Stichworte: Sehr nützlich, gutes Layout, einfach zu bedienen, gut verständlich, etc. und bis Anfang des Jahres auch immer aktuell. Nun musste ich zur Kenntnis nehmen, dass die zwei tragenden Entwickler das Projekt und ihre ehemalige Firma verlassen haben. Siehe :

http://sourceforge.net/p/fwbuilder/news/2013/04/announcement-/
http://sourceforge.net/p/fwbuilder/discussion/16372/thread/54f339dc/
http://sourceforge.net/p/fwbuilder/news/2013/07/i-am-leaving-netcitadel/

Mir ist leider bislang völlig unklar geblieben, wie es z.Z. um den Status des FWBuilder-Projektes bestellt ist. Man kann jedenfalls nicht mehr so ohne weiteres erwarten, dass sich jemand der Sache mit den conntrack-Warnungen annimmt. Es gibt daher für mich als Endverbraucher 4 Alternativen:

  1. Man bleibt bei IPtables V1.15.X. Dies bedeutet bei Opensuse, dass man dafür Hand anlegen und kompilieren muss. Auf Dauer sicher keine gute Lösung.
  2. Man sieht sich nach einer Alternative zu FWBuilder um. In Frage käme etwa “shorewall”. Dabei wird man jedoch die komfortable grafische Oberfläche von FWBuilder vermissen. Zudem muss man sich in das dateibasierte Interface von Shorewall einarbeiten. Sollte sich niemand des FWBuilder Projekts annehmen, ist dieser Schritt vielleicht auf Dauer nicht zu vermeiden.
  3. Man findet sich mit den Warnungen ab. Zur Sicherheit sollte man dann aber testen, ob die Regeln noch tatsächlich wirksam sind. Der Grund ist, dass das Modul “state” früher oder später möglicherweise nicht mehr in allen Kernelkonfigurationen repräsentiert sein wird. S.u. Auf Dauer also auch nicht gut.
  4. Man nutzt FWBuilder weiter und baut als Workaround um die generierten fw-Installationsskripts ein Script herum, dass die notwendigen Änderungen an den von FWBuilder generierten iptables-Regeln vornimmt. Das wäre immerhin ein Workaround auf Zeit …

Nachfolgend widme ich mich nach ein paar Infos zu “conntrack” der Alternative 4.

Unterschiede zwischen “conntrack” und “state” ?

Bevor man sich mit
Eingriffen in sicherheitsrelevante Scripts befasst, sollte man sich wenigstens ein wenig dazu kundig machen, worum es geht. Also hier eine (sehr kurze) Kurzfassung:

Das Verfolgen eines Verbindungszustands ist ein elementarer Bestandteil von Paketfiltern. Unter Linux sind hierfür bestimmte Kernelkomponenten (Kernel Frameworks) verantwortlich, die z.T. und ggf. nicht fix in den Kernel integriert sondern als Kernel-Module kompiliert sein können. Das State-Modul wurde vor einer Weile durch eine ganze Kaskade von optionsreicheren “Conntrack”-Modulen abgelöst. Ob und wie nun ein System mit einer bestimmten Kernel- und Kernel-Modul-Konfiguration auf die alten “-m state” Optionen und zugehörige Suboptionen von IPtables-Filterregeln reagiert, hängt von Details der Implementierung ab. Siehe auch:

http://serverfault.com/questions/358996/iptables-whats-the-difference-between-m-state-and-m-conntrack

Eine Einführung in den Einsatz der Status-Analyse im Zusammenhang mit iptables findet man hier:
http://www.iptables.info/en/connection-state.html

Ich zitiere den dortigen “Original Author: Oskar Andreasson”:

“All of the connection tracking is done by special framework within the kernel called conntrack. conntrack may be loaded either as a module, or as an internal part of the kernel itself. Most of the time, we need and want more specific connection tracking than the default conntrack engine can maintain. Because of this, there are also more specific parts of conntrack that handles the TCP, UDP or ICMP protocols among others. These modules grab specific, unique, information from the packets, so that they may keep track of each stream of data. The information that conntrack gathers is then used to tell conntrack in which state the stream is currently in. For example, UDP streams are, generally, uniquely identified by their destination IP address, source IP address, destination port and source port. “

Entsprechend findet man auf einem Standard-Opensuse 12.3-System folgende Module:

os123:~ # lsmod | grep conntrack
nf_conntrack_ipv4 15013 66
nf_defrag_ipv4 12730 1 nf_conntrack_ipv4
nf_conntrack_netlink 35452 0
nfnetlink 14407 1 nf_conntrack_netlink
nf_conntrack_ftp 18680 0
nf_conntrack_snmp 12858 0
nf_conntrack_irc 13519 0
nf_conntrack_tftp 13122 0
nf_conntrack_pptp 19246 0
nf_conntrack_netbios_ns 12666 0
nf_conntrack_broadcast 12590 2 nf_conntrack_snmp,nf_conntrack_netbios_ns
nf_conntrack_slp 12648 0
nf_conntrack_h323 73846 0
nf_conntrack_sane 13144 0
nf_conntrack_proto_sctp 18823 0
nf_conntrack_amanda 13042 0
nf_conntrack_sip 33868 0
xt_conntrack 12761 66
nf_conntrack_proto_udplite 13282 0
nf_conntrack_proto_gre 14435 1 nf_conntrack_pptp
nf_conntrack_proto_dccp 13511 0
nf_conntrack 98519 19 nf_conntrack_ipv4,nf_conntrack_netlink,nf_conntrack_ftp,nf_conntrack_snmp,
    nf_conntrack_irc,nf_conntrack_tftp,nf_conntrack_pptp,nf_conntrack_netbios_ns,
    nf_conntrack_broadcast,nf_conntrack_slp,nf_conntrack_h323,nf_conntrack_sane,
    nf_conntrack_proto_sctp,nf_conntrack_amanda,nf_conntrack_sip,xt_conntrack,
    nf_conntrack_proto_udplite,nf_conntrack_proto_gre,nf_conntrack_proto_dccp
x_tables 34060 9 xt_LOG,xt_multiport,xt_tcpudp,xt_conntrack,ip6table_filter,ip6_tables,
    iptable_filter,ip_tables,ebtables

Welche Konsequenzen hat das nun für IPtables-Regeln ?

Wie man conntrack verwendet, ergibt sich z.B. aus den Ausführungen dieser Webseiten:

http://www.iptables.info/en/iptables-matches.html#GENERICMATCHES
http://www.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html

Aus meiner Sicht sind daher bisherige IPtables-Regeln wie in folgendem Beispiel zu modifizieren:

Alte Syntax:
$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
 
Neue Syntax:
$IPTABLES -A INPUT -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT

Ich sage aber ausdrücklich, dass ich das noch nicht im Detail verifiziert habe. Für komplexe Prüfungen mögen mehr Anpassungen von Nöten sein, als in dem simplen Beispiel angegeben. Und zudem gilt:

Das conntrack-System hat wesentlich mehr Optionen als nur "–cstate" !!

Auf die ganzen Möglichkeiten kann und will ich an dieser Stelle nicht eingehen.
Ein Blick in mehrere meiner generierten fw-Scripts zeigte mir jedenfalls für meine Fälle, dass die Ersetzung funktionieren sollte.

Die gute Nachricht – einfache Modifikation der generierten Scripts von FWBuilder

Wenn die oben genannte Ersetzungsregeln richtig sein sollten, dann ist man insofern fein raus, als man zur Modifikation der Skripts, die FWBuilder generiert, auf den jeweiligen Zielmaschinen ein einfaches “sed”-Kommando laufen lassen kann, um die notwendigen Modifikationen vorzunehmen. Folgende sed-Ersetzungsregeln sollten dann ausreichen :

sed ‘s/-m state –state/-m conntrack –ctstate/g’

Siehe auch :
http://gentooligan.blogspot.de/2012/12/change-in-iptables-state-vs-conntrack.html

Tatsächlich passen die angegebenen Blanks in der Ersetzungsregel auch zu den FW-Scripts. “sed” nutzt den Pipe-Mechanismus. Hat man z.B. ein System namens “os123” und hat man dort über die Remote Installationsmechnismen von FWBuilder ein Skriptfile namens “/etc/os123.fw” installiert, so kann man auf diesem System folgendes Kommando durchführen:

sed ‘s/-m state –state/-m conntrack –ctstate/g’ < /etc/os123.fw > os123.fw.mod

Anschließend kann man das neue Script zur Installation der Firewall nutzen:

os123:~ # sh /etc/os123.fw

Um das ganze etwas handlicher zu machen, bastelt man dann ggf. ein Skript um das Ganze. Eine erste Primitiv-Version kann auf dem besagten System etwa so aussehen:

#!/bin/bash
SHORT_HOSTNAME=$(hostname -s)
FW_FILE=”/etc/”$SHORT_HOSTNAME”.fw”
FW_FILE_ORIG=$FW_FILE”.orig”
FW_MOD_FILE=$FW_FILE”.mod”
echo “***************************************************”
echo “Preparing and installing FW-Firewall on “$SHORT_HOSTNAME
if [ -e $FW_FILE ]
then
echo ” – Copying “$FW_FILE” to backup file “$FW_FILE_ORIG
cp $FW_FILE $FW_FILE_ORIG
echo ” – Starting to modify \””$FW_FILE”\” with SED”
sed ‘s/-m state –state/-m conntrack –ctstate/g’ < $FW_FILE > $FW_MOD_FILE
rm $FW_FILE
mv $FW_MOD_FILE $FW_FILE
echo ” – Modification of \””$FW_FILE”\” with conntrack statements
finalized”
echo “Executing the modified script …”
echo “***************************************************”
sh $FW_FILE
echo “***************************************************”
else
echo “Firewall file does not exist”
fi
exit

Ich überlasse es dem Leser, hieraus ein übersichtliches, dokumentiertes Skript zu bauen, das sich für den Produktiveinsatz eignet. Und natürlich muss man das noch mit systemd verheiraten …..

Auf einem realen System sieht das dann etwa so aus:

#sh install_fw
***************************************************
Preparing and installing FW-Firewall on os123
– Copying /etc/os123.fw to backup file /etc/os123.fw.orig
– Starting to modify “/etc/os123.fw” with SED
– Modification of “/etc/os123.fw” with conntrack statements finalized
Executing the modified script …
***************************************************
Activating firewall script generated Wed Aug 28 15:30:16 2013 by root
Running prolog script
Verifying interfaces: br0 lo
Rule 0 (br0)
Rule 1 (br0)
Rule 2 (lo)
Rule 3 (br0)
Rule 4 (br0)
Rule 5 (br0)
Rule 6 (global)
Rule 8 (br0)
Rule 9 (global)
Rule 10 (br0)
Rule 11 (br0)
Rule 12 (br0)
Rule 13 (br0)
Rule 14 (br0)
Rule 15 (br0)
Rule 16 (br0)
Rule 17 (br0)
Rule 18 (br0)
Rule 19 (br0)
Rule 21 (br0)
Rule 22 (br0)
Rule 23 (global)
Running epilog script
***************************************************

Viel Spaß weiterhin mit FWBuilder auf Opensuse-Systemen. Und hoffentlich nehmen sich bald irgendein Sponsor und interessierte Entwickler des verwaisten FWBuilder-Projekts an ….

FwBuilder – eine Perle von einem Programm

Auch Linux-Systeme benötigen Firewalls. Auch wenn ganze Firmennetzwerke nach außen hin durch kommerzielle Firewalls abgeschottet werden, treten innerhalb des Netzwerkes immer wieder Situationen auf, bei denen man bestimmten Rechnern nicht gestatten will, mit anderen Systemen im Netz frei zu kommunizieren oder von anderen Rechnern beliebige Zugriffe anzunehmen. Eine Anwendungssituation ist z.B. die Begrenzung des Schadens durch evtl. Trojaner.

Zur schnellen Konfiguration von server- und generell rechnerspezifischen Firewalls auf der Basis von Iptables setzen wir bei anracon das Programm fwbuilder ein. Ich werde in weiteren Beiträgen hierzu mehr berichten.

Im Moment möchte ich festhalten: Es gibt immer mal wieder Momente, in denen man außerordentlich positive Erfahrungen mit Opensource-Programmen unter Linux macht. Mein Einstieg vor etwa einem Jahr in die Anwendung FWBuilder war ein solcher Moment:

Diese Anwendung

  • ist leicht verständlich
  • prüft die Konsistenz der Firewall-Bedingungen sehr weitgehend
  • hat eine ansprechende graphische Oberfläche, die sehr klar strukturiert ist
  • und entpuppt sich nach einer rel. kurzen Einarbeitungszeit als echte, langfristig wirksame Arbeitserleichterung.

Kurzum: Es handelt sich um echte Perle von einem Programm! Es macht Freude, damit zu arbeiten.

Leute, macht euch mit diesem Programm vertraut und setzt es ein!