Apache indiziert keinen Ordner von einem anderen Mount

8

Ich versuche, die Verzeichnisliste für einen Ordner außerhalb des Webstamms von einem anderen lokalen ext4-Mount aus zu aktivieren, der die Standardauthentifizierung verwendet, erhalte jedoch eine leere Liste und keine protokollierten Fehler. Was seltsam ist, ist, dass wenn ich den bekannten Speicherort einer Datei unter diesem Verzeichnis in meinem Browser ablege, die Datei einwandfrei heruntergeladen wird.

Geben Sie hier die Bildbeschreibung ein

Hier ist meine example.confDatei:

<virtualhost *:80>

  ServerAdmin [email protected]
  ServerName  example.com
  ServerAlias www.example.com


  DirectoryIndex index.php
  DocumentRoot /var/www/example.com
    <Directory />
    Options FollowSymLinks
    AllowOverride All
    </Directory>

  LogLevel warn
  ErrorLog  /var/apachelogs/error.log
  CustomLog /var/apachelogs/access.log combined

  Alias /blah2 "/blah1/blah2"
    <Location /blah2>
              Options +Indexes +MultiViews +FollowSymLinks
              IndexOptions +FancyIndexing
    </Location>


</virtualhost>

Und hier ist meine .htaccess

AuthType Basic
AuthName "Authentication Required"
AuthUserFile "/home/myusername/.htpasswd"
Require valid-user

Außerdem habe ich kommentiert die IndexIgnorein/etc/apache2/mods-enabled/autoindex.conf

#IndexIgnore .??* *~ *# RCS CVS *,v *,t

Ich bin gelaufen chmod -R 755 /blah1/blah2und chgrp -R www-data /blah1/blah2und chmod a+x -R /blah1/blah2. Der Ordnerbesitzer ist Mitglied von www-data. Wenn ich laufe, sudo usermod -a -G www-data myusernamekann ich alle Dateien und Ordner gut durchsuchen und lesen.

Bei einigen Tests funktioniert meine Konfiguration einwandfrei, wenn ich / blah1 / blah2 in mein Home-Verzeichnis verschiebe und den Alias ​​ändere. Es hat etwas damit zu tun, dass es sich auf einem anderen Mount befindet, das mod_autoindex durcheinander bringt, obwohl Apache die Dateien selbst klar lesen kann. Das Entfernen der Authentifizierung hilft nicht. Mit LogLevel warnbekomme ich keine protokollierten Fehler. Nachdem ich mein LogLevel in trace4 geändert habe, ist hier mein Fehlerprotokoll .

Hier ist die Mount Line von /etc/fstab:

UUID=[theuuid] /blah1 ext4 rw,nosuid,nodev,errors=remount-ro    0    0

BEARBEITEN Letzte Anmerkung: Um zu bestätigen, dass www-Daten in meinen Ordner lesen und schreiben können, habe ich das folgende PHP-Skript erstellt:

<?php

mkdir ("testdir");
var_dump(scandir('.'));

?>

Das Ergebnis: Verzeichnis testdir wird mit dem Eigentümer www-data: www-data erstellt, und die Liste der Verzeichnisse und Dateien wird als Variable ausgegeben.

EDIT2 Ich habe die folgenden Befehle ausgeführt, um die Berechtigungen korrekt festzulegen :

chmod 755 /blah1/blah2
chmod 755 /blah1
find /blah1/blah2 -type d -exec chgrp www-data {} +
find /blah1/blah2 -type d -exec chmod o+rx {} +
find /blah1/blah2 -type d -exec chmod g+rwxs {} +

Immer noch das gleiche Ergebnis.

user255406
quelle
Was ist mit der Verwendung LogLevel debugund anschließenden Überprüfung von Protokolldateien?
Michal Przybylowicz
Keine neuen Infos mit Debug. pastebin.com/xu1bUuvB
user255406
Basierend auf Ihren Protokollen. Ich denke, Ihr Problem ist, dass der Index nicht auf Ihren .htaccess zugreifen kann. versuchen Sie, den Inhalt von .htaccess in <Directory /> zu kopieren
abu-ahmed al-khatiri
Versuchte das, das gleiche Ergebnis.
user255406
1
Haben Sie versucht, <Directory /blah1/blah2>statt zu verwenden <Location /blah2>?
Dan

Antworten:

1

Es gibt verschiedene Dinge, die in Ihrer Konfiguration geändert werden können. Um Ihnen zu helfen, stelle ich hier die folgende Anleitung zur Verfügung, die auf der Standardkonfiguration von Apache2 basiert.

Behandeln Sie die Dateisystemberechtigungen

Um die Dateien zugreifen, die Benutzer Apache www-dataBedürfnisse Berechtigungen für die Dateien lesen und schreib ausführen Berechtigungen für die Verzeichnisse, auch in dieser Nummer schreibAusführungsBerechtigungen für den gesamten Pfad. Wenn Sie keine besonderen Anforderungen haben, würde ich Ihnen empfehlen, die Berechtigungen der anderen Benutzer zu verwenden.

