Leubi
Anmeldungsdatum: 23. April 2017
Beiträge: Zähle...
|
Grüße, Ich habe mir ein Script geschrieben das man nur mit einem Passwort starten kann. 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #!/bin/bash
#ScriptName
ScriptN="test"
PWD=`head -n1 TEST.PWD | tail -n 1`
echo ""
read -p " Für Script start bitte Passwort eingeben : " A
if [ "$A" == "$(basename $0)" ];then
exit
fi
if [ "$A" == "$PWD" ];then
echo ""
echo " ...starte das Script *$ScriptN*"
echo ""
fi
|
Soweit geht es auch. Das Passwort steht leider in der TEST.PWD in Klartext, wie müßte ich das Script ändern damit es z.B. in MD5 drinnen steht? Bei der Passworteingabe sieht man leider das Passwort in Klartext, kann man das Script so ändern das man da nur ******* sieht? Bei einer falschen eingabe wird das Scrip einfach beendet könnte mann da noch eine Info hinzugeben z.B. "Passwort leider falsch" diese Info sollte wenn möglich auch nur beim betätigen der Entetertase kommen. Schon mal meinen Dank für eure Hilfe. Lg Leubi
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
Hallo, du unterliegst da einem fundamentalem Missverständnis. Wenn du ein Skript mit Passwort starten willst, dann muss das Skript eben im Klartext vorliegen. Punkt. Natürlich kannst du es bei jedem Aufruf hashen (wobei md5 die falsche Wahl wäre), aber um etwas zu hashen, muss es wiederum im Klartext vorliegen. Bitte schildere mal deinen konkreten Anwendungsfall. Was ist das für ein Skript, was soll es tun? Davon abhängig können wir bessere Möglichkeiten empfehlen. edit: Steht das Passwort nun in einer Datei? Daraus würde ich schließen, dass du das Passwort automatisiert übergeben willst. Oder willst du es interaktiv übergeben? Bitte erkläre wirklich mal, was du vorhast mit dem Skript.
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin, das Passwort würde in der Passwortdatei ja schon z.B. in MD5 Hash vorliegen. Das Script selber soll nur verhindern das meine Kinder nicht einfach den Spieleserver starten können, also nix sicherheits relewantes, sondern nur eine kleine Sicherheit.
Wenn Sie den Spieleserver starten möchten müssen sie eben fragen dann gebe ich das Passwort ein und er startet. Dass das Passwort nicht mehr angezeigt wird habe ich jetzt mit stty -echo gelöst, jetzt sieh man garnix bei der eingabe. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
#ScriptName
ScriptN="test"
PWD=`head -n1 /TEST.PWD | tail -n 1`
echo ""
stty -echo
echo " Für Script start bitte Passwort eingeben : "
read -p "" A
if [ "$A" == "$(basename $0)" ];then
exit
fi
if [ "$A" == "$PWD" ];then
echo ""
echo " ...starte das Script *$ScriptN*"
echo ""
fi
|
Daher ist es auch ausreichend wenn es nur ein MD5 Hash ist. Bei dem start von dem Script werde ich nach dem Passwort gefragt, dieses Passwort liegt schon in der Passwortdatei vor und wird praktisch mit der eingabe überprüft. Bearbeitet von rklm: Syntax
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4694
Wohnort: Berlin
|
@Leubi: $PWD ist eine Shell-Variable die bereits eine Bedeutung hat. Die sollte man nicht überschreiben. Die Namen sind auch nicht besonders gut gewählt, selbst wenn man mal von der Kollision absieht. Soll der Kommentar #ScriptName dem Leser mitteilen, dass $SriptN für ScriptName steht? Dann nenn doch die Variable einfach $ScriptName , dann braucht man den Kommentar nicht. Genauso bei $PWD — das hiesse besser $password . Und bei $A kann der Leser dann ja richtig anfangen zu raten wofür das steht. Immer daran denken das der ”fremde” Leser auch Du selbst bist — wenn Du in den Quelltext in einem Jahr wieder rein schaust und nicht mehr frisch im Gedächtnis hast was Du geschrieben hast. Zur besseren Lesbarkeit trägt auch eine sinnvolle Einrückung bei, welche die Programmstruktur verdeutlicht. Kannst Du mal erklären was der Sinn dieser head und tail -Kombination sein soll? Wo kommt $A her? Und warum wird $REPLY nicht verwendet?
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin,
so Script geändert. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #!/bin/bash
#ScriptName
ScriptName="test"
Passwortdatei=`head -n1 /TEST.PWD | tail -n 1`
echo ""
stty -echo
echo " Zum starten von dem Script *$ScriptName* bitte Passwort eingeben."
read -p " Passwort: " password
echo ""
if [ "$password" == "$(basename $0)" ];then
exit
fi
if [ "$password" == "$Passwortdatei" ];then
echo ""
echo " ...starte das Script *$ScriptName*"
echo ""
fi
|
War das nicht so das head die angegebene Datei auslist? in meinem Fall die erste zeile, und bei tail war das doch so das daß ausgelesende übergen wir. So verwende ich das schon ewig in anderen Scripte und bis jetzt hatte ich damit auch keine Probleme.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13215
|
Leubi schrieb:
so Script geändert.
Und immer noch keine Einrückung und Leerzeilen, die der Strukturierung helfen... Bedenke, dass die Maschine beliebige syntaktisch korrekte Programme ausführen kann, aber ein menschlicher Leser sich unterschiedlich schwer tut mit dem Verständnis.
War das nicht so das head die angegebene Datei auslist? in meinem Fall die erste zeile, und bei tail war das doch so das daß ausgelesende übergen wir. So verwende ich das schon ewig in anderen Scripte und bis jetzt hatte ich damit auch keine Probleme.
Ja, aber es ist total witzlos, denn der tail extrahiert die letzte Zeile einer sowieso einzeiligen Eingabe. Wie andere bereits angemerkt haben: der ganze Ansatz ist fragwürdig. Wenn Du ein Skript hast, das eine Passwortabfrage enthält, dann ist es ein leichtes, dieses Skript zu kopieren, die Passwortabfrage zu entfernen und es dann auszuführen. In Deinem Fall ist es sogar noch einfacher, denn Du hast zwei Skripte: Du musst einfach nur das Skript in $ScriptName ausführen und musst nicht mal kopieren und editieren.
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
Jetzt habe ich endlich verstanden, was du willst! Du willst das Passwort nicht aus der Datei auslesen und dann verwenden (auch das tun Leute häufig), sondern du willst es mit einem hinterlegten Passwort vergleichen! So nett solche Fingerübungen sind: Erstelle eine neue Gruppe "gameserver", übereigne das Skript dieser Gruppe und verteile/entziehe das Execute-Bit nach Belieben. Du müsstest ja auch in deinem Beispiel das Passwort jedes Mal ändern, wenn du wieder willst, dass deine Kinder den Server nicht starten können.
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7790
|
Die Ausgabe kannst du mit read -s unterdrücken. $ read -s -p 'Passwort: ' password
Passwort: [keksgesicht] # wird nicht ausgegeben
$ echo $password
keksgesicht Hashen kannst du es dann beliebig. Beispiel: $ (printf "%s" keksgesicht ; head -c 512M /dev/zero) | sha1sum > password.sha1sum
$ cat password.sha1sum
51139d0fd97ed138fdc864fbcd23ec0fe5826400 - Hash prüfen: $ (printf "%s" "$password" ; head -c 512M /dev/zero) | sha1sum -c password.sha1sum
# wenn $password = keksgesicht war
-: OK
# wenn $password = husteguzel anderes war
-: FAILED
sha1sum: WARNING: 1 computed checksum did NOT match Das head -c 512M /dev/zero kann man weglassen, es dient dazu, den Hash langsamer zu machen. Das ist dann so ähnlich wie bei LUKS, eben mehr Rechenaufwand als Brute-Force-Schutz. Was ggü. LUKS fehlt ist das zufällige Salz. Kann man natürlich auch noch machen, wird aber hier wohl wirklich keine Rolle spielen. 😉
Das Hauptproblem an der Idee ist eigentlich was anderes, nämlich: Was hindert irgendwen daran, das Script zu kopieren und dann einfach ohne Passwortabfrage auszuführen. Das macht also nur in Verbindung mit einem anderen Schutzmechanismus Sinn, der dafür sorgt daß das Script nicht verändert und nicht anders ausgeführt werden kann, z.B. SSH-Key mit erzwungenem Befehl - und ein Script das so gestaltet ist, daß es keine Shell droppen kann. Andererseits wärs in dem Fall auch egal, daß das Passwort im Klartext steht, denn lesen könnte das ja denn auch niemand.
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin, rklm schrieb: Leubi schrieb:
so Script geändert.
Und immer noch keine Einrückung und Leerzeilen, die der Strukturierung helfen... Bedenke, dass die Maschine beliebige syntaktisch korrekte Programme ausführen kann, aber ein menschlicher Leser sich unterschiedlich schwer tut mit dem Verständnis.
War das nicht so das head die angegebene Datei auslist? in meinem Fall die erste zeile, und bei tail war das doch so das daß ausgelesende übergen wir. So verwende ich das schon ewig in anderen Scripte und bis jetzt hatte ich damit auch keine Probleme.
Ja, aber es ist total witzlos, denn der tail extrahiert die letzte Zeile einer sowieso einzeiligen Eingabe. Wie andere bereits angemerkt haben: der ganze Ansatz ist fragwürdig. Wenn Du ein Skript hast, das eine Passwortabfrage enthält, dann ist es ein leichtes, dieses Skript zu kopieren, die Passwortabfrage zu entfernen und es dann auszuführen. In Deinem Fall ist es sogar noch einfacher, denn Du hast zwei Skripte: Du musst einfach nur das Skript in $ScriptName ausführen und musst nicht mal kopieren und editieren.
wenn ich das Script wenn es fertig ist durch einen Kompiler jage dann ist es einiger maßen sicher. https://www.camma.ch/2009/09/12/bash-scripte-kompilieren/ unbuntuS12 schrieb: Jetzt habe ich endlich verstanden, was du willst! Du willst das Passwort nicht aus der Datei auslesen und dann verwenden (auch das tun Leute häufig), sondern du willst es mit einem hinterlegten Passwort vergleichen!
Sorry, das ich das nicht gleich so geschildert hatte.
So nett solche Fingerübungen sind: Erstelle eine neue Gruppe "gameserver", übereigne das Skript dieser Gruppe und verteile/entziehe das Execute-Bit nach Belieben.
Das könnte ich machen. Aber jetzt geht es mir einfach nur darum ob man es machen kann so wie ich mir das vorgestellt habe. Und wenn ja wie?
Du müsstest ja auch in deinem Beispiel das Passwort jedes Mal ändern, wenn du wieder willst, dass deine Kinder den Server nicht starten können.
Da das Passwort bei der Eingabe nicht mehr angezeig wird, brauch ich es ja nicht so offt ändern, da ich es ja nur eingebe.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4694
Wohnort: Berlin
|
@Leubi: stty -echo sollte man nach der Eingabe auch wieder rückgängig machen, sonst flucht der Benutzer. ☺ Besser wäre es die -s -Option von read dafür zu verwenden. Wenn der Backslash im Passwort vorkommt, hast Du ohne die -r -Option von read ein Problem. „Whitespace“-Zeichen können auch problematisch sein, denn read betreibt „word splitting“ und entfernt „whitespace“-Zeichen am Anfang und am Ende der Eingabe. Es sei denn man setzt $IFS auf die leere Zeichenkette. Bei dem basename -Aufruf ist es sicherer das Argument in doppelte Anführungszeichen einzufassen, sonst gibt es Probleme wenn das Skript in einem Pfad liegt der beispielsweise Leerzeichen enthält oder selbst Leerzeichen im Dateinamen hat. Man könnte das statt mit if mit && etwas kürzer formulieren. Ungetestet:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
readonly script_name=test
readonly password_file=/TEST.PWD
echo
echo 'Für Scriptstart bitte Passwort eingeben: '
IFS='' read -r -s answer
[ "$answer" = "$(basename "$0")" ] && exit
if [ "$(head -n1 "$password_file")" = "$(echo "$answer" | md5sum)" ]; then
echo
echo " ...starte das Script *$script_name*"
echo
fi
|
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7790
|
Leubi schrieb: wenn ich das Script wenn es fertig ist durch einen Kompiler jage dann ist es einiger maßen sicher. https://www.camma.ch/2009/09/12/bash-scripte-kompilieren/
Eine Google Suche später und du hast das Originalscript wieder. ( z.B. https://stackoverflow.com/a/3408731/2876682 ) Gibts auch als fertiges Script (unshc)
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
frostschutz schrieb: Leubi schrieb: wenn ich das Script wenn es fertig ist durch einen Kompiler jage dann ist es einiger maßen sicher. https://www.camma.ch/2009/09/12/bash-scripte-kompilieren/
Eine Google Suche später und du hast das Originalscript wieder. ( z.B. https://stackoverflow.com/a/3408731/2876682 ) Gibts auch als fertiges Script (unshc)
😊 Meine Kinder sind 9 und 11, ich will ja nicht das Internet löschen 🤣 jetzt geht es mir einfach um die Machbarkeit...
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Marc_BlackJack_Rintsch schrieb:
Ungetestet:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
readonly script_name=test
readonly password_file=/TEST.PWD
echo
echo 'Für Scriptstart bitte Passwort eingeben: '
IFS='' read -r -s answer
[ "$answer" = "$(basename "$0")" ] && exit
if [ "$(head -n1 "$password_file")" = "$(echo "$answer" | md5sum)" ]; then
echo
echo " ...starte das Script *$script_name*"
echo
fi
|
Ich habe es getestet und es geht leider so nicht, wenn ich das Passwort eingebe wird das Script denoch beendet.
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7790
|
Nimm einfach den Exit-Code, ungefähr so: frage_passwort() {
read -s -p 'Passwort: ' password
}
pruefe_passwort() {
echo "$password" | md5sum -c password.md5sum &> /dev/null
}
while ! pruefe_passwort
do
frage_passwort
done Wie man die Hash Datei anlegt hab ich weiter oben geschrieben... dort mit sha1sum, hier wäre es echo "holla die waldfee" | md5sum > password.md5sum
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4694
Wohnort: Berlin
|
@Leubi: Was steht denn in /TEST.PWD? Da muss der Hash drinstehen, und nicht das Passwort selbst.
|