Archive

Kategorien

SSH-Authentifizierung mit Google 2-Faktor und SSH-Key

Die 2-Faktor Authentifizierung ist etwas sehr feines. Sie legt einen zusätzlichen Sicherheitslayer über den Login d.h. auch wenn die Logindaten mal kompromittiert würden, ist damit kein Login am System möglich. Es gibt verschiedene Anbieter z.B. DuoSecurity oder Authy. Beide lassen sich recht einfach für den SSH Login einbauen: Authy und DuoUnix.

Im Folgenden möchte ich kurz zeigen wie man den Dienst von Google einbinden kann.

Voraussetzungen

  • Ruby
  • rotp
  • SSH-Server
gem install rotp

Damit die Google App (z.B. auf dem Handy) korrekt initialisiert wird, muss ein Secret Key existieren, welcher sowohl Google App als auch der SSH Server kennen. Diesen Code kann man mit folgendem Ruby Script generieren lassen

#!/usr/bin/env ruby
require 'rubygems'
require 'rotp'
 
secret = ROTP::Base32.random_base32
data = "otpauth://totp/#{`hostname -s`.strip}?secret=#{secret}"
url = "https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=#{data}"
 
puts "Your secret key is: #{secret}"
puts url

erzeugt einen solchen Output

1
2
Your secret key is: 4rr7kc47sc5a2fgt
https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/myserver?secret=4rr7kc47sc5a2fgt

Der Secret Key wird für den SSH-Server benötigt und unter der URL wird ein QR-Code generiert, den man mit der Google App scannen kann, damit diese den Code auch kennt.

Es gibt grundsätzlich zwei Möglichkeiten die Auth einzubauen: entweder global für jeden SSH User oder ganz gezielt pro User. Ich würde den zweiten Weg empfehlen, weil sonst auch Accounts betroffen sind, welche von Scripten (z.B. für Backups) genutzt werden.

#!/usr/bin/env ruby
require 'rubygems'
require 'rotp'
 
# we'll pass in a secret to this script from the authorized_keys file
abort unless secret = ARGV[0]
 
# prompt the user for their validation code
 
STDERR.write "Enter the validation code: "
until validation_code = STDIN.gets.strip
  sleep 1
end
 
# check the validation code is correct
 
abort "Invalid" unless validation_code == ROTP::TOTP.new(secret).now.to_s
 
# user has validated so we'll give them their shell
 
Kernel.exec ENV['SSH_ORIGINAL_COMMAND'] || ENV['SHELL']

obiges Script (Ruby) fragt nach dem Code, prüft diesen und erlaubt dann den weiteren Zugriff oder nicht.

Will man das Ganze nun global für alle SSH User haben, dann setzt man in /etc/ssh/sshd_config den

ForceCommand /path/to/script <SECRET CODE>

und restartet den SSH. Ich empfehle dringend die SSH Verbindung nicht zu beenden bis man den Zugriff getestet hat, sonst sperrt man sich bei einem Fehler noch aus.

Besser als über ForceCommand ist es die Authentifizierung selektiv pro Schlüssel einzubauen. Dazu kann man in /home/USER/.ssh/authorized_keys den entsprechenden Key um das command-Kommando erweitern

command="/path/to/script <SECRET CODE>" ssh-rsa AAAAB3NzaC1yc2E**********

Mehr

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

  

  

  

18 − seventeen =

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .