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 root
sebagai 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 -d
karena 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 -l
karena 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 su
atau 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 -d
untuk alasan yang sama. Kita tidak dapat menggunakan passwd -u
karena hanya mengeluh bahwa itu akan mengarah pada apa yang passwd -d
terjadi.
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
, sudo
dan 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.
Jawaban:
Persyaratan yang akan saya tawarkan solusinya, sebagai poin:
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/securetty
file 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/login
Saya memiliki serangkaian garis standar untuk otentikasi (yang dimulai dengan kata kunciauth
):common-auth
File include yang direferensikan berisi baris yang relevan berikut:The
common-auth
File menginstruksikan PAM untuk melewatkan satu aturan (deny) jika "UNIX login" berhasil. Biasanya ini berarti kecocokan dalam/etc/shadow
.The
auth ... pam_securetty.so
garis dikonfigurasi untuk mencegah login root kecuali pada perangkat tty ditentukan dalam/etc/securetty
. (File ini sudah termasuk semua perangkat konsol.)Dengan
auth
sedikit memodifikasi baris ini, Anda dapat menentukan aturan yang mengizinkan login root tanpa kata sandi dari perangkat tty yang ditentukan di/etc/securetty
. Thesuccess=ok
parameter perlu diubah sehinggaok
diganti dengan jumlahauth
baris yang akan dilewati dalam hal pertandingan sukses. Dalam situasi yang ditunjukkan di sini, angka itu adalah3
, yang melompat turun keauth ... pam_permit.so
garis:Login remote root tanpa password dari pengguna yang diotorisasi
Ini adalah pemasukan langsung dari kunci ssh untuk pengguna yang diberi otorisasi ditambahkan ke
authorized_keys
file 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_keys
file 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_keys
file pengguna baru . Apa yang tidak begitu jelas adalah bahwa pendekatan ini hanya tersedia ketikaUsePAM Yes
diatur/etc/ssh/sshd_config
. PAM membedakan!
sebagai "akun dikunci untuk kata sandi tetapi metode akses lain mungkin diizinkan" dan!...
"akun dikunci. Periode." (JikaUsePAM No
diatur, 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_keys
file 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).sumber
.ssh/authorized_keys
file tersebut berisi kunci publik yang relevan. Apakah ini membantu?!
di bidang kata sandi di/etc/shadow
. Menurut halaman manual ini menunjukkan akun yang valid tanpa kata sandi yang cocok.Sepertinya Anda menginginkan akun pengguna nyata (non-root) dengan kunci ssh dan
NOPASSWD
akses penuh viasudo
(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 berjalansudo -s
atau pengguna~/.bash_profile
hanya berisi perintah itu.Sudo
Tambahkan setiap pengguna ke
sudo
grup 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/groups
secara langsung).Di
/etc/sudoers
atau/etc/sudoers.d/local
, Anda ingin garis seperti ini:Jika Anda ingin akses root otomatis, tambahkan ini ke profil pengguna. Sebab
bash
, itu akan menjadi~/.bash_profile
:Ini akan memungkinkan Anda untuk melihat siapa yang login (coba
who
ataulast
) 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 adilbob::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/shadow
dan 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:(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 menggunakanSALT
garam Anda!)SSH
ssh
Konfigurasi daemon Anda hidup di dalam/etc/sshd_config
atau/etc/ssh/sshd_config
. Untuk keamanan yang tepat, saya sarankan itu termasuk baris berikut: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
ssh
karena 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
Ini menghasilkan kunci pribadi di
$HOME/.ssh/id_rsa
dan 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/.ssh
harus mode 700, mismkdir -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
passwd
dari 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_profile
memiliki dua baris di bagian bawah:passwd
dan kemudianmv ~/.bash_profile.real ~/.bash_profile
mereka 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_keys
file 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_keys
file pengguna itu . Jika Anda memiliki pelanggaran keamanan, Anda memiliki log yang menunjukkan siapa yang masuk.sumber
passwd -d
dalam pertanyaan, memungkinkansu
untuk 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.