Beiträge zu “SSH”

Startup Script für verschlüsseltes Debian System

Um die einzelnen Schritte für das Starten meines verschlüsselten Debian Servers zu automatisieren konnte ich auf Basis dieses Beitrags alle Schritte in ein Script zusammenfassen

  #!/bin/bash
  sudo wakeonlan e4:1faa:zz:yy:xx
  printf "%s" "waiting for Server ..."
  while ! timeout 0.2 ping -c 1 -n serveraddresse &> /dev/null
  do
      printf "%c" "."
  done
  printf "\n%s\n"  "Server is back online"
  ssh -i /home/hbauer/.ssh/id_rsa_initram root@192.168.xxx.yy -p 22

Das sieht dann so aus

 wecken-server.sh
 Sending magic packet to 255.255.255.255:9 with e4:1faa:zz:yy:xx
 waiting for ServerXY ............................................................................................................................................................................................................................................................................................................................................
 Server is back online
 Enter passphrase for key '/home/hbauer/.ssh/id_rsa_initram':
 To unlock root partition, and maybe others like swap, run `cryptroot-unlock`
 BusyBox v1.22.1 (Debian 1:1.22.0-19+b3) built-in shell (ash)
 Enter 'help' for a list of built-in commands.
 ~ # cryptroot-unlock
 Please unlock disk sda3_crypt:
 cryptsetup: sda3_crypt set up successfully
 ~ # packet_write_wait: Connection to 192.168.xxx.yyy port 22: Broken pipe
2.10.18
Weitere Beiträge zu: Debian   SSH  

Debian System mit verschlüsslten Festplatten remote starten

Ich wollte einen Server im Keller mit verschlüsselten Festplatten über wakeonlan remote aufwecken und dann “aus der Ferne” die Passphrase für die Festplattenverschlüsselung eingeben. Die Anleitungen mit denen ich erfolgreich war sind die und die

Zuerst installieren wir dropbear

 sudo apt install busybox dropbear-initramfs
 echo 'DROPBEAR=y' >> /etc/initramfs-tools/initramfs.conf

Wie ist der Name der Netzwerkkarte?

 ifconfig | grep flags
 enp11s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

Was steht schon in der Konfiguration und dann den richtigen Eintrag setzten

  grep DEVICE /etc/initramfs-tools/initramfs.conf
  sed -i 's/DEVICE=/DEVICE=enp11s0f0/'  /etc/initramfs-tools/initramfs.conf

Jetzt ist es richtig

 grep DEVICE /etc/initramfs-tools/initramfs.conf
 # DEVICE: ...
 DEVICE=enp11s0f0

Die Netzwerkkarte soll schön über DHCP booten

echo 'IP=:::::enp11s0f0:dhcp' >> /etc/initramfs-tools/initramfs.conf

Auf einem Client habe ich einen speziellen SSH Key generiert

/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): /home/user/.ssh/id_rsa_initram_server
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa_initram_server.
Your public key has been saved in /home/user/.ssh/id_rsa_initram_server.pub.
The key fingerprint is:
SHA256:+FRsAJC4JLB29GnTnkFlasdfj..........

Dann den öffentlichen Key anschauen

  more id_rsa_initram_server.pub

und auf dem Server an die richtige Stelle einkopieren

vi /etc/dropbear-initramfs/authorized_keys
   ...
   ...

Dann das Bootpaket neu bauen (um die deprecated Meldung kümmere ich mich später)

sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.9.0-8-amd64
dropbear: WARNING: Setting DROPBEAR in /etc/initramfs-tools/initramfs.conf is deprecated and will be ignored in a future release

Wenn der Server dann hochfährt kann ich mich über Port 22 mit dem SSH Key als root anmelden

ssh -i .ssh/id_rsa_initram_server root@192.168.xxx.yyy -p 22  
Enter passphrase for key '.ssh/id_rsa_initram_server':
To unlock root partition, and maybe others like swap, run `cryptroot-unlock`

und lande in der kleinen Shell

BusyBox v1.22.1 (Debian 1:1.22.0-19+b3) built-in shell (ash)
Enter 'help' for a list of built-in commands.

Mit dem Befehl werde ich aufgefordert die Passphrase einzugeben.

cryptroot-unlock
Please unlock disk sda3_crypt:

