Pendekatan yang konsisten dan aman untuk akun tanpa kata sandi dengan SSH

12

Saya harus mengakui bahwa saya suka server tanpa kata sandi dalam beberapa kasus. Server tipikal rentan terhadap siapa pun yang memiliki akses fisik ke sana. Jadi dalam beberapa kasus praktis untuk menguncinya secara fisik dan sejak itu memercayai akses fisik apa pun .

Konsep dasar

Secara teori, ketika saya secara fisik mencapai server seperti itu, saya harus dapat melakukan tugas-tugas administrasi tanpa kata sandi hanya dengan mengetik rootsebagai login dan saya tidak boleh diminta kata sandi. Hal yang sama mungkin berlaku untuk akun pengguna tetapi orang tidak akan mengaksesnya secara fisik. Karenanya tidak diperlukan kata sandi sistem untuk akses lokal (sesekali).

Saat mengakses server dari jarak jauh, baik untuk administrasi, atau untuk akun pengguna, saya berharap untuk selalu menggunakan kunci pribadi SSH. Sangat mudah untuk membuat kunci SSH untuk akun yang baru saja dibuat dan karenanya tidak diperlukan kata sandi sistem untuk akses jarak jauh (reguler).

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

Kesimpulannya adalah, secara teori, kami tidak akan membutuhkan kata sandi sistem apa pun untuk kasus penggunaan seperti itu. Jadi pertanyaannya adalah, bagaimana kita mengkonfigurasi sistem dan akun pengguna untuk mewujudkannya secara konsisten dan aman.

Detail akses lokal

Bagaimana kami memastikan akun root dapat diakses secara lokal tanpa kata sandi? Saya tidak berpikir kita dapat menggunakan passwd -dkarena itu akan membuat akses root terlalu permisif dan pengguna yang tidak berhak dapat beralih ke root secara gratis, yang salah. Kami tidak dapat menggunakan passwd -lkarena mencegah kami dari masuk.

Perhatikan bahwa akses lokal secara eksklusif tentang akses menggunakan keyboard lokal. Oleh karena itu solusi yang valid tidak boleh mengizinkan pengguna beralih (baik menggunakan suatau sudo).

Detail akses jarak jauh

Sampai baru-baru ini solusi di atas akan berfungsi tetapi sekarang SSH mulai memeriksa akun pengguna yang terkunci. Kami mungkin tidak dapat menggunakan passwd -duntuk alasan yang sama. Kita tidak dapat menggunakan passwd -ukarena hanya mengeluh bahwa itu akan mengarah pada apa yang passwd -dterjadi.

Ada solusi untuk kata sandi boneka untuk bagian ini.

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

Mungkin juga untuk mematikan akun terkunci yang diperiksa di SSH sepenuhnya tetapi akan lebih baik untuk mempertahankan dukungan akun yang terkunci dan hanya dapat membuka kunci mereka.

Catatan akhir

Yang saya minati adalah solusi yang memungkinkan Anda untuk masuk ke akun root secara lokal dan semua akun termasuk root dari jarak jauh, tanpa kata sandi. Di sisi lain, solusi tidak boleh berdampak pada keamanan kecuali dengan cara yang dijelaskan secara eksplisit, terutama tidak dengan memungkinkan pengguna jarak jauh untuk mendapatkan akses ke akun root atau akun pengguna lain. Solusinya harus cukup kuat sehingga tidak menyebabkan masalah keamanan secara tidak langsung.

Jawaban yang diterima dan diberikan mungkin atau tidak menggambarkan konfigurasi terperinci dari masing-masing alat tetapi harus mengandung poin-poin kunci untuk mencapai tujuan yang dinyatakan. Perhatikan bahwa ini mungkin tidak dapat diselesaikan melalui penggunaan konvensional alat-alat seperti passwd, ssh, su, sudodan sejenisnya.

Lebih banyak ide setelah membaca jawaban pertama

Hanya sebuah ide - akses root lokal dapat dicapai dengan memulai shell root alih-alih proses login. Tetapi masih ada kebutuhan untuk mengunci hanya otentikasi kata sandi, bukan otentikasi kunci publik.

Pavel Šimerda
sumber
Gunakan konfigurasi PAM khusus untuk akses lokal tanpa kata sandi dan lakukan hal yang sama untuk masuknya sudo dan SSH.
0xC0000022L

