Vraag Tips voor het beveiligen van een LAMP-server


Dit is een Canonical Question over het beveiligen van een LAMP-stapel

Wat zijn de absolute richtlijnen voor het beveiligen van een LAMP-server?


91
2017-12-14 01:52


oorsprong




antwoorden:


Davids antwoord is een goede basislijn van de algemene principes van serververharding. Zoals David aangaf, is dit een enorme vraag. De specifieke technieken die u gebruikt, kunnen sterk afhankelijk zijn van uw omgeving en hoe uw server zal worden gebruikt. Waarschuwing, dit kan in een testomgeving veel werk vergen om uit te bouwen en goed gedaan te krijgen. Gevolgd door veel werk om te integreren in uw productieomgeving, en nog belangrijker, bedrijfsproces.

Controleer eerst om te zien of uw organisatie een verhardingsbeleid heeft, omdat deze wellicht de meest relevante zijn. Zo niet, afhankelijk van je rol, is dit misschien een goed moment om ze uit te bouwen. Ik zou ook aanraden om elke component afzonderlijk van onderaf aan te pakken.

De L
Er zijn veel goede gidsen beschikbaar om u te helpen. Deze lijst kan je al dan niet helpen, afhankelijk van je verdeling.

De A
Apache kan leuk zijn om te beveiligen. Ik vind het gemakkelijker om het besturingssysteem te harden en de bruikbaarheid te handhaven dan zowel Apache als PHP.

Hen

De P
Dit loopt halsstarrig in het hele idee van Secure Programming Practices, wat een hele discipline op zich is. SANS en OWASP hebben een belachelijke hoeveelheid informatie over het onderwerp, dus ik zal het hier niet proberen te repliceren. Ik zal me concentreren op de runtime-configuratie en je ontwikkelaars zorgen maken over de rest. Soms verwijst de 'P' in LAMP naar Perl, maar meestal naar PHP. Ik veronderstel dat laatste.


105
2017-12-14 14:50



Ik wil dit antwoord ten minste tien keer stemmen. - user58859
De stille N - Met IPTables of een externe firewall blokkeert u alleen de netwerkverbindingen om toegang te krijgen tot het publiek. - Matt
Dit zou een communitywiki moeten zijn - Brian Adkins
Het is zo gemakkelijk om de firewall te vergeten. Ik hoorde van iemand die een webserver voor een website bouwde en zelfs zover ging als het hacken van de TCP / IP-stack om verkeer weg te gooien dat niet poort 80 was. Een ander ding dat over het hoofd wordt gezien is onnodige diensten - als het niet nodig is om aan te zetten, zet het uit. - Aaron Mason
@AaronMason: gefeliciteerd! Je hebt een succesvolle anekdote. Laten we onthouden dat uw specifieke situatie goed is verlopen, maar laten we hopen dat toekomstige lezers uw ongewone omgeving begrijpen. In het algemeen is dit advies behoorlijk gevaarlijk. - Scott Pack


U hebt een vraag gesteld die, eerlijk gezegd, een paar boeken over het onderwerp waard is. Maar er zijn enkele algemene basisrichtlijnen die goed werken:

  1. Blijf op de hoogte. Dit betekent het besturingssysteem, alle services en vooral alle webapps die u gebruikt.
  2. Schakel onnodige services uit, beperk die nodig zijn tot de minimale blootstelling (als u niet op afstand verbinding maakt met MySQL, en laat het dan niet luisteren op TCP) en voer een host-gebaseerde firewall uit. (Als het strikt LAMP is, zou je goed moeten zijn met 80 en 443, maar misschien ook met SSH voor administratie.))
  3. Gebruik sterke wachtwoorden. Beter nog, als u SSH gebruikt, gebruik dan alleen op sleutels gebaseerde authenticatie.
  4. Zorg ervoor dat je niet als root inlogt. Log in als gebruikers en gebruik su & sudo.
  5. Hoewel het de dingen niet veiliger maakt, moet u tools als logwatch gebruiken, zodat u weet wat er op uw server gebeurt.

Ik hoop dat het je helpt om te beginnen.


13
2017-12-14 02:23



Ik zal voorstellen om "Gids voor de veilige configuratie van Red Hat Enterprise Linux 5" te lezen, geschreven door NSA - ALex_hha
laat op het feest, maar ik heb onlangs gelezen dat "niet als root inloggen" niet langer zo'n grote deal is, vooral als je SSH auth gebruikt op basis van publieke / private sleutels. - the0ther


Hier is een goede checklist waar ik graag mee begin.

brandmuur

  • Een leuke benadering is om geen verkeer toe te staan ​​om mee te beginnen enkel en alleen open wat je nodig hebt, zoals je het nodig hebt. Dit resulteert in het openen van de minimale poorten / ips om dingen te laten werken en dat minimaliseert uw blootstelling.
  • Voor een LAMP-server hoeft u mogelijk alleen poorten te openen voor http / https voor de wereld en ssh voor sysadmins.
  • Zorg ervoor dat dingen zoals ipv6-verkeer zijn vergrendeld als het niet wordt gebruikt
  • AWS biedt beveiligingsgroepen, linux heeft iptables evenals tal van pakketten om uit te kiezen van.