Nehmen wir an, das Verzeichnis, das Sie über den Webserver indizieren möchten, heißt barund befindet sich im Ausgangsverzeichnis des Benutzers foo. Standardmäßig hat er Verzeichnisse /homeund /home/foomuss 755Berechtigungen haben. Das letzte Bit in der Oktal - Zahl bedeutet , dass alle anderen Benutzer Berechtigungen Lese ausführen haben (Inhalt rad Zugang) an den Innen Dateien .755/home/foo

Erstellen wir also unser Verzeichnis /home/foo/barund stellen wir sicher, dass es (und sein Pfad) r-xBerechtigungen für die anderen Benutzer hat:

mkdir -p /home/foo/bar                            # create the directory
find /home/foo/bar -type d -exec chmod o+rx {} +  # apply o+rx for the dirs recursively
sudo chmod o+rx /home /home/foo                   # this step is optional

Erstellen wir nun drei Testdateien und stellen sicher, dass sie Leseberechtigungen für die anderen Benutzer haben:

touch /home/foo/bar/file.{1..3}                  # create three empty test files
find /home/foo/bar -type f -exec chmod o+r {} +  # apply o+r for the files recursively

Um das www-dataSchreiben von Inhalten zu ermöglichen , /home/foo/barkönnen Sie den Gruppenbesitz des Verzeichnisses ändern und rwxsGruppenberechtigungen hinzufügen ( weitere Details ):

find /home/foo/bar -type d -exec chgrp www-data {} +
find /home/foo/bar -type d -exec chmod g+rwxs {} +

Testen Sie, indem Sie drei weitere leere Dateien erstellen:

sudo -u www-data touch /home/foo/bar/file.{4..6}


Beschäftige dich mit der Apache-Konfiguration

In der Hauptkonfigurationsdatei /etc/apache2/apache2.confist der Zugriff auf das Stammverzeichnis aus Sicherheitsgründen standardmäßig /eingeschränkt. Ich würde Ihnen empfehlen, diese Regeln nicht über die Konfiguration des virtuellen Hosts zu überschreiben und <Directory />Tags (und die beigefügten Anweisungen) zu entfernen .

Insbesondere wenn Sie einen Alias ​​für ein Verzeichnis außerhalb Ihres Verzeichnisses erstellen DocumentRoot, müssen Sie möglicherweise explizit den Zugriff auf das Zielverzeichnis (Quell- Apache-Modul mod_alias ) zulassen .

Erstellen wir zunächst eine .htpasswdDatei mit ausreichenden Berechtigungen ( erhöhen Sie die Sicherheit mithilfe von 2FA - S.6 ):

htpasswd -c /home/foo/.htpasswd foo               # authentication for the username 'foo'
chmod 400 /home/foo/.htpasswd                     # restricted the permissions
sudo chown www-data:www-data /home/foo/.htpasswd  # change the ownership

Demnach sollte der relevante Teil Ihrer Konfigurationsdatei für den virtuellen Host ungefähr so ​​aussehen:

<VirtualHost *:80>

    # Other configuration directives

    Alias "/bar" "/home/foo/bar"

    <Directory "/home/foo/bar">
            #Require all granted
            Options +Indexes +MultiViews +FollowSymLinks
            IndexOptions +FancyIndexing

            # Allow using of a .htaccess files
            AllowOverride All

            # This section could be moved in .htaccess file
            <IfModule mod_authz_core.c>

                <IfModule mod_authn_file.c>
                    AuthType Basic
                    AuthName "Type some hints here..."
                    AuthUserFile /home/foo/.htpasswd
                </IfModule>

                Require valid-user

            </IfModule>

    </Directory>


</VirtualHost>

Aktivieren Sie die entsprechenden Module und starten Sie Apache2 neu, um die neue Konfiguration anzuwenden:

sudo a2enmod authz_core authz_user authn_file
sudo systemctl restart apache2.service


Beispielergebnis

Geben Sie hier die Bildbeschreibung ein


Aktualisieren:

Ich gehe davon aus, dass das Problem zum Berechtigungsproblem des Dateisystems gehört. Der wahrscheinlich einfachste Weg, dies zu lösen, besteht darin, das Zielverzeichnis innerhalb des DocumentRoot-Verzeichnisses zu mounten, indem bindfsSie das in dieser Antwort beschriebene verwenden .


Arbeitslösung:

Hier ist die endgültige Lösung: Geben Sie die Idee auf, dass Alias ​​für meinen extern bereitgestellten Ordner ordnungsgemäß funktioniert, und befolgen Sie stattdessen die Problemumgehungsempfehlung von @ pa4080 bindfs, um den Ordner in / blah2 im Webroot bereitzustellen. Es ist mir nicht gelungen, / etc / fsab dazu zu bringen, meine Bindung korrekt zu initialisieren, daher habe ich beschlossen, ein Init-Skript für die Aufgabe zu schreiben.

Installieren Sie zuerst bindfs:

apt-get update
apt-get install bindfs
mkdir /var/www/example.com/blah2

