8-bo‘lim
SSH - kalit bilan kirish va qattiqlashtirish
Kalit juftligi, authorized_keys, ~/.ssh/config va serverga kirishni parolsiz hamda xavfsiz qilish.
Ushbu bo‘lim mundarijasi
- Parol nima uchun yetarli emas
- Kalit juftligi qanday ishlaydi
- Kalit yaratish
- Kalit turlari
- Ochiq kalitni serverga qo'yish
- ~/.ssh/config - eslab qolmaslik uchun
- Server tomonini qattiqlashtirish
- Portni o'zgartirish - foydasi va chegarasi
- known_hosts - serverning shaxsiyati
- Yopiq kalitdan ochiq kalitni tiklash
- Kalitni bekor qilish
- Xulosa
SSH - serverga yagona eshik. Uni to'g'ri sozlash serverni himoya qilishning eng katta bitta qadami: parol bilan kirishni o'chirib, kalitga o'tish hujumlarning aksariyatini foydasiz qiladi.
Parol nima uchun yetarli emas #
| Parol | Kalit |
|---|---|
| 12-20 belgi | 256 bit tasodifiy ma'lumot |
| Odam eslab qoladi (demak - oddiy) | Odam eslamaydi (demak - kuchli) |
| Har ulanishda uzatiladi | Hech qachon uzatilmaydi |
| Bir necha serverda takrorlanadi | Har server uchun alohida bo'lishi mumkin |
| Brute-force mumkin | Amalda imkonsiz |
Internetga ulangan har qanday serverning 22-portiga bir necha
daqiqada avtomatik skanerlar keladi. Ular root, admin,
ubuntu, test kabi nomlar va eng ko'p uchraydigan parollar
ro'yxatini sinab ko'radi.
Bu shaxsan sizga qarshi hujum emas - bu butun internetni sanab chiqadigan robotlar.
Parol bilan kirish yoqiq bo'lsa, kunlar ichida ular sizga yetadi. Kalitga o'tsangiz - ularning urinishlari birinchi qadamdayoq to'xtaydi.
Kalit juftligi qanday ishlaydi #
Kalit yaratish #
mkdir -p ish
ssh-keygen -t ed25519 -f ish/kalit -N "" -C "husanboy@ish-stoli" >/dev/null
ssh-keygen -t rsa -b 4096 -f ish/eski_kalit -N "" -C "eski@usul" >/dev/null
Haqiqiy buyruq - bu:
ssh-keygen -t ed25519 -C "husanboy@ish-stoli"
| Bayroq | Vazifa |
|---|---|
-t ed25519 | Kalit turi - bugungi standart tanlov |
-C "..." | Izoh: kalit qayerdan kelganini eslatadi |
-f nom | Fayl nomi (standart - ~/.ssh/id_ed25519) |
-N "parol" | Kalitning o'z paroli (passphrase) |
Ikkita fayl paydo bo'ladi:
cd ish && stat -c "%a %n" kalit kalit.pub
600 kalit
644 kalit.pub
| Fayl | Nima | Ruxsat |
|---|---|---|
kalit | Yopiq kalit - hech qayerga bermang | 600 |
kalit.pub | Ochiq kalit - serverga qo'yiladi | 644 |
.pub bilan tugamagan faylni:
- Elektron pochtaga qo'shmang;
- Chatga tashlamang;
- Git omboriga qo'ymang;
- Serverga yuklamang.
Serverga faqat .pub boradi.
Agar yopiq kalit chetga chiqib ketgan bo'lsa - u endi ishonchsiz.
Yangi juftlik yarating va eskisini barcha serverlarning
authorized_keys faylidan o'chiring.
Kalit turlari #
cd ish
awk '{print $1, length($2)}' kalit.pub
awk '{print $1, length($2)}' eski_kalit.pub
ssh-ed25519 68
ssh-rsa 716
Ed25519 kaliti o'n barobar qisqa, lekin kuchi bo'yicha RSA-4096 dan qolishmaydi.
cd ish && ssh-keygen -lf kalit.pub | awk '{print $1, $4}'
256 (ED25519)
| Tur | Tavsiya | Sabab |
|---|---|---|
ed25519 | Ha | Tez, qisqa, kuchli |
rsa 4096 bit | Faqat zaruratda | Eski tizimlar bilan moslik uchun |
rsa 2048 bit | Yo'q | Bugungi kunda kuchsiz hisoblanadi |
ecdsa | Yo'q | Egri chiziq parametrlariga ishonch kam |
dsa | Hech qachon | Buzilgan, OpenSSH dan olib tashlangan |
Kalitning o'z paroli - ikkinchi himoya qatlami: kimdir noutbukingizni o'g'irlasa, kalit fayli o'zi yetarli bo'lmaydi.
Kamchiligi - har ulanishda parol yozish kerak. Yechim -
ssh-agent:
| Buyruq | Vazifa |
|---|---|
eval $(ssh-agent) | Agentni ishga tushirish |
ssh-add ~/.ssh/id_ed25519 | Kalitni qo'shish (parol bir marta so'raladi) |
ssh-add -l | Agentdagi kalitlar |
ssh-add -D | Hammasini o'chirish |
Ish kompyuteringizda parol qo'ying. Avtomatlashtirish
uchun ishlatiladigan serverdagi kalitlarga esa parol
qo'yib bo'lmaydi - u yerda kalitni 600 va cheklangan
foydalanuvchi bilan himoya qilasiz.
Ochiq kalitni serverga qo'yish #
Eng oson usul:
ssh-copy-id -i ~/.ssh/kalit.pub husanboy@203.0.113.10
U aslida shunchaki ~/.ssh/authorized_keys fayliga bitta
satr qo'shadi va ruxsatlarni to'g'rilaydi:
cd ish
mkdir -p uy/.ssh
cat kalit.pub >> uy/.ssh/authorized_keys
chmod 700 uy/.ssh
chmod 600 uy/.ssh/authorized_keys
stat -c "%a %n" uy/.ssh uy/.ssh/authorized_keys
wc -l < uy/.ssh/authorized_keys
700 uy/.ssh
600 uy/.ssh/authorized_keys
1
Bu eng ko'p vaqt yo'qotadigan xato. sshd quyidagilarni
talab qiladi:
| Ob'ekt | Kerakli ruxsat |
|---|---|
| Uy katalogi | 755 yoki qattiqroq - guruh yozmasin |
~/.ssh | 700 |
~/.ssh/authorized_keys | 600 yoki 644 |
| Egasi | Foydalanuvchining o'zi |
Talab bajarilmasa, sshd faylni butunlay e'tiborsiz qoldiradi
va sizdan parol so'raydi - hech qanday tushunarli xato
bermasdan.
Sababni topish usuli - mijoz tomonda batafsil rejim:
ssh -vvv husanboy@203.0.113.10
Serverda esa journalctl -u ssh (13-bo'lim) aniq sababni
yozadi: Authentication refused: bad ownership or modes for
directory /home/husanboy/.ssh.
~/.ssh/config - eslab qolmaslik uchun #
Har ulanishda uzun buyruq yozish o'rniga:
cd ish
cat > ssh_config <<'EOF'
Host veb
HostName 203.0.113.10
User husanboy
Port 2222
IdentityFile ~/.ssh/kalit
IdentitiesOnly yes
EOF
ssh -F ssh_config -G veb 2>/dev/null | grep -E '^(user|hostname|port|identityfile|identitiesonly) ' | sort
hostname 203.0.113.10
identitiesonly yes
identityfile ~/.ssh/kalit
port 2222
user husanboy
Endi ssh veb yozish kifoya.
ssh -G - sozlama qanday o'qilganini ko'rsatadissh -G host hech qayerga ulanmaydi. U faqat yakuniy
sozlamani chiqaradi: qaysi qiymatlar ~/.ssh/config dan,
qaysilari standartdan olindi.
Bu "nega SSH boshqa kalitni ishlatyapti?" degan savolga javob beradigan birinchi buyruq.
| Buyruq | Vazifa |
|---|---|
ssh -G host | Yakuniy mijoz sozlamasi |
ssh -v host | Ulanish jarayonini ko'rsatish |
sshd -T | Yakuniy server sozlamasi |
sshd -t | Server sozlamasini tekshirish |
Foydali config sozlamalari:
| Sozlama | Vazifa |
|---|---|
IdentitiesOnly yes | Faqat ko'rsatilgan kalitni sinash |
ServerAliveInterval 60 | Ulanish uzilib qolmasligi uchun |
ProxyJump bastion | Oraliq server orqali o'tish |
ForwardAgent yes | Agentni uzatish (ehtiyot bo'ling) |
StrictHostKeyChecking yes | Noma'lum serverga ulanmaslik |
IdentitiesOnly yes ni yozingIdentitiesOnly bo'lmasa, SSH ~/.ssh/ dagi barcha
kalitlarni navbat bilan sinab ko'radi.
Server esa MaxAuthTries (odatda 6) dan keyin ulanishni
uzadi. Agar sizda oltitadan ortiq kalit bo'lsa, to'g'ri kalit
navbatga yetib bormasligi mumkin - va siz "kalit ishlamayapti"
deb o'ylaysiz.
Bundan tashqari, har sinab ko'rilgan kalit serverga sizning boshqa serverlardagi shaxsingizni oshkor qiladi.
Server tomonini qattiqlashtirish #
mkdir -p /run/sshd
mkdir -p konf
cat > konf/sshd_config <<'EOF'
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
AllowUsers husanboy
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
EOF
Sozlamani saqlashdan oldin tekshiring:
sshd -t -f konf/sshd_config && echo "sintaksis to'g'ri"
sintaksis to'g'ri
Xato qiymat qanday ushlanadi:
printf 'PermitRootLogin xato_qiymat\n' > konf/yomon.conf
sshd -t -f konf/yomon.conf 2>&1
konf/yomon.conf line 1: unsupported option "xato_qiymat".
Yakuniy sozlamani ko'rish:
sshd -T -f konf/sshd_config | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|permitemptypasswords|maxauthtries|allowusers|x11forwarding) ' | sort
allowusers husanboy
maxauthtries 3
passwordauthentication no
permitemptypasswords no
permitrootlogin no
port 2222
pubkeyauthentication yes
x11forwarding no
| Sozlama | Qiymat | Nima beradi |
|---|---|---|
PermitRootLogin no | no | Root ga to'g'ridan-to'g'ri kirish yo'q |
PasswordAuthentication no | no | Faqat kalit - eng katta ta'sir |
PermitEmptyPasswords no | no | Bo'sh parolli hisoblar bloklanadi |
MaxAuthTries 3 | 3 | Bitta ulanishda uch urinish |
AllowUsers husanboy | ro'yxat | Faqat sanab o'tilganlar |
X11Forwarding no | no | Kerak bo'lmagan imkoniyat - o'chirilsin |
ClientAliveInterval 300 | 300 | Osilib qolgan sessiyalarni yopadi |
PasswordAuthentication no yozishdan oldinBu satr parol bilan kirishni butunlay o'chiradi. Agar kalitingiz serverda to'g'ri o'rnatilmagan bo'lsa, siz serverdan butunlay chiqib qolasiz.
Xavfsiz tartib:
| Qadam | Nima qilinadi |
|---|---|
| 1 | Kalitni qo'ying va kalit bilan kirib ko'ring |
| 2 | Ikkinchi SSH sessiyasini ochiq qoldiring |
| 3 | Sozlamani o'zgartiring, sshd -t bilan tekshiring |
| 4 | systemctl reload ssh (restart emas) |
| 5 | Uchinchi oynadan yangi ulanishni sinang |
| 6 | Ishlagach - ikkinchi sessiyani yoping |
reload mavjud sessiyalarni uzmaydi, restart esa uzishi
mumkin. Shu sababli 4-qadamda aynan reload.
Provayderda konsol (VNC yoki serial) bor-yo'qligini oldindan bilib qo'ying - u SSH ishlamay qolganda yagona yo'l bo'lib qoladi.
Portni o'zgartirish - foydasi va chegarasi #
| Beradi | Bermaydi |
|---|---|
| Jurnaldagi shovqin keskin kamayadi | Haqiqiy hujumdan himoya |
| Oddiy skanerlar o'tib ketadi | Portni skanerlaydigan hujumchi baribir topadi |
Bu xavfsizlik chorasi emas, u "noaniqlik orqali xavfsizlik" (security through obscurity). Lekin jurnalni o'qish mumkin bo'lgan holga keltirgani uchun foydali.
Portni o'zgartirsangiz, xavfsizlik devorida ham ochishni unutmang (16-bo'lim) - aks holda o'zingizni bloklaysiz.
Haqiqiy himoya - kalit bilan kirish va fail2ban
(19-bo'lim).
known_hosts - serverning shaxsiyati #
Birinchi ulanishda tasdiqlangan barmoq izi ~/.ssh/known_hosts
ga yoziladi. Keyingi safar SSH uni jimgina solishtiradi.
cd ish
printf '%s
' "203.0.113.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAe" > kh
ssh-keygen -F 203.0.113.10 -f kh >/dev/null && echo "yozuv topildi"
yozuv topildi
| Buyruq | Vazifa |
|---|---|
ssh-keygen -F host -f fayl | Yozuvni qidirish |
ssh-keygen -R host | Yozuvni o'chirish |
ssh-keygen -H -f fayl | Host nomlarini xeshlash |
ssh-keyscan host | Server kalitini olish |
Bu xabarni ko'rsangiz, SSH ulanishni butunlay to'xtatadi. U ikki narsani anglatishi mumkin:
| Sabab | Ehtimoli |
|---|---|
| Server qayta o'rnatildi yoki IP boshqasiga o'tdi | Yuqori |
| Kimdir o'rtada turibdi (man-in-the-middle) | Past, lekin nolga teng emas |
Internetdagi maslahat odatda shunday bo'ladi: "ssh-keygen -R
qiling va davom eting". Bu avval sababni bilmasangiz
noto'g'ri.
To'g'ri tartib: serverni qayta o'rnatganingizni bilsangiz - eski yozuvni o'chiring. Bilmasangiz - avval provayder konsolidan yangi barmoq izini tekshiring, keyin o'chiring.
cd ish
printf '%s
' "203.0.113.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAe" > kh
ssh-keygen -H -f kh 2>/dev/null
head -c 3 kh; echo
kh updated.
Original contents retained as kh.old
|1|
ssh-keygen -H eski faylni kh.old sifatida saqlab qo'yadi -
uni o'chirishni unutmang, aks holda xeshlashning ma'nosi
qolmaydi.
|1| bilan boshlangan satr - xeshlangan host nomi.
Shunda known_hosts faylini qo'lga kiritgan hujumchi siz
qaysi serverlarga ulanishingizni bilmaydi.
Ubuntu bu sozlamani standart holda yoqib qo'yadi
(HashKnownHosts yes).
Yopiq kalitdan ochiq kalitni tiklash #
.pub faylni yo'qotib qo'ysangiz, uni qayta yaratish mumkin -
yopiq kalitning ichida ochiq kalit ham bor.
cd ish
ssh-keygen -y -f kalit > tiklangan.pub
cut -d' ' -f1,2 kalit.pub > a; cut -d' ' -f1,2 tiklangan.pub > b
diff a b && echo "ochiq kalit aynan bir xil"
ochiq kalit aynan bir xil
Ochiq kalitdan yopiq kalitni tiklab bo'lmaydi - butun tizim aynan shunga asoslangan.
Shuning uchun yopiq kalitni yo'qotsangiz, u butunlay yo'qolgan bo'ladi: serverga kira olmaysiz va yangi juftlik yaratib, uni qayta o'rnatishingiz kerak.
Kalitni yo'qotib qo'yish ehtimoliga qarshi ikkita choralar:
| Chora | Izoh |
|---|---|
| Ikkinchi kalit (zaxira) | Boshqa mashinada saqlanadi, authorized_keys da ham bor |
| Provayder konsoli | SSH ishlamaganda yagona yo'l |
Ikkalasini ham oldindan tayyorlang - kalit yo'qolgandan keyin kech bo'ladi.
Kalitni bekor qilish #
cd ish
mkdir -p uy2/.ssh
cat kalit.pub eski_kalit.pub > uy2/.ssh/authorized_keys
wc -l < uy2/.ssh/authorized_keys
grep -v "eski@usul" uy2/.ssh/authorized_keys > uy2/.ssh/yangi
mv uy2/.ssh/yangi uy2/.ssh/authorized_keys
wc -l < uy2/.ssh/authorized_keys
grep -c "husanboy@ish-stoli" uy2/.ssh/authorized_keys
2
1
1
Kalitni bekor qilish - authorized_keys dan o'sha satrni
o'chirish. Boshqa markaziy ro'yxat yo'q.
Kalit oshkor bo'lganda, uni barcha serverlardan o'chirish kerak. Agar qaysi serverlarda ekanini bilmasangiz - hech qachon ishonch hosil qila olmaysiz.
Shuning uchun:
| Amaliyot | Foydasi |
|---|---|
Kalit izohida (-C) egasi va mashinasi yozilsin | Kim ekani ko'rinadi |
| Har xodimga alohida kalit | Bittasini bekor qilish qolganlarga tegmaydi |
Umumiy hisob (deploy) o'rniga shaxsiy hisoblar | Jurnalda kim nima qilgani ko'rinadi |
authorized_keys ni konfiguratsiya boshqaruvida saqlash | Manba yagona bo'ladi |
Oxirgisi eng kuchlisi: fayl serverda emas, omborda yashaydi va serverga o'sha yerdan tarqatiladi.
ssh-keygen -t ed25519bilan kalit juftligi yarating.- Ikkala faylning ruxsatini tekshiring.
- Ed25519 va RSA-4096 ochiq kalitlarining uzunligini solishtiring.
ssh-keygen -lfbilan barmoq izini oling.- Ochiq kalitni
authorized_keysga qo'shing va700/600qo'ying. ~/.ssh/configdaHostyozuvini yarating.ssh -Gbilan yakuniy sozlamani tekshiring.sshd_configyozing vasshd -tbilan tekshiring.ssh-keygen -ybilan yopiq kalitdan ochiq kalitni tiklang.known_hostsni-Hbilan xeshlang va farqni ko'ring.
Xulosa #
- Parol uzatiladi, kalit - yo'q; shuning uchun kalit kuchliroq.
ed25519- bugungi standart tanlov;dsava 2048-bit RSA - yo'q.- Serverga faqat
.pubfayl boradi. ~/.ssh=700,authorized_keys=600, egasi - foydalanuvchining o'zi.- Ruxsat noto'g'ri bo'lsa,
sshdkalitni jimgina rad etadi. ~/.ssh/config+IdentitiesOnly yes- kalitlar chalkashmaydi.ssh -Gmijoz sozlamasini,sshd -Tserver sozlamasini ko'rsatadi.- Sozlamani doim
sshd -tbilan tekshiring, keyinreloadqiling. PasswordAuthentication nodan oldin ikkinchi sessiya ochiq tursin.known_hostsogohlantirishini sababini bilmasdan o'chirmang.- Ochiq kalitni yopiq kalitdan tiklash mumkin, teskarisi - yo'q.
- Kalitni bekor qilish -
authorized_keysdan satrni o'chirish.
Keyingi bo'limda paket boshqaruvini ko'ramiz: apt, dpkg,
xavfsizlik yangilanishlari va ombor manbalari.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.