Bagaimana cara membuat Shared Keys .ssh / authorized_keys dan sudo bekerja bersama?

15

Saya telah menyiapkan .ssh / berwenang_keys dan saya dapat masuk dengan "pengguna" baru menggunakan kunci pub / privat ... Saya juga telah menambahkan "pengguna" ke daftar sudoers ... masalah yang saya miliki sekarang adalah ketika Saya mencoba menjalankan perintah sudo, sesuatu yang sederhana seperti:

$ sudo cd /root

itu akan meminta saya untuk kata sandi saya, yang saya masukkan, tetapi tidak berfungsi (saya menggunakan kata sandi kunci pribadi yang saya tetapkan)

Juga, saya telah menonaktifkan kata sandi pengguna menggunakan

$ passwd -l user

Apa yang saya lewatkan?

Di suatu tempat, pernyataan awal saya disalahpahami ...

Saya mencoba mengeraskan sistem saya ... tujuan utamanya adalah menggunakan kunci pub / pribadi untuk melakukan login versus otentikasi kata sandi sederhana. Saya telah menemukan cara mengatur semua itu melalui file Authorized_key.

Selain itu saya pada akhirnya akan mencegah login server melalui akun root. Tetapi sebelum saya melakukan itu saya perlu sudo bekerja untuk pengguna kedua (pengguna yang saya akan masuk ke sistem dengan semua waktu).

Untuk pengguna kedua ini saya ingin mencegah login kata sandi reguler dan hanya memaksa login kunci priv / pub, jika saya tidak mengunci pengguna melalui "passwd -l user ... maka jika saya tidak menggunakan kunci, saya masih bisa masuk ke server dengan kata sandi biasa.

Tapi yang lebih penting saya perlu membuat sudo bekerja dengan pub / setup kunci pribadi dengan pengguna yang passwordnya dinonaktifkan.


Sunting: Oke, saya pikir saya sudah mendapatkannya (solusinya):

1) Saya telah menyesuaikan / etc / ssh / sshd_config dan mengatur PasswordAuthentication no Ini akan mencegah login kata sandi ssh (pastikan untuk memiliki pengaturan kunci publik / pribadi yang berfungsi sebelum melakukan ini

2) Saya telah menyesuaikan daftar sudoers visudodan menambahkan

root      ALL=(ALL) ALL
dimas     ALL=(ALL) NOPASSWD: ALL

3) root adalah satu-satunya akun pengguna yang akan memiliki kata sandi, saya menguji dengan dua akun pengguna "dimas" dan "sherry" yang tidak memiliki set kata sandi (kata sandi kosong, passwd -d user)

Hal di atas pada dasarnya mencegah semua orang masuk ke sistem dengan kata sandi (kunci publik / pribadi harus disiapkan).

Selain itu pengguna dalam daftar sudoers memiliki kemampuan admin. Mereka juga dapat suke akun yang berbeda. Jadi pada dasarnya "dimas" dapat sudo su sherry, namun "dimas TIDAK dapat melakukan su sherry. Demikian pula setiap pengguna TIDAK dalam daftar sudoers TIDAK dapat melakukan su useratau sudo su user.

CATATAN Pekerjaan di atas tetapi dianggap keamanannya buruk. Setiap skrip yang dapat mengakses kode sebagai pengguna "dimas" atau "sherry" akan dapat menjalankan sudo untuk mendapatkan akses root. Bug di ssh yang memungkinkan pengguna jarak jauh untuk masuk meskipun ada pengaturan, eksekusi kode jarak jauh dalam sesuatu seperti Firefox, atau kesalahan lain yang memungkinkan kode yang tidak diinginkan dijalankan karena pengguna sekarang dapat dapat berjalan sebagai root. Sudo harus selalu memerlukan kata sandi atau Anda juga dapat login sebagai root alih-alih beberapa pengguna lain.

farinspace
sumber

Jawaban:

10

