IPTABLES - ssh für bestimmte dynamische IP zulassen

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
wckl
Beiträge: 580
Registriert: 10.08.2007 15:26:28
Lizenz eigener Beiträge: GNU General Public License
Wohnort: St. Georges de Didonne

IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von wckl » 20.04.2017 17:28:30

Hallo,
die Situation:
- Mein Rechner liegt hinter einem Router, auf meinem Rechner läuft eine firewall mit IPTABLES;
- SSH-Verbindungen will ich nur für bestimmte externe IP zulassen, diese sind leider dynamisch.

Für die Kontrolle habe ich diesen Code vorgesehen

Code: Alles auswählen

$IPT4 -A INPUT  -s $ssh_extern  -d $ssh_obelix -p TCP --dport ssh \
        -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT4 -A OUTPUT -d $ssh_extern -s $ssh_obelix -p TCP --dport ssh \
        -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Wie kann ich

Code: Alles auswählen

ssh_extern=
bestimmen, wenn die IP-Adresse des zugelassenen Teilnehmers ständig wechselt?
Am Ende will ich einen SSH-Tunnel einrichten, über den mit TightVNC der fremde Rechner betreut werden soll.

Hat jemand dafür eine Lösung?

Vielen Dank für Hilfe.
wckl

heinzelrumpel
Beiträge: 149
Registriert: 26.07.2004 20:07:58

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von heinzelrumpel » 20.04.2017 18:41:32

Ich sehe da nur einen Umweg als Lösung. Die IP des externen Rechners muss auf den Rechner gelangen, damit die iptables Regel erstellt werden kann. Ich würde mir da per OpenVPN ein Verbindung einrichten. Was genau soll denn der Sinn und Zweck dieser Übung sein? Wenn sich die IP des entfernten Rechners doch ständig ändert kann man ja nicht erkennen, dass hie rein Sicherheitsgewinn durch iptables erreicht wird. Erkläre doch bitte etwas genauer, was Du damit erreichen möchtest.

thoerb
Beiträge: 847
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von thoerb » 20.04.2017 18:45:42

Das einzig Sinnvolle ist meiner Meinung nach eine Authentifizierung über Public-Keys.

MSfree
Beiträge: 2620
Registriert: 25.09.2007 19:59:30

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von MSfree » 20.04.2017 19:08:11

heinzelrumpel hat geschrieben:Ich sehe da nur einen Umweg als Lösung. Die IP des externen Rechners muss auf den Rechner gelangen, damit die iptables Regel erstellt werden kann. Ich würde mir da per OpenVPN ein Verbindung einrichten.
Es ist nicht besonders sinnvoll, eine VPN-Verbindung aufzubauen, um die IP des entfernten Rechners auf den Server zu übertragen, damit dann IP-Tables-Regeln erstellt werden können, die genau diese eine IP für SSH zuläßt. Das Problem ist nämlich dann, daß die VPN nur für bestimmte dynamische IPs zulassen willst, die du dann.....
Was genau soll denn der Sinn und Zweck dieser Übung sein?
Die Begrenzung des SSH-Zugangs auf einen eingeschränkten Nutzerkreis.
thoerb hat geschrieben:Das einzig Sinnvolle ist meiner Meinung nach eine Authentifizierung über Public-Keys.
Und genau die wurde bei mir schonmal ausgehebelt durch einen Fehler im SSH-Daemon, der zwar später geflickt wurde, aber da war es schon zu spät. Seither mache ich genau das, was der OP oben gefordert hat.
wckl hat geschrieben:Hat jemand dafür eine Lösung?
Ja, ich habe dafür eine Lösung.

Die sieht so aus:

- Client und Server müssen ihre aktuelle IP-Adresse bei einem DynDNS-Hoster ständig aktuell halten, z.B. bei afraid.org. Beim Server ist das nur nötig, wenn der ebenfalls eine dynamisch wechselnde IP-Adresse hat, sonst findet der Client den nicht.

- mit iptables wir eine Regel erstellt, so daß eingehenden SSH-Pakete, die einen Verbindungsaufbau initiieren sollen, gequeued werden:

Code: Alles auswählen

iptables -A INPUT -i ppp0 -p tcp -m tcp --dport 22 -m state --state NEW -j QUEUE
- ich habe mir einen eigenen Daemon geschrieben, der die gequeueten Pakete abfängt, die IP-Adresse des Clients extrahiert, und dann einen Nameserverlookup auf den Hostnamen des erlaubten Clients durchführt, als z.B. ein nslookup beispiel.homenet.org. Die IP-Adresse, die dieser nslookup liefert, wird dann mit dem eingehenden Paket verglichen und bei Übereinstimmung durchgelassen, sonst verworfen.

Es gibt leider keine Debianpaket, nur Sourcecode, den man selbst kompilieren muß.

wckl
Beiträge: 580
Registriert: 10.08.2007 15:26:28
Lizenz eigener Beiträge: GNU General Public License
Wohnort: St. Georges de Didonne

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von wckl » 21.04.2017 00:40:33

Aber existiert denn -i ppp0 hinter einem Router?
Gibt es die Schnittstelle pppX nicht nur bei einem direkten Anschluß über ein Modem?

