Чӣ метавонад хато кунад CI/CD pipelines?

Ҳамгироии пайваста ва интиқоли пайваста (CI/CD) pipelines асоси ҳама гуна созмони нармафзоре мебошанд, ки нармафзорро бо роҳи "муосир" месозад. Автоматизатсия қудрати бузургеро фароҳам меорад, аммо аксари таҳиягарон масъулияти онро аз даст медиҳанд.

ташкилкунанда: Бале, мо мегирем CI/CD амният ҷиддӣ ва назорати қавӣ бар нигоҳдорандагони код дошта бошед, баррасӣ кунед commitпеш аз муттаҳидшавӣ; ҷойҳои корӣ ва pipelineаз ҷониби кормандони баландпоя нигоҳдорӣ мешаванд, онҳо аз фош накардани сирру асрор дар pipelineс. Ва асбоб аз ҷониби кормандоне насб карда шуд, ки ин масъаларо медонанд. Чӣ хато шуда метавонад?

Муҳтарам таҳиягар, CI/CD системаҳо мураккабанд. Сатҳи васеи ҳамлаи он амалкунандагони бадхоҳро ҷалб мекард. Беҳтар аст, ки эҳтиёткор бошед ва ҳеҷ гоҳ аз ҳад зиёд боварӣ накунед.

Баъзан танзимоти пешфарз нигоҳ дошта мешаванд ва барои ҳакерҳо дӯсти беҳтарин мешаванд. Камбудиҳои ҷиддӣ метавонанд дар CI/CD pipeline манбаъҳо, дар конфигуратсияи система ё дар атрофи раванд ва контексти он pipeline ва чӣ гуна он фаъол карда мешавад.

Дар ин паём мо худро дар ҷои актёрҳои бад мегузорем. Тасаввур кунед, ки мо андешаҳои M3M3N70 (Ёдгории Мори?) ва Хашми ботлоқ дар ҷое дар торикии торики, эҳтимолан бо забони ғайриғарбӣ, аммо ҳеҷ гоҳ фаромӯш накунед, ки бадӣ дар саросари ҷаҳон паҳн шудааст.

 

Дар замонҳои қадим ин хеле осон буд...

M3M3N70: Дар замонҳои хуби қадим, тиҷорати мо хеле осон буд... Рӯзҳои сифрӣ меваҳои осон буданд, барномаҳо бо осебпазириҳо васеъ кушода буданд ва мо метавонистем дар як лаҳза ба паҳлӯ ҳаракат кунем.

Хашми ботлоқ: Фу#@Ҷаҳаннам! Баъзеҳо то ҳол беақланд, аммо чизҳо тағйир ёфтанд. Бачаҳои калон ба он чизҳои AppSec хеле ҷиддӣ муносибат карданд.

M3M3N70Бале. Аммо аблаҳони нав таҳиягарон ҳастанд. Барои мо, интихоб кардани абзорҳое, ки ин бачаҳо истифода мебаранд, осонтар шудааст. CI, бахусус, як кони тилло аст! Токенҳои дастрасии абрӣ, SCM эътимодномаҳо, паролҳои пойгоҳи додаҳои истеҳсолӣ, калидҳои махфии SSH, эътимодномаҳои дигар корбарони CI... Гузаштан аз чизҳои дилгиркунандаи таҳиягар ба гӯшти воқеӣ хеле содда буд.

Автоматикунонӣ барои сохтан, озмоиш ва ҷойгиркунии нармафзор бо CI/CD асбоб аксар вақт ба интиқоли асрор ба фармонҳо қадам ба қадам ниёз дорад. Ва аксар вақт онҳо фош мешаванд, ки оқибатҳои бад доранд.

Pipelineба асроре ниёз дорад, ки баъзан фош мешаванд

M3M3N70: The code monkeys slipped their AWS keys in a pipeline on a GitHub commit, later they removed the thing but not changed git history. For our scripts it was trivial to scan the history, grab the key and wreak havoc.

