OpenSSH dengan kunci publik dari basis data

14

Apakah mungkin untuk mengambil kunci publik dari basis data alih-alih file yang diotorisasi?

Saya ingin menggunakan pengaturan seperti itu untuk mengelola akses ssh ke hal-hal seperti repositori git untuk banyak pengguna tanpa perlu membuat ulang file Authorized_key setiap kali kunci publik diubah atau ditambahkan.

Fionn
sumber
1
Saya menggunakan boneka untuk ini
Matt Simmons
Userify dapat mengelola akun tersebut dengan administrasi terpusat tetapi otentikasi lokal .. dengan cara ini jika DB terpusat Anda turun, Anda masih bisa masuk, tetapi Anda mendapatkan semua manfaat dari manajemen terpusat.
Jamieson Becker

Jawaban:

16

Saya menemukan pertanyaan ini ketika mencoba menjawabnya sendiri. Setelah beberapa pencarian dan percobaan, saya menemukan beberapa opsi lain untuk ini. Saya akan melewatkan bagian tentang mendistribusikan kunci sebagai alternatif karena Matt Simmons membahasnya. Juga, saya tahu ada saat-saat itu tidak cukup baik. Sebagai contoh, jika Anda GitHub dan harus menyimpan jutaan kunci publik terhadap satu pengguna, terus memperbarui file SSH Authorized_keys dan menjaganya agar tetap disinkronkan di puluhan hingga ratusan kotak tepi yang tidak layak atau tidak diinginkan.

Begitu,

  1. Pertama-tama, RedHat (dan varian) memiliki tambalan yang didukung untuk OpenSSH yang menambahkan opsi AuthorizedKeysCommanddan AuthorizedKeysCommandRunAs. Patch telah digabung hulu di openssh 6.2. Mengutip dari halaman manual :

    Perintah ResmiKeys

    Menentukan program yang akan digunakan untuk pencarian kunci publik pengguna. Program akan dipanggil dengan argumen pertama nama pengguna yang diotorisasi, dan harus menghasilkan pada output standar garis AuthorizedKeys (lihat AUTHORIZED_KEYS dalam sshd (8)). Secara default (atau ketika diatur ke string kosong) tidak ada menjalankan AuthorizedKeysCommand. Jika AuthorizedKeysCommand tidak berhasil mengotorisasi pengguna, otorisasi jatuh ke AuthorizedKeysFile. Perhatikan bahwa opsi ini hanya memiliki efek dengan PubkeyAuthentication diaktifkan.

    AuthorizedKeysCommandRunAs

    Menentukan pengguna yang akunnya menjalankan AuthorizedKeysCommand. String kosong (nilai default) berarti pengguna yang diotorisasi digunakan.

    Dalam eksperimen saya malam ini, saya menemukan bahwa di luar kotak, ini tidak berfungsi karena kebijakan SELinux default. Anda dapat menyiasatinya dengan mematikan penegakan SELinux dengan setenforce 0. Karena memutar SELinux mungkin adalah ide yang buruk , Anda justru dapat menghasilkan kebijakan yang benar. Dalam kasus saya, itu sesederhana mencoba masuk dengan AuthorizedKeysCommandopsi yang diatur /etc/ssh/sshd_configdan kemudian menggunakan audit2allow -a -M local && semodule -i local.pp. Ini pada dasarnya melihat melalui log audit dan menemukan hal-hal yang dicegah dan menghasilkan pengecualian untuk mereka. Jika Anda mungkin memiliki barang-barang lain di sana yang mungkin masuk daftar putih, Anda mungkin harus mempelajari lebih lanjut audit2allowuntuk memastikan Anda mendapatkan kebijakan baru yang tepat.

  2. Ada berbagai tambalan lain (mungkin kurang teruji dan tepercaya) di luar sana untuk menambahkan fungsi serupa. Misalnya ada, openssh-script-auth . Anda juga dapat menemukan tambalan yang digunakan RedHat dan menerapkannya secara langsung. Pertarungan cepat Googling mengungkap https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch dan https://launchpadlibrarian.net/10/103838151/openssh-authorized-keys-command.patch yang merupakan berdasarkan versi RH tetapi yang telah diperbarui untuk versi OpenSSH yang lebih baru.

  3. Patch OpenSSH untuk melakukan pencarian kunci langsung dari beberapa toko (mis. Seperti GitHub dan CodeBaseHQ dan yang lainnya telah melakukannya). GitHub belum membuka patch ini, sepengetahuan saya, tapi saya tahu di masa lalu saya telah menemukan versi untuk pencarian kunci MySQL dan PostgreSQL. Saya mencoba untuk menemukan mereka lagi sekarang tetapi belum beruntung.

  4. Ada juga beberapa opsi berbasis FUSE. Misalnya ada LPKFuse yang memungkinkan Anda menyajikan kunci publik dari LDAP dengan mengubah AuthorizedKeysFilelokasi menjadi satu di sistem file LPKFuse. LPKFuse FS membuat file virtual yang isinya didukung oleh bidang dari server direktori.


Secara keseluruhan, saya pikir opsi # 1 sejauh ini adalah yang terbaik karena secara resmi didukung oleh RedHat. Selain itu, ini memungkinkan Anda untuk menempatkan logika apa pun yang Anda suka dalam skrip itu (termasuk berbicara ke database) dalam bahasa apa pun yang Anda inginkan.

Bo Jeanes
sumber
Re: # 1 yang bagus !! Saya harap itu berjalan di hulu, itu akan berguna di ESXi.
Jason Tan
@JasonTan: AuthorizedKeysCommand pergi ke hulu di openssh 6.2. Saya juga memperbarui jawaban untuk mencerminkan hal itu.
Bluewind
Jawaban yang bagus, opsi 1 adalah persis apa yang saya cari.
Shane Kilkelly
3

OpenSSH tidak memiliki kemampuan ini, sejauh yang saya ketahui. Taruhan terbaik Anda mungkin memiliki skrip yang secara otomatis membuat ulang file setiap malam (atau sesering yang diperlukan).

Juga, Anda mungkin ingin melihat pertanyaan ini: Suatu sistem untuk mendistribusikan kunci publik SSH

Matt Simmons
sumber
1

Saya percaya bahwa dalam versi openssh yang lebih baru Anda dapat menyimpan kunci dalam entri LDAP pengguna. Jika Anda sudah menggunakan LDAP atau AD untuk manajemen akun, Anda juga harus dapat memanfaatkannya untuk manajemen kunci.

mtinberg
sumber