SSH — kalitlar, ~/.ssh/config, agent
Muammodan boshlaylik
Har kuni:
ssh root@45.12.34.56
root@45.12.34.56's password: ************
Murakkab parolni har safar terish. Uchta server — uchta parol va uchta IP ni eslab qolish. Va eng yomoni — serverning auth.log ida (18-dars) minglab begona urinish: internetdagi botlar kechayu kunduz root paroliga "123456", "admin", "password" ni sinab ko'rmoqda.
SSH kalitlari bularning hammasini hal qiladi: parolsiz, xavfsizroq va qisqa nomlar bilan — ssh dokon.
SSH nima?
SSH (Secure Shell) — masofadagi kompyuterga shifrlangan ulanish. Siz terminalda yozasiz — buyruqlar serverda bajariladi. Tarmoqdagi hech kim (Wi-Fi da, provayderda) nima yozganingizni ko'ra olmaydi.
ssh foydalanuvchi@server
ssh otabek@45.12.34.56
ssh otabek@dokon.uz
ssh -p 2222 otabek@dokon.uz # nostandart port
Birinchi ulanishda:
The authenticity of host '45.12.34.56' can't be established.
ED25519 key fingerprint is SHA256:x8Kj3...
Are you sure you want to continue connecting (yes/no)?
yes — server "barmoq izi" ~/.ssh/known_hosts ga saqlanadi. Keyingi safar SSH uni tekshiradi: kimdir serverni almashtirgan bo'lsa (yoki hujum bo'lsa) — ogohlantiradi.
[!WARNING]
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!— e'tiborsiz qoldirmang. Agar serverni o'zingiz qayta o'rnatgan bo'lsangiz — normal:ssh-keygen -R 45.12.34.56bilan eski yozuvni o'chiring. Aks holda — hujum bo'lishi mumkin.
Bitta buyruqni bajarib, darhol chiqish:
ssh otabek@dokon.uz "uptime"
ssh otabek@dokon.uz "df -h /"
ssh otabek@dokon.uz "sudo systemctl restart dokon"
Chiqish — exit yoki Ctrl+D.
SSH kalitlari
Parol o'rniga — kalit jufti:
- Yopiq kalit (private) —
~/.ssh/id_ed25519— faqat sizning kompyuteringizda, hech kimga bermaysiz - Ochiq kalit (public) —
~/.ssh/id_ed25519.pub— serverlarga, GitHub ga qo'yasiz; uni hamma ko'rsa ham xavfsiz
Analogiya: ochiq kalit — qulf; uni istalgan eshikka o'rnatasiz. Yopiq kalit — faqat sizdagi kalit; u qulfni ochadi.
1. Kalit yaratish
ssh-keygen -t ed25519 -C "otabek@noutbuk"
Enter file in which to save the key (/home/otabek/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): ********
-t ed25519— zamonaviy, qisqa va xavfsiz algoritm (eskirsao'rniga)-C— izoh (qaysi kompyuterdan ekanini bilish uchun)- Passphrase — yopiq kalitni himoya qiladi: noutbuk o'g'irlansa ham kalit ishlatib bo'lmaydi. Tavsiya etiladi (agent bilan har safar yozish shart emas — pastda)
ls -l ~/.ssh/
-rw------- 1 otabek otabek 464 Nov 6 12:00 id_ed25519 ← YOPIQ, 600
-rw-r--r-- 1 otabek otabek 102 Nov 6 12:00 id_ed25519.pub ← ochiq
2. Ochiq kalitni serverga qo'yish
ssh-copy-id otabek@45.12.34.56
Oxirgi marta parolni so'raydi va ochiq kalitni serverdagi ~/.ssh/authorized_keys fayliga qo'shadi.
ssh-copy-id yo'q bo'lsa (masalan, Windows PowerShell da) — qo'lda:
cat ~/.ssh/id_ed25519.pub | ssh otabek@45.12.34.56 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
3. Parolsiz kirish
ssh otabek@45.12.34.56
Parol so'ralmaydi (yoki faqat kalitning passphrase i).
GitHub ga qo'shish
cat ~/.ssh/id_ed25519.pub
Chiqishni nusxalab: GitHub → Settings → SSH and GPG keys → New SSH key. Tekshirish:
ssh -T git@github.com
Hi otabek! You've successfully authenticated...
Endi git clone git@github.com:... — token siz ishlaydi.
Ruxsatlar — SSH qat'iy
SSH noto'g'ri ruxsatli kalitlarni ishlatishdan bosh tortadi (20-dars):
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys # serverda
chmod 600 ~/.ssh/config
"Kalit bilan kira olmayapman" muammosining yarmi — ruxsatlarda. Ikkinchi yarmi — serverdagi uy papkaning o'zi boshqalarga yozish uchun ochiq bo'lishi (chmod 755 ~ yoki qat'iyroq).
~/.ssh/config — qisqa nomlar
nano ~/.ssh/config
Host dokon
HostName 45.12.34.56
User deploy
IdentityFile ~/.ssh/id_ed25519
Host dokon-test
HostName 45.12.34.99
User deploy
Port 2222
Host *
ServerAliveInterval 60
AddKeysToAgent yes
Endi:
ssh dokon
ssh dokon-test "uptime"
scp fayl.txt dokon:/tmp/ # 35-dars
ServerAliveInterval 60— har 60 soniyada "tirikman" signali; ulanish bekor turganda uzilib qolmaydiHost *— barcha serverlar uchun umumiy sozlamalar
Bir nechta GitHub hisobi (shaxsiy va ish):
Host github-ish
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_ish
git clone git@github-ish:kompaniya/loyiha.git
ssh-agent — passphrase ni bir marta
Passphrase har safar so'ralmasligi uchun — agent kalitni xotirada saqlaydi:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l # agentdagi kalitlar
macOS va ko'p Linux ish stollarida agent avtomatik ishlaydi. Config dagi AddKeysToAgent yes — birinchi ishlatishda o'zi qo'shadi.
Agent forwarding
Server orqali GitHub dan git pull qilish kerak, lekin yopiq kalitni serverga ko'chirish — yomon fikr:
ssh -A dokon
# serverda:
git pull # sizning lokal kalitingiz ishlatiladi
-A — agent so'rovlarini sizning kompyuteringizga "uzatadi". Faqat ishonchli serverlarda ishlating.
Port forwarding — tunnel
Serverdagi MySQL faqat 127.0.0.1:3306 da (32-dars) — tashqaridan yopiq. Lekin lokal kompyuteringizdagi DBeaver / TablePlus bilan ulanmoqchisiz:
ssh -L 3307:localhost:3306 dokon
Endi kompyuteringizdagi localhost:3307 → shifrlangan tunnel → serverdagi localhost:3306. DBeaver da localhost:3307 ga ulaning. Bazani internetga ochmasdan, xavfsiz kirish.
ssh -N -L 3307:localhost:3306 dokon # -N — shell ochmasdan, faqat tunnel
Server tomoni: sshd sozlamalari
Kalit bilan kirish ishlashini tekshirgandan keyin, parolni o'chirish (42-dars):
sudo nano /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
sudo sshd -t # sintaksisni tekshirish
sudo systemctl restart ssh
[!WARNING] Parolni o'chirishdan oldin yangi terminalda kalit bilan kirish ishlashini tekshiring va eski sessiyani yopmang. Xato qilsangiz — ochiq sessiya orqali tuzatasiz. Aks holda serverdan butunlay qulflanib qolasiz (faqat hosting panelidagi konsol orqali kirish mumkin bo'ladi).
Nima uchun shunday?
Nima uchun kalit paroldan xavfsizroq?
Parol — sir, va uni server bilan bo'lishasiz: har kirishda u serverga yuboriladi (shifrlangan bo'lsa ham). Server buzilsa yoki soxta bo'lsa — parol o'g'irlanadi. Uni taxmin qilish ham mumkin: botlar millionlab variantni sinaydi. Kalitda esa yopiq qism hech qachon kompyuteringizdan chiqmaydi: server tasodifiy "savol" yuboradi, sizning kompyuteringiz yopiq kalit bilan "imzolaydi", server ochiq kalit bilan imzoni tekshiradi. Ochiq kalit o'g'irlansa ham — undan yopiqni hisoblab bo'lmaydi. ed25519 kalitni taxmin qilish esa amalda imkonsiz. Shuning uchun PasswordAuthentication no — har bir serverda birinchi qadam.
Xulosa
Eslab qoling:
ssh foydalanuvchi@server;ssh server "buyruq"— bitta buyruqssh-keygen -t ed25519— kalit yaratish; passphrase — tavsiya- Yopiq kalit — faqat sizda (600); ochiq kalit — serverlarga, GitHub ga
ssh-copy-id server— ochiq kalitniauthorized_keysga~/.ssh/config—Hostnomlari,User,Port,IdentityFilessh-add— agent;-A— forwarding (faqat ishonchli serverlarda)ssh -L 3307:localhost:3306 server— tunnel- Serverda:
PasswordAuthentication no,PermitRootLogin no— avval kalitni tekshirib
Keyingi dars
35-dars: Fayl ko'chirish — scp va rsync