Saya sedang menulis bash
skrip, dan perlu meminta kata sandi pengguna dan meneruskannya kepada openssl
. Sementara openssl
dapat membaca kata sandi itu sendiri, saya perlu dua kali menjalankan program dan tidak ingin bertanya kepada pengguna dua kali. Ini skripnya:
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
Ini tidak aman karena kata sandi mudah tersedia dengan melihat baris perintah; seseorang dapat membacanya menggunakan ps
, misalnya.
openssl
dapat membaca kata sandi dari variabel lingkungan, jadi saya dapat menggantinya -k "$PASS"
dengan -pass env:PASS
, tetapi masih belum aman; variabel lingkungan dari setiap proses dapat dibaca secara bebas (sekali lagi, ps
dapat melakukannya).
Jadi, bagaimana saya bisa meneruskan kata sandi dengan aman ke dua openssl
contoh?
bash
command-line
password
openssl
Chris Down
sumber
sumber
ps
membaca lingkungan dari suatu proses/proc/<pid>/environ
, tetapi file ini memiliki0600
izin, jadi hanya root dan pengguna yang menjalankan proses dapat membaca lingkungan proses. Menurut saya itu cukup aman.Jawaban:
Pass password pada deskriptor file terpisah dari input (dua kali, sekali untuk enkripsi dan sekali untuk dekripsi). Jangan ekspor
PASS
ke lingkungan.Jika sistem Anda tidak memiliki
/dev/fd
, Anda dapat menggunakan-pass
argumen untuk memberitahuopenssl
untuk membaca kata sandi dari deskriptor file terbuka.sumber
bash
versi denganenv:PASS
aman juga.printf '%s\n' "$PASS"
tidak aman. Seseorang dapat membaca baris perintah denganps
misalnya.env:PASS
tidak aman karena kata sandi akan muncul di lingkunganopenssl
proses (tidak akan muncul di lingkunganbash
proses, tetapi itu tidak cukup). Penggunaannyaprintf
aman karena merupakan bash built-in.echo $PASS | openssl ...
. Itu tidak akan muncul dalam daftar ps. Satu-satunya tempat Anda bisa mendapatkan akan berada dalam memori proses bash. Kupikir ?echo
akan aman karena alasan yang samaprintf
aman (danprintf
tidak akan aman di shell di mana ia tidak dibangun). Alasan saya menggunakanprintf
dan tidakecho
adalah karenaecho
dapat memotong backslash (tergantung pada opsi bash).Menggunakan Bash dapat dilakukan tanpa menggunakan
printf '%s\n' "$PASS"
dengan menghubungkan string yang disebut di sini dengan deskriptor file menggunakan perintah Bash builtinexec
.Untuk informasi lebih lanjut, lihat: Keamanan kata sandi script shell parameter parameter baris perintah .
sumber
Maaf, jawaban saya sebelumnya adalah dari openssl man, bukan the openssl enc docs.
Solusi ini bukan saluran pipa, tapi saya percaya solusi ini mencegah kata sandi terlihat oleh ps.
Menggunakan dokumen di sini, hanya openssl yang melihat teks kata sandi.
Selama Anda yakin untuk menghilangkan file perantara, tidak ada jejak yang tersisa. Mungkin seseorang dapat membantu melakukan ini dalam saluran pipa dan menghilangkan file perantara?
sumber
enc
perintah tidak memiliki-kn
saklar, setidaknya pada versi saat ini, itu-pass
), tetapi tidak terlalu informatif. (Suara turunnya bukan milikku.)