Шояд замонҳои хуби қадим дар таърихи Гит пайдо мешуданд .env файл (таҳиягар фаромӯш кард, ки онро ба он илова кунад .gitignore):

AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=wJalrXUtn...
AWS_REGION=us-east-1
APP_FOLDER=...
S3BUCKET=...

ки дар ҷараёни кории GitHub истифода шудааст .github/deploy.yaml ки чизе монанди ин дошт:

jobs:
build:
name: Automated build and deployment into AWS
runs-on: ubuntu-22.04
steps:
# Load environment from .env file
- id: dotenv
uses: falti/dotenv-action@v1.0.2

- name: Configure AWS Credentials
uses:
with:
args: --acl public-read --follow-symlinks --delete
aws-access-key-id: $
aws-secret-access-key: $
aws-region: $

# ... build steps skipped ...

- name: Upload compiled code for deployment
working-directory: $/packaged_app
run: aws s3 cp my-app.zip s3://$

- name: Deploy the app
run: aws deploy create-deployment ...

M3M3N70: воҳ! Он тугмаҳои aws кор мекарданд! Мо аввал тағйироти inocuos-ро дар барнома санҷида, сипас sting-ро илова кардем, зеро он бачаҳо ба назар чунин менамуданд, ки бехабаранд. Бинго! Чӣ маъракае буд…

Амали бад танҳо калидҳои AWS-ро барои бор кардани барномаи тағирёфта бо нармафзори зараровар истифода бурд ва сипас фармони deploy-ро бо чунин эътимоднома иҷро кард. Асрори фошшуда, дар баробари маълумоти дар он мавҷудбуда pipeline«Чӣ маърака!» эҳтимол маънои онро дорад, ки Memento ба сари қурбонии бечора харобие овардааст.

Он чизе ки Memento ба мо мегӯяд, ин аст, ки вақте ки ихроҷи махфӣ рух дод, ба монанди калидҳои дастрасии AWS дар мисол, шумо бояд сирро бекор кунед (калидҳои дар боло зикршударо гардонед) фавранҲамеша вуҷуд дорад тирезаи экспозиция байни ихроҷ commit ва беэътибор донистани махфӣ; аз нав навиштани таърихи Git душвор аст (ҳатто сахттарин давлати авторитарӣ кӯшиш кард, ки чунин аз нав навиштани таърихро анҷом диҳад, аммо бенатиҷа буд) ва эҳтимолан бесамар аст (дӯстони мо шояд пеш аз анбор бо ихроҷи махфӣ нусхабардорӣ карда бошанд). commit). Тугмаҳоро фавран гардонед ва ҳангоми хондани гузоришҳои фаъолият барои ҳисоби мақсаднок дар давоми равзанаи экспозиция дуо гӯед!

Эҳтимол, созмонҳо бояд манъи истифодаи сирри дарозмуддат CI/CD pipelines, ва онҳоро бо эътимодномаҳои муваққатӣ иваз кунед. Дар мисоли қаблӣ бо калидҳои AWS дар амалҳои GitHub, истифодаи он бехатартар аст Провайдери OpenID Connect (OIDC) барои гирифтани эътимодномаҳои кӯтоҳмуддат барои амалҳо.

Хашми ботлоқШумо хеле хушбахт будед! Дар замонҳои қадим, ҳатто дар сатилҳои S3, ки барои омма дастрас буданд, ихроҷи скриптҳо як амали маъмулӣ буд. Шумо танҳо бояд аз болои ашёҳои дар сатил буда гузаред ва барои ёфтани чизҳои ҷолиб каме ҷустуҷӯ кунед.

Баъзан минтақаи истифодашуда барои ҷойгиркунӣ (сатили AWS S3 дар ин мисол) аз сабаби камбудии конфигуратсия (ки ошкор нашуд) барои хондан аз ҷониби шахсони бегона кушода буд. Чӣ Хашми ботлоқ чизе монанди ин истифода мешуд:

aws s3 ls --recursive s3://<bucket_name>/<path>/ | \
awk '{print $4}' | \
xargs -I FNAME sh -c "echo FNAME; \
aws s3 cp s3://<bucket_name>/FNAME - | \
grep '<regex_pattern>'"

