Construire un serveur Web avec Apache 2.4 (httpd 2.4.43) + PHP 7.4 sous Linux --4 Security (chown et firewalld)

Hypothèses et préparatifs

Article sur la construction du serveur Linux

Jusqu'à précédent, j'ai construit un environnement d'application Web avec PHP7.4 + MySQL8.0 sur Apache2.4, mais je dois également aborder la sécurité; ;

Avec le firewalld standard Linux, vous pouvez spécifier uniquement qui utilise quel port sans règles de commande difficiles comme iptables ou contrôle compliqué pour chaque fichier tel que SELinux, et sécurité de base dans le pare-feu. (Bien sûr, il est relativement sûr d'utiliser la sécurité avec un contrôle compliqué même si elle est intrusive ...)

Je voudrais également utiliser le cryptage de fichiers ensemble, mais il sera difficile d'en parler, donc cette fois je ne définirai le droit d'accès avec le pare-feu que par firewalld, chown.

De plus, dans cette vérification, ** je veux vérifier s'il est accessible à partir d'un autre segment de réseau, de sorte que le serveur Web ajoutera une autre carte réseau et ajoutera un autre segment de réseau ** (192.168.1.0/24) J'utilise, mais j'ai ajouté une autre carte réseau (bien que ce soit un pont virtuel) au serveur Web pour construire 192.168.5.0/24)

environnement

supposition

--Utilisateur installé en tant que root (dans ma vérification, il s'agit d'un compte administrateur appelé admin, et il est traité par sudo à partir de là)

Conditions du serveur

adresse IP

--Client (principal): 192.168.1.11 --Client (côté extension): 192.168.5.2

Fonctions et versions pour télécharger et installer individuellement les packages (à partir de juin 2020)

Les autres packages requis sont installés à l'aide des commandes de package standard de la distribution (dnf, apt, etc.) et n'ont pas besoin d'être téléchargés individuellement.

Pour le téléchargement, vous pouvez accéder au site officiel, le télécharger à partir de là et le transférer par FTP, ou vous pouvez l'obtenir avec wget si vous connaissez l'URL du fichier à télécharger, mais la méthode d'acquisition est omise.

Contrôle d'accès pour chaque réseau par firewalld

État actuel du pare-feu

Au moment de la construction du précédent lui-même, je pense que les règles suivantes existent dans firewalld.

--Port 80 à partir de 192.168.1.0/24 (HTTP): autorisé --Port 443 (HTTPS) à partir de 192.168.1.0/24: autorisé --Autres que cela, il y en a qui autorisent des ports séparés tels que SSH et Samba, mais ils sont omis ici car ils ne sont pas liés au serveur Web.

À ce stade, même si vous ajoutez un nouveau réseau de 192.168.5.0/24 comme indiqué dans la figure «Adresse IP» dans «Conditions du serveur», vous ne devriez pas pouvoir y accéder car le pare-feu n'est pas ouvert.

Ici, pour accéder au serveur Web à partir du client (192.168.5.2), entrez l'adresse IP du port du côté extension du serveur Web, https (le port est 443): //192.168.5.1/. Bien entendu, il ressort clairement de la structure du réseau que le client du côté 192.168.5.0/24 ne peut pas accéder au côté principal (192.168.1.18).

192-168-5-0_443-refuse.png

Voir (* ॑ ꒳ ॑ *) ⋆ *

Autoriser / refuser l'accès pour chaque segment de réseau avec firewalld

Autoriser l'accès à un autre segment de réseau

Maintenant, ajoutons une règle «Port 443 (HTTPS) de 192.168.5.0/24: Autoriser» au pare-feu du serveur Web afin qu'il puisse être autorisé même à ** 192.168.5.0/24 **

Utilisez la règle enrichie de firewalld pour identifier un segment de réseau et entrez une règle pour recevoir un port spécifique. Utilisez --add-rich-rule pour saisir la règle entre '~'.

# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port port="443" protocol="tcp" accept'

Cela signifie que la famille IP est IPv4, la source est 192.168.5.0/24, le port 443, le protocole est TCP et la réception est autorisée.

