SSH konfiguratsiyasi
SSH kalit autentifikatsiyasi dan keyin, ayniqsa bir nechta server va bir nechta kalit paydo bo'lganda, bitta ulanishning o'zi ssh -i ~/.ssh/id_work [email protected] kabi uzun buyruqni talab qilishi mumkin. Yana bir hali ochiq savol ham bor: serverning o'zi qaysi autentifikatsiya usullariga ruxsat beradi va root umuman to'g'ridan-to'g'ri kira oladimi. Bular ikki alohida masala — klient tomonidagi qulaylik va server tomonidagi siyosat — va ular ikki butunlay boshqa konfiguratsiya fayli bilan boshqariladi.
Ikki mustaqil konfiguratsiya fayli
SSH’da konfiguratsiyaning ikki butunlay alohida darajasi bor:
| Fayl | Qamrovi | Nimani boshqaradi | |
|---|---|---|---|
| Klient | ~/.ssh/config |
har bir foydalanuvchi uchun | qaysi serverga, qanday parametrlar bilan ulanish |
| Server | /etc/ssh/sshd_config |
butun tizim (root) | bu serverga kim va qanday kira oladi |
Bu ikkalasini ajratib turish muhim: klient konfiguratsiyasidagi o'zgarish faqat ssh ning sizning mashinangizda qanday ishlashiga ta’sir qiladi; server konfiguratsiyasidagi o'zgarish esa o'sha serverga ulanadigan hammaga qo'llanadi.
Klient konfiguratsiyasi: ~/.ssh/config
Agar fayl hali mavjud bo'lmasa, uni yarating:
Har bir server o'zining Host blokiga ega bo'ladi:
Host prod-web
HostName 192.168.1.50
User alice
Port 2222
IdentityFile ~/.ssh/id_ed25519
Host staging-db
HostName 10.20.0.15
User deploy
IdentityFile ~/.ssh/id_work
Endi to'liq buyruq o'rnini qisqa alias egallaydi:
Bu funksional jihatdan ssh -p 2222 -i ~/.ssh/id_ed25519 [email protected] ni ishga tushirish bilan bir xil.
Eng ko'p ishlatiladigan direktivalar
Host— blok qaysi alias(lar)ga tegishli ekanini belgilaydi; bir nechta andozaga ruxsat beriladi (masalan,Host *.internal);HostName— haqiqiy manzil yoki domen nomi;User— masofaviy foydalanuvchi nomi;Port— sukut bo'yicha 22 dan boshqa port;IdentityFile— qaysi private key faylidan foydalanish;ProxyJump— oraliq (bastion/jump) server orqali ulanish, masalan:
Bu ichki tarmoqqa faqat bitta, qattiq nazorat qilinadigan bastion server orqali yetish mumkin bo'lgan arxitekturalarda keng tarqalgan andoza: ssh internal-app ni ishga tushirish bu ikki qadamni qo'lda bajarmasdan avval avtomatik ravishda bastion-server ga, so'ng ichki 10.20.0.30 ga ulanadi.
Har bir host uchun umumiy sozlamalar
Host * bloki sozlamalarni har bir serverga qo'llaydi:
ServerAliveInterval 60— klient serverga har 60 soniyada keep-alive so'rovini yuboradi; bu uzoq vaqt harakatsiz turgan ulanishni NAT yoki firewall indamay uzib qo'yishining oldini oladi;ServerAliveCountMax 3— ulanish o'lgan deb hisoblanishidan oldin nechta javobsiz so'rovga chidash kerakligi.
Note
Host * blokini fayl oxiriga qo'ying. OpenSSH konfiguratsiyani yuqoridan pastga o'qiydi va har bir parametr uchun topgan birinchi qiymatni oladi — shuning uchun Host * oldinroq kelsa, undan keyingi aniqroq bloklardagi qiymatlar e’tiborsiz qoldiriladi.
Server konfiguratsiyasi: /etc/ssh/sshd_config
Bu fayl sshd xizmatining xatti-harakatini boshqaradi va uni faqat root huquqlari bilan tahrirlash mumkin.
Asosiy direktivalar
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers alice deploy
Port— xizmat qaysi portni tinglashi; sukut bo'yicha bo'lmagan qiymatni tanlash SSH hardening maqolasida chuqurroq ko'rib chiqiladi;PermitRootLogin no—rootfoydalanuvchisining SSH orqali to'g'ridan-to'g'ri kirishiga yo'l qo'ymaydi; administrator avval oddiy foydalanuvchi sifatida kirib, so'ngsudodan foydalanishi kerak — bu Root va sudo maqolasidagi eng kam huquq tamoyilining to'g'ridan-to'g'ri qo'llanishi;PasswordAuthentication no— faqat kalit bilan kirishga ruxsat beradi va parol urinishlarini butunlay o'chiradi;PubkeyAuthentication yes— kalit autentifikatsiyasi yoqilganini tasdiqlaydi (odatda allaqachon sukut bo'yicha shunday);AllowUsers— faqat ro'yxatdagi foydalanuvchilar SSH orqali kira oladi; boshqa har qanday tizim hisobi — hatto to'g'ri parol yoki kalitga ega bo'lsa ham — to'g'ridan-to'g'ri rad etiladi.
Danger
PasswordAuthentication no ni yoqishdan oldin har doim kalit autentifikatsiyasi haqiqatan ishlashini tasdiqlang. Buni noto'g'ri qilish serverga kirish imkonini butunlay yo'qotish xavfini tug'diradi — ayniqsa masofaviy mashinada, u yerda yagona tiklash yo'li hosting provayderining konsoli yoki rescue mode bo'lishi mumkin.
Warning
Ubuntu 22.04+ da (va ko'p joriy distributivlarda) /etc/ssh/sshd_config ning eng boshida Include /etc/ssh/sshd_config.d/*.conf qatori bor, bulut image’lari esa u yerga 50-cloud-init.conf kabi drop-in fayl joylaydi. sshd_config har bir sozlama uchun topgan birinchi qiymatni olgani va include eng tepada turgani uchun drop-in fayldagi direktiva asosiy faylning pastroq qismida siz tahrirlagan xuddi shu direktivani ustidan bosadi. Bu tez-tez uchraydigan "men PasswordAuthentication no ni o'rnatdim, lekin parollar baribir ishlayapti" tuzog'i. Faqat asosiy faylga ishonmasdan, amaldagi qiymatni doim sudo sshd -T | grep -i <directive> bilan tasdiqlang (quyidagi vaziyatda ishlatiladi) va doimiy o'zgarishlarni o'zining alohida drop-in fayliga yozing, masalan /etc/ssh/sshd_config.d/99-hardening.conf.
Konfiguratsiyani xavfsiz o'zgartirish
sshd_config dagi har qanday o'zgarishdan keyin xizmatni qayta yuklashdan oldin sintaksisni tekshirish kerak:
Chiqish bo'lmasligi muvaffaqiyatni bildiradi. Xato bo'lsa, u aniq qator raqami bilan ko'rsatiladi. Faqat shundan keyin xizmatni qayta yuklang:
reload restart dan afzalroq — u mavjud ulanishlarni uzmasdan yangi konfiguratsiyani qayta o'qiydi. Bu ayniqsa masofaviy o'zgarishlar uchun muhim: agar yangi konfiguratsiya buzilgan bo'lib chiqsa va xizmat to'liq qayta ishga tushirilsa, o'zingizni serverdan uzib qo'yishingiz mumkin; reload esa joriy sessiyani tirik saqlaydi.
Warning
Masofaviy serverda sshd_config ni o'zgartirganda joriy SSH sessiyasini yopmasdan, yangi ulanishni alohida terminalda sinab ko'ring. Agar yangi ulanish muvaffaqiyatsiz bo'lsa, o'zgarishni ortga qaytarish uchun mavjud sessiya hali ham turadi. Tahrirlab, terminalni yopib, faqat shundan keyin sinab ko'rish — serverdan o'zingizni uzib qo'yishning eng keng tarqalgan yo'li.
Amaliy vaziyat: root login’ni o'chirishdan oldin kirish rejasini tekshirish
Muammo: yangi server hozircha faqat root sifatida kirishga ruxsat beradi; buni xavfsizroq sozlamaga o'tkazish kerak.
1-qadam — joriy amaldagi qiymatlarni tekshirish:
sshd -T barcha amaldagi sozlamalarni — sukut bo'yicha qiymatlarni ham, fayldan o'qilganlarini ham — chiqaradi. Bu faylni to'g'ridan-to'g'ri o'qishdan ishonchliroq, chunki muayyan o'rnatmada ayrim qiymatlar hujjatlashtirilgan sukut bo'yicha qiymatlardan allaqachon farq qiladi.
2-qadam — avval oddiy foydalanuvchi va kalit autentifikatsiyasini sozlash: SSH kalit autentifikatsiyasi maqolasiga ko'ra alice uchun authorized_keys tayyorlanadi va kirish yangi terminalda ssh alice@server bilan tekshiriladi.
3-qadam — sudo huquqini tasdiqlash:
4-qadam — konfiguratsiyani o'zgartirish:
5-qadam — eski sessiyani ochiq qoldirib qayta yuklash, so'ng yangi terminalda sinash:
Yangi terminalda:
alice@server sifatida kirish ishlashda davom etadi.
6-qadam — natija va hujjatlashtirish: root endi to'g'ridan-to'g'ri kira olmasligini, alice esa kalit bilan kirib, ma’muriy vazifalarni sudo orqali bajara olishini tasdiqlang. O'zgarish sanasi va sababini (masalan, xavfsizlik siyosatiga moslashtirish) qayd qiling.
Keng tarqalgan xatolar
Avval sshd -t siz to'g'ridan-to'g'ri restart ni ishga tushirish
Konfiguratsiyada sintaksis xatosi bo'lgan holda xizmatni qayta ishga tushirish uni umuman ishga tusha olmaydigan holatda qoldirishi mumkin — bunday holatda serverga SSH orqali kirish butunlay yo'qoladi.
Xavfli o'zgarish uchun bitta ochiq sessiyaga tayanish
Yuqorida ta’kidlanganidek, o'zgarishni sinashdan oldin joriy sessiyani yopish buzilgan konfiguratsiyani tuzatishning har qanday yo'lini yo'q qiladi.
~/.ssh/config da noto'g'ri IdentityFile yo'lini yozish
Agar yo'l mavjud bo'lmasa yoki noto'g'ri faylga (masalan, .pub faylga) ishora qilsa, ssh indamay boshqa sukut bo'yicha kalitlarni sinab ko'rishga o'tadi — bu debug qilishni chalkashtirishi mumkin. Aslida qaysi kalit ishlatilayotganini ko'rish uchun -v flag'idan foydalaning.
AllowUsers ni yangilashda mavjud foydalanuvchini unutish
Yangi foydalanuvchi qo'shishda AllowUsers qiymatiga qo'shish o'rniga uni butunlay almashtirish avval ruxsat berilgan foydalanuvchilarning kirish imkonini yopib qo'yishi mumkin.
Mashqlar
~/.ssh/configda laboratoriya serveringiz uchunHostblokini (alias,HostName,User,IdentityFile) yarating vassh <alias>yordamida ulaning.sudo sshd -T | lesschiqishidanPermitRootLogin,PasswordAuthenticationvaX11Forwardingqiymatlarini toping va har birining amaliy ma’nosini yozing.- Yuqoridagi vaziyatni takrorlang: oddiy foydalanuvchi uchun kalit autentifikatsiyasini sozlang va faqat shundan keyin
PermitRootLogin noni yoqing. sshd_configga ataylab sintaksis xatosi kiriting (masalan,Port abc),sudo sshd -tuni qanday ko'rsatishini kuzating, so'ng uni tuzating.
Mashqni bajardim deyish uchun: 3-mashqda to'g'ridan-to'g'ri ssh root@server urinishi Permission denied qaytarishi, ssh alice@server esa muvaffaqiyatli bo'lishi va sudo -l mavjud buyruqlarni ro'yxatlashi kerak — tekshiruvlardan biri muvaffaqiyatsiz bo'lsa, o'zgarish to'g'ri qo'llanmagan.