Katakanlah saya memiliki satu set mesin (disebut mesin pelanggan) yang hanya daftar kecil orang (disebut staf pendukung) yang diizinkan masuk ke SSH, menggunakan hanya satu akun dengan mesin (akun akses dukungan).
Staf pendukung hanya seharusnya login ke mesin pelanggan menggunakan kunci. Selain itu, staf pendukung dapat berevolusi, sehingga seseorang yang meninggalkan staf pendukung tidak diizinkan masuk ke mesin pelanggan mana pun. Oleh karena itu, staf orang dilarang membaca kunci pribadi yang digunakan untuk masuk ke mesin pelanggan. Juga, dilarang untuk memodifikasi authorized_keys
file di mesin pelanggan.
Untuk mewujudkan konfigurasi itu, saya punya ide untuk menggunakan SSH proxy yang akan didukung oleh staf pendukung (dengan otentikasi LDAP, tapi itu masalah lain) dan yang berisi kunci pribadi.
Pertanyaannya adalah: Bagaimana cara saya mengizinkan staf pendukung untuk menggunakan kunci pribadi SSH tanpa bisa membacanya?
Saya percaya bahwa saya harus membuat daemon yang berjalan sebagai root pada mesin proxy yang akan menerima permintaan pengguna dan membuka sesi SSH untuk mereka, tetapi saya tidak tahu bagaimana melakukannya. Ada ide?
sumber
Jawaban:
Saya akan menyarankan beberapa opsi.
Lindungi kunci ssh dan minta penggunaan
sudo
di sisi tim pendukung Anda. Anda bisa melakukan ini secara transparan dengan pembungkus. Panggil pembungkus, katakan,/usr/local/bin/ssh-support
dan minta agar berisi sesuatu seperti ini (belum diuji):Ini akan membutuhkan entri dalam
sudoers
file yang memungkinkan pengguna dalamsupport
grup untuk menggunakan alat ini. Perintah ini memungkinkan mereka untuk menjalankanssh-support
alat sebagaissupport
pengguna - yang harus Anda buat. Itu tidak memberi hak root.Jika Anda senang bahwa pengguna dukungan tidak perlu memberikan kata sandi mereka sendiri untuk menjalankan alat (seperti yang diminta oleh
sudo
doa dalam skrip itu sendiri) Anda dapat mengubahsudoers
definisi sebagai berikut:Dengan asumsi
PATH
ada/usr/local/bin/
Anda akan menyebutnya denganssh-support clientname
. Juga dengan asumsi Anda telah membuatssupport
pengguna seperti yang/home/ssupport
Anda buat/home/ssupport/.ssh/id_rsa_clientname
dan/home/ssupport/.ssh/id_rsa_clientname.pub
sebagai pasangan sertifikat, dan memiliki entri host/home/ssupport/.ssh/config
untukclientname
yang menentukan pengguna, host, port, dll untuk mesin target. Anda mungkin akan menonaktifkan penerusan X11, penerusan porta, dll. Secara eksplisit. Seperti biasa,/home/ssupport/.ssh
direktori perlu dilindungi dengan izin0700
.Berikan masing-masing anggota dukungan akun pengguna lokal mereka sendiri, dan mintalah setiap orang menggunakan kunci ssh pribadi mereka sendiri untuk mengakses server klien. Ketika seseorang meninggalkan grup dukungan, Anda menghapus kunci ssh mereka dari server klien. Ini berarti bahwa Anda tidak perlu lagi khawatir tentang mencegah staf Anda mengetahui kunci ssh pribadi.
sumber
sudoers
batas garis akses ke satu perintah-E
untuk menambahkan), meneruskan port istimewa (-L,-R,-D
) atau hanya mendapatkan root (-o PermitLocalCommand=yes -o 'LocalCommand=/bin/bash'
. Komentar dari galaksi tentang penyalahgunaan sudo ada di tempat yang benar!ssh root@somewhere
kunci, vs.ssh user@somewhere
kemudian sudo. Ini sebenarnya poin yang sangat bagus. Namun, satu-satunya cara itu berlaku untuk kasus ini adalah itussh keyowner@localhost ssh_to_client client.example.org
adalah alternatifsudo -u keyowner ssh_to_client client.example.org
. Mirip dengan sudo, SSH dapat membatasi perintah yang diizinkan dijalankan oleh pengguna. Kita berbicara tentang sudo tanpa kata sandi ke non-root, bukan kasus penggunaan Galaxy.Apa yang benar-benar ingin Anda lakukan adalah menggunakan SSH CA dan menandatangani kunci yang digunakan oleh masing-masing orang yang mendukung (mereka harus memiliki kunci ssh sendiri, seperti paspor) dan mengonfigurasi server klien Anda untuk menggunakan
TrustedUserCAKeys /etc/ssh/users_ca.pub
di / etc / ssh / sshd_config. Dengan cara ini server akan menerima kunci apa pun yang ditandatangani oleh kunci CA (yang dapat Anda akses) dan Anda akan dapat mencabut kunci orang yang tidak lagi mendukung tanpa menyentuh tombol_wenang resmi.Pencarian cepat untuk "ssh ca" menunjuk ke tutorial ini: https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with -ubuntu (gulir ke bawah ke "Cara Mengonfigurasikan Kunci Pengguna") - walaupun tutorial menyebutkan Ubuntu distribusinya independen, tetapi Anda memerlukan versi baru OpenSSH yang mendukung SSH CA
Entri blog lain yang bagus tentang topik ini adalah https://ef.gy/hardening-ssh (gulir ke bawah ke "sertifikat SSH").
Perhatikan bahwa Anda dapat menandatangani kunci agar valid untuk waktu yang terbatas, sehingga secara otomatis kedaluwarsa!
sumber
Ada beberapa jawaban berbeda yang melibatkan skrip wrapper untuk ssh yang dipanggil melalui sudo atau setuid-executable (ke beberapa akun non-root dengan tujuan khusus ). Seperti dikatakan nkms , melewati semua argumen ke ssh memungkinkan pengguna melakukan hal-hal yang sewenang-wenang dengan kunci ssh yang kami coba lindungi. Ekstrem lainnya yang muncul adalah membiarkan hanya nama host saja.
OP mengatakan admin harus dapat mengunggah sesuatu.
Anda dapat memiliki dua pembungkus fixed-args-to-ssh yang berbeda. Satu untuk shell login, satu lagi untuk scp. Tidak ada argumen yang disediakan pengguna selain nama host (dan nama file yang akan diunggah).
Atau skrip wrapper yang menggunakan
getopt
dirinya sendiri untuk mem-parsing opsi yang sangat terbatas, dan menyambungkannya dengan perintah ssh yang sebagian besar sudah diperbaiki. Mengabaikan (atau salah) pada opsi yang tidak dikenali akan menjadi cara untuk melakukannya.Jangan mencoba memfilter opsi ssh "berbahaya", cukup tulis pembungkus yang dapat melakukan dua hal: login interaktif, atau unggah file (nama file lokal dan jarak jauh). Anda masih perlu melakukan sanitasi di sana, saya kira.
Sebenarnya, ini masih mudah salah. Anda harus menemukan cara untuk menghentikan pengguna memberikan file memegang kunci ssh sebagai file lokal. Jadi, Anda masih mencoba memikirkan segala hal yang perlu dianulir, alih-alih mulai dari tidak membiarkan apa pun. Ini akan menjadi awal untuk memastikan nama file tidak mengandung
@
atau:
.sumber
Jika Anda menyiapkan server proxy SSH, Anda dapat mengatur agar shell (in
/etc/passwd
) pengguna pengguna Anda tidak disetel ke shell seperti bash, melainkan ke skrip sederhana yang tidak memungkinkan akses shell. Sebagai gantinya, ia akan meminta nama host target (read target
), kemudianexec ssh "support@$target"
.Perhatikan bahwa menggunakan proxy seperti ini mungkin menyulitkan untuk menggunakan alat seperti
scp
untuk mentransfer file ke / dari mesin pelanggan. Ini mungkin masalah atau keuntungan!sumber
sudo
juga berfungsi. Jawabannya menyarankan menggunakan pengguna root lokal, tetapi pengguna non-root juga akan berfungsi. Lihat komentar saya pada jawabannya untuk diskusi tentang itu. (ssh keyowner@localhost
Ide saya sama dengan ide Anda.)sudo
.Orang-orang dukungan Anda selalu terhubung melalui mesin proxy itu, dan hanya dari itu, sehingga klien dapat dengan mudah mengotentikasi mesin proxy menggunakan HostbasedAuthentication .
Katakanlah mesin proxy itu
supporters.pc
dan Anda memberikan dukungancustomer.pc
customer.pc akan memiliki HostbasedAuthentication ya di
/etc/ssh/ssd_config
, pendukung.pc terdaftar/etc/ssh/shosts.equiv
dan kunci publiknya/etc/ssh/ssh_known_hosts
.Ketika staf dukungan Anda masuk ke [email protected], dan melakukan
ssh customer.pc
, itu akan menelurkan ssh-keysign (8) (yang perlu diatur secara tepat), yang akan menangani penandatanganan kunci dengan file-Anda-tidak bisa membaca dan berikan bukti kepada suporter.pc bahwa koneksi memang berasal dari suporter.pc . Sebagai customer.pc mempercayai pendukung.pc , anggota staf Anda akan masuk sebagai dukungan .sumber
Gunakan biner pembungkus
Untuk kasus penggunaan khusus ini (lihat catatan penting di bawah), satu kemungkinan adalah membuat pengguna (katakanlah
support-ssh
) khusus untuk koneksi SSH keluar ini, kemudian instal biner pembungkus kecil yang dijalankan/usr/bin/ssh
.ssh
biner itu sendiri, karena Anda tidak akan ingat untuk menyalinnya kembali setiap kali Anda menerapkan pembaruan keamanan.root
sebagai pengguna yang lebih istimewa, karena alasan yang saya percayai sudah jelas.Ini adalah alternatif yang setara secara fungsional untuk digunakan
sudo
untuk meningkatkan hak istimewa dengansupport-ssh
akun dengan trade-off berikut:sudo
, jadi ada sedikit risiko kesalahan konfigurasi yang membuka lebih dari yang Anda inginkan.sudo
(tetapi semakin banyak kode yang Anda tulis, semakin Anda perlu mengaudit untuk keamanan).Biner pembungkus harus diatur
HOME
kesupport-ssh
direktori home pengguna, sehinggassh
akan mengambilssh_config
kunci pribadi yang sesuai . Tetapi pengguna yang memohon sebaiknya tidak diizinkan membaca~support-ssh/.ssh/
atau kontennya.Pembungkus bisa sesederhana:
Anda mungkin ingin menjadi lebih ketat, dan memeriksa apakah argumennya
argv[1]
adalah sekumpulan nama host yang diizinkan. Atau kurang membatasi, dan memungkinkan (sebagian) argumen opsi. Anda mungkin ingin sepenuhnya menggantikan variabel lingkungan (tapi tetap yang penting sepertiTERM
,LC_*
, dll); perhatikan ituLD_LIBRARY_PATH
danLD_PRELOAD
sangat berbahaya.Program pembungkus serupa dapat disediakan
scp
jika diperlukan.Catatan tentang penerapan
Jawaban ini membahas keadaan khusus dari pertanyaan, di mana pengguna secara kontraktual diwajibkan untuk mengikuti prosedur, dan ada sanksi (misalnya pemecatan) karena melanggar mereka. Itu mengandaikan bahwa Anda ingin mencegah karyawan dengan mudah menyalin kunci privat di sekitar, daripada mencegah penyerang yang tekun mendapatkan akses yang tidak sah.
Saya mengambil pandangan bahwa keamanan dicapai melalui pertahanan teknis dan non-teknis, dan bahwa keseimbangan yang dicapai di sini atau dengan menggunakan
sudo
sesuai untuk situasi yang disajikan.sumber