Załóżmy, że użyłem sha1pass
do wygenerowania skrótu poufnego hasła w wierszu polecenia. Mogę użyć sha1pass mysecret
do wygenerowania skrótu, mysecret
ale ma to wadę, która mysecret
jest teraz w historii bash. Czy istnieje sposób, aby osiągnąć cel końcowy tego polecenia, unikając ujawniania mysecret
zwykłego tekstu, być może za pomocą passwd
zachęty w stylu?
Interesuje mnie również uogólniony sposób, aby to zrobić w celu przekazywania wrażliwych danych do dowolnego polecenia. Metoda zmieni się, gdy wrażliwe dane zostaną przekazane jako argument (np. sha1pass
In) lub STDIN do jakiegoś polecenia.
Czy istnieje sposób na osiągnięcie tego?
Edycja : To pytanie przyciągnęło wiele uwagi, a poniżej podano kilka dobrych odpowiedzi. Podsumowanie to:
- Zgodnie z odpowiedzią @ Kusalananda idealnie byłoby, gdyby nigdy nie trzeba było podawać narzędzia ani hasła lub hasła jako argumentu wiersza poleceń. Jest to podatne na kilka sposobów opisanych przez niego, i należy użyć lepiej zaprojektowanego narzędzia, które jest w stanie pobierać tajne dane wejściowe na STDIN
- Odpowiedź @ vfbsilva opisuje, jak zapobiegać przechowywaniu rzeczy w historii bash
- Odpowiedź Jonathana opisuje doskonale dobrą metodę osiągnięcia tego celu, o ile program może pobierać swoje tajne dane na STDIN. Jako taki postanowiłem zaakceptować tę odpowiedź.
sha1pass
w moim OP był tylko przykładem, ale dyskusja wykazała, że istnieją lepsze narzędzia, które pobierają dane na STDIN. - jak zauważa @R .. w swojej odpowiedzi , użycie interpretacji poleceń dla zmiennej nie jest bezpieczne.
Podsumowując, zaakceptowałem odpowiedź @ Jonathana, ponieważ jest to najlepsze rozwiązanie, biorąc pod uwagę, że masz dobrze zaprojektowany i dobrze działający program do pracy. Chociaż przekazanie hasła lub hasła jako argumentu wiersza polecenia jest zasadniczo niebezpieczne, inne odpowiedzi zapewniają sposoby złagodzenia prostych problemów związanych z bezpieczeństwem.
sha1pass mysecret
jest uruchomiony, a tym samym wiedzieć, comysecret
jest. (Działa to tylko przez kilka sekund, gdy program jest uruchomiony, oczywiście ...)Odpowiedzi:
Jeśli używasz powłoki
zsh
lubbash
, użyj opcji -sread
wbudowanej powłoki, aby odczytać wiersz z urządzenia końcowego bez jego echa.Następnie możesz użyć fantazyjnego przekierowania, aby użyć zmiennej jako stdin.
Jeśli ktokolwiek
ps
ucieknie, zobaczy tylko „sha1pass”.Zakłada się, że
sha1pass
czyta hasło ze standardowego wejścia (w jednym wierszu, ignorując ogranicznik wiersza), gdy nie podano żadnego argumentu.źródło
sha1pass
nie używa on standardowego strumienia wejściowego.sha1pass
był tylko przykładem w mojej OP i zdecydowanie nie był najlepszym wyborem do tego.ps
, ale może być zapisany w pliku tymczasowym - jeśli ktoś chce tego uniknąć,sshpass < <(printf '%s\n' "$VARIABLE")
może być wzięty pod uwagę (ponieważprintf
jest wbudowany, a nie polecenie zewnętrzne, nie jest przekazywaneexecv
i dostępne za pośrednictwemps
).Najlepiej, aby nigdy nie wpisywać hasła jawnego tekstu w wierszu polecenia jako argumentu polecenia. W ten sposób hasło staje się argumentem polecenia, a argumenty wiersza poleceń mogą być widoczne w tabeli procesów za pomocą prostych narzędzi, takich jak
ps
dzienniki kontroli lub zalogowane do nich.To powiedziawszy, z pewnością istnieją sposoby na ukrycie faktycznego hasła w historii poleceń powłoki.
Następnie wpisz hasło i naciśnij Enter.
head
Komenda używana tutaj przyjąć dokładnie jeden wiersz danych wejściowych i ostatni przełamane, że typ nie będzie część danych, które są przekazywane dosha1pass
.Aby zapobiec powtórzeniu się znaków:
Te
stty -echo
zakręty dowodzenia off echo wpisywanych znaków z na terminalu. Echo jest następnie przywracane za pomocąstty echo
.Aby przekazać standardowe wejście, to ostatnie polecenie może zostać zmienione (zrobiłbyś to, gdyby
sha1pass
zaakceptowano dane na standardowym wejściu, ale wygląda na to, że to konkretne narzędzie ignoruje standardowe wejście):Jeśli potrzebujesz wprowadzania wielowierszowego (powyższe założenie, że należy przekazać jedną linię, bez znaku nowej linii na końcu), zastąp całą
head
komendęcat
i zakończ wprowadzanie (zakładającsomecommand
, że odczytuje do końca pliku) Ctrl+D( śledzenie, Returnjeśli chcesz wstawić znak nowego wiersza, lub dwa razy, jeśli nie).Działa to niezależnie od używanej powłoki (pod warunkiem, że była to powłoka Bourne'a lub rc).
Niektóre powłoki mogą powodować, że nie zapisują wpisanych poleceń w swoich plikach historii, jeśli polecenie jest poprzedzone spacją. Zazwyczaj wiąże się to z koniecznością ustawienia
HISTCONTROL
wartościignorespace
. To jest obsługiwane przez co najmniejbash
iksh
na OpenBSD, ale nie przez npksh93
lubdash
.zsh
użytkownicy mogą użyćhistignorespace
opcji lub ichHISTORY_IGNORE
zmiennej do zdefiniowania wzorca do zignorowania.W powłokach obsługujących czytanie
read
bez echa znaków na terminalu można również użyćale to oczywiście ma ten sam problem z potencjalnym ujawnieniem hasła w tabeli procesów.
Jeśli narzędzie odczytuje ze standardowego wejścia, a powłoka obsługuje „ciągi znaków”, powyższe można zmienić na
Podsumowanie komentarzy poniżej:
Wykonanie polecenia z hasłem podanym w wierszu polecenia, co robi wszystkie powyższe polecenia, z wyjątkiem tego, które przekazuje dane do polecenia, potencjalnie sprawi, że hasło będzie widoczne dla każdego, kto działa
ps
w tym samym czasie. Żadne z powyższych poleceń nie zapisze jednak wpisanego hasła w pliku historii powłoki, jeśli zostanie wykonane z interaktywnej powłoki.Dobrze zachowujące się programy, które czytają hasła w postaci czystego tekstu, robią to, czytając ze swojego standardowego wejścia, z pliku lub bezpośrednio z terminala.
sha1pass
wymaga hasła w wierszu polecenia, wpisanego bezpośrednio lub przy użyciu zastępowania polecenia.Jeśli to możliwe, użyj innego narzędzia.
źródło
$(...)
będzie częścią wiersza polecenia i będzie widoczny wps
danych wyjściowych, z wyjątkiem systemu z hartowaniem / proc.sha1pass
uruchamianie bez hasła w wierszu poleceń wydaje się dawać wynik bez czytania niczego ... OP musi więc wybrać inne narzędzie.Jeśli tak ustawisz
HISTCONTROL
:i uruchom polecenie spacją:
nie będzie przechowywany w historii.
źródło
Przekaż wrażliwe dane za pomocą potoku lub tutaj:
lub:
Sekrety są dobrze w (nieeksportowanych) zmiennych powłoki, ale nigdy nie można używać tych zmiennych w wierszach poleceń, tylko w dokumentach tutaj i wewnętrznych elementach powłoki.
Jak zauważył Kusalananda w komentarzu, jeśli wpisujesz polecenia w interaktywnej powłoce, linie, które wprowadzasz dla dokumentu tutaj, zostaną zapisane w historii powłoki, więc wpisanie hasła nie jest bezpieczne, ale nadal powinno być bezpieczne w użyciu zmienne powłoki zawierające sekrety; historia będzie zawierać tekst,
$secret
a nie wszystko, co zostało$secret
rozszerzone.Korzystanie z rozszerzeń poleceń nie jest bezpieczne :
ponieważ dane wyjściowe zostaną dołączone do wiersza poleceń i będą widoczne w
ps
danych wyjściowych (lub ręcznie czytane z / proc), z wyjątkiem systemów z hartowanym / proc.Przypisanie do zmiennej jest również w porządku:
źródło
command_with_secret_output
które pozwala mi wpisać tajne wyjście. Czy istnieje takie polecenie, które można tutaj zastąpić?bash
sesji interaktywnej spowoduje zapisanie dokumentu w pliku historii.read
, npread -r secret
. Więc twój sekret jest w środku$secret
. Możesz uruchomić stty przed / po nim, aby ukryć wejście, jeśli chcesz.sha1pass
wydaje się zasadniczo uszkodzony / nieużywalny / niebezpieczny, ponieważ nie może odczytać hasła ze standardowego pliku lub pliku. Myślę, że do rozwiązania problemu potrzebna jest inna użyteczność.read -rs
wykona zadanie (jeśli uwzględnisz-r
możliwość posiadania haseł z odwrotnymi ukośnikami), ale wrócisz do potencjalnego pokazania hasła na liście procesów (i w zależności od tego, czy rozliczanie procesów jest włączone i jak to skonfigurowano , także w dziennikach rozliczania procesu).Po prostu wpisz wartość do pliku i przekaż plik:
Nie jestem pewien, jak to
sha1pass
działa, jeśli można pobrać plik jako dane wejściowe, możesz użyćsha1pass < mysecret
. Jeśli nie, używaniecat
może być problemem, ponieważ zawiera ostatnią nową linię. W takim przypadku użyj (jeślihead
obsługuje-c
):źródło
cat | sha1pass
?cat mysecret | sha1pass
isha1pass < mysecret
zachowują się tak samo w odniesieniu do końcowych nowych linii.cat
nie dodaje nowych linii. W każdym razie, jeślisha1pass
obsługuje przekazywanie hasła za pomocą standardowego wejścia, oczekiwałbym, że zignoruje ono samą ostatnią linię. Pliki z liniami, które nie są zakończone znakami nowej linii, są jednak w Uniksie nienaturalne, więc byłoby dziwnie oczekiwać, że plik, który nie jest zakończony znakiem nowego wiersza.cat | sha1pass
wydaje się działać,sha1pass
zanim daje mi szansę na wprowadzenie jakichkolwiek danych wejściowych. ii) Nie, oczywiście,cat mysecret
że nie dodaje nowej linii, nigdy nie powiedziałemcat
, że ją dodaje, tylko że zawiera .< mysecret
że go usuwa. :)head -c-1
. Chyba właśnie się pomyliłem, dlaczego używam,cat mysecret | sha1pass
a potem proponujęsha1pass < mysecret
. Myślę, że martwi Cię to, że sha1pass może narzekać na zwykłe pliki dla standardowego wejścia; Nie jestem pewien dlaczego.sha1pass
i nie mogłem znaleźć instrukcji ani-h
żadnej innej formy dokumentacji w ciągu kilku minut, które spędziłem na wyszukiwaniu, więc nie mogłem dowiedzieć się, czy działasha1pass foo
traktowanyfoo
jak ciąg wejściowy czy plik wejściowy . Dlatego dałem opcje radzenia sobie z każdą możliwością.Jeśli to, co zrobił terdon, jest możliwe, to jest to najlepsze rozwiązanie, przechodząc przez standardowe dane wejściowe. Pozostał tylko problem, że zapisał hasło na dysk. Zamiast tego możemy to zrobić:
Jak powiedział Kusalananda,
stty -echo
zapewnia , że to, co piszesz, nie będzie widoczne, dopóki niestty echo
powtórzysz.head -1
otrzyma jeden wiersz ze standardowego wejścia i przekaże go dosha1pass
.źródło
użyłbym
cat
będzie czytać ze standardowego doEOF
, co może być spowodowane naciśnięciem Ctrl + D. Następnie wynik zostanie przekazany jako argument dosha1pass
źródło