8-bo‘lim

SSH - kalit bilan kirish va qattiqlashtirish

Kalit juftligi, authorized_keys, ~/.ssh/config va serverga kirishni parolsiz hamda xavfsiz qilish.

🕑 23 daqiqa o‘qish 📄 1 791 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Parol nima uchun yetarli emas
  2. Kalit juftligi qanday ishlaydi
  3. Kalit yaratish
  4. Kalit turlari
  5. Ochiq kalitni serverga qo'yish
  6. ~/.ssh/config - eslab qolmaslik uchun
  7. Server tomonini qattiqlashtirish
  8. Portni o'zgartirish - foydasi va chegarasi
  9. known_hosts - serverning shaxsiyati
  10. Yopiq kalitdan ochiq kalitni tiklash
  11. Kalitni bekor qilish
  12. 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 #

ParolKalit
12-20 belgi256 bit tasodifiy ma'lumot
Odam eslab qoladi (demak - oddiy)Odam eslamaydi (demak - kuchli)
Har ulanishda uzatiladiHech qachon uzatilmaydi
Bir necha serverda takrorlanadiHar server uchun alohida bo'lishi mumkin
Brute-force mumkinAmalda imkonsiz
Ochiq serverga soatiga minglab urinish tushadi

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 bilan autentifikatsiya - to'rt qadam Sizning kompyuteringiz Yopiq kalit ~/.ssh/kalit (600) HECH QAYERGA CHIQMAYDI Server Ochiq kalit authorized_keys (600) Ochiq bo'lsa ham xavf yo'q 1. Server tasodifiy "topishmoq" yuboradi 2. Mijoz uni YOPIQ kalit bilan imzolaydi 3. Server imzoni OCHIQ kalit bilan tekshiradi 4. Mos kelsa - kirish ochiladi Yopiq kalit tarmoqqa hech qachon chiqmaydi - shuning uchun uni tutib olib bo'lmaydi
Yopiq kalit imzo qo'yadi, ochiq kalit imzoni tekshiradi

Kalit yaratish #

Terminal
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:

Terminal
ssh-keygen -t ed25519 -C "husanboy@ish-stoli"
BayroqVazifa
-t ed25519Kalit turi - bugungi standart tanlov
-C "..."Izoh: kalit qayerdan kelganini eslatadi
-f nomFayl nomi (standart - ~/.ssh/id_ed25519)
-N "parol"Kalitning o'z paroli (passphrase)

Ikkita fayl paydo bo'ladi:

Terminal
cd ish && stat -c "%a %n" kalit kalit.pub
Natija
600 kalit
644 kalit.pub
FaylNimaRuxsat
kalitYopiq kalit - hech qayerga bermang600
kalit.pubOchiq kalit - serverga qo'yiladi644
Yopiq kalitni hech qachon ko'chirmang

.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 #

Terminal
cd ish
awk '{print $1, length($2)}' kalit.pub
awk '{print $1, length($2)}' eski_kalit.pub
Natija
ssh-ed25519 68
ssh-rsa 716

Ed25519 kaliti o'n barobar qisqa, lekin kuchi bo'yicha RSA-4096 dan qolishmaydi.

Terminal
cd ish && ssh-keygen -lf kalit.pub | awk '{print $1, $4}'
Natija
256 (ED25519)
TurTavsiyaSabab
ed25519HaTez, qisqa, kuchli
rsa 4096 bitFaqat zaruratdaEski tizimlar bilan moslik uchun
rsa 2048 bitYo'qBugungi kunda kuchsiz hisoblanadi
ecdsaYo'qEgri chiziq parametrlariga ishonch kam
dsaHech qachonBuzilgan, OpenSSH dan olib tashlangan
Kalitga parol (passphrase) qo'yingmi?

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:

BuyruqVazifa
eval $(ssh-agent)Agentni ishga tushirish
ssh-add ~/.ssh/id_ed25519Kalitni qo'shish (parol bir marta so'raladi)
ssh-add -lAgentdagi kalitlar
ssh-add -DHammasini 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:

