Lyhyesti: Virallista PHP-kuvaa Docker Hubissa on tarjolla monina tageina, jotka yhdistävät version, variantin (esimerkiksi cli, fpm, apache) ja perusjärjestelmän. Tag on osoitin, joka siirtyy uudelleenrakennusten jälkeen uusiin tiloihin; vain digest yksilöi täsmälleen yhden tilan. PHP2Shelliä vastaan tarvitsette kuvan, jossa on PHP 8.5.12, 8.4.27, 8.3.36 tai 8.2.35, tarkistettuna komennolla php -v, sekä omien kuviennne uudelleenrakennuksen sen päälle.
Miksi tagi yksin kertoo vähän
Monet tiimit kirjoittavat Dockerfileensa rivin kuten FROM php:8.3-fpm ja unohtavat sen. Se toimii niin kauan kuin kukaan ei kysy, mikä PHP-versio oikeastaan on käynnissä. PHP2Shellistä lähtien jokainen kysyy.
Vastaus ei ole Dockerfilessä. Tag kuten 8.3-fpm osoittaa noutohetkellä kyseisen haaran uusimpaan tilaan. Jos kuva noudettiin ennen 21. lokakuuta eikä sitä ole sen jälkeen uusittu, siinä on haavoittuva versio, vaikka tag osoittaisi nykyään korjattuun tilaan. Docker Official Images -ohjeiden mukaan kuvat rakennetaan aktiivisesti uudelleen, myös tietoturvakorjausten yhteydessä. Se ei kuitenkaan vaikuta paikalliseen tilaanne.
Koko kulun uudelleenrakennuksesta uudelleen luotuun konttiin kuvaa PHP:n korjaus Docker-konteissa. Tässä käsitellään ennakkokysymystä: mikä kuva on oikea, ja miten sen tilan todistatte?
PHP Docker -kuvan tagit: näin ne rakentuvat
Tagit koostuvat enintään kolmesta osasta. Docker Hub näyttää esimerkkejä kuten php:8.2-cli, php:8.2-fpm-alpine tai php:8.4.27-zts-alpine3.24.
| Osa | Esimerkki | Merkitys |
|---|---|---|
| Versiotieto | 8.4.27 tai 8.4 |
täysi versio pysyy tässä tilassa, haaratieto siirtyy uusien korjausten mukana |
| Variantti | cli, fpm, apache, zts |
PHP:n ajotapa kontissa |
| Perusjärjestelmä | alpine3.24, bookworm, trixie |
taustalla oleva Alpine- tai Debian-versio |
Variantit eivät ole PHP2Shellin kannalta samanarvoisia. fpm ajaa PHP-FPM:ää, apache ajaa PHP:tä Apache-moduulina, siis mod_php:nä. Tämän ajotavan PHP-tiimi arvioi riskialtteimmaksi, koska siinä on esitetty hyökkäys, joka toimii jo ennen kuin sovelluskoodia ajetaan. Lisää sivulla Miksi mod_php on erityisen haavoittuva. Variantti cli on tarkoitettu komentorivitehtäviin.
Myös perusjärjestelmällä on seurauksia. Alpine-kuvat ovat pieniä, mutta käyttävät eri C-kirjastoa kuin Debian-kuvat; jotkin laajennukset tai esikäännetyt kirjastot toimivat siellä toisin. Älkää siksi vaihtako perusjärjestelmää sivutoimena tietoturvapäivityksen yhteydessä, vaan pysykää aluksi siinä, minkä sovelluksenne tuntee.
Ymmärtämisen kannalta tärkeää: virallisessa kuvassa PHP ei tule perusjakelun paketeista. Docker Hub kuvaa, että PHP:n lähdekoodi on kuvassa ja laajennukset rakennetaan apuskripteillä kuten docker-php-ext-install. Perusjärjestelmän pakettipäivitys omassa Dockerfilessänne ei siksi muuta PHP-versiota. Ratkaisevaa on yksin se, minkä virallisen kuvan tilan päälle rakennatte.
Tag vai digest: mikä muuttuu ja milloin
Digest on kuvan sisällöstä laskettu tarkistussumma, kirjoitettuna sha256: ja pitkä merkkijono. Se muuttuu jokaisella uudelleenrakennuksella. Siksi se soveltuu todisteeksi: kun digest tiedetään, tiedetään täsmälleen, mikä tila on käynnissä.
Käytännössä toimii työnjako:
- Dockerfilessä käytetään haaratagia, esimerkiksi
php:8.4-fpm, jotta uudelleenrakennus saa automaattisesti kyseisen haaran uusimman korjauksen. - Käyttöönotossa käytetään valmiiksi rakennetun oman kuvan digestiä, jotta on yksiselitteistä, mitä toimitetaan.
- Dokumentaatiossa kirjataan molemmat: tag, digest ja komennolla
php -vtarkistettu versio.
Jos sen sijaan lukitsette täyden versiotagin kuten 8.3.35-fpm, ette saa koskaan automaattisesti korjausta. Se voi olla tarkoituksellista, mutta vaatii prosessin, joka nostaa tagia jokaisen tietoturvailmoituksen yhteydessä.
PHP2Shell: kuvan tarkistus ennen käyttöä
Seuraavat komennot noutavat kuvan ja lukevat tietoja. Ne eivät muuta käynnissä olevia kontteja.
# Nouda haaratagin nykyinen tila
docker pull php:8.4-fpm
# Mikä PHP-versio kuvassa on?
docker run --rm php:8.4-fpm php -v
# Näytä noudetun kuvan digest
docker image inspect php:8.4-fpm --format '{{index .RepoDigests 0}}'
# Kysy digest ja alustat suoraan rekisteristä
docker buildx imagetools inspect php:8.4-fpm
Monialustakuvissa imagetools-kysely näyttää ylemmän tason digestin ja sen alla kullekin alustalle, esimerkiksi linux/amd64 tai linux/arm64, oman digestinsä. Dokumentoikaa digest, jonka palvelimenne todella noutavat, ja huomatkaa, että eri arkkitehtuurin kehittäjäkoneet saavat eri alustadigestin.
Jos php -v ei näytä vähintään haaran korjattua versiota, kuva on vanhentunut tai peräisin välimuistista. Tarkistakaa silloin, käyttääkö ympäristönne rekisteripeiliä, joka toimittaa vanhoja tiloja.
Versioille PHP 8.1 ja vanhemmat PHP-projekti ei enää julkaise virallisia julkaisuja. Näiden haarojen virallinen kuva ei siksi voi sisältää säännöllistä korjattua versiota. Tagit, joita ei enää huolleta, pysyvät Docker-ohjeiden mukaan noudettavissa, mutta niitä ei enää päivitetä.
Kuvan mukana tulevat Docker Hubin mukaan php.ini-development ja php.ini-production, ja tuotantokäyttöön suositellaan jyrkästi tuotantoversiota. Omat asetukset tallennatte tiedostona hakemistoon $PHP_INI_DIR/conf.d/, myös php.netin väliaikaisarvot.
Tyypillisiä virheitä kuvan valinnassa
- Variantti tottumuksesta: Valitaan apache-variantti, koska se käynnistyy helposti, vaikka fpm erillisellä verkkopalvelimella olisi mahdollinen.
- Omia kuvia ei rakenneta uudelleen: Peruskuva on ajan tasalla, siitä rakennettu sovelluskuva ei.
- Monivaiheiset buildit huomaamatta: Dockerfilessä, jossa on useita
FROM-rivejä, muutetaan vain yhtä. - Sivukuvat unohdetaan: Worker-, cron-kontit ja ylläpitotyökalut käyttävät omia tageja.
- Luotetaan vain
latest-tagiin: Tag ei kerro mitään haarasta eikä variantista, ja se voi uuden pääversion tullessa hypätä yllättäen.
Miten uudelleenrakennukset automatisoidaan, jotta vanhentunut kuva ei ehdi pitkään olla käynnissä, kuvaa CI/CD: PHP-kuvien automaattinen uudelleenrakennus. PHP:n perusteet konteissa selittää PHP konteissa.
Miten PHP SOS auttaa konkreettisesti?
- Kannan tarkistus: Luemme, mitä tageja, digestejä ja PHP-versioita kuvissanne ja käynnissä olevissa konteissanne on.
- Variantin arviointi: Tarkistamme, onko mod_php tarpeen vai vähentääkö fpm erillisellä verkkopalvelimella riskiä.
- Uudelleenrakennus ja todistus: PHP-päivityspalvelun kautta rakennamme kuvat uudelleen korjatun pohjan päälle ja dokumentoimme tagin, digestin ja version.
- Prosessin vakiinnuttaminen: Rakennamme Dockerfilet ja käyttöönotot niin, että seuraava korjaus saapuu suunnitellusti.
Usein kysytyt kysymykset
Mitä eroa on tagilla ja digestillä?
Tag, kuten php:8.4-fpm, on nimi, joka voi jokaisen uudelleenrakennuksen jälkeen osoittaa uuteen tilaan. Digest on tarkistussumma, joka yksilöi täsmälleen yhden muuttumattoman tilan. Todisteiden ja toistettavien käyttöönottojen kannalta digest on luotettavampi tieto.
Mikä tag sisältää PHP2Shell-korjauksen?
Korjattu on PHP 8.5.12, 8.4.27, 8.3.36 ja 8.2.35. Täydellä versionumerolla varustettu tag näyttää tilan suoraan. Lyhyemmillä tageilla, kuten 8.4-fpm, tarkistatte noutamisen jälkeen komennolla php -v, mikä versio kuvassa todella on.
Onko PHP 8.1:lle olemassa korjattua virallista kuvaa?
PHP-projekti ei enää julkaise versioille 8.1 ja vanhemmille virallisia julkaisuja. Näiden haarojen virallinen kuva ei siksi voi sisältää säännöllistä korjattua versiota. Suunnitelkaa siirtymä tuettuun haaraan.
Onko apache-variantti riskialttiimpi kuin fpm?
apache-variantti ajaa PHP:tä Apache-moduulina, siis mod_php:nä. Tämän ajotavan PHP-tiimi arvioi PHP2Shellin kohdalla riskialtteimmaksi. Molemmat variantit tarvitsevat päivityksen; mod_php:ssä kiire on erityisen suuri.