Deze zelfstudie maakt deel uit van de Bouw je Startup met PHP-serie op Envato Tuts +. In deze serie begeleid ik je door het opstarten van een startup van concept naar realiteit met behulp van mijn Meeting Planner app als een realistisch voorbeeld. Elke stap die ik doe, zal ik de Meeting Planner-code vrijgeven als open-source voorbeelden waar je van kunt leren. Ik zal ook opstartgerelateerde zakelijke problemen aanpakken zodra deze zich voordoen.
De productieserver voor Meeting Planner wordt momenteel uitgevoerd op Digital Ocean (zie andere tutorials over hen bij Envato Tuts +.) In de aflevering van vandaag duiken we in op de basisprincipes van webserverbeveiliging. Ik zal gaan over het beveiligen van de Linux VPS met Meeting Planner en wat standaard Yii-beveiliging. In de volgende aflevering duik ik meer in de programmatische Yii-toepassingsbeveiliging.
Ik neem wel deel aan de opmerkingen hieronder, dus deel uw feedback. Laat het me weten als er beveiligingsonderwerpen zijn die u hebt gemist. Ik sta ook open voor nieuwe functie-ideeën en suggesties voor onderwerpen voor toekomstige zelfstudies.
Ter herinnering: alle code voor Meeting Planner is geschreven in het Yii2 Framework voor PHP. Als je meer wilt weten over Yii2, bekijk dan onze parallelle serie Programming With Yii2.
Als u dit nog niet hebt gedaan, kunt u Meeting Planner nu uitproberen door uw eerste vergadering te plannen. Voel je vrij om feedback te geven over je ervaringen in de reacties hieronder.
Als u een generieke Linux VPS gebruikt, wilt u misschien mijn eerdere Envato Tuts + -handleiding, Uw aanmeldingsgegevens beveiligen bekijken. Het behandelt een aantal stappen die we vandaag zullen bekijken, waaronder SSH-beveiliging en firewalls.
Digital Ocean is ook een geweldige bron voor beveiligingspraktijken. Een inleiding tot het beveiligen van uw Linux VPS is een van de beste overzichten die zij bieden. Bovendien hebben ze gave graphics.
via 7 beveiligingsmaatregelen van Digital Ocean om uw servers te beschermenHier zijn drie andere artikelen die zij aanbieden die ik voor de achtergrond in deze zelfstudie heb gebruikt:
Ten eerste is het van groot belang dat u uw server up-to-date houdt met regelmatige updates en upgrades. Dit integreert beveiligingspatches van software (en open source) providers die u gebruikt.
Dit zijn de basisstappen - u zult er waarschijnlijk bekend mee zijn:
$ sudo apt-get update Ontvang: 1 http://security.ubuntu.com trusty-security InRelease [65.9 kB] Download: 2 http://security.ubuntu.com trusty-security / main Sources [118 kB] Ontvang: 3 http://security.ubuntu.com trusty-security / universe Bronnen [38.0 kB] ... Ign http://mirrors.digitalocean.com trusty / universe Translation-en_US 5.298 kB opgehaald in 10s (526 kB / s) Leespakket lijstjes ... Klaar
Dist-upgrade gebruikt enige intelligentie om de onderlinge afhankelijkheden van bijgewerkte pakketten te beheren:
$ sudo apt-get dist-upgrade Pakketlijsten lezen ... Klaar Bouwafhankelijkheidsboom Statusstatus lezen ... Klaar Een upgrade berekenen ... Gereed De volgende pakketten werden automatisch geïnstalleerd en zijn niet langer nodig: linux-headers-3.13.0-85 linux-headers- 3.13.0-85-generieke linux-headers-3.13.0-86 linux-headers-3.13.0-86-generic ... Cloud-init instellen (0.7.5-0ubuntu1.19) ... Verlaten 'afleiding van / etc / init / ureadahead.conf naar /etc/init/ureadahead.conf.disabled by cloud-init 'Verwerkingstriggers voor libc-bin (2.19-0ubuntu6.9) ...
Om ervoor te zorgen dat het volledig effect heeft, moet u mogelijk enkele keren opnieuw opstarten. Ik stop altijd mijn database en start opnieuw op:
$ sudo service mysql stop mysql stop / waiting $ sudo start $ Broadcast-bericht van meetingplanner.io (/ dev / pts / 0) om 13: 51 ... Het systeem gaat nu NU opnieuw opstarten! Verbinding met meetingplanner.io afgesloten door externe host. Verbinding met meetingplanner.io gesloten.
Wanneer Meeting Planner meer gebruikers heeft, zijn mogelijk meer uitgebreide herstartmechanismen nodig.
U hebt de mogelijkheid uw privésleutel te gebruiken bij het maken van een Digital Ocean-druppel. Toen ik Meeting Planner instelde, herhaalde ik de stappen die ik hier heb beschreven: Uw aanmeldingsgegevens voor de server beveiligen.
Ik heb ook SSH-login verplaatst naar een aangepaste poort, niet naar de veelgebruikte (en aangevallen) poort 22.
Vervolgens heb ik UFW geïnstalleerd, de ongecompliceerde firewall:
$ sudo ufw enable Commando kan bestaande ssh-verbindingen verstoren. Ga verder met de bewerking (y | n)?
Ik heb echter geen ja gezegd tegen dat verzoek. De waarschuwing herinnerde me eraan om al mijn SSH-vereisten nogmaals te controleren.
Ik heb bijvoorbeeld de standaard SSH-poort uitgeschakeld en degene die ik gebruik ingeschakeld:
$ sudo ufw allow 31345 $ sudo ufw deny 22
Vervolgens heb ik een sudo-aanvraag voor de toekomst ingesteld om UFW uit te schakelen voor het geval dat mijn instellingen niet correct waren:
$ sudo op nu +5 minuten waarschuwing: commando's worden uitgevoerd met / bin / sh op> sudo ufw uitschakelen op>baan 9 op ma 18 juli 16:14:00 uur 2016
Vervolgens heb ik UFW ingeschakeld en mijn resterende instellingen doorlopen:
$ sudo ufw default weigert inkomende $ sudo ufw standaard staat uitgaande $ sudo toe ufw staat http $ sudo toe ufw staat https $ sudo toe ufw deny mysql $ sudo ufw enable Commando kan bestaande ssh-verbindingen verstoren. Ga door met operatie (y | n)? y Firewall is actief en ingeschakeld bij het opstarten van het systeem
Dit zijn de resultaten:
$ sudo ufw-status Status: actief Aan actie van - ------ ---- 31345 ALLOW Anywhere 80 ALLOW WAAROM 443 ALLES overal toestaan 22 Overal weigeren 3306 Overal weigeren 31345 (v6) ALLOW Overal (v6) 80 (v6) ALLOW Overal (v6) 443 (v6) ALLOW Overal (v6) 22 (v6) Overal weigeren (v6) 3306 (v6) Overal weigeren (v6)
Notitie: Omdat mijn database momenteel wordt uitgevoerd op dezelfde server als de webservices van Meeting Planner, kan ik poort 3306 blokkeren. Als het gebruik van de site echter naar meerdere servers wordt geschaald, zijn er wijzigingen nodig.
Ik heb ook de UFW-configuratie bewerkt om de firewall in te schakelen wanneer de server opnieuw opstart:
$ sudo nano /etc/ufw/ufw.conf enabled = on
Vanwege de opdracht uitgesteld uitschakelen, moest ik UFW na vijf minuten opnieuw inschakelen.
Naast mijn aanmeldingsgegevens voor het beveiligen van uw server, begeleidt de Digital Ocean UFW Essentials: Common Firewall-regels en -opdrachten en het instellen van een firewall met UFW op een Ubuntu en Debian Cloud Server zijn handig bij het configureren van UFW.
Voor de veiligheid van mensen die Meeting Planner gebruiken, configureer ik ook SSL, zoals beschreven in Het gebruik van Let's Encrypt SSL with Your WordPress Project.
En misschien merk je dat ik https toegang gaf op poort 443 bij het instellen van de bovenstaande firewall. Verzoeken aan http://meetingplanner.io worden automatisch doorgestuurd naar https://meetingplanner.io.
Naast de Linux-beveiligingsstichting, moeten we ook nadenken over het beveiligen van het Yii Framework bovenop PHP. Misschien wil je Programming With Yii2: Security lezen, waarvan we de meeste in de volgende aflevering zullen bekijken.
Vandaag zullen we enkele basisfuncties voor toegangsbeheer implementeren voor Meeting Planner.
Een van de eerste voordelen van het gebruik van een PHP MVC-raamwerk is dat alle verzoeken om pagina's worden gerouteerd via een enkel index.php-bestand. Zoals ik heb beschreven in Programming With Yii2: Routing en URL-creatie, beheert Yii zorgvuldig binnenkomende verzoeken om pagina's en verwijst ze naar de juiste controllers en actiemethoden.
Bovendien is het onze taak om controllerverzoeken te beveiligen wanneer ze in de toepassing komen. In de eerste plaats, wie is deze persoon en hebben zij het recht om deze pagina te openen?
Zoals besproken in de Yii2 Security-zelfstudie, heeft Yii verschillende opties voor het beheren van toegang. Meeting Planner maakt voornamelijk gebruik van de Access Control-functie.
Hier is een voorbeeld van verkeer dat de Meeting Controller binnenkomt, waar gebruikers vaak toegang toe hebben:
class MeetingController breidt Controller public function behaviors () return [... 'access' => ['class' => \ common \ filters \ MeetingControl :: className (), // \ yii \ filters \ AccessControl :: className () uit , 'alleen' => ['index', 'view', 'create', 'update', 'delete', 'decline', 'cancel', 'command', 'download', 'wizard', 'trash' , 'laat'], 'rules' => [// staan geverifieerde gebruikers toe ['allow' => true, 'actions' => ['create', 'index', 'view', 'update', 'delete' , 'weigeren', 'annuleren', 'opdracht', 'downloaden', 'wizard', 'trash', 'late'], 'roles' => ['@'],], ['allow' => true , 'acties' => ['opdracht'], 'rollen' => ['?'],], // al het andere wordt geweigerd],],];
Het toegangsgedrag beschermt alle methoden die worden genoemd in 'enkel en alleen'
. De acties
vermeld met rollen
'@'
vereisen geverifieerde gebruikers, met andere woorden, alleen gebruikers die zich hebben aangemeld, kunnen deze pagina's bekijken. Gebruikers die niet zijn ingelogd, worden omgeleid naar de standaard startpagina. Pagina's met rollen
'?'
zijn open voor het publiek.
Dus, bijvoorbeeld, alleen een geverifieerde gebruiker kan creëren
een vergadering, maar iedereen kan de toepassing invoeren via de URL van vergadering / opdracht. Dat komt omdat we de opdracht-URL in e-mails op grote schaal gebruiken en het heeft een andere authenticatielaag, beschreven in de zelfstudie bij Delivering-uitnodigingen.
Met de opdracht-URL kunnen gebruikers die niet zijn aangemeld (en zelfs deelnemers aan vergaderingen die nog nooit op de site zijn geweest) veilig toegang krijgen tot specifieke pagina's.
Voor het back-endsysteem van Meeting Planner hebben alleen beheerders toegang tot deze pagina's. Omdat beheerders in onze gebruikerstabel op een aangepaste, toepassingsspecifieke manier worden aangegeven, moest ik een aangepaste toegangsregel maken om ze te verifiëren. De basisrollen van Yii ondersteunen alleen geverifieerd @
en niet-geverifieerd ?
.
Laten we eens kijken naar de back-end MessageController voor het verzenden van e-mailupdates voor de hele site naar onze gebruikers:
class MessageController breidt Controller uit / ** * @ neheritdoc * / public function behaviors () return ['access' => ['class' => AccessControl :: className (), 'rules' => [['allow' = > true, 'matchCallback' => functie ($ rule, $ action) return (! \ Yii :: $ app-> user-> isGuest && \ common \ models \ User :: findOne (Yii :: $ app-> gebruiksvriendelijkheid> getId ()) -> isAdmin ()); ],],],
De aangepaste regel zorgt ervoor dat de gebruiker geen gast is en slaagt isAdmin ()
voordat ze worden doorgestuurd naar de juiste actie. Andere gebruikers worden omgeleid naar de inlogpagina van de back-end.
We hebben vandaag veel bereikt, maar er is nog veel te doen.
Als u een server draait, hebt u waarschijnlijk waardering gehad voor de herziening van de standaard Linux- en hostbeveiliging. In de volgende aflevering onderzoeken we beveiligingsstappen die nauwer verband houden met het Yii Framework en de Meeting Planner-toepassing.
Kijk uit voor komende tutorials in de Building Your Startup With PHP-serie. Er komen nog een paar grote functies aan.