Wie anfangs beschrieben liege ich hinter einem Router.

MSfree
Beiträge: 2620
Registriert: 25.09.2007 19:59:30

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von MSfree » 21.04.2017 08:32:01

wckl hat geschrieben:Aber existiert denn -i ppp0 hinter einem Router?
Das war eigentlich nur als Beispiel gedacht, um das QUEUE-Target von iptables zu illustrieren. In deinem Fall dürfte das eher eth0 als Inputdevice sein.

Aber, wie gesagt, es ist mit dieser Regel alleine nicht getan. Man braucht auf jeden Fall ein Programm (Daemon), das im Userspace läuft und sich um die gequeueten Pakete kümmert. Wenn sich keiner um die Pakete kümmert, werden sie verworfen und nicht durchgelassen. Das hat immerhin den Vorteil, daß ein so geschützter Rechner nicht erreichbar und auch nicht kompromitierbar ist, wenn der Daemon mal abstürzen sollte.

Benutzeravatar
heisenberg
Beiträge: 1081
Registriert: 04.06.2015 01:17:27

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von heisenberg » 21.04.2017 10:24:45

Eine zusätzliche Sicherung wäre noch portknocking. Es werden in einer vordefinierten Reihe Anfragen an eine exakt definierte Reihenfolge von Ports gesendet. Der Portknocking-Daemon lauscht und führt nach der korrekten Sequenz ein Kommando aus.

Bei mir mache ich das z. B. so, dass ich als Erfolgsaktion dann einen zweiten SSH-Server auf einem anderen Port temporär freischalte, der dann nur einen bestimmten Benutzer aber mit Kennwort zulässt. Somit kann ich von einem fremden Rechner, auf dem mein Key nicht gespeichert ist eine Notadministration durchführen. (In Kombination mit Debianshellinabox, damit ich ein komfortables Terminal im Browser habe).

Hier ist mal meine Konfig vom portknocking-daemon dazu:

Code: Alles auswählen

[options]
        UseSyslog

[openSSH]
        sequence    = 23854,23123,12334,9444,1234,8712,23664,55231,21345,32445
        seq_timeout = 5
        command     = /usr/local/bin/temp_unblock_port tcp 64118 120
        tcpflags    = syn
Die zusätzliche sshd Konfiguration:

Code: Alles auswählen

...
Port 64118
...
PasswordAuthentication no
PubkeyAuthentication no
Match User superspecialadminaccount
  PasswordAuthentication yes
...
Hier noch das Script: temp_unpblock_port

Code: Alles auswählen

#!/bin/bash

function usage_exit {
        echo
        echo "Error: wrong invocation"
        echo
        echo "$(basename $0) : temporary unblock a port"
        echo
        echo "Usage: $(basename $0) <tcp|udp> <port_nr(1-65535)> <duration_minutes(1-1440)>"
        echo
        exit 1
}

function iptables_add_first_rule {

        UNIQUE_ID="$(tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1)"
        CHAIN=$1
        PROTO=$2
        PORT=$3
        DURATION=$4

        /sbin/iptables -I $CHAIN 1 -p $PROTO --dport $PORT -m comment --comment="Unblocked $DURATION minutes $UNIQUE_ID" -j ACCEPT
        echo $UNIQUE_ID

}