Terminal
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:

Terminal
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
Natija
700 uy/.ssh
600 uy/.ssh/authorized_keys
1
Ruxsat noto'g'ri bo'lsa, SSH kalitni JIMGINA rad etadi

Bu eng ko'p vaqt yo'qotadigan xato. sshd quyidagilarni talab qiladi:

Ob'ektKerakli ruxsat
Uy katalogi755 yoki qattiqroq - guruh yozmasin
~/.ssh700
~/.ssh/authorized_keys600 yoki 644
EgasiFoydalanuvchining 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:

Terminal
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:

Terminal
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
Natija
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'rsatadi

ssh -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.

BuyruqVazifa
ssh -G hostYakuniy mijoz sozlamasi
ssh -v hostUlanish jarayonini ko'rsatish
sshd -TYakuniy server sozlamasi
sshd -tServer sozlamasini tekshirish

Foydali config sozlamalari:

SozlamaVazifa
IdentitiesOnly yesFaqat ko'rsatilgan kalitni sinash
ServerAliveInterval 60Ulanish uzilib qolmasligi uchun
ProxyJump bastionOraliq server orqali o'tish
ForwardAgent yesAgentni uzatish (ehtiyot bo'ling)
StrictHostKeyChecking yesNoma'lum serverga ulanmaslik
IdentitiesOnly yes ni yozing

IdentitiesOnly 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 #

Terminal
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:

Terminal
sshd -t -f konf/sshd_config && echo "sintaksis to'g'ri"
Natija
sintaksis to'g'ri

Xato qiymat qanday ushlanadi:

Terminal
printf 'PermitRootLogin xato_qiymat\n' > konf/yomon.conf
sshd -t -f konf/yomon.conf 2>&1
Natija
konf/yomon.conf line 1: unsupported option "xato_qiymat".

Yakuniy sozlamani ko'rish:

Terminal
sshd -T -f konf/sshd_config | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|permitemptypasswords|maxauthtries|allowusers|x11forwarding) ' | sort
Natija
allowusers husanboy
maxauthtries 3
passwordauthentication no
permitemptypasswords no
permitrootlogin no
port 2222
pubkeyauthentication yes
x11forwarding no
SozlamaQiymatNima beradi
PermitRootLogin nonoRoot ga to'g'ridan-to'g'ri kirish yo'q
PasswordAuthentication nonoFaqat kalit - eng katta ta'sir
PermitEmptyPasswords nonoBo'sh parolli hisoblar bloklanadi
MaxAuthTries 33Bitta ulanishda uch urinish
AllowUsers husanboyro'yxatFaqat sanab o'tilganlar
X11Forwarding nonoKerak bo'lmagan imkoniyat - o'chirilsin
ClientAliveInterval 300300Osilib qolgan sessiyalarni yopadi
PasswordAuthentication no yozishdan oldin

Bu satr parol bilan kirishni butunlay o'chiradi. Agar kalitingiz serverda to'g'ri o'rnatilmagan bo'lsa, siz serverdan butunlay chiqib qolasiz.

Xavfsiz tartib:

QadamNima qilinadi
1Kalitni qo'ying va kalit bilan kirib ko'ring
2Ikkinchi SSH sessiyasini ochiq qoldiring
3Sozlamani o'zgartiring, sshd -t bilan tekshiring
4systemctl reload ssh (restart emas)
5Uchinchi oynadan yangi ulanishni sinang
6Ishlagach - 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 #

2222-portga o'tish nima beradi
BeradiBermaydi
Jurnaldagi shovqin keskin kamayadiHaqiqiy hujumdan himoya
Oddiy skanerlar o'tib ketadiPortni 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.

Terminal
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"
Natija
yozuv topildi
BuyruqVazifa
ssh-keygen -F host -f faylYozuvni qidirish
ssh-keygen -R hostYozuvni o'chirish
ssh-keygen -H -f faylHost nomlarini xeshlash
ssh-keyscan hostServer kalitini olish
"REMOTE HOST IDENTIFICATION HAS CHANGED!"

