Trumpai: oficialus PHP atvaizdas Docker Hub turi daug žymių, kurios sujungia versiją, variantą (pavyzdžiui, cli, fpm, apache) ir bazinę sistemą. Žymė yra rodyklė, kuri po perkūrimų keliauja į naujas būsenas; tik santrauka nurodo tiksliai vieną būseną. Nuo PHP2Shell jums reikia atvaizdo su PHP 8.5.12, 8.4.27, 8.3.36 ar 8.2.35, patikrinto su php -v, ir savo atvaizdų perkūrimo ant jo.
Kodėl vien žymė mažai ką išduoda
Daug komandų savo Dockerfile įrašo eilutę, pavyzdžiui, FROM php:8.3-fpm, ir ją pamiršta. Tai veikia tol, kol niekas neklausia, kokia PHP versija iš tikrųjų veikia. Nuo PHP2Shell klausia visi.
Atsakymo Dockerfile nėra. Žymė, pavyzdžiui, 8.3-fpm, atsisiuntimo momentu rodo į naujausią šios šakos būseną. Jei atvaizdas buvo atsisiųstas iki spalio 21 d. ir nuo to laiko neatnaujintas, jame yra pažeidžiama versija, nors žymė šiandien rodo į ištaisytą būseną. Pagal Docker Official Images gaires atvaizdai aktyviai perkuriami, taip pat dėl saugumo pataisų. Tačiau jūsų vietinė būsena dėl to nesikeičia.
Visą eigą nuo perkūrimo iki naujai sukurto konteinerio aprašo PHP pataisymas Docker konteineriuose. Čia kalbama apie išankstinį klausimą: kuris atvaizdas tinkamas ir kaip įrodyti jo būseną?
PHP Docker atvaizdo žymės: kaip jos sudarytos
Žymės sudarytos iš iki trijų dalių. Docker Hub rodo pavyzdžius, tokius kaip php:8.2-cli, php:8.2-fpm-alpine ar php:8.4.27-zts-alpine3.24.
| Dalis | Pavyzdys | Reikšmė |
|---|---|---|
| Versijos nuoroda | 8.4.27 arba 8.4 |
pilna versija lieka šioje būsenoje, šakos nuoroda keliauja su naujomis pataisomis |
| Variantas | cli, fpm, apache, zts |
PHP veikimo režimas konteineryje |
| Bazinė sistema | alpine3.24, bookworm, trixie |
pagrindinė Alpine ar Debian versija |
PHP2Shell atžvilgiu variantai nėra lygiaverčiai. fpm eksploatuoja PHP-FPM, apache eksploatuoja PHP kaip Apache modulį, t. y. mod_php. Šį veikimo režimą PHP komanda vertina didžiausiu rizikos lygiu, nes ten išnaudojimas buvo parodytas dar prieš pradedant vykdyti programos kodą. Daugiau skiltyje Kodėl mod_php ypač pažeidžiamas. Variantas cli skirtas komandinės eilutės užduotims.
Svarbi ir bazinė sistema. Alpine atvaizdai maži, bet naudoja kitą C biblioteką nei Debian atvaizdai; kai kurie plėtiniai ar iš anksto sukompiliuotos bibliotekos ten elgiasi kitaip. Todėl bazinės sistemos nekeiskite šalia saugumo atnaujinimo, o pirmiausia pasilikite prie to, ką jūsų programa pažįsta.
Svarbu suprasti: oficialiame atvaizde PHP nėra iš bazinės distribucijos paketų. Docker Hub aprašo, kad PHP šaltinio kodas yra atvaizde, o plėtiniai įtraukiami pagalbiniais skriptais, tokiais kaip docker-php-ext-install. Todėl bazinės sistemos paketų atnaujinimas jūsų Dockerfile PHP versijos nekeičia. Lemia tik tai, kurioje oficialaus atvaizdo būsenoje statote.
Žymė ar santrauka: kas kada keičiasi
Santrauka yra atvaizdo turinio kontrolinė suma, rašoma kaip sha256: su ilga simbolių eilute. Ji keičiasi su kiekvienu perkūrimu. Todėl tinka kaip įrodymas: kas žino santrauką, tiksliai žino, kuri būsena veikia.
Praktikoje pasiteisino toks darbo pasidalijimas:
- Dockerfile naudoti šakos žymę, pavyzdžiui,
php:8.4-fpm, kad perkūrimas automatiškai gautų naujausią šios šakos pataisą. - Diegiant (rollout) naudoti paties sukurto atvaizdo santrauką, kad būtų aiškiai žinoma, kas pateikiama.
- Dokumentacijoje užfiksuoti abu: žymę, santrauką ir su
php -vpatikrintą versiją.
Kas vietoj to užfiksuoja pilną versijos žymę, pavyzdžiui, 8.3.35-fpm, niekada automatiškai negauna pataisos. Tai gali būti norima, bet reikalauja proceso, kuris žymę pakelia po kiekvieno saugumo pranešimo.
PHP2Shell: atvaizdo patikra prieš naudojimą
Toliau pateiktos komandos atsisiunčia atvaizdą ir nuskaito informaciją. Jos nekeičia veikiančių konteinerių.
# Atsisiųsti dabartinę šakos žymės būseną
docker pull php:8.4-fpm
# Kokia PHP versija yra atvaizde?
docker run --rm php:8.4-fpm php -v
# Parodyti atsisiųsto atvaizdo santrauką
docker image inspect php:8.4-fpm --format '{{index .RepoDigests 0}}'
# Santrauką ir platformas užklausti tiesiai registre
docker buildx imagetools inspect php:8.4-fpm
Užklausa su imagetools kelių platformų atvaizdams parodo aukštesnio lygio santrauką ir po ja kiekvienai platformai, pavyzdžiui, linux/amd64 ar linux/arm64, atskirą. Dokumentuokite santrauką, kurią jūsų serveriai iš tikrųjų atsisiunčia, ir atminkite, kad kūrėjų kompiuteriai su kita architektūra gauna kitą platformos santrauką.
Jei php -v nerodo bent ištaisytos šakos versijos, atvaizdas pasenęs arba ateina iš tarpinės talpyklos. Tuomet patikrinkite, ar jūsų aplinka nenaudoja registro veidrodžio, kuris pateikia senas būsenas.
PHP 8.1 ir senesnėms PHP projektas oficialių leidimų nebeteikia. Todėl oficialus šių šakų atvaizdas negali turėti įprastos ištaisytos versijos. Žymės, kurios nebeprižiūrimos, pagal Docker gaires lieka prieinamos, bet nebeatnaujinamos.
Pasak Docker Hub, atvaizdas pateikia php.ini-development ir php.ini-production ir gamybai primygtinai rekomenduoja gamybinį variantą. Savo nustatymus, taip pat php.net pereinamąsias reikšmes, dėkite kaip failą į $PHP_INI_DIR/conf.d/.
Tipinės klaidos renkantis atvaizdą
- Variantas iš įpročio: pasirenkamas apache variantas, nes jis paprastai paleidžiamas, nors galima fpm su atskiru žiniatinklio serveriu.
- Nėra savų atvaizdų perkūrimo: bazinis atvaizdas yra naujausias, iš jo sukurtas programos atvaizdas ne.
- Praleisti daugiapakopiai kūriniai: Dockerfile su keliomis
FROMeilutėmis pakeičiama tik viena. - Pamirštos šalutinės paskirties atvaizdai: worker, cron konteineriai ir administravimo įrankiai naudoja savas žymes.
- Pasikliauta tik
latest: žymė nieko nesako apie šaką ir variantą ir gali netikėtai peršokti naujai pagrindinei šakai.
Kaip automatizuoti perkūrimus, kad pasenęs atvaizdas ilgai neveiktų, aprašo CI/CD: automatinis PHP atvaizdų perkūrimas. PHP konteineriuose pagrindus paaiškina PHP konteineriuose.
Kaip PHP SOS padeda konkrečiai?
- Patikrinti turimą: nuskaitome, kokios žymės, santraukos ir PHP versijos yra jūsų atvaizduose ir veikiančiuose konteineriuose.
- Įvertinti variantą: tikriname, ar mod_php reikalingas, ar fpm su atskiru žiniatinklio serveriu sumažina riziką.
- Perkurti ir įrodyti: su PHP pataisų paslauga atvaizdus perkuriame ant ištaisyto pagrindo ir dokumentuojame žymę, santrauką bei versiją.
- Įtvirtinti procesą: Dockerfile ir diegimus nustatome taip, kad kita pataisa atkeliautų planuotai.
Dažni klausimai
Kuo skiriasi žymė ir santrauka (digest)?
Žymė, pavyzdžiui, php:8.4-fpm, yra pavadinimas, kuris po kiekvieno perkūrimo gali rodyti į naują būseną. Santrauka yra kontrolinė suma, nurodanti tiksliai vieną nekintamą būseną. Įrodymams ir atkartojamam diegimui santrauka yra patikimesnis duomuo.
Kurioje žymėje yra PHP2Shell ištaisymas?
Ištaisytos PHP 8.5.12, 8.4.27, 8.3.36 ir 8.2.35. Žymė su pilnu versijos numeriu būseną rodo tiesiogiai. Su trumpesnėmis žymėmis, tokiomis kaip 8.4-fpm, po atsisiuntimo su php -v patikrinkite, kokia versija iš tikrųjų joje yra.
Ar yra pataisytas oficialus atvaizdas PHP 8.1?
PHP projektas 8.1 ir senesnėms oficialių leidimų nebeteikia. Todėl oficialus šių šakų atvaizdas negali turėti įprastos ištaisytos versijos. Planuokite perėjimą prie palaikomos šakos.
Ar apache variantas rizikingesnis nei fpm?
Apache variantas PHP eksploatuoja kaip Apache modulį, t. y. mod_php. Šį veikimo režimą PHP komanda esant PHP2Shell vertina didžiausiu rizikos lygiu. Abiem variantams reikia atnaujinimo; esant mod_php skubėti ypač reikia.