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

Opensuse 12.3, mysql/mariadb, logrotate-Fehler

Nach der Umstellung auf die Maria DB unter Opensuse 12.3 bin ich mal wieder über einen mysql-logrotate-Fehler gestolpert.

2013-05-18T10:45:03.378467+02:00 myserv logrotate: ALERT exited abnormally with [1]
2013-05-18T10:45:03.379471+02:00 myserv logrotate: #007/usr/bin/mysqladmin: flush failed; error: ‘Unknown error’
2013-05-18T10:45:03.379739+02:00 myserv logrotate: /logrotate.d/mysql failed, probably because
2013-05-18T10:45:03.379926+02:00 myserv logrotate: the root acount is protected by password.
2013-05-18T10:45:03.380190+02:00 myserv logrotate: See comments in /logrotate.d/mysql on how to fix this
2013-05-18T10:45:03.380359+02:00 myserv logrotate: error: error running non-shared postrotate script for /var/log/mysql/mysqld.log of ‘/var/log/mysql/mysqld.log ‘

Die Ursache dieses Fehlers ist, dass der mysql-root-Account – also der Administrator Account für die mysql/mariadb-Datenbank – natürlich mit einem Passwort geschützt ist. Wo muss man das eintragen ?

Der Hinweis in der Fehlermeldung ist ein wenig irreführend. Natürlich gibt es kein “/logrotate.d”-Verzeichnis. Aber sehr wohl ein Verzeichnis “/etc/logrotate.d”. Dort findet man auch die Steueranweisungen für mysql, und zwar in der Datei:

/etc/logrotate.d/mysql

In dieser Datei findet man folgenden Hinweis:

# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
password = %Tromsoe!
user= root
#
# where “” is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !

Das machte die Sache schon klarer, löste sie aber nicht, denn das .my.cnf – File war bei mir bereits korrekt vorhanden.
Also lag der Verdacht nahe, dass es noch ein weiteres rechte-Problem beim Zugriff auf das Log-Verzeichnis für MySQL selbst geben könnte.

Folgender Novell-Bugzilla-Beitrag und die darin beschriebenen Schritte lösten dann mein Problem

https://bugzilla.novell.com/show_bug.cgi?id=763150#c7

This bug seems to occur still on openSuSe 12.3. Simply
chown mysql /var/log/mysql
chmod 750 /var/log/mysql
will fix it.

Danke an den Autor Thomas Wagner !

opensuse 12.3, LDAP, sssd – III

In den vorigen Beiträgen

opensuse 12.3, LDAP, sssd – I
opensuse 12.3, LDAP, sssd – II

zu meiner kleinen LDAP-Reihe für OS 12.3 bin ich darauf eingegangen, dass der OpenLDAP-Server seit OS 12.2 wegen sssd TLS/SSL-fähig ausgelegt werden muss. In diesem Beitrag treffe ich mittels YaST2 die Vorbereitungen, um die TLS-Fähigkeit zu erreichen und lege dafür Zertifikate an.

Im weiteren Verlauf des Textes bezeichne ich als “LDAP-Server” dasjenige Server-System unter Opensuse 12.3, das eine OpenLDAP-Implementierung beinhaltet. Im LDAP-Baum werden später gemäß suse-spezifischer Regeln Standardobjekte für die Beherbergung von User- und Gruppen-Informationen angelegt. Der LDAP-Baum beinhaltet dann auch die Credentials für eine User-Authentifizierung.

Ein anderer Opensuse 12.3-basierter PC oder Server, auf dem ein User, dessen Daten im LDAP hinterlegt sind, sich einloggen will, bezeichnen wir nachfolgend dagegen als Linux- “Host” unseres Netzwerkes. Ziel ist es, den User mit Hilfe des LDAP_Servers zu authentifizieren und ihm bzw. anderen Programmen auf dem Host das Arbeiten mit dem LDAP-Server zu ermöglichen.

CA und Common Server Certificate für einen LDAP-Server

Verschlüsselte Verbindungen wie TLS/SSL basieren u.a. auf Zertifikaten. Ein asymmetrisches Sicherheitsverfahren leitet die Client/Server-Kommunikation ein. Dabei werden der private wie der öffentliche Schlüssel eines Servers eingesetzt: Der Erhalt des Server-Zertifikats dient dem Client zur Prüfung der Identität des Servers. Nach erfolgreicher Authentizitätsprüfung sendet der Client dem Server eine Zufallssequenz (pre-master-secret). Dieser Austausch erfolgt verschlüsselt unter Zuhilfenahme des öffentlichen Server-Keys (aus dem Zertifikat). Server und Client berechnen dann auf Basis definierter Verfahren einen gemeinsamen Schlüssel für das anschließend eingesetzte symmetrische (und deshalb schnelle) Verschlüsselungsverfahren für den eigentlichen Datenaustausch. Weitere detailliertere Infos erhält man hier :

http://de.wikipedia.org/wiki/Transport_Layer_Security

Zertikate – im besonderen Server-Zertifikate – werden über eine übergeordnete Instanz ausgestellt. Diese Instanz ist ein sog. “Certificate Authority”, kurz CA. Bei der Kommunikation von Clients mit Servern, die sich über Zertifikate ausweisen, muss das Serverzertifikat und damit die Identität des Servers mittels Informationen der CA als unabhängiger dritter Instanz verifiziert werden.

Hatte man für sein eigenes Netzwerk bislang keine CA generiert, so wird dies nun zwingend erforderlich, wenn Netzwerk-Hosts mit ihrem SSSD den zentralen LDAP-Server zur User-Authentifizierung nutzen sollen.

