SSH Schlüssel aus known_hosts entfernen

Manchmal ändert sich die RSA Schlüssel für einen entfernten Server welchen man per SSH erreichen möchte. Dann bekommt man vom System eine schöne Meldung:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

The fingerprint for the RSA key sent by the remote host is
3b:a3:48:fc:55:70:70:f8:43:33:50:73:d9:b8:1d:9e.

Please contact your system administrator.

Add correct host key in /Users/seeseekey/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/seeseekey/.ssh/known_hosts:17
RSA host key for 8.8.8.8 has changed and you have requested strict checking.
Host key verification failed.

Das Problem besteht darin, das ein alter Fingerprint in der „known_hosts“-Datei vorhanden ist. Die brachiale Methode wäre es die Datei zu löschen. Damit wäre die Verbindung mit dem Server wieder möglich. Natürlich löscht man so auch alle anderen verifizierten Server (bzw. deren Fingerprints). Sauberer ist es den veralteten Key mittels „ssh-keygen“ zu entfernen:

ssh-keygen -R 8.8.8.8

Anschließend wird man beim nächsten Verbindungsversuch wieder gefragt ob man die Verbindung akzeptieren möchte. Ist dies der Fall kann sich mit dem Server verbunden werden.

Git bei all-inkl einrichten

Nachdem ich versuchte Git per WebDAV in Verbindung mit ownCloud einzurichten, fiel mir ein, das die größeren Paketen (ab Premium) bei all-inkl.com auch einen SSH Zugang beinhalten. Mit diesem ist es relativ einfach das Webhosting Paket als Server für Git Repositories zu benutzen. Sollte auf dem lokalen Rechner noch kein SSH-Schlüssel erzeugt worden sein, so kann dies mittels:

ssh-keygen -t rsa -C ""

nachgeholt werden. Nun kann der Schlüssel an den all-inkl Server übertragen werden:

ssh-copy-id -i ~/.ssh/id_rsa.pub 

Anschließend ist es möglich sich mit dem all-inkl SSH Server ohne Authentifikation über ein Passwort anzumelden:

ssh 

Dort legen wir in dem Ordner in welchem unserer Git Repository landen soll ein leeres Repository an:

git init --bare

Als nächsten Schritt trägt man einen Remote an ein lokales Git Repository an:

git remote add origin ssh:///www/htdocs/nutzername/repos/Example.git

Danach kann das lokale Repository mit dem Befehl:

git push origin master

auf den entfernten Server kopiert werden. Benötigt man es auf einem anderen Rechner so kann das ganze mittels:

git clone ssh:///www/htdocs/nutzername/repos/Example.git

bewerkstelligt werden.

Linux Nutzer ohne Shell anlegen

Manchmal benötigt man unter Linux einen Nutzer, möchte aber das dieser keine Shell zugewiesen bekommt und sich somit nicht anmelden kann. Dies kann unter anderem mit dem Befehl „adduser“ bewerkstelligt werden:

adduser seeseekey --no-create-home --shell /bin/false

Damit legt man einen Nutzer an, welcher sich nicht anmelden kann, aber durchaus für die Authentifizierung über das Nutzersystem z.B. bei bestimmten Netzwerkdiensten taugt. Daneben wird auch gleich verhindert, dass der Nutzer einen „home“-Ordner bekommt.

PuTTY SSH Schlüssel in OpenSSH Schlüssel umwandeln

Möchte man den privaten SSH Schlüssel welcher mittels des „PuTTY Key Generator“ erzeugt wurde auch in der „Git Bash“ nutzen, so muss man den Schlüssel in das OpenSSH Format bringen.

Der PuTTY Key Generator

Der PuTTY Key Generator

Dazu öffnet man den PuTTY Schlüssel mittels „File“ -> „Load private key“. Anschließend wird der Schlüssel über „Conversions“ -> „Export OpenSSH key“ in eine Datei mit dem Namen „id_rsa“ exportiert. Diese Datei wird dann in den Benutzerordner (z.B. „c:\Users\seeseekey\.ssh\“ unter Windows 7) gelegt. Anschließend kann der Schlüssel auch unter der Git Bash benutzt werden.

Git Server für mehrere Benutzer einrichten

Wie man Git auf einem Ubuntuserver aufsetzt hatte ich vor einiger Zeit in einem Artikel beschrieben. Nachteil der vorgestellten Methode ist, das sie sich nur für einen Nutzer eignet. Natürlich kann man mit dieser Methode auch mehrere Nutzer zu dem Repositories verbinden, hat damit aber keine Möglichkeit mehr Zugriffsberechtigungen für die Repositories zu setzen.

Als Lösung für das Problem wird Gitolite für die Nutzer und Rechteverwaltung genutzt. Im ersten Schritt werden auf dem Server die notwendigen Pakete installiert:

sudo apt-get install git openssh-server perl

Als nächster Schritt wird der Nutzer angelegt, in welchem Gitolite läuft und in diesen gewechselt:

sudo useradd -m git
sudo su git

Danach geht es auch schon an die Installation von Gitolite:

cd ~
git clone git://github.com/sitaramc/gitolite
mkdir bin
cd gitolite
./install -ln

Anschließend muss der öffentliche SSH Schlüssel von dem Rechner mit welchem auf das System zugriffen werden soll in den Home Ordner des „git“ Nutzers kopiert werden. Anschließend kann das Setup abgeschlossen werden:

cd ~/bin
./gitolite setup -pk $HOME/seeseekey.pub

Damit ist das Setup abgeschlossen und es kann an die Konfiguration gehen. Dazu wird vom Rechner dessen Public Key beim Setup benutzt wurde das entsprechende administrative Repository geklont:

git clone git@192.168.1.128:gitolite-admin

Die Dateistruktur des Repositories sieht dabei wie folgt aus:

conf
  gitolite.conf
keydir
  seeseekey.pub

In dem Verzeichnis „keydir“ sind die SSH Schlüssel enthalten. Um einen Nutzer hinzuzufügen reicht es einfach einen neuen öffentlichen Schlüssel in das Verzeichnis zu legen und das ganze ins Git Repository einzubringen. Die eigentliche Konfiguration der Repositories erfolgt in der „gitolite.conf“ Datei. Diese sieht nach der Erzeugung so aus:

repo gitolite-admin
    RW+     =   seeseekey

repo testing
    RW+     =        @all

Das bedeutet das es zwei Repositores gibt, eines trägt den Namen „gitolite-admin“ und dient der Verwaltung. Das zweite Repository ist „testing“ auf das alle Nutzer zugreifen dürfen. Benötigt man nun ein neues Repository, so fügt man einen neuen „repo“ Abschnitt mit dem Namen und den entsprechenden Rechten hinzu. Sobald das ganze commitet und gepusht wurde, legt Gitolite das neue Repository an. Wenn man bei den Schlüsseln mehrere SSH Schlüssel pro Nutzer wünscht, so legt man dafür am besten eine Verzeichnisstruktur an:

keydir
  seeseekey
    rechner1
      seeseekey.pub
    rechner2
      seeseekey.pub

Möchte man ein Repository löschen so entfernt man es aus der „gitolite.conf“ und löscht es anschließend auch vom Server. Damit hat man eine Lösung für Git Server mit mehren Nutzern und und entsprechender Verwaltung.