SSH & gebruikers

  • Geen wachtwoord voor ssh-toegang (gebruik persoonlijke sleutel)
  • Sta root niet toe aan ssh (de juiste gebruikers moeten inloggen, dan su of sudo)
  • Gebruik sudo voor gebruikers, zodat opdrachten worden vastgelegd
  • Log ongeoorloofde inlogpogingen in (en overweeg software om gebruikers die te vaak toegang proberen te krijgen tot uw server te blokkeren / te verbieden, zoals fail2ban)
  • ssh op een niet-standaard poort (dit kan handig zijn om ervoor te zorgen dat je niet laaghangend fruit bent, en een hoop van het vervelende verkeer weghoudt, maar niet veel voor de veiligheid doet, vooral op zichzelf)
  • lock ssh alleen naar het ip-bereik dat je nodig hebt (een groot bereik is beter dan geen bereik)

Database

  • Sanitaire gebruikersgegevens
  • Parametereer zoekopdrachten
  • Overweeg de DB te abstraheren naar zijn eigen machine. Deze scheiding kan het voor een aanvaller moeilijker maken om naar uw webstack te gaan en omgekeerd.
  • Zoals elke software up-to-date houden is belangrijk.
  • Een gebruiker voor elk doel. Wanneer u gebruikers maakt, begint u zonder privileges en voegt u alleen degenen toe die u nodig hebt om hun rol te vervullen. Het hebben van afzonderlijke gebruikers voor verschillende applicaties (of soms verschillende delen van applicaties) zal helpen het voordeel te verminderen dat een aanvaller heeft als ze een account zouden compromitteren. Wees ook voorzichtig met speciale privileges zoals GRANT, die niet licht moeten worden toegewezen.
  • Een beleid hebben om periodiek wachtwoorden te veranderen, is een goed idee. Als u zich zorgen maakt over de hoeveelheid benodigde inspanning, onthoud dan dat minder vaak beter is dan nooit.
  • Begrijp wachtwoord-encryptie. Zout wachtwoorden. Gebruik geen md5!

Software

  • Houd software up-to-date (os, webserver, scriptingtaal, CMS). Veel mensen zullen scannen op bekende zwakke plekken in oude (niet-gepatchde) versies
  • Verwijder alle software die u niet nodig hebt (in het ideale geval geen pakket bewaren dat vereist is om software te compileren op productieservers, is het beter om software vooraf te compileren en als pakket beschikbaar te maken voor uw productiemachines)
  • Zorg ervoor dat het bestand machtigingen zijn geblokkeerd (vooral voor dingen zoals gebruikersuploads en configuratiebestanden)
  • Wachtwoordbeveiligingsbeheer voor CMS op webserversniveau (http-authenticatie kan voor een kwetsbaar CMS zitten en de toegang blokkeren, wat een goede manier is om aanvallen te voorkomen)
  • Gebruik SSL voor beheerdersgebieden en andere gevoelige gegevens
  • Automatiseer het beheer van uw servers en infrastructuur (iets als Puppet, Chef of SaltStack.) Als u AWS CloudFormation ook gebruikt). Dit zal u helpen om dingen op meerdere servers te patchen en om scenario's te beperken, zoals het oplossen van machtigingen op server A maar het vergeten om het op server B te doen
  • Vermijd waar mogelijk niet de specifieke versie van uw CMS, PHP of WebServer. Hoewel het verdoezelen van deze informatie geen beveiliging is, zijn er veel mensen op zoek naar bepaalde versies van verschillende software en hoe minder informatie u vrijelijk verspreidt, hoe meer een aanvaller moet werken. Dit is een goede manier om ervoor te zorgen dat je niet een van de laaghangende vruchten bent. Dit zal natuurlijk niets doen aan iemand die wat meer moeite wil besteden om erin te komen
  • Beperk de mensen die toegang hebben tot de server

7
2017-08-10 08:08





Voegend aan wat David suggereert, hoe modulairer uw installatie, daarmee bedoel ik het beperken van de toegang tot bepaalde gebruikers / groepen die speciaal voor één taak zijn gemaakt en beperk hun bereik, hoe veiliger uw LAMP-stack: een voorbeeld hiervan is om een ​​Apache-gebruiker te hebben voor Apache-bestanden / mappen met overeenkomstige machtigingen en niet in groepen die toegang hebben tot kritieke systeembestanden / mappen. Een gebruiker die toegang heeft tot de MySQL-tabellen die zijn gekoppeld aan uw websites die u gaat gebruiken en alleen die tabellen. Bovendien kunt u hun toegang beperken om de minimale hoeveelheid toegang te geven vanaf een PHP-oproep. Zorg er ook voor dat de MySQL-gebruikersnaam die wordt gebruikt / weergegeven via het PHP-bestand niet dezelfde gebruikersnaam of hetzelfde wachtwoord is dat voor een andere gebruiker wordt gebruikt.

