Moduuli 7 · 7.4
Sivuston vahventaminen: oikeudet, otsakkeet ja tietoturvalisäosat
Moduuli 7: Tietoturva · Lukuaika: 10 minuuttia
Oppimistavoite: Tämän oppitunnin jälkeen osaat vahventaa WordPress-sivustoa oikeuksilla, asetuksilla ja tietoturvaotsakkeilla, sekä arvioida tietoturvalisäosien todellisen hyödyn.
Keskeiset käsitteet: vahventaminen (hardening), tiedosto-oikeudet (644, 755), DISALLOW_FILE_EDIT, ei PHP:tä uploads-kansiossa, hakemistolistaus, version piilottaminen, X-Powered-By, tietoturvaotsakkeet, varmuuskopiotiedostot ja .git-kansio verkkohakemistossa, WAF palvelimella, WAF lisäosassa, haittaohjelmaskanneri
Mitä vahventaminen on
Vahventaminen tarkoittaa sivuston asettamista niin, että virhe tai tietoturva-aukko aiheuttaa mahdollisimman vähän vahinkoa. Se ei korvaa päivityksiä tai vahvoja salasanoja (oppitunti 7.2 ja 7.3), mutta rajoittaa seurauksia. Ajattele taloa: päivitykset ovat lukkoja, vahventaminen varmistaa, ettei sisään päässyt murtautuja pääse kassakaappiin asti.
Tiedosto-oikeudet
Jokaisella palvelimen tiedostolla ja kansiolla on oikeudet: kuka saa lukea, kirjoittaa ja suorittaa. Ne kirjoitetaan kolmena numerona: omistajalle, ryhmälle ja kaikille muille. WordPressin dokumentaation ohjeistus:
| Mikä | Oikeudet | Merkitys |
|---|---|---|
| Kansiot | 755 | Omistaja saa tehdä kaiken, muut saavat lukea ja avata |
| Tiedostot | 644 | Omistaja saa lukea ja kirjoittaa, muut vain lukea |
| wp-config.php | tiukempi, esimerkiksi 600 tai 640 | Vain omistaja (ja mahdollisesti webpalvelimen ryhmä) saa lukea |
Mikä arvo toimii wp-config.php-tiedostolle, riippuu siitä, miten webhotellisi ajaa PHP:tä: useimmissa jaetuissa webhotelleissa PHP ajetaan omana käyttäjänäsi, jolloin 600 riittää. Kokeile ja katso, toimiiko sivusto vielä.
Ei koskaan 777. Se tarkoittaa, että kuka tahansa palvelimella saa kirjoittaa. Ohje, jossa lukee "aseta kansio arvoon 777, jos lataaminen ei toimi", ratkaisee ongelman väärällä tavalla. Hyvässä webhotellissa sitä ei tarvita koskaan.
Asetukset wp-config.php-tiedostossa
Muutama rivi, joka vaikuttaa paljon (rivin "stop editing" yläpuolelle):
// Tiedostojen muokkaaminen ohjausnäkymästä pois käytöstä (Ulkoasu > Teemaeditori ja Lisäosat > Lisäosaeditori).
define( 'DISALLOW_FILE_EDIT', true );
// Virheilmoituksia ei koskaan kävijöiden näytölle (oppitunti 5.4).
define( 'WP_DEBUG', false );DISALLOW_FILE_EDIT poistaa editorin, jolla ohjausnäkymästä voi muokata teemojen ja lisäosien PHP-tiedostoja. Murtautuja, joka saa haltuunsa pääkäyttäjätilin, ei voi silloin kahdella klikkauksella lisätä haitallista koodia teemaasi. Lisäosien asentaminen onnistuu silti; jos haluat kieltää senkin (esimerkiksi hallinnoidessasi asiakkaan sivustoa), käytettävissä on DISALLOW_FILE_MODS, mutta silloin myöskään päivitykset ohjausnäkymästä eivät enää toimi.
Ei PHP:tä uploads-kansiossa, ei hakemistolistausta
Kansiossa wp-content/uploads kuuluu olla kuvia ja asiakirjoja, ei koskaan PHP-tiedostoja. Murtautujat, jotka pääsevät tietoturva-aukon kautta lataamaan tiedoston, yrittävät nimenomaan ladata PHP-tiedoston ja sitten kutsua sitä. Estä tämä .htaccess-tiedostolla uploads-kansiossa (LiteSpeedillä ja Apachella):
<Files *.php>
Require all denied
</Files>Kytke pois päältä myös kansioiden sisällön näyttäminen. Ilman tiedostoa index.php tai index.html jotkin webpalvelimet näyttävät listan kaikista kansion tiedostoista ("Index of /wp-content/uploads/2026/11"). Se on näyteikkuna sille, joka etsii varmuuskopioita tai arkaluonteisia asiakirjoja. Verkkohakemistosi .htaccess-tiedostossa:
Options -IndexesMonilla webhotelleilla tämä on jo oletuksena pois päältä. Tämän oppitunnin tehtävä tarkistaa sen.
Ei tähteitä verkkohakemistossa
Kaikki verkkohakemistossa on noudettavissa webin kautta, paitsi se, minkä palvelin suorittaa PHP:nä tai estää. Vaarallisia ovat:
- wp-config.php-tiedoston kopiot (
wp-config.php.bak,wp-config.old,wp-config.php~tekstieditorista): ne sisältävät tietokantasalasanasi ja lähetetään tekstinä (oppitunti 1.3); - varmuuskopiot kuten
backup.zip,site.tar.gztaidatabase.sqlverkkohakemistossa; - kehittäjän jättämä
.git-kansio, jolla joku voi ladata koko koodisi (ja joskus salasanoja); - debug.log wp-content-kansiossa (oppitunti 5.4);
- vanhat asennus- tai testitiedostot, kuten
info.phpjossa onphpinfo().
Säilytä varmuuskopiot verkkohakemiston ulkopuolella tai palvelimen ulkopuolella, ja siivoa tähteet pois.
Version piilottaminen: pieni hyöty
WordPress lisää oletuksena HTML:ään:
<meta name="generator" content="WordPress 7.1.4" />ja saman RSS-syötteeseen. Myös PHP ilmoittautuu joskus otsakkeessa: X-Powered-By: PHP/8.3.14. Sen piilottaminen on järkevää, mutta älä odota siltä liikaa: murtautujien ohjelmat yrittävät tietoturva-aukkoa joka tapauksessa, riippumatta siitä, minkä version näytät, ja versiot ovat usein pääteltävissä myös skriptien perässä olevasta ?ver=-parametrista. Piilottaminen on siivoamista, ei suojausta. Sivusto, joka piilottaa versionsa mutta ei päivity, on yhtä haavoittuva.
Näin teet sen, omassa pienessä lisäosassa tai lapsiteemasi functions.php-tiedostossa:
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );Ja PHP:n otsake asetuksella expose_php = Off webhotellisi PHP-asetuksissa (DirectAdminissa kohdassa Select PHP version, Options), tai .htaccess-tiedostossa komennolla Header unset X-Powered-By.
Tietoturvaotsakkeet
Muutamalla otsakkeella kerrot selaimelle, miten sen tulee käsitellä sivustoasi. Tärkeimmät:
| Otsake | Mitä se tekee |
|---|---|
Strict-Transport-Security | Vain https:n kautta (oppitunti 3.1) |
X-Content-Type-Options: nosniff | Selain ei arvaile, minkä tyyppinen tiedosto on kyseessä; estää ladatun "kuvan" suorittamisen skriptinä |
X-Frame-Options: SAMEORIGIN tai Content-Security-Policy: frame-ancestors 'self' | Muut sivustot eivät saa näyttää sivustoasi kehyksessä; estää clickjackingin (näkymättömän painikkeen asettamisen sivustosi päälle toisella sivustolla) |
Referrer-Policy: strict-origin-when-cross-origin | Klikatessa linkkiä toiselle sivustolle mukaan lähtee vain verkkotunnuksesi, ei koko osoite |
Permissions-Policy | Kytkee pois selaintoiminnot, joita sivustosi ei käytä (kamera, mikrofoni, sijainti) |
Content-Security-Policy | Määrittää tarkasti, mistä lähteistä skriptit ja tyylit saavat tulla. Tehokas, mutta hankala saada toimimaan kunnolla WordPressin ja lisäosien kanssa; aloita Report-Only-tilasta |
.htaccess-tiedostossa (LiteSpeedillä ja Apachella):
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>Testaa sen jälkeen, että kaikki toimii: upotettu sisältö, maksupainikkeet, chat-widget. Ulkoiset työkalut, kuten securityheaders.com ja internet.nl, näyttävät mitä sivustosi lähettää.
Tietoturvalisäosat, rehellisesti arvioituna
Tietoturvalisäosia on paljon (esimerkiksi Wordfence, Solid Security, All-In-One Security, Sucuri). Ne yhdistävät usein: palomuurin, haittaohjelmaskannerin, kirjautumissuojauksen, kaksivaiheisen tunnistautumisen, ilmoitukset ja vahventamislistan. Hyödyllisiä, mutta rajoituksin:
- Lisäosan palomuuri (WAF) käynnistyy vasta, kun PHP käynnistyy. Haitallisen pyynnön täytyy ensin kulkea webpalvelimen ja PHP:n läpi ennen kuin lisäosa näkee sen. Tietoturva-aukko PHP-tiedostossa, jota kutsutaan suoraan, tai hyökkäys, joka kuormittaa itse PHP:tä raskaasti, ei aina pysähdy siihen. Palvelimella oleva palomuuri (esimerkiksi ModSecurity, Imunify360 tai webhotellisi oma palomuuri) on aiemmin ketjussa ja pysäyttää enemmän, ilman että oma lisäosasi tekee laskentatyön. Kysy webhotellistasi, mitä palvelimella ajetaan.
- Skanneri löytää jälkikäteen. Haittaohjelmaskanneri kertoo, että jotain on vialla. Se on arvokasta, mutta ei estä mitään. Ja samalla palvelimella hakkeroidun sivuston kanssa oleva skanneri voi itsekin olla murtautujan muokkaama.
- Ne eivät korvaa päivityksiä. Lisäosa, jossa on tunnettu tietoturva-aukko, pysyy haavoittuvana, myös tietoturvalisäosan rinnalla. Jotkut tietoturvapalvelut tarjoavat "virtuaalisia paikkauksia", jotka pysäyttävät tunnettuja hyökkäyksiä kunnes olet päivittänyt; kätevä väliaikaisratkaisu, ei korvaaja.
- Ne ovat itsekin lisäosia. Enemmän koodia, enemmän päivitettävää, joskus itsessään tietoturva-aukko. Ja kaksi tietoturvalisäosaa yhtä aikaa törmäävät usein keskenään.
- Ne vievät laskentatehoa, erityisesti skannerit, jotka ajetaan omalla palvelimellasi.
Järkevä valinta: katso ensin, mitä webhotellisi jo tekee (palomuuri, haittaohjelmaskannaus, kirjautumisyritysten estäminen). Täydennä se, mikä puuttuu, yleensä kaksivaiheinen tunnistautuminen ja kirjautumisyritysten rajoittaminen. Laaja tietoturvalisäosa on hyödyllisin, kun webhotelli itse tekee vain vähän.
Yhteenveto
- Vahventaminen rajoittaa virheen tai tietoturva-aukon aiheuttamaa vahinkoa; se ei korvaa päivityksiä tai salasanoja.
- Kansiot 755, tiedostot 644, wp-config.php tiukempi; ei koskaan 777.
- Kytke DISALLOW_FILE_EDIT päälle, estä PHP uploads-kansiossa, kytke hakemistolistaukset pois ja siivoa varmuuskopiot, .git ja debug.log pois verkkohakemistosta.
- Version piilottaminen on siivoamista, ei suojausta; tietoturvaotsakkeet auttavat selainta suojelemaan kävijöitäsi.
- Palvelimella oleva palomuuri pysäyttää enemmän kuin lisäosa; tietoturvalisäosat ovat täydennys, eivät korvaaja.
Tietovisa
Tehtävä
Tehtävä A7.4: Mitä sivustosi näyttää kaikille? Syötä sivustosi osoite. Ohjelma lukee etusivun ja RSS-syötteen (/feed/) ja tarkistaa: ei ole WordPress-versiota HTML:n ja syötteen generator-tagissa, otsake X-Powered-By ei näytä PHP-versiota, ja sivustosi lähettää X-Content-Type-Options: nosniff, kehyssuojauksen (X-Frame-Options tai frame-ancestors) ja Referrer-Policy-otsakkeen? HSTS (oppitunti 3.1) ja Permissions-Policy saavat puuttua (oranssi).
Tehtävä A7.4b: Ei jämiä webhotellin hakemistossa. Todista, että sivusto on omasi (TXT-tietue tai tiedosto, jossa on tehtävän koodi). Ohjelma kysyy sen jälkeen lyhyen vakiolistan: kansio /wp-content/uploads/ (ei hakemistolistausta), /.git/HEAD, /wp-content/debug.log ja muutama yleinen wp-config.php-tiedoston kopion nimi. Hyvä tulos on, jos mikään niistä ei palauta sisältöä (404 tai 403). Ohjelma ei kokeile mitään muuta eikä muuta mitään.
Lue lisää
Nämä artikkelit kuvaavat vaiheet WebOkén hallintapaneeleissa; muissa paneeleissa toiminta on vastaavaa.
- DirectAdmin-ohje 11.5: Tiedostojen ja kansioiden oikeudet (chmod)
- DirectAdmin-ohje 11.4: Piilotiedostojen, kuten .htaccess, näyttäminen ja muokkaaminen
- DirectAdmin-ohje 15.10: Web Application Firewall
- DirectAdmin-ohje 15.11: Imunify360: verkkosivuston skannaaminen haittaohjelmien varalta
- Tiedostojen estäminen .htaccess-tiedostolla, esimerkiksi plugin-googlemap2-proxy.php
- PHP:n tietoturva
- WordPressin vahventaminen (developer.wordpress.org, englanniksi): https://developer.wordpress.org/advanced-administration/security/hardening/
- Tietoturvaotsakkeet (MDN, englanniksi): https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security
- WordPressin lisäsuojaus: oikeudet, wp-config ja .htaccess
