web-dev-qa-db-fra.com

Apache2: La directive Require ne fonctionne pas

Je suis un peu confus après avoir lu ces docs:

J'ai écrit cette définition du site:

$ cat /etc/Apache2/sites-enabled/adminer.conf
Alias /adminer  "/var/www/adminer.php"

<Location "/adminer">
        <RequireAny>
                Require local
                Require ip 192.168
                Require ip 10
        </RequireAny>
</Location>

Je redémarre Apache:

$ Sudo service Apache2 restart

et pourtant à partir d'un WAN situé sur un PC, je peux toujours charger:

https://example.com/adminer

J'admets et admets que je comprends mal quelque chose ou que j'ai mal interprété quelque chose dans les documents mentionnés ci-dessus. Si quelqu'un pouvait me diriger dans la bonne direction, je vous en serais très reconnaissant. Je préférerais avoir accès à adminer uniquement à partir du réseau local et ne pas l'ouvrir aux attaques du réseau étendu.

EDIT: Je vois ceci dans /etc/Apache2/Apache2.conf:

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

Cela peut-il avoir une priorité plus élevée que mon spécificateur Location?

4
Bernd Wechner

Je pense que le "problème" concerne votre directive Alias.

Tandis que la directive <Location> remplace généralement la directive <Directory>, car elle est traitée plus tard . Quand il y a un Alias, la directive <Location> est traitée avant le Alias est évalué, donc le conteneur <Directory> qui concerne la Alias La cible est traitée plus tard . Dans votre cas, le conteneur <Directory> correspondant a une directive Require all granted, de sorte que l'accès est finalement accordé.

À partir de documentation Apache pour la directive Alias :

Notez que vous devrez peut-être spécifier des sections supplémentaires <Directory> qui couvrent la destination des alias. La création d'alias a lieu avant la vérification des sections <Directory>, de sorte que seule la destination des alias est affectée. (Notez cependant que les sections <Location> sont lues une fois avant que les alias ne soient exécutés, elles seront donc appliquées.)

UPDATE: Vous devriez pouvoir utiliser une directive <Files>, comme vous le suggérez dans les commentaires. Il n'est donc pas clair pourquoi cela ne fonctionnerait pas. vous. Par exemple:

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
<Files adminer.php>
    <RequireAny>
        Require local
        Require ip 192.168
        Require ip 10
    </RequireAny>
</Files>
</Directory>

Je suppose que toutes ces directives se retrouvent dans la configuration du serveur principal? Dans ce cas, l'ordre dans lequel ils sont inclus pourrait être important. Idéalement, vous créeriez un conteneur <VirtualHost> pour ce site, ce qui facilitera ensuite la substitution de la configuration du serveur.

Notez également que vous ne devriez généralement pas utiliser les directives <Location> pour contrôler l'accès aux ressources locales du système de fichiers, car elles pourraient facilement être contournées. Par exemple, dans votre cas, l'utilisateur pourrait simplement accéder directement à /adminer.php. Comme indiqué dans le Apache docs :

Les sections <Location> fonctionnent complètement en dehors du système de fichiers. Cela a plusieurs conséquences. Plus important encore, les directives <Location> ne doivent pas être utilisées pour contrôler l'accès aux emplacements de système de fichiers. Étant donné que plusieurs URL différentes peuvent mapper vers le même emplacement de système de fichiers, ces contrôles d'accès peuvent être contournés.

2
DocRoot