sshdan sudotidak ada hubungannya satu sama lain. Menyiapkan sshmetode otentikasi tidak akan melakukan apa pun untuk sudo. sudotidak akan mengerti sshkata sandi.

passwd -ldimaksudkan untuk mengunci akun pengguna, sehingga ia tidak dapat lagi mengotentikasi dengan kata sandi. Itu kebalikan dari yang Anda inginkan, yaitu membiarkan pengguna mengotentikasi tanpa kata sandi.

Saya pikir yang Anda inginkan adalah NOPASSWDopsi di file Andasudoers .

(PS, tidak ada alasan untuk menjalankan cdperintah sudo. cdTidak merambat ke proses induk, jadi segera setelah sudokeluar, Anda kembali ke tempat Anda memulai.)

Sunting: Anda terus mengatakan bahwa Anda ingin mengunci kata sandi akun dan ingin sudo memahami kunci publik / pribadi. Maaf, sudo tidak akan menggunakan kunci ssh. Bukan ssh. Jika Anda tidak ingin pengguna dapat masuk dengan kata sandi mereka, saya pikir jawabannya adalah untuk menonaktifkan otentikasi kata sandi ssh , bukan untuk mengunci akun. Kemudian Anda dapat menyimpan kata sandi untuk pengguna, yang dapat mereka gunakan untuk sudo setelah mereka masuk melalui ssh official_keys.

pemain coneslayer
sumber
ok, tetapi apakah fakta bahwa pengguna tidak memiliki kata sandi melalui: passwd -l user ... menyebabkan perintah sudo tidak berfungsi?
farinspace
@farinspace Ya, saya memahami pertanyaan dengan lebih baik dan secara substansial telah memperluas komentar saya. passwd -lmenghapus kata sandi dalam arti bahwa akun tersebut TERKUNCI - artinya, kata sandi tidak akan berfungsi. Anda ingin mematikan otentikasi kata sandi di sudo.
pemain coneslayer
bagaimana logika ini: mematikan kata sandi dalam file sudoers akan tetap aman, karena sistem dikeraskan melalui pub / login kunci pribadi ... dan sekali lagi hanya admin yang dapat menambahkan pengguna ke daftar sudoers
farinspace
ketika menggunakan kunci pribadi adalah tipikal untuk menetapkan kata sandi, atau cukup aman untuk tidak mengatur dan memotong entri kata sandi pada login server
farinspace
4
@coneslayer balasan ini tidak 100% akurat. Seperti yang Anda lihat di bawah, sudo dapat dikonfigurasi untuk menghormati otentikasi ssh.
Andre de Miranda
18

Apa yang ingin Anda lakukan adalah mungkin tetapi itu akan memerlukan beberapa pengalaman karena Anda harus mengkompilasi modul PAM yang disebut pam-ssh-agent-auth .

Prosesnya cukup sederhana:

$ sudo aptitude install libssl-dev libpam0g-dev build-essential checkinstall
$ wget "http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v0.9.3/pam_ssh_agent_auth-0.9.3.tar.bz2"
$ tar -xjvf pam_ssh_agent_auth-0.9.3.tar.bz2
$ cd pam_ssh_agent_auth-0.9.3

$ ./configure --libexecdir=/lib/security --with-mantype=man

$ make
$ sudo checkinstall

Edit konfigurasi sudo:

$ sudo visudo

Tambahkan yang berikut ini:

Defaults env_keep += SSH_AUTH_SOCK

Lanjutkan dengan mengubah pengaturan PAM sudo:

$ sudo vi /etc/pam.d/sudo

Tambahkan (tepat di atas garis sertakan @):

**auth [success=2 default=ignore] pam_ssh_agent_auth.so file=~/.ssh/authorized_keys**
@include common-auth
@include common-account
Andre de Miranda
sumber
4
Ini seharusnya jawaban yang diterima
Christopher Monsanto
1
Instruksi ini (terutama /etc/pam.d/sudoinstruksi) sudah ketinggalan zaman untuk versi Ubuntu saat ini. Saya telah memberikan instruksi yang diperbarui dalam jawaban saya.
Chris Pick
4

