Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

CI/CD: PHP attēlu automātiska pārbūve

Attēls noveco arī bez koda izmaiņām. Ar laika grafika būvējumiem, versijas pārbaudi un izvietošanu pēc digest PHP ielāpi uzticami nonāk produkcijā.

Aktuāls uz 5 min lasīšanas laiksHostings un distributīvi

Īsi sakot: Docker attēls satur PHP tā būvēšanas brīža stāvoklī un noveco arī bez koda izmaiņām. Kas attēlus pārbūvē automātiski, pēc laika grafika un pie drošības paziņojumiem, konveijerā pārbauda PHP versiju un izvieto pēc digest, ielāpus, piemēram, pret PHP2Shell, nogādā produkcijā plānoti. Zaļš būvējums vien tomēr nav pierādījums; skaitās versija darbojošajā konteinerā.

Kāpēc attēli noveco bez koda izmaiņām

Daudzās komandās būvēšanas konveijers startē tikai tad, kad kāds maina kodu. Lietojumprogrammai tas ir loģiski. Drošībai tā ir problēma, jo PHP attēlā nāk no bāzes attēla pēdējā būvējuma dienā.

PHP2Shell to padarīja redzamu. Labotās versijas 8.5.12, 8.4.27, 8.3.36 un 8.2.35 parādījās 2026. gada 21. oktobrī. Projekts, pie kura šajās dienās neviens nestrādāja, nesaņēma jaunu būvējumu un turpināja darboties ar veco PHP, kaut gan bāzes attēls sen bija atjaunināts. Manuālo ceļu no šīs situācijas apraksta PHP ielāpošana Docker konteineros. Šis raksts rāda, kā to automatizēt.

Docker attēlu automātiska pārbūve: trīs aktivizētāji

Noturīgs process apvieno vairākus aktivizētājus, lai neviens nebūtu jānes vienam.

Aktivizētājs Īstenojums Kas jāņem vērā
Laika grafiks pēc laika grafika vadīta darbplūsma, piem., ik nedēļu ielāpus paņem arī bez koda izmaiņām
Jauns bāzes attēls rīks, kas uzrauga bāzes attēlus un piedāvā izmaiņas darbojas galvenokārt pie fiksētiem versiju tagiem
Drošības paziņojums konveijera manuāla palaišana, ko veic operāciju komanda vajadzīgs skaidrs atbildīgais

GitHub Actions laika grafiku nodrošina notikums schedule. Saskaņā ar GitHub dokumentāciju tas izmanto cron sintaksi ar pieciem laukiem, darbojas UTC un tikai noklusējuma atzarā. Ieplānotie palaišanas gadījumi augstas slodzes laikā var startēt ar kavēšanos, un publiskos repozitorijos GitHub tos izslēdz pēc 60 dienām bez aktivitātes. Tieši pēdējais skar mierīgus projektus, tātad tieši tos, kuriem automātiskā pārbūve vajadzīga visvairāk.

Otrajam aktivizētājam Dependabot saskaņā ar GitHub dokumentāciju atbalsta ekosistēmu docker un jaunus bāzes attēlu stāvokļus piedāvā kā pull request. Jāzina divi ierobežojumi. Pirmkārt, kādam pull request jāpārbauda un jāapvieno, citādi tas paliek nepaņemts. Otrkārt, atzara tagam, piemēram, php:8.3-fpm, Dockerfile nekas nemainās, kad bāzes attēls tiek pārbūvēts. Rīkam, kas piedāvā teksta izmaiņas, tad nav ko piedāvāt. Tieši tāpēc papildus vajadzīga pārbūve pēc laika grafika.

Trešais aktivizētājs izklausās banāli, taču praksē bieži sastop jautājumu, kas to aktivizē. Nosakiet, kas seko PHP drošības paziņojumiem un kam ir tiesības palaist konveijeru, arī nedēļas nogalē. PHP2Shell gadījumā starp priekšpaziņojumu un ielāpu bija tikai viena diena.

Konveijers, kas pārtver novecojušu PHP

Šis GitHub Actions piemērs būvē attēlu ik nedēļu un pēc pogas nospiešanas, pārbauda PHP versiju un pārtrauc darbu, ja tā ir zemāka par labotu stāvokli. Reģistru, nosaukumus un minimālo versiju pielāgojiet.

name: php-image-rebuild
on:
  schedule:
    - cron: "0 3 * * 1"      # pirmdienās 03:00 UTC
  workflow_dispatch: {}      # manuāla palaišana pie drošības paziņojumiem

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Image ohne Cache und mit frischem Basis-Image bauen
        run: docker build --pull --no-cache -t app:${{ github.run_id }} .
      - name: PHP-Version prüfen (Mindeststand des Zweigs 8.3)
        run: |
          docker run --rm app:${{ github.run_id }} php -v
          docker run --rm app:${{ github.run_id }} \
            php -r 'exit(version_compare(PHP_VERSION, "8.3.36", ">=") ? 0 : 1);'

Versijas pārbaude darbojas oficiālajiem PHP attēliem, kuru versijas numurs norāda faktisko stāvokli. Ja jūsu attēls izmanto distributīva PHP pakotnes, numurs pēc backport bieži paliek tāds pats. Tad numura vietā pārbaudiet pakotnes changelog uz CVE numuriem, kā aprakstīts rakstā CVE numuru apliecināšana pakotnes changelog.

