Home.

Technik-Blog

Willkommen auf meinem
Notiz - Blog
Blog

Kmoser's Tech-Blog

Dienstag
07
November 2017
Klaus Moser
Klaus Moser

Wake on Lan

Habe neulich mal nach einer Möglichkeit gesucht meinen PC auf der Arbeit von zu Hause aus über VPN einschalten zu können. Aus jungen Jahren war mir noch bekannt dass man PCs auch übers Netzwerk mittels WoL (Wake on LAN) einschalten kann.

Eines vorweg, über einen VPN Tunnel kann man einen PC nicht direkt einschalten, da man ein Paket an eine MAC Adresse anstatt an eine IP-Adresse schicken muss. Das VPN liegt also schon ein paar Schichten zu weit oben.

Um einen PC per VPN aufwecken zu können benötigt man also einen Rechner der im selben Netz hängt wie der zu startende Rechner. Hat man keinen Server im Netz kann man sich auch mit einem Raspberry Pi behelfen. Dieser benötigt nicht so viel Strom.

WoL am Raspberry

Nur so am Rande bemerkt: Einen Raspberry Pi kann man nicht per WoL aufwecken, da dessen Netzwerkkarte am USB Bus hängt und im ausgeschaltetem Zustand nicht mit Strom versorgt wird.

Etwas Hintergrundwissen

Von früher konnte ich mich noch erinnern dass Netzwerkkarten die WoL konnten immer ein 3-adriges Kabel beiliegen hatten, welches man mit dem Mainboard verbinden musste. Bei meiner Recherche habe ich herausgefunden dass dieses Kabel nur bis zum PCI-Standard 2.1 Verwendung findet. Modernere Mainboards mit einem PCI-Standard ab 2.2 benötigen diese Verbindung nicht mehr. Stattdessen wird ein PME (Power Management Event) verwendet.

Damit eine Netzwerkkarte auf die PME Events reagiert müssen zum einen die Events im Bios erlaubt sein und das gewünschte Verhalten in der Netzwerkkarte aktiviert werden. In meinem Bios musste ich nichts einstellen da die PME Events standardmäßig bereits aktiviert waren. Früher musste man das WoL mit dem 3-adrigen Kabel noch explizit einschalten.

WoL aktivieren

Um den Devicenamen der Netzwerkkarte herauszubekommen benutzt man den Befehl ifconfig. Meisstens ist das eth0, auf neueren Ubuntu Systemen kann das Device aber auch ganz anders heißen.

Bash
ifconfig

Hat man seine Netzwerkkarte gefunden kann man jetzt dessen Status abfragen.

