Tembolok kata sandi jika kunci SSH dilarang

46

Saya memiliki server yang harus sering saya akses melalui ssh, karena saya menghitungnya. Sekarang, pusat komputasi secara eksplisit melarang kunci SSH karena mereka "tidak aman". Mereka merasa mengetikkan kata sandi saya, pada keyboard, setiap kali, mungkin di depan manusia lain, adalah cara yang jauh lebih aman untuk login.

Sekarang; Saya tidak dapat mengubah pikiran mereka (saya mencoba).

Apakah ada cara untuk setidaknya menyimpan sementara kata sandi SSH, cara GIT dapat menyimpan kata sandi dalam cache untuk waktu tertentu?

pengguna2667180
sumber
55
the computing center explicitly forbids SSH-keys because they are "insecure"- Pendapat saya tentang masalah ini? Temukan host server baru, karena server Anda jelas tidak layak.
Matt Clark
18
@Matt: "pusat komputasi" terdengar lebih seperti sistem jaringan akademis, yang saya kira tidak memiliki banyak kompetisi
grawity
27
Mereka salah. Mereka mungkin lupa menonaktifkan kunci ssh saat mereka kedaluwarsa, jadi mereka memutuskan bahwa kunci ssh adalah masalahnya.
Yosua
10
grawity benar. itu superkomputer nasional jadi saya terjebak dengannya. untuk apa nilainya, mesin itu bagus. Joshua mungkin benar juga, tapi, yah, itu semacam hak yang tidak baik untuk apa pun
user2667180
7
@TheHansinator Jika ada keylogger terinstal, Anda telah dikompromikan ke titik di mana tidak lagi penting apakah Anda melindungi koneksi ssh Anda. Tetapi ada keuntungan lain dari publickeyotentikasi. Jika Anda menonaktifkan passwordotentikasi di server, Anda mencegah semua penyerang itu mencoba menebak kata sandi. Dan jika seorang penyerang mencoba serangan mitm terhadap klien yang sebelumnya tidak menyimpan kunci publik dari server, Anda jauh lebih terlindungi dengan publickeydaripada jika Anda menggunakan passwordotentikasi.
kasperd

Jawaban:

63

Koneksi ulang

SSHv2 memungkinkan koneksi terotentikasi yang sama untuk membangun beberapa 'saluran' - shell interaktif, perintah batch, SFTP, bersama dengan yang sekunder seperti agen-forwarding atau TCP-forwarding Server Anda mungkin mendukung multiplexing koneksi secara default. (Jika admin Anda mengeluh, itu bukan caching kata sandi Anda di mana pun - itu caching seluruh koneksi.)

Dengan OpenSSH yang Anda miliki ControlMasterdan ControlPathopsi (-M dan -S) untuk memanfaatkan ini:

  1. Mulai koneksi SSH 'master' menggunakan -M. (Karena Anda belum memiliki ControlPath dalam konfigurasi Anda, Anda perlu menentukannya di baris perintah menggunakan -S. Ini perlu waktu lama, jadi saya menambahkan -fNopsi untuk turun ke latar belakang; mereka secara teknis opsional jika tidak.)

    $ ssh [email protected] -fNMS ~/.ssh/bar.socket
    [email protected]'s password:
    

    Anda kembali ke shell lokal.

  2. Mulai koneksi baru melalui master:

    $ ssh [email protected] -S ~/.ssh/bar.socket
    

    Anda masuk

  3. Untuk membuat ini berguna bagi Git / rsync / SFTP, Anda perlu mengatur ControlPathkonfigurasi Anda, karena Anda tidak akan dapat menentukan -Ssetiap saat:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Anda dapat mengotomatiskan ini - versi OpenSSH terbaru juga memiliki ControlPersistyang secara otomatis membuat koneksi master di latar belakang jika belum ada. Ini memungkinkan Anda untuk melewati langkah 1 dan hanya menggunakan ssh seperti biasa.

  1. Konfigurasi dalam ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. Koneksi pertama meminta kata sandi:

    $ ssh [email protected]
    [email protected]'s password:
    [foo@bar:~]$ exit
    
  3. Yang kedua tidak:

    $ ssh [email protected]
    [foo@bar:~]$ yay
    

Untuk mengontrol master multipleks (hentikan atau konfigurasikan penerusan TCP), gunakan -Oopsi.

Metode serupa didukung oleh versi Putty terbaru .

grawity
sumber
1
terima kasih banyak atas jawaban yang bagus ini. Google tidak berguna pada masalah ini, karena selalu beralih ke ssh-keys dan saya tidak tahu kata kunci yang tepat. banyak membantu saya!
user2667180
1
Itu harus pergi tanpa mengatakan, tetapi jika Anda menggunakan konfigurasi ini sangat penting bahwa Anda memastikan akun Anda aman dan bahwa folder .ssh Anda dikunci dengan benar karena siapa pun yang memiliki akses ke file saluran pada mesin itu dapat membonceng Anda koneksi, dan akses server seperti Anda.
shellster
3
@shellster: Maksud Anda "siapa pun dengan UID yang sama", seperti halnya dengan ssh-agent sudah. Bahkan jika Anda dengan sengaja membuka izin file socket (yang secara default adalah 0600), pengguna lain hanya akan mendapatkan "multiplex uid mismatch" darinya.
grawity
3
@shellster Seseorang dengan root dapat menginstal keylogger dan mencuri kata sandi Anda ke sistem jarak jauh, atau melakukan sejumlah hal jahat. Jika kami khawatir tentang root lokal, ini tidak kalah aman daripada menyimpan kunci pribadi SSH.
amalloy
1
Saya tidak menganggap root lokal sebagai ancaman karena jika itu menjadi ancaman, Anda tetap bersulang apa pun yang terjadi. (Seperti memata-matai tingkat pemerintah.) Sejujurnya root lokal bisa saja mengganti klien dan agen ssh Anda dengan apa pun yang mereka inginkan. Simpan semua kata sandi dan kunci pribadi di /root/.secret? Tentu.
grawity
19

Menggunakan sshpass

sshpass ( github , halaman manual ) adalah alat yang secara otomatis memasukkan kata sandi ke ssh. Cara aman untuk menggunakannya adalah ini:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Ini akan membaca kata sandi ~/.ssh/compute_password, seperti file kunci pribadi tanpa frasa sandi. Anda bisa meletakkan sshpassperintah di skrip shell kecil atau alias shell untuk menghindari mengetik perintah penuh. Sayangnya, saya belum menemukan cara untuk melakukan ini ~/.ssh/config.

(Dimungkinkan juga untuk menentukan kata sandi secara langsung pada baris perintah sshpass, tetapi ini harus dihindari, karena kata sandi bocor kepada siapa saja yang dapat melakukannya ps)

Perbandingan dengan metode lain

Pendekatan ini tentu saja kurang aman daripada mengatur otentikasi kunci publik dengan benar, tetapi Anda mungkin sudah tahu itu.

Ini juga kurang aman daripada jawaban @ grawity tentang penggunaan kembali koneksi, tetapi memiliki keuntungan karena tidak harus memasukkan kata sandi secara interaktif sama sekali.

Anda dapat mempertimbangkan jawaban @ grawity sebagai alternatif untuk autor pubkey dengan frasa sandi dan caching kunci pribadi (yaitu ssh-agent). Maka jawaban saya akan menjadi alternatif untuk autentikasi pubkey tanpa frasa sandi pada file kunci pribadi.