both.png

--Port 80 à partir de 192.168.1.0/24 (HTTP): autorisé --Port 443 (HTTPS) à partir de 192.168.1.0/24: autorisé --Port 443 (HTTPS) à partir de 192.168.5.0/24: autorisé

L'écran ci-dessus est l'écran auquel j'ai essayé d'accéder dans cet état de pare-feu. Vous pouvez certainement y accéder! !! D'ailleurs, si vous voulez le rendre accessible en permanence, ajoutez l'option "--permanent" après "firewall-cmd", et la règle restera appliquée même si vous redémarrez.

Au fait, si vous souhaitez supprimer l'autorisation du port 443 (HTTPS) du réseau 192.168.5.0/24, utilisez --remove-rich-rule et placez la règle que vous souhaitez supprimer dans le '~'. Par exemple, dans IPv4, pour supprimer la règle autorisée sur le port 443 (TCP) de 192.168.5.0/24,

# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port port="443" protocol="tcp" accept'

Si vous entrez, vous ne pourrez pas accéder au port 443 (HTTPS) à partir de 192.168.5.0/24.

192-168-5-0_443-refuse.png

Pour refuser l'accès au réseau

Ensuite, j'ai essayé ce genre d'expérience. Si vous souhaitez refuser le port 80 (HTTP) et ne laisser que le port 443 (HTTPS) autorisé sur le segment de réseau principal 192.168.1.0/24, IPv4, port 80 à partir de 192.168.1.0/24 Supprimer la règle "Autoriser (TCP)"

# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'

Fondamentalement, firewalld bloque tout ce qui n'existe pas dans la règle par défaut, donc s'il n'est pas répertorié dans la règle, il rejettera la réception (méthode de la liste blanche), comme mentionné ci-dessus, le port 80 de 192.168.1.0/24 Si ce n'est pas dans la règle, il sera inaccessible.

port80refuse.png

Gérer les propriétaires et les autorisations Apache

Changer l'utilisateur de démarrage Apache

Par défaut dans Apache (lorsque la source est compilée et installée), l'utilisateur exécute "daemon". Utilisez ps -aux pour afficher une liste de tous les processus et utilisateurs, et limitez-vous à ceux sur lesquels "httpd" est en cours d'exécution, donc limitez-vous avec grep httpd.

# ps -aux | grep httpd
root     14249  0.0  0.4 121504 17124 ?        Ss   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14250  0.0  0.5 1332460 22448 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14251  0.0  0.4 1330220 19460 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14252  0.0  0.6 1332460 25428 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
admin    17782  0.0  0.0   8176   924 pts/0    S+   18:45   0:00 grep --color=auto httpd

Comme mentionné ci-dessus, l'utilisateur qui exécute l'unité principale httpd "/ usr / local / apache2 / bin / httpd" est l'utilisateur par défaut "daemon".

Donc, si vous avez explicitement décidé qui exécutera Apache, j'ai édité httpd.conf pour savoir comment le modifier. Par exemple, si vous souhaitez exécuter Apache avec le nom d'utilisateur "apache" et le nom de groupe "users" (le nom du groupe est users car nous avons expérimenté openSUSE),

# vi /usr/local/apache2/conf/httpd.conf

httpd.conf


Démon utilisateur ← Remplacer par apache
Démon de groupe ← Remplacer par les utilisateurs

Ainsi, lorsque je redémarre Apache et vérifie à nouveau l'utilisateur exécutant httpd avec ps -aux,

# ps -aux | grep httpd
root     17985  0.0  0.4 121504 16944 ?        Ss   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17986  0.0  0.3 1327980 16060 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17987  0.0  0.2 1327980 11980 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17988  0.0  0.2 1327980 11980 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
admin    18071  0.0  0.0   8176   836 pts/0    S+   18:48   0:00 grep --color=auto httpd

Vous pouvez voir qu'apache exécute correctement httpd.

Lorsque vous voulez montrer des fichiers sur Apache à d'autres personnes et que vous ne voulez pas les montrer