Bu xabarni ko'rsangiz, SSH ulanishni butunlay to'xtatadi. U ikki narsani anglatishi mumkin:

SababEhtimoli
Server qayta o'rnatildi yoki IP boshqasiga o'tdiYuqori
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.

Terminal
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
Natija
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.

Terminal
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"
Natija
ochiq kalit aynan bir xil
Teskarisi mumkin emas

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:

ChoraIzoh
Ikkinchi kalit (zaxira)Boshqa mashinada saqlanadi, authorized_keys da ham bor
Provayder konsoliSSH ishlamaganda yagona yo'l

Ikkalasini ham oldindan tayyorlang - kalit yo'qolgandan keyin kech bo'ladi.

Kalitni bekor qilish #

Terminal
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
Natija
2
1
1

Kalitni bekor qilish - authorized_keys dan o'sha satrni o'chirish. Boshqa markaziy ro'yxat yo'q.

Kalit qaysi serverlarda borligini yozib boring

Kalit oshkor bo'lganda, uni barcha serverlardan o'chirish kerak. Agar qaysi serverlarda ekanini bilmasangiz - hech qachon ishonch hosil qila olmaysiz.

Shuning uchun:

AmaliyotFoydasi
Kalit izohida (-C) egasi va mashinasi yozilsinKim ekani ko'rinadi
Har xodimga alohida kalitBittasini bekor qilish qolganlarga tegmaydi
Umumiy hisob (deploy) o'rniga shaxsiy hisoblarJurnalda kim nima qilgani ko'rinadi
authorized_keys ni konfiguratsiya boshqaruvida saqlashManba yagona bo'ladi

Oxirgisi eng kuchlisi: fayl serverda emas, omborda yashaydi va serverga o'sha yerdan tarqatiladi.

Amaliy topshiriq
  1. ssh-keygen -t ed25519 bilan kalit juftligi yarating.
  2. Ikkala faylning ruxsatini tekshiring.
  3. Ed25519 va RSA-4096 ochiq kalitlarining uzunligini solishtiring.
  4. ssh-keygen -lf bilan barmoq izini oling.
  5. Ochiq kalitni authorized_keys ga qo'shing va 700/600 qo'ying.
  6. ~/.ssh/config da Host yozuvini yarating.
  7. ssh -G bilan yakuniy sozlamani tekshiring.
  8. sshd_config yozing va sshd -t bilan tekshiring.
  9. ssh-keygen -y bilan yopiq kalitdan ochiq kalitni tiklang.
  10. known_hosts ni -H bilan xeshlang va farqni ko'ring.

Xulosa #

  • Parol uzatiladi, kalit - yo'q; shuning uchun kalit kuchliroq.
  • ed25519 - bugungi standart tanlov; dsa va 2048-bit RSA - yo'q.
  • Serverga faqat .pub fayl boradi.
  • ~/.ssh = 700, authorized_keys = 600, egasi - foydalanuvchining o'zi.
  • Ruxsat noto'g'ri bo'lsa, sshd kalitni jimgina rad etadi.
  • ~/.ssh/config + IdentitiesOnly yes - kalitlar chalkashmaydi.
  • ssh -G mijoz sozlamasini, sshd -T server sozlamasini ko'rsatadi.
  • Sozlamani doim sshd -t bilan tekshiring, keyin reload qiling.
  • PasswordAuthentication no dan oldin ikkinchi sessiya ochiq tursin.
  • known_hosts ogohlantirishini sababini bilmasdan o'chirmang.
  • Ochiq kalitni yopiq kalitdan tiklash mumkin, teskarisi - yo'q.
  • Kalitni bekor qilish - authorized_keys dan satrni o'chirish.

Keyingi bo'limda paket boshqaruvini ko'ramiz: apt, dpkg, xavfsizlik yangilanishlari va ombor manbalari.

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.