Сатил эҳтимолан дар як шаблони таъминотӣ сохта шудааст, ки онро ба таври худкор барои камбудиҳои амниятӣ скан кардан мумкин аст.

Танзимоти пешфарзии асбоб барои мо бозича буд

Барои мисолҳои мушаххас, биёед дар бораи он сӯҳбат кунем Ҷенкинс, яке аз маъмултарин абзорҳои CI.

Хашми ботлоқ: Оё шумо қуттии қайдкунии "Фаъолсозии амният"-ро дар Jenkins дар хотир доред ва чанд созмон барои қулайӣ онро фаъол накарданд? Ва он "Ҳар кас метавонад ҳар коре кунад"комбоҳои иҷозат ҳамчун пешфарз? Ва он плагинҳои нохуши Jenkins, ба монанди Плагини GitHub OAuthШахсе, ки онро танзим карда буд, ҳам "Ба ҳамаи корбарони тасдиқшуда иҷозатҳои READ додан" ва ҳам "Истифодаи иҷозатҳои анбори GitHub"-ро интихоб кард, ки ба мо дастрасӣ ба ҳамаи лоиҳаҳои онҳоро дод.

(Узр мехоҳам, Ҷенкинс, барои мисол овардани шумо 😉

Принсипҳои амниятӣ (ҳатто нашъаманд)-ро моҳирона риоя кунед. Яке аз онҳо ин аст, ки Амн бо нобаёнӣ принсип: идоракунӣ бояд танзимоти аз ҳама бехатартаринро муқаррар кунад. Амният бояд дар дохили он сохта шавад CI/CD воситаҳо ва pipelineаз сифр то ба охир, на фикри баъдӣ. Аммо қулайӣ ва қулайӣ аксар вақт бо амният мухолифат мекунанд.

Барои парвандаи Ҷенкинс, аутентификатсияи дарунсохт хеле заиф аст: ҳеҷ гоҳ механизмҳои дарунсохти аутентификатсияро дар Jenkins истифода набаредБеҳтар аст, ки механизми тарафи сеюмро (SAML, LDAP, Google ...) бо плагини Стратегияи ваколатдиҳии нақшӣ ("RBAC") интихоб кунед. Ва бо ин эҳтиёткор бошед. admin ҳисоб

Ба тарзи кор ва ғайра аҳамият диҳед pipeline файлҳо дар Jenkins коркард мешаванд. Ҳамин тавр бо Плагини Configuration-as-Code ва файлҳои конфигуратсияи он, ки ба конфигуратсияи Jenkins татбиқ мешаванд.

Гузариш аз худхостинг CI/CD Истифодаи системаҳо ба системаҳои SaaS дар асоси абрӣ баъзе хатарҳои эҳтимолиро, ки имкон медиҳанд ҳаракати паҳлӯӣ дар дохили шабакаи созмон имконпазир гардад, аз байн мебарад, аммо хатарҳои дигареро илова мекунад, ба монанди кушодани пайвастҳои беруна байни системаҳои мавҷудаи дохилӣ ва системаҳои берунӣ. CI/CD восита.

Ташкилотҳо бояд саъю кӯшиш кунандcisэҳтиёткорӣ ҳангоми сахт кардани он CI/CD система, ки аз танзимоти маҳдудтарин оғоз мешавад ва тадриҷан бо иҷозатҳои ҳадди ақали зарурӣ барои он кушода мешавад pipeline қадамҳо.

Танзими амният дар CI/CD асбобҳо метавонанд як кори мураккаб бошанд. Бисёриҳо плагинҳо ё васеъкуниҳое доранд, ки аксари осебпазириҳоро доранд ва ба навсозӣ ниёз доранд.

Сканнерҳои нодурусти танзимоти амниятӣ барои чунин абзорҳои мураккаб ё нишондиҳандаҳо метавонанд кумак кунанд.

Ворид кардани код pipeline фармонҳо барои фароғат ва фоида

M3M3N70Оё шумо ягон бор аз Checkouts рамзи беэътимод истифода кардаед, ки амалҳо ва скриптҳои осебпазир ба тазриқи фармон осебпазиранд?

Ин бахш нишон медиҳад, ки pipeline худаш метавонад хатогиҳои рамзгузорӣ дошта бошад, ки ба бозигарони бад имкон медиҳанд, ки иҷрои худсаронаи кодро ворид кунанд pipeline бе тағир додани pipeline худи манбаъМасалан, бо истифода аз PR

Мисоли аввалини а ҷараёни кории нохуши GitHub:

# INSECURE. Provided as an example only.
on:
pull_request_target #1

jobs:
build:
name: Build and test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: $ #2

- uses: actions/setup-node@v1
- run: |
npm install #3
npm build
# ... more steps ...

Ҷамъбаст pull_request_target Триггери ҷараёни корӣ бо санҷиши возеҳи PR-и беэътимод амалияи хатарнокест, ки метавонад ба вайроншавии анбор оварда расонад. Дар мисол, омезиши нохуши зерин:

  • pull_request_target рӯйдод, ки бо нобаёнӣ иҷозати навиштан ба анбори мақсаднок ва асрори анбори мақсаднокро дорад, ҳатто аз чангакҳои беруна ва дар контексти анбори мақсадноки PR кор мекунад,
  • рамзи PR-ро аз манбаъ, анбори беэътимод санҷед,
  • ҳар гуна скриптеро, ки метавонад дар мундариҷаи таҳти назорати PR кор кунад, ба монанди ин, ба кор дароред npm installва
  • истифода накардани шарт барои ангезиш pull_request_target ин рӯйдод танҳо дар сурате иҷро мешавад, ки ба PR ягон навъи тамғаи "ин PR санҷида шуд" таъин карда шавад (корбарони беруна наметавонанд ба PR тамғаҳо таъин кунанд).

Мисоли дуюм вуруди беэътимодро мегирад (аз масъала, шарҳ ё pull request) ҳамчун манбаи далелҳои интиқолшуда ба pipeline фармон тавассути ифодаҳо. Ин аст pipeline версияи осебпазирии воридкунии фармонҳои OS.

- name: Check title
run: |
title="$"
if [[ ! $title =~ ^.*:\ .*$ ]]; then
echo "Bad issue title"
exit 1
fi

Амали иҷрокунӣ скрипти муваққатии қабати скриптро дар асоси шаблон тавлид мекунад, ки бо $ иваз карда шуд, ки онро ба воридкунии фармони shell осебпазир мегардонад. Ҳамлагар бо ҳисоби қалбакии GitHub метавонад бо унвон мушкилот эҷод кунад. a"; bad_code_goes_here;#, ва бум! 

Хашми ботлоқ: Оҳ, он бачаҳо танҳо бо кушодани як масъала дарро барои ворид кардани фармон боз мекарданд...

Дар амалҳои GitHub осебпазириҳои иҷрои код мавҷуд буданд, ба монанди шарҳи гаҷира, ҳоло ислоҳ шудааст. Лутфан, хонед "Вуруди беэътимод дар ҷараёнҳои кории GitHub" барои тафсилоти пурра.

Маънои ҳикоя: Ҳеҷ гоҳ бидуни баррасии аввалияи PR, PR-ро аз манбаъҳои беэътимод тафтиш накунед ва эҷод накунед. "Беэътимод" дар ин ҷо, агар бо тасдиқи шадиди пайдоиш, маънои ҳама гуна ҳисоби эҳтимолан дуздидашудаи таҳиягарро дошта бошад.

 

Интишори ғайричашмдошти нармафзори зараровар дар ин ҷо!

Ҷойгиркунии доимӣ авҷи автоматизатсия аст, аммо ин авҷ метавонад аз сабаби набудани назорати мувофиқи тасдиқ дар ин ҷо ноумед шавад. pipeline ҷорист.

Хатарҳои ҷойгиркунии пурра автоматӣ аз манбаъ commit хатогиҳои марбут ба системаҳои истеҳсолӣ эҳтимолияти ҷойгиркунии рамзи зарароварро дар муҳитҳои истеҳсолӣ бе ошкор шудан, инчунин эҳтимолияти хатогиҳо дар раванди ҷойгиркунӣ, ки боиси халалдоршавӣ ё қатъи кор мешаванд, дар бар мегиранд.

Барои кам кардани ин хатарҳо, аксар вақт тавсия дода мешавад, ки созмонҳо дар раванди ҷойгиркунии худ "танаффуси сахт"-ро татбиқ кунанд, ки ин талаб мекунад тасдиқи инсон пеш аз он ки релизҳо ба муҳитҳои ниҳоӣ ҷойгир карда шаванд.

Онҳо дарҳоро мепӯшанд

Хашми ботлоқ: Он паролҳои пешфарзии шодмон дар CI/CD асбобҳо тоза карда мешаванд. Дастрасӣ ба /var/lib/jenkins/secrets/initialAdminPassword ҳоло як роҳи мурда аст. Бисёре аз абзорҳо ҳоло 2FA-ро пешниҳод мекунанд, ки Ковид онро маъмул гардонидааст ва ҳатто маймуни рамзии танбалтарин аз он истифода мебарад!

M3M3N70: Мо бо 2FA мубориза мебарем, аммо ин он қадар осон нест. Фиреб додани он бачаҳо душвор аст, зеро «Хунҳои пароканда» бо Твилио кор кардандБо калидҳои WebAuthn ин хеле душвортар аст. Ҳадди ақал, мо метавонем кӯшиш кунем, ки кукиҳоро дуздидан барои пешгирӣ аз MFA, аммо бояд ба қуттии таҳиягар ворид шавад.

Аутентификатсияи бисёрфакторӣ як қадами хуб дар самти дуруст барои маҳдуд кардани хатари ихроҷи асрори аутентификатсия мебошад. Аксари абзорҳои муосири DevOps MFA-ро дастгирӣ мекунанд. Ва калидҳои аутентификатсия дар зери WebAuthn / U2F (нигаред ба ...) Лоиҳаи FIDO2) шояд беҳтарин вариант барои MFA дар DevOps бошанд, агар дуруст идора карда шавад.

