Linux ssh: izinkan otentikasi kunci publik tanpa memberikan hak baca kepada pengguna ke kunci pribadi

14

Pengguna yang masuk di server Linux saya harus ssh ke mesin jarak jauh tertentu dengan akun default. Otentikasi pada mesin jarak jauh menggunakan kunci publik, jadi pada server kunci pribadi yang sesuai tersedia.

Saya tidak ingin pengguna server benar-benar dapat membaca kunci pribadi. Pada dasarnya, fakta bahwa mereka memiliki akses ke server memungkinkan mereka ssh benar, dan menghapusnya dari server juga harus melarang koneksi ke mesin jarak jauh.

Bagaimana saya bisa mengizinkan pengguna untuk membuka koneksi ssh tanpa memberi mereka akses baca ke kunci pribadi?

Pikiranku sejauh ini: jelas ssh executable harus dapat membaca kunci privat, sehingga harus dijalankan di bawah pengguna lain di server yang memiliki hak tersebut. Setelah koneksi ssh dibuat, saya kemudian dapat "meneruskan" ke pengguna sehingga ia dapat memasukkan perintah dan berinteraksi dengan mesin jarak jauh.

  • Apakah ini pendekatan yang baik?
  • Bagaimana saya harus menerapkan maju?
  • Bagaimana pengguna dapat memulai koneksi (yaitu, eksekusi ssh oleh pengguna yang memiliki hak baca pada kunci)?
  • Apakah ada celah keamanan? - jika pengguna dapat menjalankan ssh sebagai pengguna lain, dapatkah mereka melakukan semua yang dapat dilakukan pengguna lain (termasuk, membaca kunci pribadi)?
Philipp
sumber
Tampaknya ini adalah duplikat dari stackoverflow.com/questions/9286622/protecting-ssh-keys
wenzul
1
Konfigurasikan server jarak jauh untuk menerima koneksi dengan kunci itu hanya dari IP server Anda? Dengan begitu bahkan jika mereka mencuri kuncinya, mereka tidak bisa melakukan apa-apa.
@ AndréDaniel mungkin mereka bisa masuk ke komputer lain yang sama sekali tidak terkait yang juga dikonfigurasi untuk menerima login tanpa kata sandi dari server. Itulah satu-satunya alasan saya bisa memikirkan untuk memiliki pengaturan seperti ini; jika bukan itu, saya agak penasaran seperti apa itu. (Sebenarnya itu tidak penting.)
David Z
@ DavidZ Saya tidak begitu mengerti ... kuncinya tidak boleh dipercaya di mana pun tetapi pada server target dengan asumsi IP cocok dengan salah satu server pertama (ke tempat pengguna terhubung).
2
Jika Anda perlu menguncinya dengan cara ini, saya menganggap Anda telah mengambil tindakan untuk melarang pengguna menambahkan kunci publik baru ke ~/.ssh/authorized_keysfile?
mpontillo

Jawaban:

31

Itulah salah satu alasan yang sudoada. Cukup izinkan pengguna Anda untuk menjalankan 1 perintah tunggal dengan hanya opsi baris perintah pra-resmi dan pengelakan paling jelas diselesaikan. misalnya

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

mengatur sudoagar semua anggota grup usersdapat menjalankan perintah ssh sebagai pengguna some_uid tanpa memasukkan kata sandi mereka sendiri (atau akun some_uid) ketika mereka menjalankan:

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

Hapus NOPASSWD:opsi untuk memaksa pengguna memasukkan kata sandi mereka sendiri sebelum masuk ke host jarak jauh.
Mungkin mengatur alias atau skrip pembungkus sebagai kenyamanan bagi pengguna Anda karena sudocukup pilih-pilih tentang menggunakan argumen yang benar.

HBruijn
sumber
Bekerja seperti pesona. Ini juga harus menjadi jawaban yang disarankan untuk duplikat yang disebutkan oleh wenzul.
Philipp
10

Ini sepertinya kasus penggunaan yang baik untuk otentikasi berbasis host. Ini adalah metode otentikasi di mana SSH tidak menggunakan kunci pengguna individu pada mesin lokal (dalam hal ini, server Anda) untuk mengotentikasi; sebaliknya, ia menggunakan kunci pribadi host , yang disimpan /etc/ssh/dan yang hanya dapat dibaca oleh root.

Untuk mengatur ini, Anda harus membuat file bernama .shostspada mesin jarak jauh, di direktori home pengguna yang Anda ingin orang-orang untuk login (tidak di ~/.ssh). File tersebut harus memiliki konten

server-hostname +

di mana server-hostnamenama server Anda, dan +merupakan tanda plus literal yang berfungsi sebagai wildcard yang berarti "pengguna mana pun".

Anda juga harus memastikan bahwa mesin jarak jauh dapat memverifikasi kunci host server, yang berarti kunci host server harus terdaftar di salah satu /etc/ssh/ssh_known_hostsatau ~/.ssh/known_hostsdi mesin jarak jauh. Jika ini belum terjadi, Anda dapat mengaturnya dengan masuk ke mesin jarak jauh dan menjalankannya

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

Setelah mengatur langkah-langkah ini, Anda dapat menghapus kunci pribadi di server sepenuhnya, jika Anda tidak memerlukannya untuk hal lain. (Dan jika Anda melakukannya, Anda selalu dapat mengaturnya agar hanya dapat dibaca oleh rootatau sesuatu.)

Anda juga dapat dengan mudah melakukan hal-hal seperti mengizinkan atau menolak akses pengguna tertentu ke mesin jarak jauh. Lihat halaman manual sshdan hosts.equivuntuk detailnya.

Satu masalah dengan pengaturan ini adalah bahwa pengguna yang masuk ke mesin jarak jauh dapat memodifikasi .shosts. Tidak ada yang dapat mereka lakukan yang memungkinkan mereka untuk masuk ke mesin jarak jauh sebagai pengguna yang berbeda, tetapi mereka dapat memotong akses mereka sendiri atau orang lain ke mesin jarak jauh. Jika ini masalah, Anda mungkin dapat membuat .shostshanya dapat ditulis oleh rootatau sesuatu - Saya tidak yakin apakah ini berhasil, tetapi Anda bisa mencobanya dan melihatnya. (Metode lain seperti sudoyang rentan terhadap risiko yang sama, karena pengguna selalu dapat menghapus ~/.ssh/authorized_keys.)

David Z
sumber
+1; Saya pikir opsi ini memberikan fleksibilitas yang baik, jika pengguna perlu menggunakan fitur SSH selain terminal, seperti penerusan porta, salinan aman, dll. Bahkan klien SSH alternatif harus bekerja. The sudopilihan bisa lebih baik untuk lingkungan terkunci-down, meskipun ...
mpontillo