Als nächstes habe ich eine Skriptdatei erstellt /var/www/scripts/blahbind.sh, die beim Start ausgeführt werden soll:

#!/bin/bash
bindfs -o force-user=www-data,perms=a=rX /blah1/blah2 /var/www/example.com/blah2

Dann geben Sie ihm die richtigen Berechtigungen:

chmod 750 /var/www/scripts/blahbind.sh
chmod +x /var/www/scripts/blahbind.sh

Als nächstes habe ich ein Service-Skript erstellt:

vi /etc/systemd/system/blahbind.service 

Mit dem Inhalt:

[Unit]
Requires=mydrive.mount
After=mydrive.mount
Description=bind /blah1/blah2 to example.com/blah2 folder

[Service]
ExecStart=/var/www/scripts/blahbind.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Hinweis, mydrive.mountsollte durch das Laufwerk des /blah1/blah2Ordners ersetzt werden. Holen Sie sich eine Liste der Reittiere mit systemctl list-units --type=mount.

Stellen Sie sicher, dass das Dienstskript funktioniert, indem Sie es ausführen

sudo service blahbind start

Aktivieren Sie dann den Dienst beim Neustart mit:

sudo systemctl enable blahbind.service

Und dann, meine vereinfachte Lage Block, sans Aliasinexample.com.conf

   <Location /blah2>
            Options +Indexes +MultiViews +FollowSymLinks
            IndexOptions +FancyIndexing
   </Location>
pa4080
quelle
1
Danke für die umfassende Erklärung. Wenn ich Ihrem Tutorial für ein Verzeichnis in meinem Home-Ordner folge, funktioniert es einwandfrei, aber wenn sich dieser Ordner auf einem anderen gemounteten Laufwerk befindet, erhalte ich das gleiche Ergebnis. Ich habe den Code, den ich ausgeführt habe, zu EDIT2 hinzugefügt.
user255406
Hallo, @ user255406, IMO, dies ist ein Berechtigungsproblem. Ich habe meiner Antwort einen Verweis auf eine mögliche Problemumgehung hinzugefügt.
pa4080
1
Mit der bindfsProblemumgehung konnte ich alles richtig zum Laufen bringen. Für mich bedeutet dies, dass es sich überhaupt nicht um ein Berechtigungsproblem handelt.
user255406
1
Letztendlich ist die Problemumgehung eine funktionierende Lösung für mich. Möchten Sie Ihren Update-Bereich erweitern, um die Methode hier zu erläutern? (Ich habe bindfs verwendet und das Mounten als systemd-Dienst hinzugefügt, um es beim Neustart
aufzurufen.
Hallo, @ user255406, ich möchte den Update-Bereich erweitern, ich werde morgen früh Zugang zu einem Computer haben.
Gern geschehen
0

Apache benötigt Ausführungsrechte für alle Verzeichnisse, Ihren Fall /blah1und /blah2. Wenn es auf ein Verzeichnis stößt, das keine Gruppenausführungsrechte für ein Verzeichnis hat, führt es die Auflistung nicht durch.

Sie müssen wahrscheinlich Änderungen /blah1vornehmen www-data, um entweder öffentliche Ausführungsrechte zu haben, oder um eine Gruppe mit Gruppenausführungsrechten zu sein, z.g+x

Kristopher Ives
quelle
Ich habe den Code hinzugefügt, den ich zu EDIT2 hinzugefügt habe. Apache kann ausführen, aber immer noch keine Würfel.
user255406
Führen Sie Rechte für das Verzeichnis aus, in dem die Rechte im Wesentlichen aufgelistet sind.
Kristopher Ives
0

Basierend auf example.confhaben Sie /var/www/example.comals Document Root und /blah1/blah2als Directory ext4 gemountet.

Nehmen wir an, dass das Dokumentstammverzeichnis mit Ihrem Verzeichnis verknüpft ist. Jetzt müssen wir den Speicherort unseres Dokumentenstamms bestätigen. Wir werden die Dateien mit kopieren rsync. Der Inhalt wird auf dem Einhängepunkt abgelegt, anstatt ihn an einen htmlSpeicherort zu übertragen.

$sudo rsync -av /var/www/example.com/html /blah1/blah2

Jetzt können wir die Konfiguration aktualisieren

<VirtualHost *:80>

...
...
DocumentRoot /var/www/example.com
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
...
...
Alias /blah2 "/blah1/blah2"
<Directory "/blah1/blah2">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    IndexOptions FancyIndexing
    Require valid-user
    ...
    ...
    #to ensure the DocumentRoot is updated in rewrites or aliases to reflect the changes at the new location.
    RewriteEngineon
    RewriteCond %{HTTP_HOST} =www.example.com
    RewriteRule ^index\.html$ filename.html
    ...
</Directory>

<VirtualHost>

Vergessen Sie nicht, mod_rewritediese Dokumente zu aktivieren .

Schließlich überprüfen wir die Syntax und starten Ihren Apache neu.

$sudo apachectl configtest
$sudo systemctl reload apache

Hoffe das hilfreich.

Abu-Ahmed al-Khatiri
quelle