Jawaban:

5

Persyaratan yang akan saya tawarkan solusinya, sebagai poin:

  1. Login konsol root tanpa kata sandi
  2. Login remote root tanpa password dari pengguna yang diotorisasi
  3. Login jarak jauh tanpa kata sandi untuk akun yang ditentukan dari pengguna pra-otorisasi
  4. Login jarak jauh tanpa kata sandi untuk akun apa pun dari pengguna pra-resmi

Contoh-contoh berikut didasarkan pada Debian, karena itulah yang saya dapatkan di sini untuk pengujian. Namun, saya tidak melihat alasan mengapa prinsip-prinsip tersebut tidak dapat diterapkan pada distribusi apa pun (atau memang turunan PAM * ix).

Login konsol root tanpa kata sandi

Saya pikir cara saya akan mendekati ini adalah dengan memanfaatkan PAM dan /etc/securettyfile konfigurasi.

Sebagai prasyarat, kata sandi root "cukup aman" harus disetel. Ini tidak diperlukan untuk masuk konsol tetapi ada untuk membuat upaya pemecahan brute force tidak realistis. Akun tersebut sebaliknya merupakan akun root yang sangat normal.

Di /etc/pam.d/loginSaya memiliki serangkaian garis standar untuk otentikasi (yang dimulai dengan kata kunci auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

common-authFile include yang direferensikan berisi baris yang relevan berikut:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

The common-authFile menginstruksikan PAM untuk melewatkan satu aturan (deny) jika "UNIX login" berhasil. Biasanya ini berarti kecocokan dalam /etc/shadow.

The auth ... pam_securetty.sogaris dikonfigurasi untuk mencegah login root kecuali pada perangkat tty ditentukan dalam /etc/securetty. (File ini sudah termasuk semua perangkat konsol.)

Dengan authsedikit memodifikasi baris ini, Anda dapat menentukan aturan yang mengizinkan login root tanpa kata sandi dari perangkat tty yang ditentukan di /etc/securetty. The success=okparameter perlu diubah sehingga okdiganti dengan jumlah authbaris yang akan dilewati dalam hal pertandingan sukses. Dalam situasi yang ditunjukkan di sini, angka itu adalah 3, yang melompat turun ke auth ... pam_permit.sogaris:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

Login remote root tanpa password dari pengguna yang diotorisasi

Ini adalah pemasukan langsung dari kunci ssh untuk pengguna yang diberi otorisasi ditambahkan ke authorized_keysfile root .

Login jarak jauh tanpa kata sandi untuk akun yang ditentukan dari pengguna pra-otorisasi

Ini juga merupakan pemasukan langsung dari kunci ssh untuk pengguna yang berwenang ditambahkan ke .ssh/authorized_keysfile pengguna yang sesuai dan sesuai . ( Khasiat pengguna jarak jauh yang khas menginginkan login tanpa kata sandi ke skenario pengguna khalayak pengguna lokal .)

Perhatikan bahwa akun dapat tetap dalam status terkunci default setelah pembuatan (yaitu dengan hanya !di bidang kata sandi untuk /etc/shadow) tetapi mengizinkan login berbasis kunci SSH. Ini membutuhkan root untuk menempatkan kunci di .ssh/authorized_keysfile pengguna baru . Apa yang tidak begitu jelas adalah bahwa pendekatan ini hanya tersedia ketika UsePAM Yesdiatur /etc/ssh/sshd_config. PAM membedakan !sebagai "akun dikunci untuk kata sandi tetapi metode akses lain mungkin diizinkan" dan !..."akun dikunci. Periode." (Jika UsePAM Nodiatur, maka OpenSSH mempertimbangkan keberadaan !memulai bidang kata sandi untuk mewakili akun yang terkunci.)

Login jarak jauh tanpa kata sandi untuk akun apa pun dari pengguna pra-resmi

Tidak sepenuhnya jelas bagi saya apakah Anda menginginkan fasilitas ini atau tidak. Yaitu, pengguna resmi tertentu dapat ssh masuk tanpa kata sandi ke setiap akun lokal.

Saya tidak dapat menguji skenario ini, tetapi saya percaya ini dapat dicapai dengan OpenSSH 5.9 atau lebih baru, yang memungkinkan beberapa authorized_keysfile untuk didefinisikan /etc/ssh/sshd_config. Edit file konfigurasi untuk memasukkan file kedua yang disebut /etc/ssh/authorized_keys. Tambahkan kunci publik pengguna resmi terpilih Anda ke file ini, memastikan izin sedemikian rupa sehingga dimiliki oleh root dan hanya memiliki akses tulis oleh root (0644).

roaima
sumber
Saya harus memeriksa # 1 lebih hati-hati dan mengujinya. Ini terlihat sangat menarik, meskipun masih membutuhkan kata sandi (kuat) yang dikonfigurasi. # 3 tidak lengkap karena saat ini pengguna yang baru dibuat dikunci secara default juga dari login SSH. Saya tidak benar-benar meminta poin # 4 tetapi itu terlihat sangat menarik dan saya mungkin menggunakan metode tersebut, sebenarnya.
Pavel Šimerda
Kata sandi yang kuat untuk root diperlukan tetapi tidak pernah digunakan. Saya berasumsi Anda tahu bagaimana menerapkan # 3; beri tahu saya jika Anda membutuhkan lebih banyak detail. Pada sistem (Debian) dimungkinkan untuk ssh masuk ke akun baru yang belum memiliki kata sandi, asalkan .ssh/authorized_keysfile tersebut berisi kunci publik yang relevan. Apakah ini membantu?
roaima
Saya pikir saya perlu cara yang bagus dan standar untuk memulihkan perilaku yang Anda lihat di Debian, yaitu bahwa akun yang baru dibuat hanya dikunci untuk otentikasi kata sandi dan bukan untuk yang kunci publik.
Pavel Šimerda
Untuk akun pengguna uji yang saya buat untuk mengonfirmasi pernyataan ssh di komentar saya sebelumnya, saya melihat satu !di bidang kata sandi di /etc/shadow. Menurut halaman manual ini menunjukkan akun yang valid tanpa kata sandi yang cocok.
roaima
1
Itu menarik, itu benar-benar tidak begitu jelas setidaknya, terima kasih.
Pavel Šimerda
1

Sepertinya Anda menginginkan akun pengguna nyata (non-root) dengan kunci ssh dan NOPASSWDakses penuh via sudo(yang tersedia secara default di sebagian besar distro Linux hari ini dan juga sepele untuk menginstal secara manual). Anda dapat memiliki kata sandi kosong untuk setiap akun pengguna (yang tidak akan berfungsi dari jarak jauh), maka pengguna dapat berjalan sudo -satau pengguna ~/.bash_profilehanya berisi perintah itu.

Sudo

Tambahkan setiap pengguna ke sudogrup UNIX (mis. usermod -a -G sudo USERNAME, Meskipun sistem yang lebih lama akan memiliki cara yang kurang intuitif untuk melakukan ini; kasus terburuk, Anda mengedit /etc/groupssecara langsung).

Di /etc/sudoersatau /etc/sudoers.d/local, Anda ingin garis seperti ini:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Jika Anda ingin akses root otomatis, tambahkan ini ke profil pengguna. Sebab bash, itu akan menjadi ~/.bash_profile:

sudo -s

Ini akan memungkinkan Anda untuk melihat siapa yang login (coba whoatau last) dan akan meninggalkan login /var/log/auth.log.

Login tanpa kata sandi

Pada sistem yang jauh lebih tua, Anda bisa mengedit /etc/passwd(atau pada sistem yang sedikit lebih tua /etc/shadow) , dan menghapus hash, jadi mis. bob:$1$salt$hash:12345:0:99999:7:::Menjadi adil bob::12345:0:99999:7:::. Ini yang kamu butuhkan. Sistem modern tidak suka ini. Kemungkinan ada cara lain untuk melakukan ini, tetapi cara saya baru saja memverifikasi adalah sebagai berikut (sumber: Barang Acak Leo ) :

Buka /etc/shadowdan amati akun dengan informasi nyata. Ini akan mencakup tiga elemen yang dibatasi oleh tanda dolar ( $). Ini mewakili mekanisme hashing, kemudian garam , lalu hash. Perhatikan garamnya, lalu jalankan ini:

openssl passwd -1 -salt SALT

(Ini menggunakan MD5 sebagai mekanisme hashing. Ini adalah kata sandi kosong, jadi Anda tidak keberatan.) Saat diminta kata sandi, tekan enter. Simpan string itu, termasuk titik-titik yang tertinggal, dan rekatkan setelah titik dua pertama pada baris pengguna tersebut /etc/shadow(ini harus mengganti konten yang sudah ada sebelumnya antara titik dua pertama dan kedua). (Tolong jangan benar-benar menggunakan SALTgaram Anda!)

SSH

sshKonfigurasi daemon Anda hidup di dalam /etc/sshd_configatau /etc/ssh/sshd_config. Untuk keamanan yang tepat, saya sarankan itu termasuk baris berikut:

PermitRootLogin no
PermitEmptyPasswords no

Lihat penulisan Secure Secure Shell untuk langkah-langkah keamanan tambahan yang dapat Anda tambahkan ke konfigurasi ssh Anda untuk mengeraskannya lebih baik terhadap penyerang canggih.

Sekarang pengguna Anda tidak dapat masuk sshkarena memiliki kata sandi kosong (ini adalah langkah pengamanan yang diperlukan). Ini berarti mereka hanya bisa masuk dengan kunci ssh.

Setiap pengguna, untuk masing-masing sistem klien mereka, harus membuat pasangan kunci ssh, misalnya

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Ini menghasilkan kunci pribadi di $HOME/.ssh/id_rsadan kunci publik di $HOME/.ssh/id_rsa.pub. Minta pengguna mengirimkan kunci publik mereka dan menambahkannya ke server ini $HOME/.ssh/authorized_keys(perhatikan bahwa setiap pengguna $HOME/.sshharus mode 700, mis mkdir -p ~user/.ssh && chmod 700 ~user/.ssh.).

Pengguna yang tidak ingin kunci ssh dapat berjalan ke sistem fisik. Di sana, kata sandi kosong mereka akan masuk, pada titik mana mereka dapat mengetik passwddari shell dan mengatur kata sandi, sehingga memungkinkan mereka mengakses jarak jauh.

(Saya benar-benar menggunakan teknik ini untuk memberi orang akses ke kumpulan sistem kembali ketika saya menjalankan departemen TI. Ini memaksa pengguna untuk menggunakan kunci ssh dan saya tidak harus memberi mereka kata sandi. Inisial mereka ~/.bash_profilememiliki dua baris di bagian bawah: passwddan kemudian mv ~/.bash_profile.real ~/.bash_profilemereka menetapkan kata sandi baru saat login pertama kali.)

Risiko

Anda menaruh kepercayaan penuh pada pengguna Anda. Tidak ada yang menghentikan pengguna dari mengacaukan ~/.ssh/authorized_keysfile pengguna lain dan dengan demikian mengubah kemampuan Anda untuk mencabut dan mengaudit akses, tetapi ini tidak dapat dihindari jika Anda memberikan akses root penuh.

Kesimpulan

Setiap pengguna sekarang menjadi anggota grup sudo dan memiliki akses penuh tanpa kata sandi ke shell root. Pengguna ini tidak memiliki kata sandi untuk akun mereka dan dapat login dari jarak jauh menggunakan kunci ssh.

Jika Anda kehilangan salah satu karyawan Anda, Anda dapat menghapus akunnya. Jika salah satu laptop karyawan Anda dicuri, Anda dapat menghapus kunci ssh laptop itu dari authorized_keysfile pengguna itu . Jika Anda memiliki pelanggaran keamanan, Anda memiliki log yang menunjukkan siapa yang masuk.

Adam Katz
sumber
Bagian tentang sudo melewatkan pertanyaan karena secara eksklusif tentang login baru, bukan beralih pengguna. Mengubah pertanyaan agar lebih jelas. Bagian tentang login tanpa kata sandi menunjukkan perilaku salah yang sama persis seperti passwd -ddalam pertanyaan, memungkinkan suuntuk beralih ke pengguna itu tanpa kata sandi. Bagian risiko menjelaskan dua hal (mengacaukan data pengguna lain dan mendapatkan akses root) yang penghapusannya adalah inti dari pertanyaan itu. Oleh karena itu, sementara masing-masing bagian ditulis dengan baik, ini tidak berarti jawaban untuk pertanyaan itu.
Pavel Šimerda
Saya berasumsi Anda akan menambahkan pengguna dan kemudian membatasi pengguna.
Adam Katz