Apakah ada cara aman untuk menyimpan kata sandi yang digunakan untuk ssh oleh skrip?

16

Jadi pertama, saya tahu, saya harus menggunakan kunci auth dengan SSH. Tidak perlu menjelaskannya padaku.

Masalahnya di sini adalah bahwa saya memiliki banyak server, dan saya harus memiliki skrip untuk dapat menghubungkan masing-masing.

Saya menggunakan otentikasi kunci kapan pun saya bisa, namun itu tidak mungkin pada setiap server (saya tidak memiliki kendali atas ini). Jadi SSH dengan login, atau terkadang telnet.

Jadi untuk beberapa saya hanya menyimpan kata sandi dalam db, dan skrip saya ambil ketika diperlukan. Masalahnya adalah sepertinya tidak aman untuk melakukannya. Apakah ada cara untuk membuatnya sedikit lebih aman?

Suka cara khusus menyimpannya?

wokati
sumber
1
Variabel Env. Gandakan dari SO: stackoverflow.com/a/4410137/2579527
Travis Stoll
4
Variabel @TravisStoll Environment tidak aman.
Jenny D
Saya khawatir bahwa untuk pengaturan Anda menyimpan kata sandi dalam db adalah seaman yang didapat. Anda bisa menjadikannya db terenkripsi, seperti file keepass (saya pikir setidaknya ada modul perl untuk mengakses keepass dbs), tetapi Anda masih harus menyimpan kata sandi ke database di suatu tempat, jika Anda tidak ingin memasukkan setiap kali Anda memanggil skrip Anda. Mungkin sedikit lebih baik IFF Anda memasukkan hanya kata sandi utama setiap kali Anda memohon naskah Anda.
Isaac
1
Bahkan jika Anda menggunakan kunci otentikasi SSH alih-alih kata sandi, itu bukan jaminan keamanan - siapa pun yang dapat mencuri basis data kata sandi Anda bisa mencuri kunci pribadi Anda. Anda dapat mengenkripsi kunci pribadi Anda seperti Anda bisa mengenkripsi basis data kata sandi Anda, tetapi karena skrip Anda perlu membuka kunci (atau basis data kata sandi), ia masih rentan terhadap penyerang. Menggunakan kata sandi alih-alih kunci meningkatkan sedikit kerentanan Anda karena membuka lebih banyak jalan untuk mencuri kata sandi, tetapi bahkan menggunakan kunci alih-alih kata sandi bukanlah keamanan yang sempurna.
Johnny
1
"terkadang telnet" tampaknya menyiratkan bahwa kata sandi kadang-kadang bahkan akan ditransfer dengan jelas melalui kabel ...?
Hagen von Eitzen

Jawaban:

24

Jika skrip Anda dapat terhubung ke salah satu server itu, siapa pun yang memiliki akses ke skrip (atau akses istimewa ke mesin yang menjalankan skrip) dapat terhubung ke salah satu server tersebut.

Jika skrip perlu dijalankan secara mandiri, semua taruhan dibatalkan. Jawabannya di sini adalah tidak, tidak ada cara yang benar-benar aman untuk menyimpan kata sandi di lingkungan seperti itu . Tidak ada cara yang benar-benar aman dan praktis untuk melakukan sesuatu.

Alih-alih mencoba menghindari yang tak terhindarkan, Anda harus fokus pada pertahanan secara mendalam .

Fristly, tentu saja, Anda harus melindungi kata sandi secara memadai . Ini biasanya berarti menyimpannya dalam file yang terpisah dari skrip Anda dan mengonfigurasi izin sistem file yang terbatas . Hanya itu yang dapat Anda lakukan di front ini, dari sudut pandang keamanan.

Langkah-langkah lain pasti dapat menambah ketidakjelasan dalam proses tersebut. Mengenkripsi kata sandi akan membuat penyerang perlu mencari kunci dekripsi. Menggunakan semacam penyimpanan sistem operasi yang dilindungi umumnya melindungi terhadap pengguna lain yang mengakses kunci Anda (sehingga tidak memberikan keuntungan dibandingkan izin sistem file, selain menjadi kompleks untuk diserang - dan digunakan). Langkah-langkah ini akan menunda serangan, tetapi kemungkinan besar tidak mencegahnya terhadap penyerang yang gigih.


