ubuntuusers.de

Benutzererstellung & SSH Key erstellen in Script

Status: Ungelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

Frankenstein

Avatar von Frankenstein

Anmeldungsdatum:
1. Juni 2020

Beiträge: 47

Hey Leute,

aktuell möchte ich in einem Script einbauen, dass dort mittels user input ein Benutzer erstellt wird.

Anschließend möchte ich ein SSH Key vom Typ ed25519 erstellen und mittels user_input die Passphrase festlegen.

Die Benutzerstellung habe ich so gelöst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sudo_user=''
user_password=''

echo "Gib einen Benutzernamen ein: "
read sudo_user

echo "Gib ein Passwort ein: "
read user_password

useradd -m ${sudo_user} -p ${user_password} &> /dev/null

usermod -aG sudo ${sudo_user}

Da gibt es aber sicherlich einen besseren weg? Und wenn ja, wieso?

Bezüglich der Erstellung eines SSH Keys mit Passphrase durch user input steh ich grad noch aufm Schlauch. Ich schau mir grad die man page zu ssh-keygen an - bin mir allerdings nicht sicher, ob man -N benötigt für die Passphrase und wie man den "Standard" Pfad aktzeptiert.

Vielleicht könnt ihr mir da etwas unter die Arme greifen ☺

Frankenstein

(Themenstarter)
Avatar von Frankenstein

Anmeldungsdatum:
1. Juni 2020

Beiträge: 47

Das wäre jetzt meine aktuelle Lösung

User

1
2
3
4
5
sudo_user=`${read -p "Bitte gib einen SSH Benutzernamen an: "}`
user_password=`${read -p "Bitte gib ein Passwort an: "}`

useradd -m ${sudo_user} -p ${user_password} &> /dev/null
usermod -aG sudo ${sudo_user} $> /dev/null

SSH Key

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
key_passphrase=`$(read -p "Bitte gib eine Passphrase für deinen SSH Private Key ein: ")`
ssh_key=`ssh-keygen -t ed25519 -N ${key_passphrase} -f /root/.ssh/id_ed25519.pub`

mkdir -p /etc/skel/.ssh
mkdir -p /home/${sudo_user}/.ssh

cp /root/.ssh/id_ed25519.pub /etc/skel/.ssh/authorized_keys
cp /root/.ssh/id_ed25519.pub /root/.ssh/authorized_keys
cp /root/.ssh/id_ed25519.pub /home/${sudo_user}/.ssh/authorized_keys

chown -R root:root /etc/skel
chown -R ${sudo_user}:${sudo_user} /home/${sudo_user}

chmod 700 /etc/skel/.ssh
chmod 600 /etc/skel/.ssh/authorized_keys

chmod 700 /home/${sudo_user}/.ssh
chmod 600 /home/${sudo_user}/.ssh/authorized_keys

(Das loggen nach /dev/null sind für mich nur Stellen wo ich später noch den Output weiterverarbeiten will.)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Frankenstein schrieb:

Das wäre jetzt meine aktuelle Lösung

User

1
2
3
4
5
sudo_user=`${read -p "Bitte gib einen SSH Benutzernamen an: "}`
user_password=`${read -p "Bitte gib ein Passwort an: "}`

useradd -m ${sudo_user} -p ${user_password} &> /dev/null
usermod -aG sudo ${sudo_user} $> /dev/null

Ausprobiert hast Du das aber nicht, oder?

Die Syntax ${x} benutzt man, wenn man eine Variable x, die aber kein Leerzeichen enthalten darf, keine Anführungsstriche und auch keinen Doppelpunkt, zu dereferenzieren. Insbesondere wenn man unmittelbar etwas ankleben möchte, wie bei echo ${USER}chen . So ähnlich sieht aus was sich command substitution nennt.

1
sudo_user=`$(read -p "Bitte gib einen SSH Benutzernamen an: ")`

Allerdings hast Du mit den Backticks schon eine Command-Substitution, die aber inferior ist, da sie veraltet, nicht portabel und je nach Font auch schlecht zu lesen ist. Weg damit!

1
sudo_user=$(read -p "Bitte gib einen SSH Benutzernamen an: ")

Jetzt liefert dummerweise read aber keinen Output, daher wird sudo_user immer leer sein. Das muss Dich aber nicht bekümmern - im ersten Entwurf hattest Du es ja richtig:

1
read -p "Bitte gib einen SSH Benutzernamen an: " sudo_user 

