11-bo‘lim

Sirlar va muhitlar

Secrets va variables farqi, muhitlar va tasdiqlash, sirlarning PR dagi chegaralari hamda OIDC bilan parolsiz ulanish.

🕑 10 daqiqa o‘qish 📄 937 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Sir va oddiy o'zgaruvchi
  2. Sir jurnalda qanday yashiriladi
  3. Sirlarning uch darajasi
  4. Muhitlar
  5. PR va sirlar - muhim cheklov
  6. GITHUB_TOKEN - tayyor sir
  7. Parolsiz ulanish - OIDC
  8. Sirlarni boshqarish qoidalari
  9. Xulosa

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:

SecretsVariables
Qiymat ko'rinadimiYo'q - yozilgandan keyin hech kim ko'ra olmaydiHa, sozlamalarda ochiq turadi
JurnaldaAvtomatik *** bilan yashiriladiOddiy matn sifatida chiqadi
Nima uchunParol, token, kalitDomen nomi, muhit nomi, bayroqlar
Yozuvi${{ secrets.NOM }}${{ vars.NOM }}

Settings -> Secrets and variables -> Actions bo'limida qo'shiladi.

YAML
      - 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"
Natija
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:

YAML
      - run: echo "Token - ${{ secrets.DEPLOY_TOKEN }}"
Natija
Token - ***
Yashirish - himoya emas, xavfsizlik to'ri

Niqoblash faqat aniq mos keladigan matnni topadi. Sirni o'zgartirsangiz - u ko'rinib qoladi:

AmalNatija
echo $TOKEN*** - yashiriladi
echo $TOKEN | base64Ochiq ko'rinadi
echo ${TOKEN:0:8}Bo'lagi ko'rinadi
Xato xabari ichidaKo'pincha ko'rinib qoladi

Qoida: sirni hech qachon chop etmang. Uni faqat env orqali buyruqqa bering va natijani jurnalga chiqarmang.

Sirlarning uch darajasi #

Sir qayerda saqlanadi Tashkilot (organization) Barcha repozitoriylar uchun umumiy - masalan, registry kaliti Repozitoriy Faqat shu loyiha uchun - eng ko'p ishlatiladigan daraja Muhit (environment) Faqat shu muhitga deploy qilganda - tasdiq va cheklov qo'shish mumkin Quyi daraja yuqorisini qoplaydi: muhit siri repozitoriynikidan ustun
Bir xil nomli sir uch joyda bo'lsa, eng aniq darajadagisi ishlaydi

Muhitlar #

Muhit (environment) - deploy manzili uchun alohida sozlama to'plami: sinov, ishlab-chiqarish kabi.

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

ImkoniyatNima qiladi
O'z sirlariishlab-chiqarish siri sinov muhitiga ko'rinmaydi
Majburiy tasdiqDeploy odam tugma bosmaguncha kutadi
Kutish muddatiDeploy oldidan belgilangan vaqt kutiladi
Tarmoq chekloviFaqat main dan deploy qilishga ruxsat

Settings -> Environments bo'limida sozlanadi. Tasdiq yoqilgan bo'lsa, job "Waiting" holatida turadi va tanlangan shaxslarga xabar boradi.

Tasdiq - eng arzon himoya

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:

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

HodisaSirlar bormiYozish huquqi
push (o'z repozitoriyingiz)HaHa
pull_request (o'z tarmog'ingizdan)HaHa
pull_request (fork'dan)Yo'qYo'q (faqat o'qish)
pull_request_targetHaHa - xavfli
pull_request_target - eng ko'p suiiste'mol qilinadigan hodisa

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

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

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

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

YAML
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 kalitOIDC
Sir sifatida saqlanadiSaqlanmaydi
O'g'irlansa - uzoq ishlaydiBir necha daqiqada tugaydi
Qo'lda almashtirish kerakAlmashtirish shart emas
Kim ishlatganini bilish qiyinHar chaqiruv jurnalda

Bulutda ishlayotgan bo'lsangiz, OIDC - eng katta xavfsizlik yutug'i.

Sirlarni boshqarish qoidalari #

QoidaSabab
Har muhit uchun alohida sirSinov kaliti sizsa, ishlab chiqarish himoyalangan qoladi
Eng kam huquqDeploy kaliti faqat deploy qila olsin, hammasini emas
Muddatli kalitlarMuddati tugasa, o'g'irlangani ham foydasiz bo'ladi
Sirni chop etmaslikYashirish ishonchli emas
Sizgan sirni almashtirishO'chirish yetarli emas - u allaqachon ko'chirilgan bo'lishi mumkin
Kalitlarni vaqti-vaqti bilan yangilashEski kalit qayerda qolgani noma'lum
Amaliy topshiriq
  1. Repozitoriyga SINOV_TOKEN nomli sir qo'shing.
  2. Uni env orqali qadamga berib, buyruq ichida ishlating.
  3. Sirni ataylab echo qilib, jurnalda *** ko'rinishini tasdiqlang.
  4. ${{ vars.DOMEN }} o'zgaruvchisini yaratib, farqini ko'ring.
  5. sinov va ishlab-chiqarish nomli ikkita muhit yarating.
  6. Ularning har biriga bir xil nomli, lekin boshqa qiymatli sir qo'ying.
  7. ishlab-chiqarish muhitiga majburiy tasdiq qo'shing va deploy jobini ishga tushiring.
  8. Job "Waiting" holatida turishini va tasdiqdan keyin davom etishini kuzating.
  9. Fork'dan PR ochib (yoki hujjatdan o'qib), sirlar berilmasligini tushuntiring.
  10. pull_request_target nima 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_target fork kodi bilan birga ishlatilsa, sirlarni ochib qo'yadi.
  • GITHUB_TOKEN har 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.

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.