Und wenn diese richtig ist wird im Hintergrund dann die Festplatte aufgeschlossen und der Rechner bootet. Sobald der normale SSH Dienst läuft wird meine kleine Bootshell beendet

Connection to 192.168.xxx.yyy closed by remote host.

Und ich kann mich normal an dem Server über SSH anmelden.

28.9.18
Weitere Beiträge zu: Debian   SSH  

Debian: SSHD an IP Adresse binden

Auf einem internen Server wollte ich in einem Server mit verschiedenen IP Adresse den SSHD Dienst an eine bestimme IP Adresse binden. Ich wollte die andere IP Adresse einem Docker Server zuweisen.

Eigentlich ganz einfach

 vi /etc/ssh/sshd_config
 ListenAddress 192.168.xxx.yyy
 # Default Wert: ListenAddress ::

Leider klappte es mit dem Booten danach nicht mehr. Im wesentlichen liegt es daran das die Netzwerkkonfiguration noch nicht fertig ist wenn der SSH Server startet. Es soll verschiedene Möglichkeiten geben aber am Ende konnte ich das nur mit diesem Ansatz lösen

 echo 'net.ipv4.ip_nonlocal_bind = 1' > /etc/sysctl.d/99-nonlocal_bind.conf

Das ist zwar ein recht weitreichende Änderung zu sein aber für einen speziellen Server in einem abgetrennten Netzwerksegement wohl ok.

26.9.18
Weitere Beiträge zu: Debian   SSH  

Verzeichnisse über ssh mounten

Es ist zwar nicht die performanteste Variante aber bei bereits eingerichtetem SSH mit public/private key die einfachste und sicherste. Über SSH ein Verzeichnis mounten.

Die Installation ist eigentlich recht einfach:

sudo apt-get install sshfs
sshfs  user@yourhost:/target/directory localdirectory/ -C -p yourport

Nur wenn man versucht den sshfs Befehl mit sudo auszuführen kann man die eine oder andere Minute mit der Suche nach der Fehlermeldung

read: Connection reset by peer

verschwenden. Also: sshfs besser ohne sudo

1.4.15
Weitere Beiträge zu: SSH  

Ansible Playbook: Linux User mit SSH Public Key und Sudo Rechten einrichten.

Das folgende Playbook erlaubt es schnell einen neuen Nutzer unter Linux einzurichten, den öffentlichen Schlüssel an die richtige Stelle zu kopieren und die gewünschten Sudo Rechte zu vergeben. Die Idee hierzu kam mir durch diesen Beitrag

Ausgangspunkt ist dabei ein “neues” Linux System auf das noch mit dem Root User und Kennwort zugegriffen werden kann. Zusätzlich ist der öffentliche Schlüssel über http erreichbar. Ist dieser Anwender eingerichtet sollte der Rootzugriff per Kennwort am besten ausgeschaltet werden

Zuerst die notwendige Software installieren

sudo apt-get install sshpass

Dann das Playbook

vi install-deployment-user.yml
---
- hosts: '{{ target }}'
  remote_user: root
  vars:
     username: newuser
  tasks:
  - name: add user and create ssh key
    user: name={{username}}
  - name: download pubkey and placed as authorized_keys
    get_url: url="yourpublickeyurl" dest=/tmp/temp.authorized_keys
    delegate_to: 127.0.0.1
  - name: Create authorized_keys from the file that just downloaded
    authorized_key: user={{username}} key="{{ lookup('file', '/tmp/temp.authorized_keys') }}"
  - name: Create a sudoer file
    template:
    src=install-deployment-user-sudoers.j2
    dest=/etc/sudoers.d/{{username}}

und das SUDOER Template erstellen (die Berechtigungen natürlich wunschgemäß anpassen)

vi install-deployment-user-sudoers.j2 
    ALL=(ALL:ALL) NOPASSWD: ALL

Aufgerufen wird das ganze dann so

ansible-playbook -k --extra-vars "target=die-neue-ip-address" install-deployment-user.yml
10.11.14
Weitere Beiträge zu: SSH   Ansible  

SSH Konfigurationen mit Ansible absichern

Ich verwende einige “Standardmaßnahmen” um den Zugriff auf meine Server über SSH abzusichern. Im Prinzip gilt:

  • Kein Zugriff für root
  • Kein Anmelden über Username / Passwort
  • Zugriff über einen nicht Standardport
  • Anmelden nur über Public Key Verfahren für einen Nutzer

