Apakah "curl -u nama pengguna: kata sandi http://example.com" aman?

30

Apakah curl -u username:password http://example.comaman?

Jika tidak, dapatkah Anda memberikan penjelasan singkat tentang bagaimana seseorang dapat memperoleh kata sandi Anda?

JDiMatteo
sumber
6
Jika Anda menggunakannya di terminal, ingatkah Anda bahwa kedua kredensial disimpan dalam sejarah bash?
Francisco Tapia
15
Perintah seperti itu tidak aman karena pengguna lain mungkin menggunakan ps -efuntuk melihat proses mana yang sedang berjalan. Ketika Anda curl -u username:password http://example.communcul dalam daftar, tujuan, nama pengguna, dan kata sandi Anda dikompromikan.
Lambert
Meskipun pertanyaannya adalah pada topik di sini, Anda mungkin juga tertarik dengan Keamanan Informasi StackExchange
IQAndreas

Jawaban:

54

Itu tidak aman, karena cURL default ke otentikasi dasar di mana protokol HTTP mengirim kata sandi Anda dalam teks yang jelas. Saat Anda menentukan username:passwordstring, itu akan dikonversi ke string BASE64 di header HTTP:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Siapa pun yang dapat mencegat lalu lintas HTTP Anda (penyedia Anda, siapa pun yang mengakses AP nirkabel yang sama seperti Anda, dll.) Akan dapat memulihkan kata sandi hanya dengan menggunakan konverter BASE64 online .

Protokol HTTPS akan membuat segalanya lebih baik dengan membuat koneksi terenkripsi sebelum header ini dikirim, mencegah kata sandi terungkap. Namun, ini hanya berlaku jika pengguna memperhatikan ketika diminta untuk mengkonfirmasi sertifikat yang tidak dikenal, mengesahkan pengecualian keamanan dan sebagainya.

Perhatikan bahwa argumen perintah mungkin tersedia untuk pengguna lain di mesin yang sama untuk melihat, misalnya ps -ef, / sistem file proc, di riwayat bash Anda, dan di log terminal Anda (terima kasih atas komentar @ Lambert yang memperhatikan hal ini). cURL pada beberapa platform mencoba menyembunyikan kata sandi, jadi misalnya dengan ps -efAnda cenderung melihat ruang kosong alih-alih kata sandi. Namun, daripada meneruskan kata sandi sebagai argumen baris perintah, memiliki cURL secara langsung meminta kata sandi lebih baik, seperti yang dibahas pada faq cURL .

Dmitry Grigoryev
sumber
4
Bahkan jika Anda berada di platform di mana curl berhasil menimpa argumennya sendiri untuk menyembunyikan data ps, ada periode saat memulai sebelum menimpa dilakukan di mana konten rentan.
Charles Duffy
Bagaimana dengan otentikasi digest? Bukankah curl menggunakannya secara default?
RR
2
Otentikasi @rr Digest sedikit lebih baik, karena tidak mencegah serangan man-in-the-middle, jadi Anda masih lebih baik menggunakan HTTPS.
Dmitry Grigoryev
1
@ rr Bagaimana Anda menegaskan bahwa StartSSL tidak dipercaya oleh sebagian besar browser ? Apakah Anda berharap banyak pengguna Windows 95 atau Firefox 1.5?
Hagen von Eitzen
1
@rr IMHO Anda menjadi tidak dipercaya hanya jika ada masalah dengan sertifikat perantara yang hilang (atau salah) di server
Hagen von Eitzen
24

Itu tidak aman. Parameter baris perintah terlihat oleh semua pengguna.

Tronic
sumber
4
Menggabungkan dengan @Dmitry Grigoryev menjawabnya bisa jadi yang paling akurat.
Francisco Tapia
1
Ya, saya benar-benar merindukan sebagian besar masalah yang harus saya akui.
Dmitry Grigoryev
perintah bisa menjadi bagian dari skrip yang hanya dapat dibaca oleh pengguna ...
Pete
2
@Pete baris perintah dari program yang dijalankan (apakah dimulai dari skrip atau di terminal) biasanya terlihat oleh semua pengguna melalui psperintah dan /procsistem file. Jika perintah selesai dengan cepat, risikonya berkurang, tetapi masih ada.
RBerteig
2
@Pete Answers tidak seharusnya eksklusif, mereka saling melengkapi. Jadi tidak apa-apa untuk jawaban kedua untuk menghilangkan ancaman yang dijelaskan di pertama, lebih tepatnya, akan berlebihan untuk mengulanginya. Dan saya tidak akan menyebut pernyataan itu salah karena itu tidak benar dalam setiap kasus.
Dmitry Grigoryev
1

Ini bisa dilakukan dengan cara yang lebih aman dengan menggunakan parameter --netrc-file.

  1. Buat file dengan 600 izin

Sebagai contoh: vi / root / my-file

mesin example.com

masuk USERNAME

kata sandi PASSWORD

Simpan dan Tutup file

  1. Gunakan di bawah ini untuk mengakses URL dengan Nama Pengguna dan Kata Sandi.

curl --netrc-file / root / my-file http://example.com

  1. Selesai
Shameer
sumber
0

Tidak aman saat menggunakan skema HTTP. Untuk membuatnya aman, Anda harus menggunakan HTTPS.

Untuk menyembunyikan kata sandi agar tidak muncul dalam riwayat perintah, hanya berikan nama pengguna. Curl akan meminta kata sandi, jika tidak disediakan dalam perintah.

Mohnish
sumber
Bukan jawaban yang berguna jika HTTPS tidak tersedia. cURL adalah "klien".
mckenzm
0

Jawaban singkatnya adalah tidak ... tapi ....

Jika tidak ada opsi sisi server Anda dapat memperkeras keamanan.

  1. Jika ini intranet lokal maka isolasi domain broadcast, dan jangan gunakan WiFi atau radio apa pun.
  2. Seperti yang dikatakan Shameer, gunakan file .netrc, jauhkan nilainya dari kode.
  3. Jika Anda percaya bahwa memori itu aman, gunakan vars lingkungan. $ PSWD.
  4. Jika ini adalah otomatisasi, jalankan dari crontab root.
  5. ... dalam sebuah wadah.
  6. ... dari VM dengan disk terenkripsi.

Tidak ada yang lebih aman dari browser menggunakan HTTP.

mckenzm
sumber