Хашми ботлоқ: Бачаҳои DevOps бедор мешаванд. Дар хуни онҳо чизи "камтарин имтиёз" вуҷуд дорад. Ва дигар онҳо маймунҳои рамзӣ нестанд. Акнун мо аз ҷониби баррасикунандагон бо даст ба ҷиноят мезанем.

Дар асл, pipelines ҳоло нисбат ба ду сол пеш каме мустаҳкамтаранд, бо амалҳо ва скриптҳои заиф хориҷ карда шудаанд ва бо қадамҳои иловагии санҷиши амниятӣ, ки ҳатто дропперҳои моро дар пинҳонӣ муайян карданд. commitва бастаҳое, ки мо онҳоро дуздидаем.

Савол барои хонанда: оё раванди сохтани нармафзор аз манбаъҳо ва татбиқи он дар истеҳсолот як кори хатарнок аст? Оё шумо метавонед DevOps-и худро дар марҳилаи ... бубинед? замонҳои хуби қадим барои бачаҳои бад?

Тавсияҳои ниҳоӣ

Аз куҷо сар кардан лозим аст CI/CD pipelineс?

Тавсияи аввал дар ин ҷо содда аст: бодиққат Шарҳи pipelines (онҳо муҳимтар захираҳо) барои масъалаҳои амниятӣ. Баррасиҳо гарон ҳастанд, аммо заруранд ва бояд дуруст анҷом дода шаванд. Баррасикунандагон бояд донанд, ки ба чӣ диққат диҳанд. Ҳар як қадам бояд аз ҷиҳати камбудиҳо тафтиш карда шавад.