Wat dit betekent: als de apache-gebruiker of de MySql-gebruiker is gehackt, kunnen ze geen schade aanrichten buiten het bereik van de map (pen) waar apache toegang toe heeft (in het geval van de apache-gebruiker) en buiten de tabel ( s) / database (s) (in het geval van de gebruiker voor de MySQL-database).

Als op de een of andere manier de MySQL-gebruiker zou worden gehackt, zouden ze bijvoorbeeld geen toegang kunnen krijgen tot de database en alle databases van MySQL kunnen laten vervallen en al uw gegevens kunnen verpesten. Ze zouden onder bepaalde omstandigheden in staat kunnen zijn tabellen te laten vallen of informatie in te voegen in sommige tabellen in een geïsoleerde database. Daarom is het belangrijk om alleen tafeltoegang toe te staan ​​waar dit absoluut noodzakelijk is en alleen de benodigde rechten toe te kennen ... als je dat niet doet t moet privileges voor vervolgkeuzelijsten hebben of machtigingen bijwerken en deze dan niet aan die gebruiker geven.

Als om wat voor reden dan ook de gebruikersnaam en het wachtwoord van uw beheerdersaccount achterhaald zijn voor MySQL, moeten ze eerst de beveiliging van uw systeem breken voordat ze uw database binnengaan om schade aan te richten als u een andere gebruikersnaam gebruikt dan welke gebruikersnaam dan ook op uw systeem. Hetzelfde geldt voor de apache-gebruiker en de toegang tot bestanden.

Voorbeeldtijd! Ik ga een systeemvoorbeeld geven om het idee eenvoudiger te maken.

stel dat u gebruikers op uw systeem hebt (root moet worden uitgeschakeld voor beveiliging via bijvoorbeeld umod -l of passwd -l, enz.): John, Barney, Terence en Lisa.

je zou een gebruiker kunnen maken in MySQL met de naam bigbird (zorg ervoor dat je een hash-wachtwoord gebruikt). Bigbird heeft alleen bepaalde rechten en update-rechten, maar niet laten vallen of maken, en zeker niet . Bovendien maakt u een andere administratieve MySQL-gebruiker met de naam garfield om aan de MySQL-database te werken en verwijdert u de rootgebruiker uit de MySQL-database zodat deze niet kan worden gecompromitteerd. garfield is verleend . privileges in MySQL (in feite is dit alleen het hernoemen van de root).

nu maak je een apache-groep of een gebruiker aan en we noemen het apweb2. Appweb2 is geen lid van andere groepen en alle bestanden / mappen voor apache zijn opgeslagen in / home / apweb2 /. Elke virtuele host zou een eigen submap hebben en voor elk van deze hosts zou de document root in die submap staan. Symlinks zouden worden uitgeschakeld om niet per ongeluk toegang tot de rest van het systeem te bieden.

Ook kun je ssh-toegang beperken tot bepaalde gebruikers (of bepaalde groepen, ik plaats ze graag in de ssh-groep en zorg ervoor dat dat het enige is dat ssh kan gebruiken).

Je kunt ook kiezen welke gebruikers sudo-rechten hebben om dingen nog verder te beperken. Een andere stap die je verder kunt brengen is om ssh-gebruikers niet in staat te stellen om sudo te maken, je zou speciale gebruikers kunnen maken die sudo kunnen gebruiken die geen SSH kunnen gebruiken, dus als je eenmaal SSH hebt, moet je inloggen op een andere gebruiker om te hebben toegang tot sudo.

Dus, door elk segment te modulariseren, als een compromis wordt gesloten, zal de hele stapel niet worden aangetast en kun je het 1 probleem oplossen in plaats van helemaal opnieuw opnieuw te hoeven beginnen.


4
2017-07-30 04:49





Ik vond dit document van SANS.org erg nuttig http://www.sans.org/score/checklists/linuxchecklist.pdf


2
2017-08-10 11:50



Welkom bij Server Fault! Over het algemeen houden we van antwoorden op de site om op zichzelf te kunnen staan ​​- Links zijn geweldig, maar als die link ooit doorbreekt, moet het antwoord voldoende informatie hebben om nog steeds nuttig te zijn. Overweeg om uw antwoord te bewerken om meer details op te nemen. Zie de FAQ voor meer informatie. - slm


Vermijd op dit moment containervirtualisatie niet, namelijk Docker, systemd-nspawn en de mechanismen van containervirtualisatie waarop ze zijn gebouwd (naamruimten, cgroups). Met behulp van containervirtualisatie kunt u processen isoleren, bijvoorbeeld als een van de services wordt gehackt, krijgt een aanvaller geen toegang tot andere services.

In het geval van LAMP is het mogelijk om bijvoorbeeld vier Docker-containers met SSH-server, Apache, MySQL, PHP-FPM / Python / Perl / etc te gebruiken.


0
2017-07-27 20:00