Mengehadkan percubaan kata laluan dalam Linux bukan sekadar kebiasaan pentadbir paranoid; ia merupakan salah satu langkah paling berkesan untuk membendung serangan brute-force dan akses tanpa kebenaran, baik pada desktop mahupun pelayan. Jika komputer anda mengandungi maklumat sensitif atau bersambung ke internet, anda perlu mengamankan aspek sistem ini dan mengaudit rangkaian setempat anda.
Selain menggunakan kata laluan yang kukuh, mengkonfigurasi kunci sementara atau kekal selepas beberapa percubaan yang gagal adalah penting: ia memperlahankan penyerang, menjana lebih banyak log untuk pengauditan dan membolehkan anda menggabungkan perlindungan ini dengan dasar kata laluan lain (tamat tempoh, kerumitan, penggunaan semula, dll.). Mari kita lihat secara terperinci bagaimana ini dilakukan dalam pengedaran yang berbeza dan pada tahap sistem yang berbeza.
Penguncian akaun disebabkan percubaan log masuk yang gagal pada Red Hat, CentOS dan derivatif
Dalam pengedaran berasaskan Red Hat (RHEL, CentOS, Rocky, AlmaLinux, dll.) , penguncian akaun untuk percubaan log masuk yang gagal diuruskan oleh modul PAM pam_faillock . Modul ini mengawal bilangan percubaan gagal yang dibenarkan, tempoh akaun dikunci dan pengguna mana yang terjejas (termasuk, jika dikehendaki, pengguna root).
Untuk menggunakan dasar ini, anda perlu mengedit fail PAM global, biasanya /etc/pam.d/system-auth dan, dalam beberapa versi, juga /etc/pam.d/password-auth . Fail-fail ini bertindak sebagai templat untuk kebanyakan perkhidmatan pengesahan pada sistem (log masuk konsol, sudo, SSH, dll.).
Fail-fail ini menambah baris yang serupa dengan ini, dalam bahagian auth dan account :
auth required pam_faillock.so preauth silent audit deny=2 unlock_time=120
auth pam_faillock.so authfail audit deny=2 unlock_time=120
account required pam_faillock.so
Baris kod pertama beroperasi sebelum pengesahan sebenar (pra-autorisasi) , baris kedua dilaksanakan apabila pengesahan gagal dan baris ketiga menyemak status kunci akaun semasa fasa akaun . Dengan mengubah suai parameter, anda boleh melaraskan dasar mengikut keperluan anda.
Parameter pam_faillock yang paling biasa ialah:
- audit: Membolehkan pengelogan terperinci percubaan log masuk, supaya jejak ditinggalkan dalam log sistem (contohnya, dalam / var / log / selamat).
- tolak=2Ini menetapkan bilangan maksimum percubaan kata laluan yang gagal sebelum akaun dikunci. Dalam contoh ini, ia adalah 2, tetapi anda boleh meningkatkannya (3, 5, 10…).
- masa_buka_buka=120: menunjukkan masa sekatan dalam saat. Di sini, ia akan mengambil masa 120 saat (2 minit) sehingga akaun diaktifkan semula secara automatik.
- senyapJika ia hadir, Ia tidak menunjukkan kepada pengguna bahawa mereka telah disekatIa hanya berhenti menerima log masuk, menjadikan sistem kurang "berjela" kepada penyerang.
Satu butiran penting ialah, secara lalai, root dikecualikan daripada sekatan ini . Jika anda mahu peraturan yang sama terpakai padanya juga, anda perlu menambah parameter `even_deny_root` pada baris `pam_faillock` dalam bahagian `auth`. Ini mengukuhkan keselamatan, tetapi anda harus mempertimbangkan risiko kehilangan akses jika anda membuat terlalu banyak kesilapan.
Apabila akaun dikunci dan anda tidak menggunakan parameter senyap , sistem mungkin memaparkan mesej eksplisit yang memberi amaran bahawa pengguna telah melebihi bilangan percubaan log masuk yang dibenarkan. Ini berguna dalam persekitaran ujian untuk mengesahkan konfigurasi, walaupun dalam pengeluaran biasanya lebih baik untuk tidak memberikan terlalu banyak maklumat.
Untuk melihat percubaan log masuk yang gagal untuk pengguna tertentu, pada sistem Red Hat anda boleh menggunakan arahan faillock , yang menunjukkan akaun yang anda minati:
faillock --user lionel
Arahan ini menunjukkan berapa banyak percubaan log masuk yang gagal telah dikumpulkan oleh pengguna , dari alamat IP mana dalam kes SSH, dan butiran lain yang berkaitan dengan pengauditan. Di samping itu, anda sentiasa boleh menyemak log dalam /var/log/secure , tempat peristiwa keselamatan ini direkodkan.