Es ist wahrscheinlich, dass auf dem zentralen LDAP-Server weitere Server-Dienste laufen werden. Daher kann es sinnvoll sein, auf diesem Server ein von SuSE so genanntes “Common Server Certificate” [CSC] zu implementieren. Ich zeige kurz für zwei Fälle, wie das geht.

Neu im Vergleich zu meinem früheren Artikel Opensuse 12.1 – LDAP -II ist hier lediglich der Einsatz des CSC.

Fall 1: LDAP-Server und CA-Server sind identisch

In unserem Fall setze ich aus Testzwecken neben einer vorhandenen Root-CA eine weitere namens “anraconb” für meine Tests auf. Dies geschieht mittels des YaST2-Moduls >> “CA-Management”. Im sich öffnenden Fenster drücken wir den Button “Create CA” und
füllen im nächsten Dialogfenster die erforderlichen Informationen aus:

LDAP_OS123_2

Die CA soll logisch später für eine virtuelle Spieldomaine namens “anraconb.de” zuständig sein und Zertifikate für Server und ggf. auch Clients in dieser Domaine ausstellen. Nachdem die CA erzeugt ist, können wir diese über den entsprechenden Button in der Grundmaske des YaST2-CA-Managements “betreten”:

LDAP_OS123_3

LDAP_OS123_4

Um ein kopierbares Zertifikatsfile der CA verfügbar zu haben, exportieren wir unser Zertifikat in eine PEM-Datei. Ich lege diese in einem Verzeichnis “/etc/certs” unter dem Namen “anraconb_CA.pem” ab.

Nun legen wir dann für unseren LDAP-Server ein “Server-Zertifikat” an. Nachdem dieses später auf dem gleichen System wie die CA zum Einsatz kommen wird, handelt es sich aus Sicht der späteren Client-Hosts um ein “Self Signed Cerificate”. Aber das kümmert uns im Moment noch nicht.

LDAP_OS123_5

Bei der Bezeichnung “common name” sollte der FQDN des Servers eingetragen werden. Dies ist wichtig ! Wir werden an verschiedenen Stellen eine exakte Übereinstimmung des Zertifikatsnamens mit dem FQDN des Servers benötigen.

LDAP_OS123_6

Nachdem das Zertifikat angelegt ist, exportieren wir dieses und den zugehörigen Key in unverschlüsselter Form erneut als Dateien:

LDAP_OS123_7

Etwas scrollen hätte übrigens zeigt, dass YaST hier RSA-basierte Zertifikate und Schlüssel erzeugt:

LDAP_OS123_18

Nun zum Export als File:

LDAP_OS123_8

LDAP_OS123_9

Das Key-File enthält den “Private Key” für künftige Verschlüsselungen! Key-Files, die aus dem Certificate Management exportiert wurden, müssen daher in besonderer Weise geschützt werden und sollten zunächst nur root zum Lesen zur Verfügung stehen.

Abschließend wählen wir als weitere Exportfunktion den “Export als Common Server Certificate”.

LDAP_OS123_10

Opensuse legt dann die Dateien erneut an – allerdings an definierter Stelle, die dann später von allen möglichen YaST2-Modulen genutzt wird. Man findet die erforderlichen Zertifikats- und Key-Dateien unter

  • /etc/ssl/servercerts/servercert.pem
  • /etc/
    ssl/servercerts/serverkey.pem

Die Zertifikatsdatei der CA wird unter

  • /etc/ssl/certs/YaST-CA.pem

angelegt

Fall 2: LDAP-Server und CA-Server sind nicht identisch

Natürlich müssen wir auf dem CA-Server ein Zertifikat für den LDAP-Server ausstellen. Dieser wird dann natürlich einen anderen Namen haben – z.B. “xlamp.anraconb.de”.

Alles läuft auf dem CA-Server praktisch identisch zum oben beschriebenen Vorgehen ab, bis wir das erstellte Server-Zertifikat exportieren. Wir müssen hier einen zusätzlichen Export als “p12”-Datei vornehmen.

LDAP_OS123_17

Man beachte, dass man hier neben dem Zertifikatsnamen ein weiteres Passwort angeben muss.

Dieses File kopieren wir dann per scp auf den Zielserver – also den LDAP-Server. Am besten in das gleiche Verzeichnis “/etc/certs”. Dort schützen wir es, indem wir Lese- und Schreibrechte nur an root vergeben ! Diesen Schritt bitte nicht vergessen !

Auf dem LDAP-Server importieren wir dann das p12-File über “Yast2 >> Common Server Certificate” über die Taste “Import/Replace”. Als Ergebnis werden auf dem LDAP-Server dann in den gleichen Verzeichnissen wie oben beschrieben die notwendigen Files angelegt – u.a. auch das der CA.

Fazit

Eine CA für das eigene Netzwerk ist schnell angelegt. Für seine Server – hier den LDAP-Server – erzeugt man ebenso schnell ein RSA-basiertes Zertifikat und importiert dieses dann auf dem Zielserver mittels YaST als “Common Server Zertifikat”. Das so erhaltene Zertifikat und der private Schlüssel des Servers können dann bei der TLS-Absicherung des LDAP-Servers eingesetzt werden.

Natürlich können aber auch andere Serverdienste die Zertifikatsfiles und die generierten Schlüssel für eine SSL/TLS-Absicherung verwenden – z.B. vsftp, Apache, Cyrus IMAP.

Im nächsten Beitrag dieser Serie legen wir einen LDAP-Server unter Opensuse 12.3 an. Damit wir im Gegensatz zu früheren Artikeln bzgl. LDAP unter Opensuse 12.1 auch was neues lernen, werde ich dabei auch kurz zeigen, was man tun muss, um den LDAP-Server monitoring- und munin-fähig aufzusetzen.