Bisher habe ich diese Änderungen immer manuell durchgeführt. Auf Basis dieses Beitrages habe ich für die Konfigurationsänderungen folgendes Ansible Playbook gebaut.

Ist später mal eine Änderung notwendig so kann man diese in das Playbook einfügen und mit einem Befehl sind alle Server wieder auf einem neuen und gleichen Stand.

ACHTUNG: Erst ausführen wenn der Nicht Root Administrator mit Public Key und Sudo Rechten eingerichtet ist

---
- hosts: all
  sudo: yes
  tasks:
    - name: Disallow root SSH access
      action: lineinfile dest=/etc/ssh/sshd_config regexp="^PermitRootLogin" line="PermitRootLogin no" state=present
    - name: Disallow password authentication
      action: lineinfile dest=/etc/ssh/sshd_config regexp="^PasswordAuthentication" line="PasswordAuthentication no" state=present
    - name: Change Default Port
      action: lineinfile dest=/etc/ssh/sshd_config regexp="^Port" line="Port 3422" state=present
    - name: Disallow ChallengeResponseAuthentication
      action: lineinfile dest=/etc/ssh/sshd_config regexp="^ChallengeResponseAuthentication" line="ChallengeResponseAuthentication no" state=present
12.10.14
Weitere Beiträge zu: SSH   Ansible  

SSH Zugriffe vereinfachen

Greift man auf einen Server mit ssh zu dann muss man je nach Konfiguration neben der IP Addresse auch noch den Nutzernahmen und den Port angeben.

 ssh benutzer@www.your-server.de -p 2320

Über eine Konfigurationsdatei im Verzeichnis .ssh kann man dies vereinfachen:

vi .ssh/config
  Host web
     HostName www.your-server.de
     Port 2320
     User benutzer

Das könnte man natürlich auch Alias oder in eine Shell schreiben. Aber dieser Ansatz hat den Vorteil das diese Variable auch von anderen Diensten verwendet wird die über ssh laufen.

6.10.14
Weitere Beiträge zu: SSH  

SSH Server abschliessen

Wenn man einen virtuellen oder echten root server bekommt ist man echter Administrator. Bitte macht so was nicht ohne Linux Kenntnisse. Am besten und sichersten ist es wenn auf alle überflüssigen Anwendungen wie confixx / phpmyadmin verzichtet wird, weil jede zusätzliche Ebene weitere Sicherheitsrisiken beinhaltet.

Das erste was gemacht werden sollte ist den SSH server absichern. Folgende Einträge scheinen nach gängiger Meinung das Maß aller Dinge zu sein um einen ssh server abzusichern

  1. Anlegen eines normalen Benutzer der in die Rolle von Root wechseln kann
  2. Kein Login mit Paßworten sondern nur mit private/public key (wird hier nicht behandelt)
  3. Kein Login mit Root sondern nur mit einem normalen Benutzer
  4. Verlegen des ssh Ports weg von dem Standard

Letzeres ist zwar mehr Verstecken als Sicherheit aber man vermeidet von automatisierten Angreifern belästigt zu werden. Auch bleiben die Logfiles sauberer.

1. Anlegen des Benutzers: Ausgangspunkt ist ein eingeloggter Root (zum ersten und letzten mal ;-)

useradd youradmin -m
su - youradmin
vi .ssh/authorized_keys

und den öffentlichen Schlüssel hinzufügen. Jetzt noch sudo. Damit erlaubt man den Benutzern mit dem Programm sudo zu "root" zu werden.

vi /etc/sudoers

  youradmin  ALL=(ALL) ALL

So kann man sich mit seinem privaten Schlüssel anmelden und mit sudo in die "root" Rolle wechseln.

2. Änderungen in der ssh

vi /etc/ssh/sshd_config
    PermitRootLogin NO
    PermitEmptyPasswords no
    ChallengeResponseAuthentication no
    Port = 3422

und jetzt noch leserechte richtig setzen

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Und before der ssh Dienst neu gestartet wird bitte!!!! einmal vorher mit dem anderen Benutzer einloggen. Nicht das was schiefgeht.

9.3.10
Weitere Beiträge zu: Linux   SSH  

Dies ist ein privater Blog von Hagen Bauer- berufstätiger Vater, Ehemann, Naturliebhaber, Läufer, Zelter, technikverliebt.


Creative Commons License
This blog is licensed under a Creative Commons License