Шояд якҷоя кардани баррасикунандагони коршинос, ки бо сканнерҳои автоматии рамзи зараровар мусаллаҳанд, метавонад кумак кунад.

Тавсияи дуюм ин аст, ки таҳиягаронеро омӯзонед, ки менависанд pipelineва онҳоро дар ҳолати амниятӣ нигоҳ доредЧизҳое, ки бояд ба назар гирифта шаванд:

  • Чӣ гуна бояд аутентификатсияро бо хидматҳои дохилӣ ва абрӣ дуруст идора кард ва аз мушкилоти коркарди эътимодномаҳои дарозмуддат пешгирӣ кард.
  • Чӣ тавр маҳдуд кардан мумкин аст pipelineба маҷмӯи дақиқи захираҳое, ки ба онҳо дастрасӣ лозим аст, равона карда шудааст. Принсипи камтарин имтиёз бори дигар дурахшид.
  • Чӣ тавр қадамҳои сохтани онро нависед pipelines такроршаванда мисли пиннинги версия ва пешгирӣ аз осебпазириҳои воридкунии фармон.
  • Чӣ тавр ҷойгиркуниро аз нуқтаи назари амният тасдиқ кардан мумкин аст (онҳо дигарон ҳастанд!): кадом амният standards бояд мувофиқ карда шаванд ва чӣ гуна чекҳо/дарвозаҳои мувофиқро дар он илова кардан мумкин аст pipelines.