Pēc pārbaudes praksē seko vēl trīs soļi: attēla skenēšana uz zināmām ievainojamībām, nosūtīšana uz reģistru ar datumu un digest un digest nodošana izvietošanai. Kuri tagi un varianti der par pamatu, izskaidro Oficiālie PHP Docker attēli.

No būvējuma līdz darbojošamies konteineram

Biežākā domāšanas kļūda: konveijers ir zaļš, tātad viss ir ielāpots. Faktiski jaunais attēls atrodas tikai reģistrā. Ielāps kļūst spēkā tikai tad, kad katrs konteiners ir izveidots no jaunā attēla.

  1. Izvietot pēc digest: izvietojums atsaucas uz jaunā attēla digest, nevis uz pārvietojamu tagu.
  2. Vispirms staging, tad produkcija: automātiski testi kopijā pārtver pārrāvumus, ko izraisa jauni bāzes attēli.
  3. Pārbaudīt darbībā: pēc izvietošanas izpildīt php -v darbojošajā konteinerā un salīdzināt digest ar būvējumu.
  4. Ierobežot atkāpšanās ceļu: vecais attēls īsai atkāpšanās iespējai paliek pieejams, bet satur ievainojamo PHP.

Kubernetes ir savi noteikumi, piemēram, par pull politiku; tie ir aprakstīti sadaļā PHP ielāpošana Kubernetes.

Tipiski robi ķēdē

  • Būvēšanas kešatmiņa uz runner: bez --pull un --no-cache tiek atkārtoti izmantots vecais bāzes attēls.
  • Reģistra spogulis: iekšēja starpatmiņa joprojām piegādā bāzes attēla veco stāvokli.
  • Daudzpakāpju būvējumi: skaitās pēdējās pakāpes PHP versija, bet pārbauda bieži tikai pirmo.
  • Blakus attēli: queue worker, cron konteineriem un iekšējiem rīkiem ir savi konveijeri vai nav neviena.
  • Fiksēti digest: reiz ierakstīts bāzes attēla digest netiek atjaunināts nekad, ja to neuzrauga neviens rīks.
Svarīgi

Pārbūve nomaina PHP, nevis datus. Ļaunprātīgs kods, kas pirms ielāpa nonācis apjomos, augšupielāžu mapēs vai datubāzē, saglabājas un jāpārbauda atsevišķi.

Kas reaģē, ja pārbūve neizdodas?

Automātiska pārbūve ir tik laba, cik laba ir reakcija uz tās neveiksmi. Ja versijas pārbaude iedarbojas vai būvējums tiek pārtraukts mainīta bāzes attēla dēļ, kādam tas jāpamana. Daudzās komandās šādi paziņojumi nonāk pastkastē, ko neviens nelasa, vai kanālā, kurā sarkani būvējumi jau sen ir ikdiena.

Labi darbojas skaidrs noteikums: neizdevusies drošības pārbūve ir biļete ar atbildīgo un termiņu, nevis viena piezīme starp daudzām. Turklāt katram izvietotajam attēlam fiksējiet datumu, digest un pārbaudīto PHP versiju. Šis saraksts nākamā paziņojuma brīdī minūtēs atbild, kuras lietojumprogrammas ir skartas, un pārbaudītājiem vai apdrošinātājiem kalpo kā pierādījums. Kā no tā rodas pastāvīgs process, apraksta Ielāpu pārvaldība kā process, nevis ugunsdzēsēju darbs.

Kā PHP SOS palīdz konkrēti?

  • Pārbaudīt konveijerus: Mēs apskatām jūsu būvēšanas un izvietošanas ķēdes un parādām, kur ielāps var iestrēgt.
  • Automatizēt pārbūvi: Mēs iestatām laika grafika būvējumus, versijas pārbaudi un izvietošanu pēc digest.
  • Apzināt visus attēlus: Mēs katram darbojošamies konteineram piesaistām tā konveijeru, arī blakus un vecos attēlus.
  • Uzturēt ilgstoši: Drošības uzturēšanas līguma ietvaros mēs sekojam drošības paziņojumiem un uzsākam pārbūves.

Biežāk uzdotie jautājumi

Cik bieži PHP attēls jāpārbūvē?

Fiksēta skaitļa nav. Labi darbojas regulārs laika grafika būvējums, piemēram, ik nedēļu, plus tūlītējs būvējums pie drošības paziņojumiem. Izšķirošais ir tas, ka jaunam ielāpam nav jāgaida nākamā koda izmaiņa.

Vai veiksmīgs būvējums ir pietiekams pierādījums?

Nē. Būvējums pierāda tikai to, ka eksistē jauns attēls. Ielāps ir spēkā tikai tad, kad darbojošies konteineri no šī attēla ir izveidoti no jauna un php -v tajos rāda labotu versiju.

Kāpēc pēc pārbūves tomēr parādās vecā PHP versija?

Biežākie cēloņi ir būvēšanas kešatmiņa, kas atkārtoti izmanto veco bāzes attēlu, reģistra spogulis ar vecu stāvokli vai otra FROM rinda daudzpakāpju būvējumā. Būvējiet ar --pull un --no-cache un pārbaudiet katru pakāpi.

Vai Dependabot var atjaunināt bāzes attēlus?

Saskaņā ar GitHub dokumentāciju Dependabot atbalsta ekosistēmu Docker versiju un drošības atjauninājumiem. Tas bāzes attēlu izmaiņas piedāvā kā pull request. Pārbūvi pie nemainīga taga tas neaizstāj.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība