GitHub Secrets — maxfiy ma'lumotlarni saqlash
Muammodan boshlaylik
Deploy workflow ga (39-dars) SSH kalit, Telegram bot token, Payme API kaliti kerak. Eng oson yo'l:
- run: ssh -i "-----BEGIN OPENSSH PRIVATE KEY-----..." deploy@45.12.34.56
env:
PAYME_KEY: "sk_live_8f3a2b..."
Workflow fayli — repozitoriyda. Repozitoriyni ko'ra oladigan har kim — hamkasblar, sobiq xodimlar, ommaviy bo'lsa butun internet — production serveringizga kirish kalitini va to'lov tizimi kalitini oladi. Va ular Git tarixida abadiy qoladi (11-dars).
Sirlar uchun alohida, himoyalangan joy kerak — GitHub Secrets.
Secret yaratish
Repozitoriy → Settings → Secrets and variables → Actions → New repository secret:
- Name:
SSH_KEY(katta harflar,_bilan) - Secret: qiymat (ko'p qatorli bo'lishi mumkin — SSH kalit kabi)
Saqlangandan keyin qiymatni hech kim ko'ra olmaydi — hatto siz ham. Faqat yangilash yoki o'chirish mumkin.
Terminaldan (54-dars):
gh secret set SSH_KEY < ~/.ssh/deploy_key
gh secret set PAYME_KEY --body "sk_live_8f3a2b..."
gh secret list
Workflow da ishlatish
steps:
- name: Deploy
env:
PAYME_KEY: ${{ secrets.PAYME_KEY }}
SERVER: ${{ secrets.SERVER_HOST }}
run: ./deploy.sh
${{ secrets.NOM }}— qiymatni olishenv:orqali muhit o'zgaruvchisi sifatida berish — eng xavfsiz usul (skript uni$PAYME_KEYdeb o'qiydi)
Loglarda yashirish
GitHub sir qiymatlarini loglarda avtomatik *** ga almashtiradi:
Run echo "Kalit: $PAYME_KEY"
Kalit: ***
[!WARNING] Bu himoya mutlaq emas. Sirni o'zgartirib chiqarsangiz (base64, teskari tartibda, harflar orasiga bo'shliq) — u logda ochiq ko'rinadi. Sirlarni hech qachon ataylab
echoqilmang, va JSON kabi tuzilmali sirlarning har bir qismi alohida yashirilmasligini yodda tuting.
Sirlar darajalari
| Daraja | Qayerda | Kim uchun |
|---|---|---|
| Repository | Repozitoriy sozlamalari | Shu repozitoriyning barcha workflow lari |
| Environment | Settings → Environments → production |
Faqat shu environment dagi job lar (39-dars) |
| Organization | Tashkilot sozlamalari | Tanlangan repozitoriylar |
Environment secrets — production uchun eng yaxshisi:
jobs:
deploy:
environment: production # ← production sirlari faqat shu yerda
steps:
- run: ./deploy.sh
env:
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
Environment ga "Required reviewers" qo'yilgan bo'lsa — sirlar faqat inson tasdiqlagandan keyin beriladi. PR dagi test job lari production sirlarini umuman ko'rmaydi.
GITHUB_TOKEN — avtomatik sir
Har bir workflow uchun GitHub avtomatik vaqtinchalik token yaratadi — yaratish shart emas:
permissions:
contents: write # reliz yaratish, push
packages: write # ghcr.io ga push
pull-requests: write # PR ga izoh
steps:
- run: gh release create v1.0.0
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- Faqat shu repozitoriy uchun ishlaydi
- Workflow tugashi bilan bekor bo'ladi
permissions:— minimal kerakli huquqlarni bering (standart holatda faqat o'qish bo'lishi tavsiya etiladi: Settings → Actions → Workflow permissions → Read)
Boshqa repozitoriylarga kirish kerak bo'lsa — alohida token yoki GitHub App.
Variables — maxfiy bo'lmagan sozlamalar
Har bir sozlama sir emas. Server manzili, Node versiyasi, domen — Variables tabida:
env:
APP_URL: ${{ vars.APP_URL }}
NODE_VERSION: ${{ vars.NODE_VERSION }}
Variables loglarda ko'rinadi va qiymati sozlamalarda o'qiladi — tahrirlash qulay.
OIDC — sirsiz bulutga kirish
AWS, Google Cloud, Azure uchun uzoq muddatli kalitlarni saqlash o'rniga — OIDC: GitHub har bir workflow ga qisqa muddatli identifikatsiya tokeni beradi, bulut uni tekshirib, vaqtinchalik kirish huquqini beradi.
permissions:
id-token: write
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/github-deploy
aws-region: eu-central-1
Saqlanadigan sir yo'q — sizib chiqadigan narsa ham yo'q. Bulutga deploy uchun zamonaviy eng yaxshi amaliyot.
Xavfsizlik qoidalari
- Kodda va workflow fayllarida — hech qachon sir yo'q. Faqat
${{ secrets.X }} - Minimal huquq — deploy kaliti faqat deploy foydalanuvchisiga, token faqat kerakli repozitoriy va ruxsatlarga
- Muntazam almashtirish — ayniqsa jamoa a'zosi ketganda
- Fork PR lari sirlarni ko'rmaydi — buni
pull_request_targetbilan chetlab o'tmang (38-dars) - Uchinchi tomon action larini ehtiyotkorlik bilan: ular sirlaringizga kira oladi. Ishonchli mualliflar, aniq versiya — yoki eng xavfsizi, commit SHA bilan qotirish:
uses: some/action@a1b2c3d... - Sir sizib chiqdimi — darhol almashtiring (bekor qilib, yangisini yarating), keyin sabab va tarixni tozalash bilan shug'ullaning
Secret scanning
GitHub repozitoriylarni ma'lum formatdagi sirlar (AWS kalitlari, GitHub tokenlari, Stripe kalitlari...) uchun avtomatik tekshiradi. Push protection yoqilgan bo'lsa (Settings → Code security), sir bor commit ni push qilishga urinsangiz — GitHub uni rad etadi. Ommaviy repozitoriylarda standart holatda yoqilgan.
Nima uchun shunday?
Nima uchun sirlar kod bilan birga emas, alohida saqlanishi kerak — repozitoriy baribir yopiq-ku?
Chunki "yopiq" — vaqtinchalik holat. Repozitoriy ommaviy qilinishi, fork qilinishi, sobiq xodimning noutbukida qolishi, noto'g'ri sozlangan CI orqali sizib chiqishi mumkin — va Git tarixi hamma narsani abadiy eslaydi. Kod va sirlarning hayot sikli ham turlicha: kod ko'p kishilar tomonidan o'qiladi va o'zgartiriladi, sirlar esa — juda kam kishi tomonidan, va ular muntazam almashtirilishi kerak. Ajratilgan sirlar: kod kim tomonidan o'qilishidan qat'i nazar xavfsiz, sirni almashtirish — kodni o'zgartirmasdan bir daqiqalik ish, va kim qaysi sirga kirishi aniq nazorat qilinadi.
Xulosa
Eslab qoling:
- Sirlar — Settings → Secrets and variables → Actions; qiymati keyin ko'rinmaydi
${{ secrets.NOM }}—env:orqali bering- Loglarda
***— lekin mutlaq himoya emas, sirni chiqarmang - Darajalar: repository, environment (production uchun), organization
GITHUB_TOKEN— avtomatik, vaqtinchalik;permissions:— minimal- Maxfiy bo'lmagan sozlamalar —
vars.NOM - Bulut uchun — OIDC, saqlanadigan kalit yo'q
- Secret scanning + push protection — yoqing
- Sir sizib chiqsa — darhol almashtiring
Keyingi bo'lim
8-bo'lim: Ilg'or Git — submodule, worktree, hook lar, archive va bare repozitoriylar.