Penguncian akaun disebabkan percubaan log masuk yang gagal dalam Debian dan Ubuntu
Dalam kes Debian, Ubuntu dan derivatif , logiknya adalah serupa, tetapi modul PAM yang digunakan berbeza. Secara tradisinya , pam_tally2 telah digunakan untuk mengira percubaan log masuk yang gagal dan menyekat akaun secara automatik, walaupun dalam versi moden, penghijrahan ke pam_faillock adalah disyorkan . Walaupun begitu, pam_tally2 kekal lazim dalam banyak panduan dan persekitaran.
Untuk melaksanakan penyekatan berdasarkan bilangan percubaan pengesahan yang gagal dalam sistem Debian biasa, anda biasanya akan mengedit fail `/etc/pam.d/common -auth` , yang mentakrifkan dasar pengesahan standard untuk kebanyakan perkhidmatan setempat. Anda boleh menambah baris seperti ini padanya:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=120 audit even_deny_root root_unlock_time=600
Dengan konfigurasi ini, sistem akan mengunci akaun selepas 3 percubaan gagal , mengekalkan kunci selama 120 saat untuk pengguna biasa dan selama 600 saat untuk root. Tambahan pula, jika ralat berlaku dengan modul ( onerr=fail ), akses akan ditolak dan bukannya dibenarkan atas sebab keselamatan.
Parameter utama pam_tally2 ialah:
- onerr=gagalJika terdapat masalah membaca atau mengemas kini kaunter percubaan, pengesahan akan ditolak bagi mengelakkan pintu terbuka secara tidak sengaja.
- tolak=3Bilangan maksimum percubaan gagal yang dibenarkan sebelum akaun dikunci. Nilai 3 biasanya agak munasabah dalam praktiknya.
- masa_buka_buka=120: masa dalam saat akaun akan kekal dikunci untuk pengguna standard.
- audit: merekodkan maklumat kegagalan pengesahan (dalam Debian, ia biasanya /var/log/auth.log).
- walaupun_menafikan_akar: memaksa root juga dikira dalam sistem penguncian ini, sesuatu yang harus digunakan dengan berhati-hati.
- masa_buka_kunci_akar=600: masa kunci khusus untuk akaun root, dalam saat, bebas daripada pengguna lain.
Apabila sekatan diaktifkan, pengguna akan melihat mesej yang menunjukkan bahawa akaun mereka telah dinyahdayakan buat sementara waktu disebabkan terlalu banyak percubaan log masuk yang gagal. Ini membolehkan pentadbir mengesan tingkah laku yang mencurigakan dan memaklumkan pengguna bahawa ada sesuatu yang tidak kena.
Untuk melihat percubaan gagal yang direkodkan oleh pam_tally2 untuk pengguna tertentu (contohnya, lionel), anda boleh menggunakan:
pam_tally2 -u lionel
Arahan ini memaparkan bilangan kegagalan terkumpul dan, dengan pilihan tambahan, membolehkan anda menetapkan semula kaunter secara manual jika perlu. Tambahan pula, seperti Red Hat, anda sentiasa mempunyai pilihan untuk menyemak /var/log/auth.log untuk maklumat yang lebih terperinci tentang apa yang berlaku semasa setiap percubaan pengesahan.
Hadkan percubaan SSH dengan MaxAuthTries
Salah satu titik masuk yang paling biasa pada pelayan Linux ialah SSH , dan oleh itu adalah penting untuk mengawal berapa banyak percubaan pengesahan yang dibenarkan bagi setiap sambungan. Di sinilah arahan MaxAuthTries memainkan peranan, yang dikonfigurasikan dalam fail /etc/ssh/sshd_config pelayan OpenSSH.
Ideanya mudah: MaxAuthTries mentakrifkan bilangan maksimum percubaan pengesahan yang dibenarkan bagi setiap sambungan SSH . Jika had ini dilampaui, pelayan akan menamatkan sambungan, memaksa penyerang memulakan sesi baharu untuk terus mencuba kombinasi, yang akan memperlahankan serangan brute-force automatik dengan ketara.
Untuk mengkonfigurasinya, hanya edit fail konfigurasi:
sudo nano /etc/ssh/sshd_config
Seterusnya, cari atau tambahkan baris seperti ini:
MaxAuthTries 3
Dengan tetapan ini, hanya tiga percubaan pengesahan bagi setiap sambungan SSH dibenarkan . Jika pengguna memasukkan kelayakan yang salah lebih daripada tiga kali, daemon sshd akan menutup sesi tersebut. Agar perubahan berkuat kuasa, perkhidmatan mesti dimuat semula atau dimulakan semula, contohnya dengan:
sudo systemctl restart sshd
MaxAuthTries tidak menggantikan modul PAM seperti pam_tally2 atau pam_faillock, tetapi berfungsi secara selari . Pelayan SSH mengawal bilangan percubaan berturut-turut yang dibenarkan dalam satu sesi, manakala PAM menyimpan kiraan global bagi setiap pengguna dan boleh mengunci akaun mereka pada peringkat sistem.
Selain MaxAuthTries, adalah dinasihatkan untuk menggabungkan langkah-langkah keselamatan SSH yang lain untuk menjadikan perkhidmatan ini lebih mantap:
- Tukar port lalaiBerhenti menggunakan port 22 dan alihkan SSH ke port yang kurang jelas membantu menapis banyak imbasan automatik asas.
- Gunakan kunci awam dan bukannya hanya kata laluanPengesahan menggunakan kekunci SSH menghapuskan masalah kata laluan yang lemah dan jauh lebih kukuh terhadap serangan brute-force.
- Hadkan sumber menggunakan tembok api atau konfigurasikan DMZMembenarkan SSH hanya daripada alamat IP atau julat rangkaian tertentu menambah halangan yang sangat berkesan pada peringkat rangkaian.
Hadkan percubaan pengesahan setempat dengan PAM
Selain SSH, pengesahan setempat (konsol, TTY, sudo, pengurus paparan grafik) juga dikendalikan oleh PAM. Dalam Debian dan Ubuntu, sebagai contoh, fail /etc/pam.d/common-auth adalah teras konfigurasi ini, dan dalam sistem Red Hat, system-auth (dan kadangkala password-auth) memainkan peranan ini .
Selain modul penguncian khusus seperti pam_faillock atau pam_tally2, sesetengah pengedaran membenarkan anda mengehadkan percubaan log masuk dan tamat masa secara langsung menggunakan login.defs . Fail ini, yang terletak di /etc/login.defs , mengisytiharkan nilai seperti:
- LOGIN_RETRIES: bilangan percubaan semula maksimum yang dibenarkan pada gesaan log masuk sebelum menghentikan proses.
- LOGIN_TIMEOUT: masa maksimum, dalam saat, sesi log masuk dibenarkan untuk menunggu input pengguna.
Contohnya, jika anda menetapkan LOGIN_RETRIES kepada 3, pengguna hanya akan mempunyai tiga percubaan untuk memasukkan kata laluan mereka dalam satu sesi log masuk sebelum sistem menutup percubaan tersebut, memaksa mereka untuk memulakan semula proses tersebut. Ia tidak mengunci akaun itu sendiri, tetapi ia mengehadkan bilangan percubaan setiap sesi.
Dalam fail login.defs yang sama , anda juga boleh melaraskan parameter keselamatan lain yang berkaitan, seperti:
- LULUS_MAX_DAYS: bilangan maksimum hari kata laluan boleh digunakan sebelum ia terpaksa ditukar.
- LULUS_MINIT_HARI: bilangan hari minimum antara perubahan kata laluan, untuk mengelakkan perubahan yang terlalu kerap dan "berantai".
- LULUS_WARN_AGE: notis beberapa hari sebelum kata laluan tamat tempoh, supaya pengguna mempunyai masa untuk bertindak balas.
- LULUS_MIN_LEN y LULUS_MAX_LEN: panjang kata laluan minimum dan maksimum.
- LULUS_SELALU_BERAMARAN: memberi amaran apabila kata laluan tidak memenuhi kriteria kekuatan tertentu.
- LULUS_PERUBAHAN_PERCUBAAN: bilangan maksimum percubaan menukar kata laluan jika kata laluan baharu dianggap terlalu mudah.
- ENCRYPT_METHOD: algoritma hash yang digunakan untuk kata laluan (perkara biasa hari ini ialah SHA-512, ditunjukkan sebagai $ 6 $).
Arahan ini terutamanya memberi kesan kepada pengguna baharu yang dicipta selepas melaraskan login.defs, menjadikannya cara yang mudah untuk menetapkan dasar asas untuk seluruh organisasi.
Mengurus percubaan dan tamat tempoh dengan /etc/shadow dan arahan perubahan
Fail /etc/shadow ialah tempat sistem menyimpan kata laluan yang disulitkan untuk pengguna setempat, bersama-sama dengan semua maklumat tamat tempoh. Walaupun kata laluan ini tidak ditukar secara manual setiap hari, memahami strukturnya sangat membantu dalam mengaudit dan memperhalusi dasar keselamatan.
Setiap baris /etc/shadow mengandungi beberapa medan yang dipisahkan oleh titik bertindih. Medan yang paling relevan untuk dasar kami ialah:
- Nama pengguna: mengenal pasti akaun yang dimiliki oleh medan lain.
- Kata laluan yang disulitkan: disimpan sebagai $id$salt$hash, di mana $id$ menunjukkan algoritma ($1 MD5, $2a$/$2y$ Blowfish, $5 SHA-256, $6 SHA-512), diikuti dengan garam dan hash.
- Perubahan kata laluan terakhir: bilangan hari sejak 1 Januari 1970 (zaman) apabila ia diubah suai kali terakhir.
- Hari penggunaan minimum dan maksimumMereka mengawal bila kata laluan boleh ditukar semula dan bila ia tamat tempoh.
- Hari notis tamat tempoh: berapa hari sebelum tamat tempoh ia mula memberitahu pengguna.
- Hari-hari tidak aktifSetelah kata laluan tamat tempoh, berapa lama masa yang diperlukan sebelum akaun dinyahdayakan sepenuhnya?
- Tarikh luput akaun mutlak: juga dalam format hari sejak tahun 1970, menandakan detik apabila log masuk tidak lagi dibenarkan untuk pengguna tersebut.
Untuk mengurus parameter ini tanpa menyentuh /etc/shadow secara langsung, arahan ` tukar umur` digunakan , yang membolehkan anda melaraskan kata laluan dan tamat tempoh akaun untuk pengguna tertentu.
Antara pilihan perubahan biasa ialah:
- -d, –hari terakhir: menetapkan hari perubahan kata laluan terakhir (dalam hari sejak format zaman atau dengan tarikh yang boleh dibaca).
- -E, –tamat tempoh: menetapkan tarikh tamat tempoh akaun.
- -I, –tidak aktif: menandakan akaun sebagai tidak aktif selepas beberapa hari dari tarikh luput kata laluan.
- -m, –minggu: mentakrifkan bilangan hari minimum antara perubahan kata laluan.
- -M, –maxdays: menunjukkan bilangan hari maksimum kata laluan kekal sah.
- -W, –hari amaran: menetapkan berapa hari sebelum tamat tempoh ia akan mula memberi notis.
- -l, –senarai: menunjukkan status tamat tempoh semasa pengguna.
Contohnya, untuk menyemak maklumat tamat tempoh untuk pengguna pepe, anda boleh menjalankan:
chage -l pepe
Output akan menunjukkan tarikh perubahan terakhir, sama ada kata laluan telah tamat tempoh, tahap ketidakaktifan dan hari minimum dan maksimum , antara data lain. Dengan alat ini, anda boleh menggunakan dasar secara individu, pengguna demi pengguna atau dalam skrip yang memproses keseluruhan kumpulan akaun.
Dasar kerumitan kata laluan dengan pam_cracklib dan pam_pwquality
Mengehadkan percubaan kata laluan adalah bagus, tetapi jika kata laluan adalah seperti "123456" atau "qwerty," anda tidak akan berjaya. Itulah sebabnya penting untuk menguatkuasakan kata laluan yang kukuh menggunakan modul PAM seperti pam_cracklib dan, dalam versi yang lebih terkini, pam_pwquality.
Modul pam_pwquality merupakan evolusi cracklib dan disepadukan dengan pustaka seperti libpwquality untuk mengesahkan bahawa kata laluan tiada dalam kamus, tidak terlalu pendek dan tidak mengulangi corak mudah atau mengandungi data peribadi pengguna. Ia disertakan secara natif dalam persekitaran berasaskan RHEL dan dalam Debian/Ubuntu ia boleh dipasang menggunakan pakej seperti libpam-cracklib dan libpam-pwquality.
Setelah dipasang, konfigurasi utama biasanya dilakukan dalam fail /etc/security/pwquality.conf , di mana anda boleh menentukan parameter kerumitan seperti:
- difok: bilangan aksara yang mesti berbeza daripada kata laluan sebelumnya.
- minlen: panjang minimum yang boleh diterima untuk kata laluan baharu.
- dcredit, ucredit, lkredit, ocreditKredit kerana memasukkan digit, huruf besar, huruf kecil dan aksara lain.
- kelas min: bilangan minimum kelas aksara berbeza yang diperlukan (huruf kecil, huruf besar, digit, simbol).
- maxrepeat: bilangan maksimum aksara serupa berturutan yang dibenarkan.
- maxclassrepeat: bilangan maksimum aksara berturut-turut bagi kelas yang sama.
- gecoscheck: menyemak sama ada kata laluan tidak mengandungi perkataan daripada medan GECOS (komen) pengguna dalam /etc/passwd.
- dictpath: laluan ke kamus yang digunakan untuk menyemak sama ada kata laluan adalah sebahagian daripada perkataan yang diketahui.
- badwords: senarai perkataan yang diharamkan secara jelas.
Sistem kredit ini amat fleksibel. Pada asasnya, kata laluan memperoleh kredit kerana memasukkan pelbagai aksara; kredit ini boleh mengimbangi panjang yang sedikit lebih pendek. Contohnya, dengan minlen=10 dan dcredit=2 , kata laluan 8 aksara dengan 2 digit boleh lulus penapis kerana ia memperoleh 2 kredit tambahan. Walau bagaimanapun, jika anda mentakrifkan kredit negatif, anda memerlukan sekurang-kurangnya satu aksara negatif (contohnya, dcredit=-1 memerlukan sekurang-kurangnya satu digit).
Dengan `minclass` anda boleh mewajibkan kata laluan tersebut merangkumi beberapa kelas yang berbeza. Nilai 2 kuasa, contohnya, gabungan huruf dan nombor, atau huruf dan simbol, dsb. ` minclass=4` memerlukan penggunaan huruf kecil, huruf besar, digit dan aksara khas secara serentak, sesuatu yang sangat tipikal dalam dasar korporat yang mencabar.
Alat seperti pwscore membolehkan anda menguji kekuatan kata laluan terhadap dasar yang ditetapkan. Apabila anda menjalankan kata laluan melalui pwscore , ia memberitahu anda sama ada kunci tersebut memenuhi keperluan atau tidak, dan jika tidak, peraturan mana yang dilanggarnya (panjangnya tidak mencukupi, terlalu ringkas, terlalu serupa dengan yang sebelumnya, dsb.).
Konfigurasikan dasar yang mantap pada Debian dan Ubuntu dengan pam_cracklib
Pada sistem Debian/Ubuntu, penggunaan pam_cracklib (atau pwquality melalui PAM) adalah perkara biasa untuk mengukuhkan dasar kata laluan. Fail utama di sini ialah /etc/pam.d/common-password , yang mentakrifkan cara perubahan kata laluan dikendalikan untuk pengguna sistem.
Sebelum menyentuh apa-apa, adalah amalan yang baik untuk membuat salinan sandaran fail tersebut:
sudo cp /etc/pam.d/common-password /root/
Kemudian anda boleh mengeditnya dengan editor teks kegemaran anda (nano, vim, dll.) dengan keistimewaan superuser. Di dalamnya anda akan menemui baris yang serupa dengan:
password requisite pam_cracklib.so retry=3 minlen=8 difok=3
Di sini, parameter seperti berikut ditakrifkan:
- Cuba semula: bilangan percubaan yang dibenarkan kepada pengguna semasa menukar kata laluan mereka, sebelum perubahan gagal.
- minlen: panjang kata laluan minimum.
- difok: bilangan aksara yang mesti berbeza daripada kata laluan sebelumnya.
- ucredit, lkredit, dcredit, ocredit: kredit positif atau negatif untuk huruf besar, huruf kecil, digit dan aksara lain.
Contohnya, dasar yang agak mencabar mungkin:
password requisite pam_cracklib.so retry=3 minlen=12 difok=3 ucredit=-3 lcredit=-3 dcredit=-3 ocredit=-3
Dengan konfigurasi ini, setiap kata laluan baharu mestilah sekurang-kurangnya 12 aksara , berbeza daripada yang sebelumnya dengan sekurang-kurangnya 3 aksara, dan mengandungi sekurang-kurangnya 3 huruf besar, 3 huruf kecil, 3 digit dan 3 simbol. Ia merupakan dasar yang sangat ketat, tetapi sangat berkesan terhadap kata laluan yang lemah.
Sebaik sahaja anda telah mengubah dasar tersebut, anda boleh mengujinya dengan menukar kata laluan anda sendiri dengan:
sudo passwd
Jika kata laluan tidak memenuhi keperluan, sistem akan memaparkan mesej yang menunjukkan sebabnya: terlalu pendek, serupa dengan perkataan kamus, pengulangan aksara yang berlebihan, dsb. Sebaik sahaja kata laluan mematuhi dasar, perubahan akan digunakan tanpa masalah.
Selain mengetatkan dasar untuk perubahan baharu, Debian dan Ubuntu membolehkan anda memaksa pengguna sedia ada menukar kata laluan mereka untuk mematuhi peraturan baharu. Dengan arahan:
passwd -e USUARIO
Kata laluan pengguna tersebut ditanda sebagai tamat tempoh dan pada log masuk mereka yang seterusnya, mereka dikehendaki menetapkan kata laluan baharu yang mematuhi dasar semasa. Anda juga boleh mengawal tamat tempoh kata laluan global dengan:
passwd -w 5 -x 30 USUARIO
di mana -x 30 menetapkan tempoh sah maksimum 30 hari untuk kata laluan dan -w 5 menyebabkan sistem mula memberi amaran 5 hari sebelum tamat tempoh. Jika anda menambah -i 1 :
passwd -w 5 -x 30 -i 1 USUARIO
Akaun akan ditanda sebagai tidak aktif jika pengguna tidak menukar kata laluan mereka sehari selepas tamat tempoh , yang memerlukan campur tangan pentadbir untuk mengaktifkannya semula.
Walaupun penggiliran kata laluan secara kerap telah disyorkan selama bertahun-tahun, panduan keselamatan moden (seperti yang dikeluarkan oleh NIST) melayakkan amalan ini: adalah lebih baik untuk memilih kata laluan yang panjang dan kompleks, dan untuk sistem pengesahan dua faktor , daripada memaksa perubahan yang terlalu kerap dan akhirnya menghasilkan kata laluan yang boleh diramal.
Mengkonfigurasi modul PAM (pam_faillock, pam_tally2, pam_cracklib, pam_pwquality) dengan teliti, fail utama seperti /etc/pam.d/common-auth , /etc/pam.d/common-password , /etc/login.defs , /etc/ssh/sshd_config , dan memahami bagaimana keputusan ini dicerminkan dalam /etc/shadow , membezakan antara sistem "stok" dan persekitaran yang benar-benar kukuh terhadap akses tanpa kebenaran dan serangan brute-force.