Bash
$ sudo ethtool eth0
Settings for eth0:
	Supported ports: [ TP MII ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Half 1000baseT/Full
	Supported pause frame use: No
	Supports auto-negotiation: Yes
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Half 1000baseT/Full
	Advertised pause frame use: Symmetric Receive-only
	Advertised auto-negotiation: Yes
	Link partner advertised link modes:  10baseT/Half 10baseT/Full
	                                     100baseT/Half 100baseT/Full
	                                     1000baseT/Full
	Link partner advertised pause frame use: No
	Link partner advertised auto-negotiation: Yes
	Speed: 1000Mb/s
	Duplex: Full
	Port: MII
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: on
	Supports Wake-on: pumbg
	Wake-on: d
	Current message level: 0x00000033 (51)
			       drv probe ifdown ifup
	Link detected: yes

Unter Supports Wake-on steht eine Liste unterstützter Modi. Diese bedeuten im Einzelnen:

Kürzel Erklärung
p Wake on phy activity
u Wake on unicast messages
m Wake on multicast messages
b Wake on broadcast messages
a Wake on ARP
g Wake on MagicPacket(tm)
s Enable SecureOn(tm) password for MagicPacket(tm)
d Disable (wake on nothing). This option clears all previous options.

Unter Wake-on steht der aktuell eingstellte Modus.

Soll der PC nun z.B. mit einem MagicPacket aufgeweckt werden so muss man den entsprechenden Modus für die Netzwerkkarte aktivieren:

sudo ethtool -s enp3s0 wol g

Möchte man WoL wieder deaktivieren macht man das mit:

sudo ethtool -s eth0 wol d

PC aufwecken

Um den PC aufzuwecken, kann man jetzt z.B. das Tool wakeonlan verwenden. Dieses installiert man unter einem debian-basierten Linux mit:

Bash
sudo apt-get install wakeonlan

Den PC weckt man dann auf mit:

Bash
wakeonlan XX:XX:XX:XX:XX:XX

Wobei XX:XX:XX:XX:XX:XX für die Mac-Adresse der Netzwerkkarte steht. Diese bekommt man auch mittels ifconfig heraus.

Problembehebung - WOL wird ständig deaktiviert

Seltsamerweise deaktiviert sich bei meinem Rechner ständig das Wake On Lan Feature. Deshalb aktiviere ich ihn jetzt jedesmal automatisch wenn der Rechner gestartet wird. Dies erfolgt durch ein systemd script.

Man legt die Datei /etc/systemd/system/wol@.service an. Das @ gehört zum Dateinamen, also nicht löschen, und fügt dann folgenden Inhalt ein:

systemd
[Unit]
Description=Enable wake on lan for interface %i
Requires=network.target
After=network.target

[Service]
ExecStart=/sbin/ethtool -s %i wol g
Type=oneshot

[Install]
WantedBy=multi-user.target

Als nächstes sucht man sich mit ifconfig sein Netzwerk-Device raus und fügt den systemd-Job so hinzu:

Bash
sudo systemctl enable wol@eth0

Um zu prüfen ob der Service erfolgreich ausgeführt wurde kann man folgenden Befehl ausführen:

Bash
systemctl is-enabled wol@eth0

Nach einem Reboot kann man mit dem ethtool wieder prüfen ob Wake on Lan jetzt aktiv ist. Zur Erinnerung es muss so etwas herauskommen:

Wake-on: g
Sonntag
31
Januar 2016
Klaus Moser
Klaus Moser

Ubuntu 14.04 - fail2ban

Das Paket fail2ban ist ein in der Sparche Python geschriebes Intrusion Prevention Framework mit dem man Dienste wie z.B. SSH, FTP, Apache, etc. vor Brute-Force oder DDOS Angriffen schützen kann indem es temporäre Firewall Regeln anlegt, die potenzielle Angreifer den Zugang zum Server verweigert. Es scannt permanent Logfiles und führt definierte Aktionen aus sobald ein oder mehrere, per regular Expression definierbare Ereignisse, innerhalb eines bestimmten Zeitraumes, eintreten.

Installation

Installiert wird fail2ban mit

sudo apt-get install fail2ban

Konfiguration

Die Standardkonfiguration befindet sich in der Datei /etc/fail2ban/jail.conf. Diese Datei scheint allerdings bei Updates des Paketes überschrieben werden zu können. Deshalb muss man sich eine lokale Kopie der Datei anlegen, in der man nun seine Änderungen eintragen kann.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

In Ubuntu 16.04 gibt es den Unterordner /etc/fail2ban/jail.d/ in dem man Änderungen an der Standardkonfiguration vornehmen kann.

Als erstes legen wir mittels ignoreip die IPs fest, die fail2ban niemals sperren soll. Diese Einstellung befindet sich in der Sektion [DEFAULT]. Es können dabei IP-Adressen, DNS Hostnamen oder CIDR Bereiche sein.

ignoreip = 127.0.0.1/8 123.123.123.123/32 me.mydomain.de

Des weiteren kann man mittels bantime einstellen wie lange ein potenzieller Angreifer geblockt bleiben soll. Die Zeitspanne wird in Sekunden angegeben. Ein Wert von 600 entspricht also 10 Minuten.

bantime = 600

Ein Client wird als Angreifer eingestuft, wenn er innerhalb der in findtime definierten Zeitspanne maxretry Fehlversuche verursacht.

Die nächste Einstellung die wir tätigen müssen ist die E-Mail Adresse, an die die Warnungen gesendet werden sollen

destemail = me@mydomain.de

sowie den Absendernamen um den entsprechenden Server leichter identifizieren zu können

sendername = WWW01 Fail2Ban

Der Wert für mta kann entweder sendmail oder mail sein. Hat man postfix installiert setzt man den Wert auf sendmail.

mta = sendmail

Mit dem Parameter action kann man jetzt noch festlegen, was passieren soll wenn ein Client geblockt wurde. Es gibt in der Standardkonfiguration drei mögliche Werte, die oberhalb des action Parameter definiert sind.

Wert Erklärung
action_ Sperrt die IP
action_mw Sperrt die IP und schickt eine E-Mail mit einem Whois-Report an destemail
action_mwl Sperrt die IP und schickt eine E-Mail mit einem Whois-Report und den betreffenden Log-Zeilen an destemail.

Jails

Der Rest der Konfigurationsdatei ist in Sektionen eingeteilt, welche die Jails definieren. Fail2ban kommt von Hause aus mit einigen vordefinierten Jails, die man bei Bedarf einfach nur aktivieren muss. Eine Jail Definition sieht z.B. so aus:

[apache]

enabled = true
port = http,https
filter = apache-auth
logpath = /var/www/vhosts/*/log/access.log*
maxretry = 3
findtime = 300
bantime  = 1800

Der Name der Jail Definition steht in eckigen Klammern und alle folgenden Optionen gehören zu dieser Jail Definition, solange bis wieder ein Name in eckigen Klammern kommt und eine neue Jail Definition einleitet oder das Dateiende erreicht ist.

Option Erklärung
enabled Der Wert true aktiviert und der Wert false deaktiviert ein Jail
port Hier wird der zu überwachende Service definiert
filter Hier wird eine Datei referenziert, die unter /etc/fail2ban/filter.d liegt.
logpath Pfad zu der Log Datei. Es kann der * als Wirdcard für Zeichen und Unterverzeichnisse verwendet werden.
findtime Überschreiben des Wertes findtime aus der [GLOBAL] Sektion
maxretry Überschreiben des Wertes maxretry aus der [GLOBAL] Sektion
bantime Überschreiben des Wertes bantime aus der [GLOBAL] Sektion

Betreibt man einen Webserver kann man z.B. folgende Jails aktivieren:

ssh, apache, apache-noscript, apache-overflows, php-url-fopen

Betreibt man zusätzlich einen Mailserver wie ich ihn hier auch schon beschrieben habe, kann man auch noch folgende Jails aktivieren:

postfix, sasl, dovecot

Weitere Jails kann man definieren indem man eigene Filter schreibt.

Den Status eines Jails, in diesem Beispiel des ssh Jails, kann man abfragen mit:

Bash
fail2ban-client status ssh

[SSH] Jail Erweiterung

Für den SSH Jail habe ich, wie bei fail2ban.org beschrieben eine weitere failregex Zeile hinzugefügt um auch diese Zeilen zu erwischen:

Feb 9 06:53:05 www sshd[16660]: reverse mapping checking getaddrinfo for sd-41861.webserver.eu.com [195.154.65.98] failed - POSSIBLE BREAK-IN ATTEMPT!

Dazu bearbeitet man die Datei /etc/fail2ban/filter.d/sshd.conf

sudo nano /etc/fail2ban/filter.d/sshd.conf

und fügt die folgende Zeile bei den anderen Zeilen der failregex Variablen ein

^%(__prefix_line)sreverse mapping checking getaddrinfo .* \[<host>\] failed - POSSIBLE BREAK-IN ATTEMPT!\s*$</host>

Analyse

Die Log-Datei befindet sich unter /var/log/fail2ban.log. Hier findet man Informationen über das Sperren und Entsperren von IP-Adressen und dessen Jail Name. Ausserdem finden sich hier Informationen ob sich Jail Einstellungen geändert haben bzw. ob ein neuer Jail gestartet wurde.

Mitfolgendem Befehl kann man sich eine Liste vn IP-Adressen ausgeben lassen, welche gesperrt wurden sowie dessen Häufigkeit.

awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -nr

Die Ausgabe sieht etwa so aus:

22 115.231.222.176
18 88.80.187.139
 6 61.174.49.106
 2 41.231.53.25
 1 217.64.98.42

Um diese Auswertung über über alle Logdateien zu machen führt man folgenden Bfehl aus:

zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | sort | uniq -c

Möchte man die Liste auch noch nach Angriffspunkt sortieren geht das so

zgrep -h "Ban " /var/log/fail2ban.log* | awk -F[\ \:] '{print $10,$8}' | sort | uniq -c | sort -nr

Das ergibt eine Liste wie die folgende:

22 115.231.222.176 [ssh]
18 88.80.187.139 [ssh]
 6 61.174.49.106 [ssh]
 1 41.231.53.25 [ssh]

Da Angriffe meißtens nicht nur von einem Rechner kommen, sondern mehrere Rechner zum Einsatz kommen, kann man sich die Adressen auch nach einem Teilnetzbereich ausgeben lassen

zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | awk -F\. '{print $1"."$2"."}' | sort | uniq -c | sort -rn

Das ergibt folgende Ausgabe:

26 115.239.
22 115.231.
18 88.80.
 6 61.174.
 1 41.231.

Wenn man nun genauer wissen möchte was eine IP bzw. Netzbereich so angestellt hat, kann man sich so die Zeilen des Logs anzeigen lassen:

zgrep 115.239. /var/log/fail2ban.log

Das ergibt dann z.B. folgende Ausgabe

2015-02-11 22:55:42,757 fail2ban.actions: WARNING [ssh] Ban 115.239.228.15
2015-02-11 23:23:47,000 fail2ban.actions: WARNING [ssh] Ban 115.239.228.34
2015-02-11 23:25:43,269 fail2ban.actions: WARNING [ssh] Unban 115.239.228.15
2015-02-11 23:53:47,388 fail2ban.actions: WARNING [ssh] Unban 115.239.228.34
2015-02-12 00:19:19,141 fail2ban.actions: WARNING [ssh] Ban 115.239.228.4
2015-02-12 00:47:09,186 fail2ban.actions: WARNING [ssh] Ban 115.239.228.11
2015-02-12 00:49:19,493 fail2ban.actions: WARNING [ssh] Unban 115.239.228.4
2015-02-12 01:17:09,405 fail2ban.actions: WARNING [ssh] Unban 115.239.228.11

Eigene Jails

Zusätzlich zu den mitgelieferten Jails kann man auch eigene Jails definieren.

Fail2ban Jail

Da bei mir sehr viele Angriffe auf den SSH Port gehen und die Angreifer durch die kurze Sperrdauer auch immer wieder kommen, habe ich mir einen eigenen Filter eingerichtet, der das fail2ban Logfile im Auge behält. Wird eine IP-Adresse häufig gesperrt, bekommt diese zur Belohnung eine längere Sperrdauer.

Dazu fügt man in der Datei /etc/fail2ban/jail.local eine neue Jail-Definition ein:

[fail2ban-ssh]
enabled  = true
port     = ssh
filter   = fail2ban-ssh
logpath  = /var/log/fail2ban.log
maxretry = 3
findtime = 21600
bantime  = 86400

Entsprechend dem was man unter filter eingetragen hat, muss man jetzt noch einen Filter unter /etc/fail2ban/filter.d/ anlegen, in diesem Fall heißt die Datei fail2ban-ssh.conf.

sudo nano /etc/fail2ban/filter.d/fail2ban-ssh.conf

In die Datei kommt folgender Inhalt:

# Fail2Ban filter for fail2ban log
#
failregex = \[ssh\] Ban <HOST>
ignoreregex =

Zum Abschluss muss der Filter noch aktiviert werden mit:

fail2ban-client add fail2ban-ssh
fail2ban-client start fail2ban-ssh

Damit ist der Filter erstellt und aktiv.

Typo3 Login Jail

Um Brute Force Attacken auf das Backend-Login von Typo3 zu verhinden kann man ebenfalls ein Jail anlegen:

Apache Scanners Jail

Wenn man die Access Logs des Apaches betrachtet findet man immer wieder Versuche Login-Seiten von CMS-System oder Administrationswerkzeugen wie phpmyadmin oder plesk zu finden. Diese Scanner können wir ebenfalls von unserer Seite ausschlißen in dem wir ein neues Jail anlegen.

Dazu fügt man in der Datei /etc/fail2ban/jail.local eine neue Jail-Definition ein:

[apache-noscanners]
enabled  = true
port     = http,https
filter   = apache-noscanners
logpath  = /var/log/apache*/*access.log
maxretry = 1

Jetzt legt man den entsprechenden Filter in /etc/fail2ban/filter.d/apache-noscanners.conf mit folgendem Inhalt an:

# Fail2Ban configuration file

[Definition]
failregex = ^<HOST> .*"GET .*w00tw00t
# try to access to admin directory
            ^<HOST> .*"GET .*admin.* 403
            ^<HOST> .*"GET .*admin.* 404
# try to access to install directory
            ^<HOST> .*"GET .*install.* 404
# try to access to phpmyadmin
            ^<HOST> .*"GET .*dbadmin.* 404
            ^<HOST> .*"GET .*myadmin.* 404
            ^<HOST> .*"GET .*MyAdmin.* 404
            ^<HOST> .*"GET .*mysql.* 404
            ^<HOST> .*"GET .*websql.* 404
            ^<HOST> .*"GET \/pma\/.* 404
# try to access to wordpress (we use another CMS)
            ^<HOST> .*"GET .*wp-content.* 404
            ^<HOST> .*"GET .*wp-login.* 404
# try to access to typo3 (we use another CMS)
            ^<HOST> .*"GET .*typo3.* 404
# try to access to tomcat (we do not use it)
            ^<HOST> .*"HEAD .*manager.* 404
# try to access various strange scripts and malwares
            ^<HOST> .*"HEAD .*blackcat.* 404
            ^<HOST> .*"HEAD .*sprawdza.php.* 404
            ^<HOST> .*"HEAD .*mocfilemanager.* 404
ignoreregex =

Um den Filter zu aktivieren folgende Befehle ausführen.

fail2ban-client add apache-noscanners
fail2ban-client start apache-noscanners

Solche Scanner Tools die nach Sicherheitslücken suchen gibt es z.B. bei sectools.org.

Apache SQL Injection Jail

Um SQL Injections zu unterbinden kann man ebenfall ein Jail einrichten. Ein schönes Beispiel gibt es auf GitHub (Forks beachten!!).

Um den Filter einzurichten eine Datei /etc/fail2ban/filter.d/apache-sqlinject.conf mit dem entsprechenden Inhalt aus dem GitHub Repository anlegen, dann in der Datei /etc/fail2ban/jail.d/020-apache2.conf folgende Passage hinzufügen:

020-apache2.conf
[apache-sqlinject]

enabled  = true
port     = http,https
filter   = apache-sqlinject
logpath  = /var/www/vhosts/*/log/access.log
#bantime  = 172800
maxretry = 2

Für den Fall das der Code mal nicht mehr vorhanden sein soll, hier eine gekürtze Fassung.

apache-sqlinject.conf
[Definition]

sqlfragments_generic = select.*from|delete.*from|update.*set|insert.*into|replace.*(value|set)
sqlfragments_havij = and(\+|%%20)ascii%%28substring|and(\+|%%20)Length|union(\+|%%20)all(\+|%%20)select|and(\+|%%20)1%%3C1|and(\+|%%20)1%%3D1|and(\+|%%20)1%%3E1|and(\+|%%20)%%27.%%27%%3D%%27|%%2F\*%%21[0-9]+((\+|%%20)[0-9]*)?\*%%2F

failregex = ^<HOST> -[^"]*"[A-Z]+\s+/[^"]*\?[^"]*(?i)(?:%(sqlfragments_generic)s|%(sqlfragments_havij)s)[^"]*HTTP[^"]*"

ignoreregex =

Fail2ban jail

Existiert das Fil2ban Logfile nicht, dann startet fail2ban nicht. Es muss also vorher angelegt werden. Dazu legt man ein neues Initscript /etc/init.d/fail2ban-tmpfs an das folgenden Inhalt hat:

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          fail2ban-tmpfs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:
# Required-Stop:
# Short-Description: Create /var/log/fail2ban.log on tmpfs at startup
# Description:       Create /var/log/fail2ban.log needed by Apache.
### END INIT INFO
#
# main()
#
case "${1:-''}" in
  'start')
   # create the /var/log/fail2ban.log needed by fail2ban jail
   touch /var/log/fail2ban.log
   chmod 777 /var/log/fail2ban.log
   ;;
  'stop')
   ;;
  'restart')
   ;;
  'reload'|'force-reload')
   ;;
  'status')
   ;;
  *)
   echo "Usage: $SELF start"
   exit 1
   ;;
esac

Das Script ausführbar machen

sudo chmod a+x /etc/init.d/fail2ban-tmpfs

Dann das Script vor fail2ban starten

update-rc.d fail2ban-tmpfs defaults 90 10

Damit wird jetzt das Log-File vor dem Start von fail2ban angelegt und der Dienst kann wieder korrekt starten.

Probleme

Es kann sein, dass im Syslog sich wiederholende Meldungen wie folgt abgekürzt werden:

Feb 9 07:52:57 www sshd[19672]: message repeated 2 times: [ Failed password for root from 115.230.126.151 port 43913 ssh2]

wenn das passiert, stimmen der Zähler von fail2ban nicht mehr. Um diesen Wiederholungszähler zu deaktivieren muss man die Datei /etc/rsyslog.conf editieren und den Wert von RepeatedMsgReduction von on auf off stellen und danach rsyslog neu starten.

sudo service rsyslog restart

Jetzt kann fail2ban wieder die richtigen Werte ermtteln.

Montag
23
März 2015
Klaus Moser
Klaus Moser

Ubuntu - SSH Key erzeugen

Für die Authentifikation per SSH kann man ein Schlüsselpaar mit oder ohne Passwort verwenden. Ein solches Schlüsselpaar erzeugt man mit

ssh-keygen -t rsa -b 4096 -C "me@example.com" -f ~/.ssh/id_rsa-new

Der Parameter -f ist optional und spezifiziert nur den Namen der Datei der den privaten Schlüssel enthält. Der öffentliche Schlüssel bekommt den gleichen Namen mit der zusätzlichen Dateiendung .pub.

Führt man das Kommando aus erhält man eine Ausgabe wie die folgende

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/myuser/.ssh/id_rsa-new.
Your public key has been saved in /home/myuser/.ssh/id_rsa-new.pub.
The key fingerprint is:
a6:f4:47:cf:32:67:a5:3e:44:26:cc:39:a4:22:c3:5b myser@myhost
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|          .      |
|         + o     |
|        S o.o    |
|     . . +.o..  E|
|      o + .o+. . |
|       o +o +o.  |
|        ooo+oo   |
+-----------------+

und es werden zwei Dateien erzeugt:

$ ll ~/.ssh
-rw------- 1 myuser myuser 1,7K Mär 23 12:03 id_rsa-new
-rw-r--r-- 1 myuser myuser  402 Mär 23 12:03 id_rsa-new.pub

Der private Schlüssel id_rsa-new ist der Schlüssel mit dem man Zugriff auf einen Server erhalten kann und muss geheim gehalten werden. Wichtig für diese Datei ist, dass die Dateiberechtigungen so gesetzt werden, dass sie nur vom Benutzer gelesen und geschrieben werden darf, da sich sonst ssh beschwert und dessen Verwendung verweigert.

chmod 0600 ~/.ssh/id_rsa-new

Der öffentliche Schlüssel kann auf den Servern hinterlegt werden, auf denen man einen Zugriff per SSH möchte.

Entfernter Server

Um jetzt auf einem anderen Server den SSH Zugang über diesen Schlüssel zu ermöglichen, kopiert man den Inhalt der Datei ~/.ssh/id_rsa-new in die Datei ~/.ssh/authorized_keys auf dem Server.

cat ~/.ssh/id_rsa-new.pub | ssh myserver.local -l myusername "cat >> ~/.ssh/authorized_keys" 

Um vorher einen alten Key zu entfernen kann man folgendes machen

echo "sed -i '\,$(head -n 1 ~/.ssh/id_rsa-old.pub),d' ~/.ssh/authorized_keys" | ssh myserver.local bash

Damit der Server einen Authentifikation per Key zulässt muss in der Datei /etc/ssh/sshd_config folgendes gesetzt sein:

PubkeyAuthentication yes

Jetzt sollte man sich mit

ssh remotehost.de -l myusername

auf dem entfernten Server remotehost.de anmelden können. Die Option -l spezifiziert den Benutzernamen mit dem man sich am Server anmelden möchte und kann weggelassen werden wenn entweder der lokale Benutzername mit dem auf dem Server übereinstimmt oder man eine entsprechende Konfiguration unter ~/.ssh/config angelegt hat.

Script zum Ändern des Public Keys

Mit folgendem Script kann man das Ändern des Public Keys automatisieren.

Dem Script muss als Argument der Zielserver übergeben werden. Der neue Key muss unter ~/.ssh/id_rsa.pub und der alte Key unter ~/.ssh/id_rsa-old.pub liegen.

Also z.B.

replaceKey.sh www.myserver.de

Das Script fügt den neuen Key in die Datei ~/.ssh/authorized_keys auf dem Zielserver ein und entfernt bei Erfolg den alten Key.

#!/bin/bash
if [ -z $1 ]
then
        echo "No server given. Exiting..."
        exit 1
fi

# Add new key
cat ~/.ssh/id_rsa.pub | ssh $1 "cat >> ~/.ssh/authorized_keys"

# Remove old key
if [ $? -eq 0 ]
then
        echo "sed -i '\,$(head -n 1 ~/.ssh/id_rsa-old.pub),d' ~/.ssh/authorized_keys" | ssh $1 bash
else
        echo "Unable to add new key to ~/.ssh/authorized_keys on $1. Aborting..."
fi

# Show file ssh $1 "cat ~/.ssh/authorized_keys"

Das Script gibt am Schluss die Datei ~/.ssh/authorized_keys auf dem Zielserver zur Kotrolle aus.

Blog

Kmoser's Tech-Blog