Jawaban Andre de Miranda memberikan solusi yang bagus menggunakan pam_ssh_agent_auth , tetapi bagian-bagiannya sudah ketinggalan zaman. Terutama /etc/pam.d/sudoinstruksi ketika menggunakan banyak versi Linux saat ini.

Jika Anda menjalankan Ubuntu 12.04 tepat, saya sebenarnya telah menyederhanakan prosesnya dengan menyediakan pam_ssh_agent_auth yang dibuat dari ppa: ppa: cpick / pam-ssh-agent-auth .

Anda dapat menginstal paket dengan menjalankan:

sudo add-apt-repository ppa:cpick/pam-ssh-agent-auth
sudo apt-get install pam-ssh-agent-auth

Setelah instalasi, jika Anda ingin menggunakan modul PAM ini dengan sudo Anda harus mengkonfigurasi pengaturan sudo dan konfigurasi PAM, di Ubuntu 12,04 tepatnya Anda dapat melakukannya dengan membuat dua file berikut:

/etc/sudoers.d/pam-ssh-agent-auth:

Defaults    env_keep+="SSH_AUTH_SOCK"

/etc/pam.d/sudo:

ent#%PAM-1.0

auth       required   pam_env.so readenv=1 user_readenv=0
auth       required   pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth       sufficient pam_ssh_agent_auth.so file=/etc/security/authorized_keys
@include common-auth
@include common-account
@include common-session-noninteractive

Jika Anda menggunakan chef, proses di atas dapat diotomatiskan dengan buku masak saya, ditemukan di salah satu dari dua lokasi berikut:
https://github.com/cpick/pam-ssh-agent-auth
http: //community.opscode .com / buku masak / pam-ssh-agent-auth .

Direktori buku masak filesberisi file /etc/pam.d/sudodan /etc/sudoers.d/pam-ssh-agent-authdijelaskan di atas yang bekerja dengan Ubuntu 12.04 tepat dan harus menjadi titik awal yang bermanfaat ketika menggunakan versi / distro lain.

Chris Pick
sumber
-1

Satu-satunya cara yang saya tahu untuk memotong kata sandi adalah dengan menonaktifkannya di sudoersfile Anda .

Sesuatu seperti ini akan memberi rootdan semua anggota akses wheel penuh tanpa kata sandi:

root    ALL=(ALL)   NOPASSWD: ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

Ini sama sekali tidak disarankan . Jika Anda memiliki perintah khusus untuk dijalankan oleh server ini, beri mereka akses hanya ke perintah itu. Atau lebih baik lagi, temukan cara lain untuk mencapai apa yang ingin Anda lakukan yang tidak perlu membuat lubang keamanan.

Jack M.
sumber
saya tidak keberatan menggunakan kata sandi, masalahnya tampaknya adalah setelah saya menonaktifkan kata sandi pengguna melalui: passwd -l pengguna ... Saya masih bisa masuk ke sistem melalui kunci pub / pribadi (kunci pribadi memiliki kata sandi yang aman) , ketika saya melakukan sudo ia meminta kata sandi tapi ini bukan kata sandi dari kunci privat, di mana kata sandi ini diset jika saya menonaktifkannya untuk pengguna (saya lebih suka mencoba untuk tidak memelihara kata sandi pada sistem dan pada kunci pribadi)
farinspace
"Di mana kata sandi ini ditetapkan jika saya menonaktifkannya untuk pengguna?" Tidak ada tempat Tidak ada kata sandi yang dapat Anda ketik yang akan berfungsi, karena Anda telah mengunci akun.
pemain coneslayer
Anda harus mengaktifkan kembali akun pada sistem jarak jauh dan kemudian mengatur kata sandi. Either way, Anda tentu harus menjaga kata sandi di kedua mesin. Jika tidak ada alasan lain selain login lokal jika ada kesalahan.
Jack M.