function unblock_port {

        PROTO=$1
        PORT=$2
        DURATION=$3

        iptables_add_first_rule INPUT $PROTO $PORT $DURATION
}

  [ $# -lt 3 ]                                                  && usage_exit
! [[ $1 =~ ^(tcp|udp)$ ]]                                       && usage_exit
! [[ $2 =~ ^[0-9]+$ ]] || [ $2 -lt 1 ] || [ $2 -gt 65535 ]      && usage_exit
! [[ $3 =~ ^[0-9]+$ ]] || [ $3 -lt 1 ] || [ $3 -gt 1440  ]      && usage_exit

PROTO=$1
PORT=$2
DURATION=$3

UNIQUE_ID=$(unblock_port $PROTO $PORT $DURATION)
echo "/usr/local/bin/iptables_regex_delete $UNIQUE_ID" | /usr/bin/at "now + $DURATION minutes"
und das iptables_regex_delete

Code: Alles auswählen

#!/bin/bash

# Delete an iptables rule specified by a unique pattern. Ideally put a unique id set into the rules comment

for ID in $* ;do
        # only continue if the pattern is at least 10 chars long
        [ -z $ID ] || [ ${#ID} -lt 10 ] && continue

        /sbin/iptables-save | grep -v $ID | /sbin/iptables-restore
done

MSfree
Beiträge: 2620
Registriert: 25.09.2007 19:59:30

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von MSfree » 21.04.2017 11:53:37

heisenberg hat geschrieben:Eine zusätzliche Sicherung wäre noch portknocking.
Im Prinzip ja. Portknocking hat aber den Nachteil, daß es oft nicht funktioniert, wenn man hinter eine Firewall sitzt, die ausgehenden Verkehr filtert und nicht jeden beliebigen Port durchläßt.

Die Alternative wäre Pingknocking, bei dem man dem Ping-Paket eine Datenlast in Form eines verschlüsselten Zugangscodes mitgibt, die vom Knocking-Daemon ausgewertet werden kann. Das Problem dabei ist aber, daß Plastikrouter kein Paketforwarding für Pingpakete können und der Knocking-Daemon nicht auf dem Plastikrouter selbst laufen kann.

Anklopfen wäre fein, ist aber oft nicht möglich, wie ich aus leideiger Erfahrung selbst mitbekommen mußte. Daher ja die Geschichte mit der IP-Adresse, die mir als einzige Möglichkeit, den Kreis der Angreifer effektiv zu beschränken, erscheint. Unmöglich wird ein Angriff dadurch natürlich trotzdem nicht, aber extrem erschwert..

Benutzeravatar
heisenberg
Beiträge: 1081
Registriert: 04.06.2015 01:17:27

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von heisenberg » 21.04.2017 12:07:54

Ich habe meinen PortKnocking-Client auf dem Handy. Dort schalte ich es frei und nutze von anderer Stelle. Ist natürlich temporäres Sicherheitsrisiko den SSH für alle zu öffnen. Ich halte das für mich für akzeptabel.

Das Szenario des Themenstarters scheint auf die (spontane) Fernwartung bei Heimbenutzern abzuzielen. Dort ist üblicherweise keine Firewall oder nur eine sehr wenig restriktive Firewall im Einsatz. Im Firmenumfeld sieht das natürlich anders aus.

Bei einer spontanen Fernwartung würde die Einrichtung von dyndns einen zusätzlichen Aufwand bedeuten.

Sich aber bei so einer Sache mal grundsätzlich auf http(s) zu beschränken wäre gut weil robust.
Zuletzt geändert von heisenberg am 21.04.2017 12:17:26, insgesamt 1-mal geändert.

MSfree
Beiträge: 2620
Registriert: 25.09.2007 19:59:30

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von MSfree » 21.04.2017 12:13:18

heisenberg hat geschrieben:Ich habe meinen PortKnocking-Client auf dem Handy. Dort schalte ich es frei und nutze von anderer Stelle. Ist natürlich temporäres Sicherheitsrisiko den SSH für alle zu öffnen. Ich halte das für mich für akzeptabel.
Das ist eine Idee, die mir so noch gar nicht gekommen ist. OK, SSH muß wohl oder übel für 1-2 Minuten für jeden geöffnet werden, aber das Risiko, ausgerechnet während dieses Zeitfensters gehackt zu werden, ist überschaubar. :THX:

mat6937
Beiträge: 698
Registriert: 09.12.2014 10:44:00

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von mat6937 » 21.04.2017 13:12:41

Eine andere Möglichkeit ist hosts.allow (libwrap) in Kombination mit dyndns und zusätzlich, um den "Angreifer zu verwirren", auf das gesetzte ecn-Bit (Server/Client) beim Server zu filtern:

Code: Alles auswählen

iptables -I INPUT 1 -i eth0 -p tcp --tcp-flags SYN SYN --dport 22 -m ecn ! --ecn-tcp-cwr -m state --state NEW -j DROP

MSfree
Beiträge: 2620
Registriert: 25.09.2007 19:59:30

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von MSfree » 21.04.2017 13:30:56

mat6937 hat geschrieben:Eine andere Möglichkeit ist hosts.allow (libwrap) in Kombination mit dyndns
Meines Wissens nach funkioniert das nur, wenn der anfragende Client per DNS-Reverse-Lookup aufgelöst werden kann, also ein nslookup 11.22.33.44 funktioniert.

Bei einerm Reverse-Lookup einer T-Online IP-Adresse bekommst du etwas in der Art xyz123456.dip0.t-ipconnect.de zurück, und das ist eben nicht dein beispiel.dyndns.org, der in deiner hosts.allow steht.

mat6937
Beiträge: 698
Registriert: 09.12.2014 10:44:00

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von mat6937 » 21.04.2017 13:48:09

Ja, aber die IP-Adresse von "beispiel.dyndns.org" (Client) lasse ich auf dem Server von einem cronjob in eine Textdatei schreiben und diese Textdatei trage ich in der hosts.allow (zusätzlich mit ".t-ipconnect.de") für allow ein.

MSfree
Beiträge: 2620
Registriert: 25.09.2007 19:59:30

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von MSfree » 21.04.2017 14:00:38

mat6937 hat geschrieben:Ja, aber die IP-Adresse von "beispiel.dyndns.org" (Client) lasse ich auf dem Server von einem cronjob in eine Textdatei schreiben und diese Textdatei trage ich in der hosts.allow (zusätzlich mit ".t-ipconnect.de") für allow ein.
Dann kann man auch gleich einen Cronjob laufen lassen, der eine iptables-Regel für die gerade gültige IP-Adresse erstellt und die alte Regel entfernt. hosts.allow braucht man dann nicht mehr.

scientific
Beiträge: 2689
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: IPTABLES - ssh für bestimmte dynamische IP zulassen

Beitrag von scientific » 21.04.2017 14:27:48

Was hältst du von Zertifikat + pam-googleauthenticator?
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Antworten