Piszę bash
skrypt i muszę zapytać użytkownika o hasło i przekazać je openssl
. Chociaż openssl
mogę odczytać samo hasło, potrzebuję dwóch uruchomień programu i nie chcę pytać użytkownika dwukrotnie. Oto skrypt:
cp file{,.old}
read -sp 'Enter password. ' PASS; echo
export PASS
# decode | edit | encode
openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \
sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file
unset PASS
Nie jest to bezpieczne, ponieważ hasło jest łatwo dostępne, patrząc w wierszu poleceń; na przykład ktoś może to przeczytać ps
.
openssl
może odczytać hasło ze zmiennej środowiskowej, więc mogę wymienić -k "$PASS"
z -pass env:PASS
, ale wciąż nie jest bezpieczne; zmienne środowiskowe dowolnego procesu można odczytać dowolnie (ponownie, ps
można to zrobić).
Jak mogę bezpiecznie przekazać hasło do obu openssl
instancji?
bash
command-line
password
openssl
Chris Down
źródło
źródło
ps
odczytuje środowisko procesu/proc/<pid>/environ
, ale ten plik ma0600
uprawnienia, więc tylko root i użytkownik uruchamiający proces są w stanie odczytać środowisko procesu. Powiedziałbym, że to całkiem bezpieczne.Odpowiedzi:
Przekaż hasło do oddzielnego deskryptora pliku od danych wejściowych (dwa razy, raz dla szyfrowania i raz dla odszyfrowania). Nie eksportuj
PASS
do środowiska.Jeśli twój system nie ma
/dev/fd
, możesz użyć-pass
argumentu ,openssl
aby odczytać hasło z otwartego deskryptora pliku.źródło
bash
wersji zenv:PASS
jest bezpieczny.printf '%s\n' "$PASS"
nie jest bezpieczne. Ktoś możeps
na przykład odczytać wiersz poleceń .env:PASS
nie jest bezpieczne, ponieważ hasło pojawi się w środowiskuopenssl
procesu (nie pojawi się w środowiskubash
procesu, ale to nie wystarczy). Korzystanieprintf
jest bezpieczne, ponieważ jest wbudowane w bash.echo $PASS | openssl ...
. Nie pojawiłby się na liście ps. Jedynym miejscem, które można uzyskać, jest pamięć procesu bash. Myślę ?echo
byłby bezpieczny z tego samego powoduprintf
jest bezpieczny (iprintf
nie byłby bezpieczny w powłoce, w której nie jest wbudowany). Powodem, dla którego używam,printf
a nie nie,echo
jest to, żeecho
może to powodować odwrotne ukośniki odwrotne (w zależności od opcji bash).Za pomocą Bash można to zrobić bez użycia
printf '%s\n' "$PASS"
, łącząc tak zwany tutaj ciąg znaków z deskryptorami plików za pomocą wbudowanegoexec
polecenia Bash .Aby uzyskać więcej informacji, zobacz: Zabezpieczenie hasła skryptu powłoki parametrami wiersza polecenia .
źródło
Przepraszam, moja poprzednia odpowiedź pochodziła od openssl man, a nie od openssl enc docs.
To rozwiązanie nie jest potokiem, ale wierzę, że to rozwiązanie zapobiega widoczności hasła dla ps.
Korzystając z dokumentu tutaj, openssl widzi tylko tekst hasła.
Tak długo, jak masz pewność, że plik pośredni zostanie wyeliminowany, nie pozostanie żaden ślad. Może ktoś może pomóc to zrobić w potoku i wyeliminować plik pośredni?
źródło
enc
polecenie nie ma-kn
przełącznika, przynajmniej w obecnych wersjach, ale-pass
), ale nie bardzo pouczające. (Głos nie jest mój.)