Maintenant que nous avons changé l'utilisateur en cours d'exécution d'Apache, nous voulons gérer ce que nous voyons et ce que nous ne voulons pas que les autres voient.

Si vous êtes un autre utilisateur et n'autorisez pas la lecture

Par exemple, supposons que le dossier Apache htdocs est publié sur le Web et que les fichiers suivants y existent.

# cd /usr/local/apache2/htdocs
# ls -l
24 au total
-rw-r--r--1 utilisateurs admin 304 25 juin 17:43 connect.php
-rw-r--r--1 racine racine 45 12 juin 2007 index.html
-rw-r--r--1 racine racine 20 25 juin 17:14 phpi.php
-rw-r--r--1 racine racine 172 25 juin 18:52 some.html
-rw-r--r--1 utilisateurs admin 346 25 juin 17:45 test_form.html
-rw-r--r--1 utilisateurs admin 1271 25 juin 17:45 test_form.php

Alors disons que vous accédez à "some.html". Étant donné que le propriétaire est root et que l'autorisation est 644, ce paramètre signifie que n'importe qui peut accéder à "some.html", d'ailleurs, l'accès avec Apache ne lit que, n'écrit pas ou ne s'exécute pas, alors il suffit de lire Je vais.

200ok.png

L'utilisateur d'exécution d'Apache est apache. À ce moment-là, j'ai pu le lire correctement