marcelm
sumber
3
Jika kebijakan pusat komputasi ditulis berdasarkan "tetapi keypair disimpan pada disk tempat seseorang dapat mencuri mereka!", Maka sepertinya kebijakan itu akan menjadi bumerang.
grawity
6
@ kegembiraan Nah, kebijakan buruk mengarah pada masalah yang lebih buruk — \ _ (ツ) _ / ¯
marcelm
1
Jika Anda menghasilkan kata sandi sebagai aliran karakter acak yang cukup panjang (katakanlah head -c 16 /dev/urandom | base64untuk 128 bit) dan tidak menggunakannya pada sistem lain, ini bijaksana untuk keamanan mirip dengan kunci. Seperti sulit untuk di paksa, dan mudah digunakan dari file jika tidak dienkripsi. Ini berlaku untuk orang jahat juga, jika mereka mendapatkan file. Satu-satunya perbedaan adalah bahwa kata sandi dikirim ke server apa adanya, sedangkan kunci memiliki matematika yang lebih baik untuk membuktikan bahwa Anda memiliki kunci pribadi yang benar tanpa mengungkapkannya, dan dari segi kegunaan, lebih sulit untuk mengenkripsi file yang berisi kata sandi (tidak alat standar).
ilkkachu
1

Gunakan pengelola kata sandi.

Beberapa pengelola kata sandi (mis. KeePassXC) memiliki fitur 'tipe-otomatis'. Anda menyimpan kata sandi pada pengelola kata sandi, membuka kunci basis data saat Anda menjalankan pengelola dan setiap kali sshmeminta kata sandi, Anda menekan kombinasi tombol yang membuat pengelola kata sandi menuliskan kata sandi panjang Anda ke konsol.

Tidak perlu menyalin, ingat apa pun (kecuali kata sandi untuk membuka kunci basis data) dan Anda dapat memiliki kata sandi yang kuat tanpa menumbuk 30 karakter itu setiap kali Anda mencoba masuk.

Anda dapat memilih favorit Anda dari daftar ini: https://en.wikipedia.org/wiki/List_of_password_managers

styrofoam terbang
sumber
3
Saya tidak yakin apakah fitur tipe otomatis berfungsi baik dengan program berbasis terminal. Deteksi akan mencari judul jendela tertentu, dan autotyping itu sendiri yang terbaik tidak memiliki fitur "anti-keylogging" mewah yang dimiliki KeePass2 ...
grawity
1
@grawity gnome-terminalmengubah judulnya ssh somehostketika ssh meminta saya untuk memasukkan kata sandi sehingga Anda dapat mencocokkan jendela judul dengan ini tanpa masalah. Saya tidak tahu apa-apa tentang fitur 'anti-keylogging' - Saya menggunakan KeePassXC di terminal setiap hari dan yang terburuk yang harus saya hadapi adalah memilih akun yang sesuai dari daftar.
terbang styrofoam
2
@grawity Fitur anti-keylogging perlu diaktifkan berdasarkan per-entri pula (persis karena banyak program tidak mendukung tempel).
Bob
0

Alternatif lain adalah dengan menggunakan klien ssh GUI. Pada Windows, pilihan yang jelas adalah Putty . Ada juga versi Linux Putty, terutama sebagian besar distro berbasis Debian seperti Ubuntu biasanya menyertakan Putty dalam repo mereka.

Klien lain yang sangat baik adalah Termius . Ini mendukung tidak hanya Windows dan Linux tetapi juga OSX, iOS dan Android. Meskipun terutama dirancang untuk ponsel versi desktop sebenarnya cukup bagus.

Jika saya tidak salah, Hyperterminal yang terhormat di Windows juga memiliki / memiliki klien ssh bawaan tetapi saya belum pernah menggunakan windows dalam waktu yang sangat lama jadi saya tidak sepenuhnya yakin.

Semua klien GUI mencakup kemampuan untuk menyimpan pengaturan koneksi yang mencakup nama pengguna dan kata sandi Anda.

Slebetman
sumber
2
"Berbasis GUI" tidak secara otomatis menyiratkannya akan memungkinkan penyimpanan kata sandi Anda, sesuatu yang secara eksplisit menolak dilakukan oleh Putty . Versi HyperTerminal yang dibundel dengan Windows hanya untuk Telnet, lebih berfokus pada tautan serial. Mungkin Anda berpikir tentang CKermit untuk Windows yang memang memiliki dukungan SSH, tetapi dukungan ciphernya sudah usang sehingga tidak akan mudah terhubung ke banyak server saat ini.
grawity