Sekarang, mari kita perlakukan kata sandi sebagai publik sejenak. Apa yang dapat Anda lakukan untuk mengurangi kerusakan?

Solusi lama dan teruji adalah membatasi apa yang dapat dilakukan kredensial tersebut. Pada sistem UNIX, cara yang baik untuk melakukan ini adalah mengatur pengguna yang terpisah untuk skrip Anda dan membatasi kemampuan pengguna itu , baik pada mengakses dan server yang diakses. Anda dapat membatasi kemampuan pengguna pada level SSH , pada level shell atau mungkin menggunakan mekanisme Kontrol Akses Wajib seperti SELinux .

Sesuatu yang Anda mungkin juga ingin pertimbangkan adalah memindahkan logika skrip ke server . Dengan begitu, Anda mendapatkan antarmuka yang lebih kecil yang lebih mudah dikendalikan, dan terutama ...

Monitor . Selalu pantau akses ke server. Lebih disukai, otentikasi log dan perintah dijalankan hanya untuk log tambahan . Jangan lupa memantau perubahan file skrip menggunakan auditd, misalnya.


Tentu saja, banyak dari mekanisme ini tidak berguna jika Anda tidak memiliki kontrol atas server, karena pertanyaan Anda tampaknya menyiratkan. Jika itu masalahnya, saya akan menyarankan Anda untuk menghubungi orang-orang yang mengelola server dan memberi tahu mereka tentang skrip Anda dan potensi jebakan keamanan.

goncalopp
sumber
14

Jawaban singkatnya adalah: Tidak.

Jawaban panjangnya adalah: Tidak, tidak ada cara yang sepenuhnya aman. (Ini termasuk variabel lingkungan, yang dapat diakses oleh orang lain di server.) Yang paling dekat Anda dapat menyimpannya dalam beberapa format terenkripsi - keepass, file yang dienkripsi GPG, atau sesuatu yang lain di sepanjang baris tersebut. Tetapi pada titik tertentu Anda perlu mendekripsi kata sandi agar skrip Anda dapat menggunakannya, dan pada titik itu Anda akan rentan.

Dengan kata lain, Anda perlu memperhatikan keamanan mendalam secara mendalam, baik pada server tempat skrip dijalankan, pada jaringan dan pada server target.

Jenny D
sumber
1
Saya tidak begitu yakin ini adalah TIDAK yang pasti. Sesi aman; sistem file bisa aman, dengan izin yang sesuai ditetapkan; jadi jika dia bisa mendapatkan sesuatu dari sistem file (kata sandi yang disimpan) dan mengirimkannya melalui stdin ke perintah ssh, dia seharusnya baik-baik saja, bukan? Silakan lihat tautan yang saya berikan pada komentar lain di atas. Bagaimana menurut anda?
pgr
Jika dia mengirim mereka melalui stdin, maka ada kerentanan. Dengan saran Anda itu akan lebih aman, tetapi tidak akan sepenuhnya benar. Terutama mengingat bahwa beberapa sesi lebih dari telnet.
Jenny D
0

Anda dapat mengenkripsi kata sandi dalam db Anda dengan kata sandi kedua dan menyimpan kata sandi ini pada mesin (3) yang terpisah dan memiliki sistem di mana skrip yang perlu kata sandi dari db pertama menghubungkan mesin ke-3 ini untuk mendapatkan kata sandi dekripsi. , mendekripsi kata sandi dalam db dengan kata sandi yang didapatnya dari mesin ke-3 dan berfungsi.

Tentu saja ini tidak benar-benar menambah keamanan ekstra, penyerang dengan hak istimewa yang cukup juga bisa saja meminta kata sandi dari mesin ke-3.

Tetapi intinya adalah bahwa pihak ke-3 dapat mengendalikan mesin ke-3, misalnya bos atau petugas keamanan Anda, atau pihak ke-3 yang mengendalikan server yang tidak Anda kontrol.

Dengan cara ini Anda dapat memberi tahu mereka, jika mereka memiliki masalah, jika Anda keluar dari pekerjaan Anda dan mereka tidak percaya orang itu menggantikan Anda, atau mereka hanya ingin skrip Anda berhenti mengakses mesin mereka, mereka dapat menarik steker pada tanggal 3 mesin, dan skrip Anda tidak akan lagi memiliki akses ke kata sandi.

Jens Timmerman
sumber