Ce tutoriel fait partie de la Construire votre démarrage avec la série PHP sur Envato Tuts +. Dans cette série, je vous guide dans le lancement d’une startup du concept à la réalité en utilisant mes Planificateur de réunion application comme exemple de la vie réelle. À chaque étape du processus, je publierai le code de Meeting Planner sous forme d’exemples open source à partir desquels vous pourrez apprendre. Je traiterai également les problèmes liés au démarrage au fur et à mesure qu'ils surviennent.
Le serveur de production de Meeting Planner fonctionne actuellement à Digital Ocean (voir d'autres tutoriels à ce sujet à Envato Tuts +.) Dans l'épisode d'aujourd'hui, nous allons plonger dans les bases de la sécurité des serveurs Web. Je traiterai de la sécurisation du VPS sous Linux avec Meeting Planner et de la sécurité de base de Yii. Dans le prochain épisode, je plongerai davantage dans la sécurité des applications Yii programmatique.
Je participe aux commentaires ci-dessous, alors partagez vos commentaires. S'il vous plaît laissez-moi savoir s'il y a des sujets de sécurité que vous pensez que j'ai ratés. Je suis également ouvert aux nouvelles idées de fonctionnalités et suggestions de sujets pour les prochains tutoriels..
Pour rappel, tout le code pour Meeting Planner est écrit dans le framework Yii2 pour PHP. Si vous souhaitez en savoir plus sur Yii2, consultez notre série parallèle Programmer avec Yii2.
Si ce n'est déjà fait, essayez dès maintenant Planificateur de réunions en planifiant votre première réunion. N'hésitez pas à poster des commentaires sur votre expérience dans les commentaires ci-dessous.
Si vous utilisez un VPS Linux générique, vous pouvez consulter le didacticiel précédent d'Envato Tuts +, Sécuriser votre connexion au serveur. Il couvre un certain nombre d'étapes que nous allons réexaminer aujourd'hui, notamment la sécurité SSH et les pare-feu..
Digital Ocean est également une excellente ressource pour les pratiques de sécurité. Une introduction à la sécurisation de votre Linux VPS est l’un des meilleurs aperçus qu’ils offrent. De plus, ils ont des graphismes sympas.
7 mesures de sécurité de Digital Ocean pour protéger vos serveursVoici trois autres articles qu'ils proposent et que j'ai utilisés pour le contexte de ce tutoriel:
Tout d'abord, il est essentiel de maintenir votre serveur à jour avec des mises à jour et des mises à niveau régulières. Cela intègre les correctifs de sécurité des fournisseurs de logiciels (et open source) que vous utilisez..
Voici les étapes de base - vous les connaîtrez probablement:
$ sudo apt-get update Obtenez: 1 http://security.ubuntu.com fidel-security InRelease [65.9 kB] Obtenez: 2 http://security.ubuntu.com trusty-security / sources principales [118 kB] Obtenez: 3 http://security.ubuntu.com trusty-security / universe Sources [38.0 ko]… Ign http://mirrors.digitalocean.com trusty / universe Traduction-en_US Obtenu 5 298 ko en 10s (526 ko / s) Paquet de lecture Listes… Fait
Dist-upgrade utilise certaines informations pour gérer les interdépendances des packages mis à jour:
$ sudo apt-get dist-upgrade Lire les listes de paquetages… Terminé Construire l'arborescence des dépendances Lire les informations d'état… Terminé Calcul de la mise à niveau… Terminé Les paquetages suivants ont été installés automatiquement et ne sont plus nécessaires: linux-headers-3.13.0-85 linux-headers- 3.13.0-85-generic linux-headers-3.13.0-86 linux-headers-3.13.0-86-generic… Configuration de cloud-init (0.7.5-0ubuntu1.19)… Laissant le 'détournement de / etc / init / ureadahead.conf à /etc/init/ureadahead.conf.disabled par cloud-init 'Déclencheurs de traitement pour libc-bin (2.19-0ubuntu6.9)…
Pour que cela prenne effet, vous devrez peut-être redémarrer à l'occasion. J'arrête toujours ma base de données et redémarre ensuite:
$ sudo service mysql stop mysql stop / waiting $ sudo reboot $ Message diffusé depuis meetingplanner.io (/ dev / pts / 0) à 13h51… Le système est en cours de redémarrage MAINTENANT! Connexion à meetingplanner.io fermée par l'hôte distant. Connexion à meetingplanner.io fermée.
Lorsque Meeting Planner a plus d'utilisateurs, des mécanismes de redémarrage plus élaborés peuvent être nécessaires.
Vous avez la possibilité d'utiliser votre clé privée lors de la création d'un droplet Digital Ocean. Lors de la configuration de Meeting Planner, j'ai répété les étapes décrites ci-après: Sécurisation de la connexion au serveur..
J'ai également déplacé la connexion SSH sur un port personnalisé, pas sur le port couramment utilisé (et attaqué) 22.
Ensuite, j'ai installé UFW, le pare-feu simple:
$ sudo ufw enable La commande peut perturber les connexions ssh existantes. Procéder à l'opération (y | n)?
Cependant, je n'ai pas répondu oui à cette demande. L'avertissement m'a rappelé de vérifier toutes mes exigences SSH.
Par exemple, j'ai désactivé le port SSH par défaut et celui que j'utilise:
$ sudo ufw permettre 31345 $ sudo ufw nier 22
Ensuite, j'ai configuré une demande Sudo pour le futur pour désactiver UFW au cas où mes paramètres ne seraient pas corrects:
Avertissement $ sudo at now +5 minutes: les commandes seront exécutées à l'aide de / bin / sh à> sudo ufw disable à>emploi 9 au lun. 18 18:14:00 2016
Ensuite, j'ai activé UFW et parcouru les paramètres restants:
$ sudo ufw default refuser $ sudo ufw default autoriser les envois $ sudo ufw autoriser http $ sudo ufw autoriser https $ sudo ufw refuser mysql $ sudo ufw enable La commande peut interrompre les connexions ssh existantes. Procéder à l'opération (y | n)? Le pare-feu est activé et activé au démarrage du système.
Voici les résultats:
$ sudo ufw status Statut: actif Passe à l'action depuis - ------ ---- 31345 AUTORISER partout 80 AUTORISER n'importe où 443 AUTORISER n'importe où 22 DENY Partout 3306 DENY partout 31345 (v6) AUTORISER partout (v6) 80 (v6) AUTORISER Partout (v6) 443 (v6) AUTORISER Partout (v6) 22 (v6) DENY Partout (v6) 3306 (v6) DENY Partout (v6)
Remarque: Étant donné que ma base de données fonctionne actuellement sur le même serveur que les services Web de Meeting Planner, je peux bloquer le port 3306. Toutefois, l'utilisation du site étant étendue à plusieurs serveurs, des modifications seront nécessaires..
J'ai également édité la configuration UFW pour activer le pare-feu au redémarrage du serveur:
$ sudo nano /etc/ufw/ufw.conf enabled = on
En raison de la commande de désactivation retardée, j'ai dû réactiver UFW au bout de cinq minutes..
En plus de ma connexion Sécuriser votre serveur, les guides Digital Ocean UFW Essentials: Règles et commandes de pare-feu communes et Comment configurer un pare-feu avec UFW sur un serveur Ubuntu et Debian Cloud sont utiles lors de la configuration de UFW.
Pour la sécurité des personnes utilisant Meeting Planner, j'ai également configuré SSL, comme décrit dans Utilisation de SSL Encodons SSL avec votre projet WordPress..
Et vous remarquerez peut-être que j'ai autorisé l'accès https sur le port 443 lors de la configuration du pare-feu ci-dessus. Les demandes vers http://meetingplanner.io redirigent automatiquement vers https://meetingplanner.io.
Au-delà de la base de sécurité Linux, nous devons également réfléchir à la sécurisation du framework Yii par-dessus PHP. Vous voudrez peut-être lire la programmation de Programming With Yii2: Security, que nous verrons pour la plupart dans le prochain épisode..
Cependant, aujourd'hui, nous allons implémenter certaines fonctionnalités de contrôle d'accès de base pour Meeting Planner..
L'un des premiers avantages de l'utilisation d'un framework PHP MVC est que toutes les demandes de pages sont acheminées via un fichier index.php unique. Comme je l'ai décrit dans Programmation avec Yii2: routage et création d'URL, Yii gère soigneusement les demandes entrantes de pages et les dirige vers les contrôleurs et les méthodes d'action appropriés..
De plus, il est de notre devoir de sécuriser les requêtes des contrôleurs lorsqu’elles arrivent dans l’application. Qui est cette personne et at-elle le droit d’accéder à cette page??
Comme indiqué dans le didacticiel sur la sécurité Yii2, Yii propose diverses options pour la gestion des accès. Meeting Planner utilise principalement la fonctionnalité de contrôle d'accès.
Voici un exemple de trafic entrant dans le contrôleur de réunion auquel les utilisateurs ont généralement accès:
La classe MeetingController étend le contrôleur comportement de la fonction publique () return [… 'accès' => ['classe' => \ filtres \ commun \ filtres \ MeetingControl :: nom de la classe (), // \ yii \ filtres \ AccessControl :: nom de la classe () , 'seulement' => ['index', 'vue', 'créer', 'mise à jour', 'supprimer', 'refuser', 'annuler', 'commande', 'télécharger', 'assistant', 'corbeille' , 'late'], 'rules' => [// autorise les utilisateurs authentifiés ['allow' => true, 'actions' => ['create', 'index', 'view', 'update', 'delete' , 'refuser', 'annuler', 'commande', 'télécharger', 'assistant', 'corbeille', 'en retard'], 'rôles' => ['@' '],], [' autoriser '=> vrai , 'actions' => ['commande'], 'rôles' => ['?'],], // tout le reste est refusé],],];
Le comportement d’accès protège toutes les méthodes mentionnées dans 'seulement'
. le actes
répertorié avec rôles
'@'
requièrent des utilisateurs authentifiés, autrement dit, seuls les utilisateurs connectés peuvent voir ces pages. Les utilisateurs non connectés sont redirigés vers la page d'accueil par défaut. Cependant, les pages avec rôles
'?'
sont ouverts au public.
Ainsi, par exemple, seul un utilisateur authentifié peut créer
une réunion, mais tout le monde peut accéder à l’application via l’URL de la réunion / commande. Cela est dû au fait que nous utilisons largement l'URL de commande dans les e-mails et que celle-ci dispose d'une autre couche d'authentification, décrite dans le didacticiel sur l'envoi d'invitations..
L'URL de commande permet aux utilisateurs non connectés (et même aux participants à une réunion n'ayant jamais visité le site auparavant) d'accéder en toute sécurité à des pages spécifiques..
Pour le système dorsal de Meeting Planner, seuls les administrateurs peuvent accéder à ces pages. Étant donné que les administrateurs sont notés dans notre table Utilisateurs de manière personnalisée et spécifique à l'application, j'ai dû créer une règle d'accès personnalisée pour les vérifier. Les rôles de base de Yii ne prennent en charge que l'authentification @
et non authentifié ?
.
Regardons le MessageController d’arrière-plan pour l’envoi de mises à jour par courrier électronique à l’ensemble du site:
la classe MessageController s'étend au contrôleur / ** * @inheritdoc * / comportement de la fonction publique () return ['access' => ['class' => AccessControl :: className (), 'rules' => [['allow' = > true, 'matchCallback' => function ($ rule, $ action) return (! \ Yii :: $ app-> user-> isGuest && \ common \ models \ User :: findOne (Yii :: $ app-> utilisateur-> getId ()) -> isAdmin ()); ],],],
La règle personnalisée garantit que l'utilisateur n'est pas un invité et passe isAdmin ()
avant de les transmettre à l'action appropriée. Les autres utilisateurs sont redirigés vers la page de connexion principale.
Nous avons accompli beaucoup aujourd'hui, mais il reste encore beaucoup à faire..
Si vous utilisez un serveur, vous avez probablement apprécié la critique faite aujourd'hui sur la sécurité de base de Linux et de l'hébergement. Dans le prochain épisode, nous explorerons les étapes de sécurité liées plus étroitement au framework Yii et à l'application Meeting Planner.
Surveillez les prochains tutoriels dans la série Construire votre démarrage avec PHP. Il y a quelques autres fonctionnalités plus importantes à venir.