11-bo‘lim
Sirlar va muhitlar
Secrets va variables farqi, muhitlar va tasdiqlash, sirlarning PR dagi chegaralari hamda OIDC bilan parolsiz ulanish.
Ushbu bo‘lim mundarijasi
Quvur serverga ulanishi, registry'ga obraz yuborishi yoki API ga so'rov qilishi kerak - hammasi uchun parol yoki kalit talab qilinadi. Ularni repozitoriyga yozib qo'yish mumkin emas.
Sir va oddiy o'zgaruvchi #
GitHub ikki xil saqlash joyini beradi:
| Secrets | Variables | |
|---|---|---|
| Qiymat ko'rinadimi | Yo'q - yozilgandan keyin hech kim ko'ra olmaydi | Ha, sozlamalarda ochiq turadi |
| Jurnalda | Avtomatik *** bilan yashiriladi | Oddiy matn sifatida chiqadi |
| Nima uchun | Parol, token, kalit | Domen nomi, muhit nomi, bayroqlar |
| Yozuvi | ${{ secrets.NOM }} | ${{ vars.NOM }} |
Settings -> Secrets and variables -> Actions bo'limida qo'shiladi.
- name: Serverga ulanish
env:
TOKEN: ${{ secrets.DEPLOY_TOKEN }}
DOMEN: ${{ vars.DOMEN }}
run: |
echo "Domen: $DOMEN"
curl -sS -H "Authorization: Bearer $TOKEN" "https://$DOMEN/api/holat"
Domen: edu.softromeda.com
Token jurnalda umuman ko'rinmaydi - u ishlatilgan, lekin chop etilmagan.
Sir jurnalda qanday yashiriladi #
GitHub sir qiymatini chiqishdan qidirib, uni *** bilan almashtiradi:
- run: echo "Token - ${{ secrets.DEPLOY_TOKEN }}"
Token - ***
Niqoblash faqat aniq mos keladigan matnni topadi. Sirni o'zgartirsangiz - u ko'rinib qoladi:
| Amal | Natija |
|---|---|
echo $TOKEN | *** - yashiriladi |
echo $TOKEN | base64 | Ochiq ko'rinadi |
echo ${TOKEN:0:8} | Bo'lagi ko'rinadi |
| Xato xabari ichida | Ko'pincha ko'rinib qoladi |
Qoida: sirni hech qachon chop etmang. Uni faqat env orqali buyruqqa
bering va natijani jurnalga chiqarmang.
Sirlarning uch darajasi #
Muhitlar #
Muhit (environment) - deploy manzili uchun alohida sozlama to'plami:
sinov, ishlab-chiqarish kabi.
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: ishlab-chiqarish
url: https://edu.softromeda.com
steps:
- name: Serverga chiqarish
env:
KALIT: ${{ secrets.SSH_KALIT }}
run: echo "Deploy boshlandi"
Muhit uchta foydali imkoniyat beradi:
| Imkoniyat | Nima qiladi |
|---|---|
| O'z sirlari | ishlab-chiqarish siri sinov muhitiga ko'rinmaydi |
| Majburiy tasdiq | Deploy odam tugma bosmaguncha kutadi |
| Kutish muddati | Deploy oldidan belgilangan vaqt kutiladi |
| Tarmoq cheklovi | Faqat main dan deploy qilishga ruxsat |
Settings -> Environments bo'limida sozlanadi. Tasdiq yoqilgan bo'lsa,
job "Waiting" holatida turadi va tanlangan shaxslarga xabar boradi.
Ishlab chiqarish muhitiga bitta tasdiqlovchi qo'yish bir daqiqalik ish, lekin u tasodifiy deploy'larning oldini oladi.
Ayniqsa quvur push bo'yicha ishga tushsa: kimdir main ga tuzatish
yuboradi va u darhol serverga ketadi. Tasdiq shu zanjirga odamni qaytaradi.
PR va sirlar - muhim cheklov #
Boshqa odamning forkidan kelgan PR uchun GitHub sirlarni bermaydi:
Error: Input required and not supplied: token
Bu xato emas, himoya. Aks holda begona odam PR ochib, unda sirlaringizni chop etadigan workflow yozishi mumkin edi.
| Hodisa | Sirlar bormi | Yozish huquqi |
|---|---|---|
push (o'z repozitoriyingiz) | Ha | Ha |
pull_request (o'z tarmog'ingizdan) | Ha | Ha |
pull_request (fork'dan) | Yo'q | Yo'q (faqat o'qish) |
pull_request_target | Ha | Ha - xavfli |
pull_request_target - eng ko'p suiiste'mol qilinadigan hodisapull_request_target fork'dan kelgan PR uchun ham sirlarni beradi.
Shuning uchun u asosiy tarmoqdagi workflow faylini ishlatadi.
Xavf shundaki, ko'plar unga actions/checkout ni PR kodi bilan
qo'shadi:
on: pull_request_target
jobs:
test:
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }} # XAVFLI
- run: npm ci && npm test # begona kod, sirlar bilan
Bu yozuvda begona odamning kodi sizning sirlaringiz bilan bir muhitda
ishlaydi - npm ci ning o'zi ham skript ishga tushiradi.
Qoida: pull_request_target ni faqat kodga tegmaydigan ishlar uchun
ishlating (yorliq qo'yish, izoh yozish). Kodni sinash uchun oddiy
pull_request ishlatiladi.
GITHUB_TOKEN - tayyor sir #
Har bir ishga tushirishda avtomatik yaratiladigan token bor - uni qo'shish shart emas:
- name: PR ga izoh yozish
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh pr comment ${{ github.event.number }} --body "Quvur yashil"
U ishga tushirish tugashi bilan bekor qilinadi, ya'ni o'g'irlansa ham uzoq yashamaydi. Huquqlarini har bir workflow uchun cheklash mumkin:
permissions:
contents: read
pull-requests: write
Bu haqda 19-bo'limda batafsil gaplashamiz.
Parolsiz ulanish - OIDC #
Bulut xizmatlariga (AWS, Azure, Google Cloud) ulanish uchun uzoq yashaydigan kalitni saqlash shart emas. OIDC orqali GitHub har bir ishga tushirish uchun vaqtinchalik kalit oladi:
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: AWS ga ulanish
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActions
aws-region: eu-central-1
| Uzoq yashaydigan kalit | OIDC |
|---|---|
| Sir sifatida saqlanadi | Saqlanmaydi |
| O'g'irlansa - uzoq ishlaydi | Bir necha daqiqada tugaydi |
| Qo'lda almashtirish kerak | Almashtirish shart emas |
| Kim ishlatganini bilish qiyin | Har chaqiruv jurnalda |
Bulutda ishlayotgan bo'lsangiz, OIDC - eng katta xavfsizlik yutug'i.
Sirlarni boshqarish qoidalari #
| Qoida | Sabab |
|---|---|
| Har muhit uchun alohida sir | Sinov kaliti sizsa, ishlab chiqarish himoyalangan qoladi |
| Eng kam huquq | Deploy kaliti faqat deploy qila olsin, hammasini emas |
| Muddatli kalitlar | Muddati tugasa, o'g'irlangani ham foydasiz bo'ladi |
| Sirni chop etmaslik | Yashirish ishonchli emas |
| Sizgan sirni almashtirish | O'chirish yetarli emas - u allaqachon ko'chirilgan bo'lishi mumkin |
| Kalitlarni vaqti-vaqti bilan yangilash | Eski kalit qayerda qolgani noma'lum |
- Repozitoriyga
SINOV_TOKENnomli sir qo'shing. - Uni
envorqali qadamga berib, buyruq ichida ishlating. - Sirni ataylab
echoqilib, jurnalda***ko'rinishini tasdiqlang. ${{ vars.DOMEN }}o'zgaruvchisini yaratib, farqini ko'ring.sinovvaishlab-chiqarishnomli ikkita muhit yarating.- Ularning har biriga bir xil nomli, lekin boshqa qiymatli sir qo'ying.
ishlab-chiqarishmuhitiga majburiy tasdiq qo'shing va deploy jobini ishga tushiring.- Job "Waiting" holatida turishini va tasdiqdan keyin davom etishini kuzating.
- Fork'dan PR ochib (yoki hujjatdan o'qib), sirlar berilmasligini tushuntiring.
pull_request_targetnima uchun xavfli ekanini uch jumlada yozing.
Xulosa #
- Secrets yashirin qiymatlar uchun, variables ochiq sozlamalar uchun.
- Sir jurnalda
***bilan yashiriladi, lekin bu himoya emas - o'zgartirilgan sir ko'rinib qoladi. - Sirlar uch darajada saqlanadi: tashkilot, repozitoriy, muhit; eng aniq darajadagisi ustun.
- Muhit o'z sirlari, majburiy tasdig'i va tarmoq cheklovini beradi.
- Ishlab chiqarishga majburiy tasdiq qo'yish - eng arzon va eng foydali himoya.
- Fork'dan kelgan PR ga sirlar berilmaydi - bu ataylab qilingan.
pull_request_targetfork kodi bilan birga ishlatilsa, sirlarni ochib qo'yadi.GITHUB_TOKENhar ishga tushirishda avtomatik yaratiladi va oxirida bekor qilinadi.- OIDC bulut xizmatlariga uzoq yashaydigan kalitsiz ulanish imkonini beradi.
- Sizgan sirni o'chirish yetarli emas - uni almashtirish kerak.
Keyingi bo'limda Docker obrazini qurib, uni registry'ga yuborishni o'rganamiz.
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.