Vorab leere Variablen zu definieren war aber überflüssig und sinnlos.

Analog für's user_password.

Auch scheint es nicht sinnvoll die Fehlermeldungen nach /dev/null umzulenken, denn es können ja Fehler auftreten, und dann wüsste man gerne Bescheid - etwa unzulässige Zeichen im Usernamen. Per se scheint es eine gute Idee, den Usernamen auf zulässige Zeichen zu testen, und sonst frühzeitig mit einer hilfreichen Nachricht abzubrechen. Evtl. auch auf die Länge des Usernamens und darauf, ob dieser bereits belegt ist.

Usermod und -add benötigen Sudorechte, da sollte ein sudo davor. Die ersten zwei Kommandos (plus vorgeschlagene Fehlerbehandlung) benötigen dagegen keine, daher ist es nicht verkehrt, diese erst im Skript zu holen.

SSH Key

1
2
key_passphrase=`$(read -p "Bitte gib eine Passphrase für deinen SSH Private Key ein: ")`
ssh_key=`ssh-keygen -t ed25519 -N ${key_passphrase} -f /root/.ssh/id_ed25519.pub`

Siehe oben.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4450

Wohnort: Göttingen

Und bei dem read des Passworts sollte man -s verwenden, damit dieses nicht auf dem Bildschirm ausgegeben wird.

Frankenstein

(Themenstarter)
Avatar von Frankenstein

Anmeldungsdatum:
1. Juni 2020

Beiträge: 47

Ich muss das Passwort ja crypted übergeben an useradd. Ich würde dazu mkpasswd nutzen.

Gibt es eine Möglichkeit der stdin Prompt von mkpasswd das Passwort aus dem read zu übergeben?

Also das ich mkpasswd das Passwort direkt mitgebe, welches gecrypted werden soll ohne das nach einem Input gefragt wird?

//Edit

1
mkpasswd --method=SHA-512 --stdin $user_password

//Edit#2

Das wäre jetzt meine vollständige Lösung:

1
2
3
4
5
6
7
read -p "Bitte gib einen SSH Benutzernamen an: " sudo_user
read -p -s "Bitte gib ein Passwort an: " user_password

crypted_password=$(mkpasswd --method=SHA-512 --stdin $user_password)

useradd -m $sudo_user -p $crypted_password &> /dev/null
usermod -aG sudo $sudo_user $> /dev/null

(ungetestet, müsste aber funktionieren - Passwortüberprüfung auf Konformität baue ich dann noch ein.)

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7782

Die Variablen gehören in "" sonst gibts Ärger mit Leerzeichen im Passwort udgl.

Das -G sudo kannst du schon beim useradd mit anführen. Da brauchst du das usermod nicht.

Ansonsten musst du prüfen, ob das useradd überhaupt geklappt hat, bevor du das usermod ausführst.

Und dann kannst du statt das Passwort selbst zu basteln, auch einfach passwd name ausführen (nur wenn useradd geklappt hat - sonst setzt du das Passwort auch für root neu mit dem Skript).

Ditto mit ssh-keygen. Das sollte dann schon direkt laufen unter dem Benutzer und nicht irgendwie nachgestellt werden.

Da kriegst du doch fast alles gemacht und musst das nicht selber durchwursteln.

Frankenstein

(Themenstarter)
Avatar von Frankenstein

Anmeldungsdatum:
1. Juni 2020

Beiträge: 47

Die Variablen gehören in "" sonst gibts Ärger mit Leerzeichen im Passwort udgl.

Also so? 😬

1
2
read -p "Bitte gib einen SSH Benutzernamen an: " "sudo_user"
read -s -p "Bitte gib ein Passwort an: " "user_password"

Wenn ich folgendes ausführe:

1
useradd -m -p -G $crypted_password sudo $sudo_user

Wird die Hilfe ausgegeben. Wo ist mein Fehler?

//Edit

Fehler gefunden, du meintest die Variablen innerhalb der useradd Befehls müssen in Anführungszeichen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Die Variablen gehören in "" sonst gibts Ärger mit Leerzeichen im Passwort udgl.

Nun ja - der Benutzername darf eh nur aus Kleinbuchstaben (engl.), Ziffern und [.-_] bestehen.

Das kann und sollte man vorab prüfen:

1
if [[ "$un" =~ ^[a-z0-9._-]+$ ]] ; then echo fein; else echo faul; fi; 

ebenso wie die Länge (${#un})

Antworten |