Тавсияи сеюм ин аст, ки танзим кунед CI/CD система бо эҳтиёти муносиб. Тасдиқи қавии тасдиқ, бе паролҳои пешфарз ё танзимоти ноамн, ҳадди ақали имтиёзҳо… Аз осебпазириҳо дар плагинҳо ва васеъкуниҳои насбшуда эҳтиёт шавед. Ин метавонад мавзӯи асосии паёмҳои зерин бошад, лутфан бо мо бошед.

Тавсияи чорум ин аст, ки фишангро истифода баред CI/CD pipelines барои автоматикунонии амниятТаҳлили рамзи сарчашма (SAST), таҳлили таркиби манбаъ (SCA), сканкунии ихроҷи махфият, абзорҳои зидди нармафзори зараровар, сканнерҳои амнияти контейнер ё детекторҳои автоматии вақти иҷро (DAST ва нармафзори зараровар) метавонанд мунтазам дар система кор кунанд. pipelineВа созмони шумо метавонад татбиқи онро таъмин кунад. standardдар бораи фарогирии сканкунии амниятӣ дар CI/CD.

Дар хотир доред, ки ин абзорҳо баррасии коршиносонро аз муодила хориҷ намекунанд, вагарна шумо метавонед эҳсоси бардурӯғи амниятӣ дошта бошед.

Агар шумо дар иҷрои даҳгонаи беҳтарини OWASP моҳир бошед, як лоиҳаи хуби ахир ин аст Top 10 OWASP CI/CD Хавфи амният.

Эзоҳи раддия

(1) Мисолҳо дар ин паём истифодаи GitHub-ро ҳамчун SCM, AWS ҳамчун провайдери абрӣ ва GitHub Actions ё Jenkins ҳамчун CI/CD асбоб. Онҳо нисбат ба алтернативаҳои худ заифтар/бехатар нестанд. Ҳеҷ гуна нияти бад барои матбуот вуҷуд надорад! Ин абзорҳо пурқувватанд ва бояд мувофиқан истифода шаванд.

(2) M3M3N70 ва Хашми ботлоқ қаҳрамонҳои хаёлӣ мебошанд. Ҳар гуна монандӣ бо шахсон ё гурӯҳҳо, зинда ё мурда, танҳо тасодуф аст... ё ҳамин тавр аст?

Барои хондан бештар

асбобҳои sca-tools-нармафзор-таҳлили таркиб
Хатарҳои нармафзори худро афзалият диҳед, ислоҳ кунед ва бехатар созед
Ҳисоби ройгони худро дастрас кунед.
Корти кредитӣ лозим нест.

Таҳия ва интиқоли нармафзори худро таъмин кунед

бо маҷмӯи маҳсулоти Xygeni