J'ai donc laissé le propriétaire en tant que root et ai changé l'autorisation de "some.html" en 600 (le rendre illisible par les autres utilisateurs et uniquement disponible pour l'utilisateur).

# chmod 600 some.html
# ls -l
24 au total
-rw-r--r--1 utilisateurs admin 304 25 juin 17:43 connect.php
-rw-r--r--1 racine racine 45 12 juin 2007 index.html
-rw-r--r--1 racine racine 20 25 juin 17:14 phpi.php
-rw-------1 racine racine 172 25 juin 18:52 some.html
-rw-r--r--1 utilisateurs admin 346 25 juin 17:45 test_form.html
-rw-r--r--1 utilisateurs admin 1271 25 juin 17:45 test_form.php

403.png

Cette fois, il est devenu interdit et ne pouvait pas être lu. C'est évident car l'utilisateur d'exécution Apache apache n'a pas le droit de lire celui de root.

Fichiers qui ont le même propriétaire que l'utilisateur d'exécution Apache et n'autorisent pas les autres utilisateurs

Maintenant, créez "some.html" appartenant à l'utilisateur d'exécution d'Apache, modifiez-le pour qu'il ne puisse pas être lu par d'autres utilisateurs, et vérifiez s'il est à nouveau accessible.

# chown apache:users some.html
# ls -l
24 au total
-rw-r--r--1 utilisateurs admin 304 25 juin 17:43 connect.php
-rw-r--r--1 racine racine 45 12 juin 2007 index.html
-rw-r--r--1 racine racine 20 25 juin 17:14 phpi.php
-rw-------1 utilisateurs apache 172 25 juin 18:52 some.html
-rw-r--r--1 utilisateurs admin 346 25 juin 17:45 test_form.html
-rw-r--r--1 utilisateurs admin 1271 25 juin 17:45 test_form.php

200ok.png

Cette fois, j'ai pu accéder à (´ • ̥ ̫ • ̥ `) Vous pouvez le lire car c'est votre propre fichier

Fichiers qui ont le même propriétaire que l'utilisateur d'exécution Apache et n'autorisent aucun utilisateur

Enfin, vérifions avec html que personne n'autorise la lecture Définissez l'autorisation "some.html" sur 000 ou 200 et n'autorisez personne à lire

# chmod 200 some.html
# ls -l
24 au total
-rw-r--r--1 utilisateurs admin 304 25 juin 17:43 connect.php
-rw-r--r--1 racine racine 45 12 juin 2007 index.html
-rw-r--r--1 racine racine 20 25 juin 17:14 phpi.php
--w-------1 utilisateurs apache 172 25 juin 18:52 some.html
-rw-r--r--1 utilisateurs admin 346 25 juin 17:45 test_form.html
-rw-r--r--1 utilisateurs admin 1271 25 juin 17:45 test_form.php

403.png

C'est vrai (˙꒳ ˙ᐢ) Si vous ne permettez pas de lire vous-même, cela se produira certainement ...

Résumé

Nous avons construit le middleware, et la prochaine chose à venir est de prendre des dispositions pour savoir qui autorise / refuse quoi, donc Qiita devrait définitivement définir les droits d'accès avec firewalld et le propriétaire comme base. Je voulais aussi le mettre ici

Il semble que le cryptage soit également inclus dans le domaine de la sécurité avancée, mais si vous décidez de crypter le système de fichiers, il y aura des problèmes complexes concernant la saisie du mot de passe et la synchronisation des clés, donc je pense que ce n'est pas recommandé pour les débutants. J'ai pensé, donc j'ai gardé le cryptage minimum nécessaire dans la méthode de construction HTTPS (´ • ̥ ̫ • ̥ `)

Eh bien, l'important est de ne rien mettre qui poserait problème en cas de fuite, de ne pas ouvrir de ports inutiles, c'est une prémisse absolue ...

Site de référence

Recommended Posts

Construire un serveur Web avec Apache 2.4 (httpd 2.4.43) + PHP 7.4 sous Linux --4 Security (chown et firewalld)
Source compilez Apache2.4 (httpd 2.4.43) + PHP7.4 sous Linux pour construire un serveur Web ―― 1. Introduction à Apache
Source compile Apache2.4 (httpd 2.4.43) + PHP7.4 sous Linux pour construire un serveur Web --2 introduction PHP
Construction de serveur Web Linux (Ubuntu et Apache)
Source compile Apache2.4 (httpd 2.4.43) + PHP7.4 sous Linux pour construire un serveur Web --3 MySQL 8.0 introduction
Mesures de sécurité du serveur Web efficaces et simples «Linux»
Source compilez Apache2.4 + PHP7.4 avec Raspberry Pi et construisez un serveur Web --2 introduction PHP
Source compilez Apache2.4 + PHP7.4 avec Raspberry Pi et créez un serveur Web ―― 1. Introduction à Apache
Créer un serveur HTTP Apache et Wildfly sur Oracle Linux 8
Compilez Apache2.4 + PHP7.4 avec Raspberry Pi et construisez un serveur Web --3. Utilisez MySQL
Construction de l'environnement du serveur de surveillance Zabbix 4.4 sur CentOS7 (Apache2.4 / PHP5.4 / MariaDB5.5)
Django + Apache avec mod_wsgi sur Windows Server 2016
Installer et configurer le serveur TigerVNC sous Linux
Créez un environnement CentOS Linux 8 avec Docker et démarrez Apache HTTP Server
Installez Python3 et Django sur Amazon Linux (EC2) et exécutez le serveur Web
Lancer un serveur Web avec Python et Flask
Intégrons Django et apache (httpd) sur Mac! !!
Installez PHP série 7 sur Amazon Linux 2 avec Amazon Linux Extras
Créez des serveurs sur Linux et des réseaux locaux avec Raspberry Pi NextCloud et le partage de bureau
Exécutez l'application flask sur Cloud 9 et Apache Httpd
Exécuter une commande sur le serveur Web et afficher le résultat
Construction du système Web (super basique) ③: Construction du serveur DB et fonctionnement de base
Construction du système Web (super basique) ②: construction du serveur AP et fonctionnement de base
[Linux] Créez un auto-certificat avec Docker et apache
Commentaire sur la construction du serveur Web
Construction du serveur Web Ubuntu (18.04.3)
Construction et déploiement faciles du serveur Web avec EB CLI + git + Django
Configurer un serveur Web avec CentOS7 + Anaconda + Django + Apache
Comment intégrer Apache httpd 2.4 et Tomcat 9 sur Cent OS 8
Tester Python avec Miniconda dans un environnement OS X et Linux avec travis-ci
Créez un environnement LAMP avec Vagrant (Linux + Apache + MySQL + PHP)