Misalkan saya menggunakan sha1pass
untuk menghasilkan hash dari beberapa kata sandi sensitif pada baris perintah. Saya dapat menggunakan sha1pass mysecret
untuk menghasilkan hash mysecret
tetapi ini memiliki kelemahan yang mysecret
sekarang dalam sejarah bash. Apakah ada cara untuk mencapai tujuan akhir dari perintah ini sambil menghindari pengungkapan mysecret
dalam teks biasa, mungkin dengan menggunakan passwd
prompt-style?
Saya juga tertarik dengan cara umum untuk melakukan ini untuk meneruskan data sensitif ke perintah apa pun. Metode akan berubah ketika data sensitif dilewatkan sebagai argumen (seperti dalam sha1pass
) atau pada STDIN ke beberapa perintah.
Apakah ada cara untuk menyelesaikan ini?
Sunting : Pertanyaan ini menarik banyak perhatian dan ada beberapa jawaban bagus yang ditawarkan di bawah ini. Ringkasan adalah:
- Sesuai jawaban Kusalananda , idealnya seseorang tidak perlu memberikan kata sandi atau rahasia sebagai argumen baris perintah ke utilitas. Ini rentan dalam beberapa cara seperti yang dijelaskan olehnya, dan seseorang harus menggunakan utilitas yang dirancang lebih baik yang mampu mengambil input rahasia pada STDIN
- Jawaban @ vfbsilva menjelaskan cara mencegah hal-hal agar tidak disimpan dalam bash history
- @Jawab Jonathan menjelaskan metode yang sangat baik untuk mencapai ini selama program dapat mengambil data rahasianya pada STDIN. Karena itu, saya telah memutuskan untuk menerima jawaban ini.
sha1pass
di OP saya hanya sebuah contoh, tetapi diskusi telah menetapkan bahwa ada alat yang lebih baik yang mengambil data pada STDIN. - seperti @R .. mencatat dalam jawabannya , penggunaan ekspansi perintah pada variabel tidak aman.
Jadi, secara ringkas, saya telah menerima jawaban @ Jonathan karena ini adalah solusi terbaik mengingat Anda memiliki program yang dirancang dengan baik dan berperilaku baik. Meskipun melewatkan kata sandi atau rahasia sebagai argumen baris perintah pada dasarnya tidak aman, jawaban lain menyediakan cara untuk mengurangi masalah keamanan yang sederhana.
sha1pass mysecret
sedang berjalan, dan karenanya tahu apamysecret
itu. (Ini hanya bekerja selama beberapa detik saat program ini benar-benar berjalan, tentu saja ...)Jawaban:
Jika menggunakan shell
zsh
ataubash
, gunakan opsi -s keread
shell builtin untuk membaca garis dari perangkat terminal tanpa itu menggemakannya.Kemudian Anda dapat menggunakan beberapa pengalihan mewah untuk menggunakan variabel sebagai stdin.
Jika ada yang menjalankan
ps
, yang akan mereka lihat adalah "sha1pass".Itu mengasumsikan bahwa
sha1pass
membaca kata sandi dari stdin (pada satu baris, mengabaikan pembatas baris) ketika tidak diberi argumen.sumber
sha1pass
tidak menggunakan aliran input standar.sha1pass
hanyalah contoh di OP saya, dan jelas bukan pilihan terbaik untuk digunakan untuk ini.ps
, tetapi dapat ditulis ke file sementara - jika seseorang ingin menghindari itu, makasshpass < <(printf '%s\n' "$VARIABLE")
dapat dipertimbangkan (karenaprintf
merupakan bawaan, bukan perintah eksternal, itu tidak diteruskan keexecv
dan dapat diakses melaluips
).Idealnya, Anda tidak pernah mengetikkan kata sandi teks-jelas pada baris perintah sebagai argumen ke perintah. Melakukannya menjadikan kata sandi argumen untuk perintah, dan argumen baris perintah dapat dilihat dalam tabel proses dengan menggunakan alat sederhana seperti
ps
atau masuk ke beberapa log audit.Karena itu, pasti ada cara untuk menyembunyikan kata sandi yang sebenarnya dari sejarah perintah shell.
Kemudian ketikkan kata sandi dan tekan Enter. The
head
perintah yang digunakan di sini menerima tepat satu garis masukan dan baris baru terakhir yang Anda ketik tidak akan menjadi bagian dari data yang dilewatkan kesha1pass
.Untuk mencegah karakter bergema:
The
stty -echo
perintah bergantian off bergema dari karakter diketik di terminal. Gema kemudian dipulihkan denganstty echo
.Untuk meneruskan input standar, perintah terakhir itu dapat diubah (Anda akan melakukan ini jika
sha1pass
data yang diterima pada input standar, tetapi tampak seolah-olah utilitas khusus ini mengabaikan input standarnya):Jika Anda memerlukan input multi-baris (di atas mengasumsikan satu baris harus dilewati, tanpa karakter baris baru di akhir), lalu ganti seluruh
head
perintah dengancat
dan hentikan input (dengan asumsisomecommand
itu sendiri berbunyi hingga akhir file) dengan Ctrl+D( mengikuti Returnjika Anda ingin memasukkan karakter baris baru dalam input, atau dua kali jika tidak).Ini akan berfungsi terlepas dari shell apa yang Anda gunakan (asalkan itu shell Bourne-like atau rc-like).
Beberapa shell mungkin dibuat untuk tidak menyimpan perintah yang diketik dalam file histori mereka jika perintah tersebut didahului oleh spasi. Ini biasanya melibatkan harus mengatur
HISTCONTROL
ke nilaiignorespace
. Ini didukung oleh setidaknyabash
danksh
pada OpenBSD, tetapi tidak oleh egksh93
ataudash
.zsh
pengguna dapat menggunakanhistignorespace
opsi atauHISTORY_IGNORE
variabel mereka untuk menentukan pola untuk diabaikan.Dalam cangkang yang mendukung membaca dengan
read
tanpa menggema karakter ke terminal, Anda juga dapat menggunakantetapi ini jelas masih memiliki masalah yang sama dengan berpotensi mengungkapkan kata sandi dalam tabel proses.
Jika utilitas membaca dari input standar, dan jika shell mendukung "di sini-string", yang di atas dapat diubah menjadi
Ringkasan komentar di bawah ini:
Menjalankan perintah dengan kata sandi yang diberikan pada baris perintah, yang dilakukan oleh semua perintah di atas, kecuali yang mengirim data ke perintah, berpotensi akan membuat kata sandi terlihat oleh siapa saja yang menjalankan
ps
pada saat yang sama. Namun tidak satu pun dari perintah di atas yang akan menyimpan kata sandi yang diketikkan dalam file histori shell jika dijalankan dari shell interaktif.Program berperilaku baik yang membaca kata sandi teks jernih melakukannya dengan membaca dari input standar mereka, dari file, atau langsung dari terminal.
sha1pass
memang membutuhkan kata sandi pada baris perintah, baik diketik langsung atau menggunakan beberapa bentuk substitusi perintah.Jika memungkinkan, gunakan alat lain.
sumber
$(...)
akan menjadi bagian dari baris perintah dan terlihat dalamps
output kecuali pada sistem dengan hardened / proc.sha1pass
berjalan tanpa kata sandi pada baris perintah tampaknya menghasilkan output tanpa membaca apa pun ... Jadi OP perlu memilih alat yang berbeda.Jika Anda mengatur
HISTCONTROL
seperti itu:dan mulai perintah dengan spasi:
itu tidak akan disimpan dalam sejarah.
sumber
Lulus data sensitif melalui pipa atau di sini-dok:
atau:
Tidak masalah jika rahasia berada dalam variabel shell (tidak diekspor), tetapi Anda tidak akan pernah bisa menggunakan variabel itu di baris perintah, hanya di sini-dokumen dan internal shell.
Seperti dicatat oleh Kusalananda dalam komentar, jika Anda memasukkan perintah dalam shell interaktif, baris yang Anda masukkan untuk dokumen di sini akan disimpan dalam histori shell, jadi tidak aman untuk mengetikkan kata sandi di sana, tetapi harus tetap aman untuk menggunakan variabel shell yang berisi rahasia; sejarah akan berisi teks
$secret
daripada apa pun yang$secret
diperluas.Penggunaan ekspansi perintah tidak aman :
karena output akan dimasukkan pada baris perintah dan terlihat di
ps
output (atau secara manual membaca dari / proc) kecuali pada sistem dengan hardened / proc.Penugasan ke sebuah variabel juga oke:
sumber
command_with_secret_output
yang memungkinkan saya mengetik keluaran rahasia. Apakah ada perintah seperti itu yang bisa diganti di sini?bash
sesi interaktif akan menyimpan dokumen dalam file riwayat.read
, misread -r secret
. Lalu rahasiamu ada di$secret
. Anda dapat menjalankan stty sebelum / sesudahnya untuk menyembunyikan input jika Anda mau.sha1pass
tampaknya rusak / tidak dapat digunakan / tidak aman karena tidak dapat membaca kata sandi dari stdin atau file. Utilitas yang berbeda diperlukan untuk menyelesaikan masalah, saya pikir.read -rs
akan melakukan pekerjaan itu (jika Anda termasuk-r
untuk dapat memiliki kata sandi dengan garis miring terbalik di dalamnya), tetapi kemudian Anda kembali berpotensi memamerkan kata sandi dalam daftar proses (dan tergantung pada apakah proses akuntansi diaktifkan dan bagaimana hal itu dikonfigurasi , dalam proses log akuntansi juga).Cukup tulis nilai ke dalam file dan berikan file:
Saya tidak yakin cara
sha1pass
kerjanya, jika bisa mengambil file sebagai input, Anda bisa menggunakansha1pass < mysecret
. Jika tidak, menggunakancat
mungkin menjadi masalah karena termasuk baris baru akhir. Jika itu masalahnya, gunakan (jikahead
dukungan Anda-c
):sumber
cat | sha1pass
?cat mysecret | sha1pass
dansha1pass < mysecret
memiliki perilaku yang sama sehubungan dengan baris baru akhir.cat
tidak menambahkan baris baru. Lagi pula, jikasha1pass
mendukung lewat kata sandi melalui input standar, saya akan berharap untuk mengabaikan baris baru final dengan sendirinya. File dengan baris yang tidak diakhiri oleh baris baru tidak wajar di unix, jadi akan aneh untuk mengharapkan file yang tidak diakhiri oleh baris baru.cat | sha1pass
tampaknya berjalansha1pass
sebelum memberi saya kesempatan untuk memasukkan input apa pun. ii) Tidak, tentu sajacat mysecret
tidak menambahkan baris baru, saya tidak pernah mengatakancat
menambahkannya, hanya itu termasuk itu.< mysecret
menghapusnya juga. :)head -c-1
. Saya kira saya baru saja bingung mengapa menggunakancat mysecret | sha1pass
dan kemudian mengusulkansha1pass < mysecret
. Saya kira khawatir adalah sha1pass mungkin mengeluh tentang file biasa untuk stdin; Saya tidak yakin mengapa.sha1pass
dan tidak dapat menemukan manual atau-h
atau bentuk dokumentasi lainnya dalam beberapa menit saya menghabiskan pencarian dan jadi tidak tahu apakah berjalansha1pass foo
diperlakukanfoo
sebagai string input atau sebagai file input . Karena itu saya memberikan opsi untuk menangani setiap kemungkinan.Jika apa yang dilakukan terdon adalah mungkin, maka itu solusi terbaik, melewati input standar. Satu-satunya masalah yang tersisa adalah dia menulis kata sandi ke disk. Kita bisa melakukan ini sebagai gantinya:
Seperti yang dikatakan Kusalananda,
stty -echo
pastikan apa yang Anda ketik tidak terlihat sampai Anda melakukannyastty echo
lagi.head -1
akan mendapatkan satu baris dari input standar dan meneruskannya kesha1pass
.sumber
Saya akan menggunakan
cat
akan membaca dari stdin hinggaEOF
, yang dapat disebabkan oleh menekan Ctrl + D. Kemudian, hasilnya akan diteruskan sebagai argumen untuksha1pass
sumber