Röviden: A Docker Hubon a hivatalos PHP image sok tagben létezik, amelyek a verziót, a változatot (például cli, fpm, apache) és az alaprendszert kombinálják. A tag olyan mutató, amely az újraépítések után új állapotokra vándorol; csak a digest jelöl pontosan egy állapotot. A PHP2Shell ellen olyan image-re van szüksége, amelyben PHP 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 van, php -v-vel ellenőrizve, és a saját image-ei újraépítésére erre alapozva.
Miért mond keveset önmagában a tag
Sok csapat egy olyan sort ír a Dockerfile-jába, mint a FROM php:8.3-fpm, majd elfelejti. Ez addig működik, amíg senki sem kérdezi, melyik PHP-verzió fut valójában. A PHP2Shell óta mindenki megkérdezi.
A válasz nem a Dockerfile-ban áll. Egy olyan tag, mint a 8.3-fpm, a letöltés időpontjában az ág legújabb állapotára mutat. Ha az image-et október 21. előtt töltötték le, és azóta nem újították meg, sebezhető verziót tartalmaz, noha a tag ma egy kijavított állapotra mutat. A Docker Official Images irányelvei szerint az image-eket aktívan újraépítik, biztonsági javításoknál is. A helyi állapotát ez azonban nem érinti.
A teljes folyamatot az újraépítéstől az újonnan létrehozott konténerig a PHP javítása Docker-konténerekben írja le. Itt az előkérdésről van szó: melyik a megfelelő image, és hogyan igazolja az állapotát?
PHP Docker image címkék: így épülnek fel
A tagek legfeljebb három részből állnak. A Docker Hub olyan példákat mutat, mint a php:8.2-cli, a php:8.2-fpm-alpine vagy a php:8.4.27-zts-alpine3.24.
| Összetevő | Példa | Jelentés |
|---|---|---|
| Verziómegjelölés | 8.4.27 vagy 8.4 |
a teljes verzió ezen az állapoton marad, az ágmegjelölés új javításokkal együtt vándorol |
| Változat | cli, fpm, apache, zts |
a PHP üzemmódja a konténerben |
| Alaprendszer | alpine3.24, bookworm, trixie |
az alapul szolgáló Alpine- vagy Debian-verzió |
A változatok a PHP2Shell szempontjából nem egyenértékűek. Az fpm PHP-FPM-et üzemeltet, az apache a PHP-t Apache-modulként, vagyis mod_php-ként. Ezt az üzemmódot a PHP-csapat értékeli a legmagasabbra, mert ott még az alkalmazáskód futása előtt bemutattak egy exploitot. Erről többet a Miért különösen veszélyeztetett a mod_php oldalon olvashat. A cli változat parancssori feladatokra szolgál.
Az alaprendszernek is vannak következményei. Az Alpine image-ek kicsik, de más C-könyvtárat használnak, mint a Debian image-ek; egyes bővítmények vagy előre lefordított könyvtárak ott másként viselkednek. Ezért az alaprendszert ne a biztonsági frissítés mellékeként cserélje, hanem először maradjon annál, amit az alkalmazása ismer.
A megértéshez fontos: a hivatalos image-ben a PHP nem az alap disztribúció csomagjaiból származik. A Docker Hub leírása szerint a PHP forráskódja az image-ben van, a bővítményeket pedig segédszkriptek, például a docker-php-ext-install építik be. Az alaprendszer csomagfrissítése a saját Dockerfile-ban ezért nem változtat a PHP-verzión. Egyedül az számít, a hivatalos image melyik állapotára épít.
Tag vagy digest: mi mikor változik
A digest egy image tartalmára számított ellenőrző összeg, sha256: formában, hosszú karaktersorozattal. Minden újraépítéssel megváltozik. Ezáltal alkalmas igazolásra: aki ismeri a digestet, pontosan tudja, melyik állapot fut.
A gyakorlatban a következő munkamegosztás vált be:
- A Dockerfile-ban az ágtag használata, például
php:8.4-fpm, hogy egy újraépítés automatikusan megkapja az ág legújabb javítását. - A kiadásnál a kész saját image digestjének használata, hogy egyértelmű legyen, mi kerül kiszállításra.
- A dokumentációban mindkettő rögzítése: tag, digest és a
php -v-vel ellenőrzött verzió.
Aki ehelyett teljes verziótaget ír elő, például a 8.3.35-fpm-et, az sosem kap automatikusan javítást. Ez lehet szándékos, de olyan folyamatot igényel, amely a taget minden biztonsági közleménynél felemeli.
PHP2Shell: egy image ellenőrzése használat előtt
Az alábbi parancsok letöltenek egy image-et, és információt olvasnak ki. Futó konténereket nem módosítanak.
# Az ágtag aktuális állapotának letöltése
docker pull php:8.4-fpm
# Melyik PHP-verzió van az image-ben?
docker run --rm php:8.4-fpm php -v
# A letöltött image digestjének megjelenítése
docker image inspect php:8.4-fpm --format '{{index .RepoDigests 0}}'
# Digest és platformok lekérdezése közvetlenül a registryből
docker buildx imagetools inspect php:8.4-fpm
Az imagetools lekérdezés több platformos image-eknél egy felső szintű digestet mutat, alatta pedig platformonként, például linux/amd64 vagy linux/arm64, egy-egy sajátot. Dokumentálja azt a digestet, amelyet a szerverei ténylegesen letöltenek, és vegye figyelembe, hogy a más architektúrájú fejlesztői gépek más platform-digestet kapnak.
Ha a php -v nem mutatja legalább az ág kijavított verzióját, az image elavult, vagy gyorsítótárból származik. Ellenőrizze ilyenkor, hogy a környezete nem használ-e olyan registry-tükröt, amely régi állapotokat szolgáltat.
A PHP 8.1-hez és a régebbiekhez a PHP-projekt már nem ad ki hivatalos kiadásokat. Ezért ezeknek az ágaknak a hivatalos image-e nem tartalmazhat rendes kijavított verziót. A már nem gondozott tagek a Docker irányelvei szerint továbbra is letölthetők maradnak, de már nem frissülnek.
Az image a Docker Hub szerint php.ini-development és php.ini-production fájlt hoz magával, és éles üzemben határozottan az éles változatot ajánlja. Saját beállításait fájlként tegye a $PHP_INI_DIR/conf.d/ könyvtárba, a php.net átmeneti értékeit is.
Tipikus hibák az image kiválasztásánál
- Változat megszokásból: Az apache változatot azért választják, mert egyszerűen indul, noha az fpm külön webszerverrel is lehetséges lenne.
- A saját image-ek nincsenek újraépítve: Az alapimage friss, az abból épített alkalmazás-image nem.
- Többlépcsős buildek figyelmen kívül hagyása: Egy több
FROMsort tartalmazó Dockerfile-ban csak az egyiket igazítják. - Mellékimage-ek elfelejtése: A workerek, a cron-konténerek és az admin eszközök saját tageket használnak.
- Kizárólag a
latesthasználata: A tag nem mond semmit az ágról és a változatról, és új főág esetén váratlanul átugorhat.
Hogyan automatizálja az újraépítéseket, hogy egy elavult image egyáltalán ne fusson sokáig, azt a CI/CD: PHP-image-ek automatikus újraépítése írja le. A PHP alapjait konténerekben a PHP konténerekben oldal magyarázza.
Hogyan segít konkrétan a PHP SOS?
- Állomány ellenőrzése: Kiolvassuk, mely tagek, digestek és PHP-verziók vannak az image-eiben és a futó konténereiben.
- Változat értékelése: Megvizsgáljuk, szükség van-e a mod_php-ra, vagy az fpm külön webszerverrel csökkenti a kockázatot.
- Újraépítés és igazolás: A PHP-javítási szolgáltatással kijavított alapra építjük újra az image-eket, és dokumentáljuk a tagot, a digestet és a verziót.
- A folyamat rögzítése: Úgy alakítjuk ki a Dockerfile-okat és a kiadásokat, hogy a következő javítás tervezhetően érkezzen meg.
Gyakori kérdések
Mi a különbség a tag és a digest között?
Egy olyan tag, mint a php:8.4-fpm, név, amely minden újraépítés után új állapotra mutathat. A digest ellenőrző összeg, amely pontosan egy változatlan állapotot jelöl. Igazoláshoz és reprodukálható kiadásokhoz a digest a megbízhatóbb adat.
Melyik tag tartalmazza a PHP2Shell javítását?
Kijavítottak a PHP 8.5.12, 8.4.27, 8.3.36 és 8.2.35. A teljes verziószámú tag közvetlenül mutatja az állapotot. Rövidebb tagek, például a 8.4-fpm esetén a letöltés után a php -v paranccsal ellenőrizze, melyik verzió van ténylegesen benne.
Van javított hivatalos image a PHP 8.1-hez?
A PHP-projekt a 8.1-hez és régebbiekhez már nem ad ki hivatalos kiadásokat. Ezért ezeknek az ágaknak a hivatalos image-e nem tartalmazhat rendes kijavított verziót. Tervezze meg a váltást egy támogatott ágra.
Kockázatosabb az apache változat, mint az fpm?
Az apache változat a PHP-t Apache-modulként, vagyis mod_php-ként üzemelteti. Ezt az üzemmódot a PHP-csapat a PHP2Shellnél a legmagasabbra értékeli. Mindkét változatnak szüksége van a frissítésre; a mod_php-nál különösen sürgős.