it-swarm-ja.com

Apacheは別のマウントからフォルダのインデックスを作成しません

基本認証を使用する別のローカルext4マウントから、Webルート外のフォルダーのディレクトリ一覧を有効にしようとしていますが、空のリストが取得され、エラーは記録されません。奇妙なのは、ブラウザのこのディレクトリの下にあるファイルの既知の場所に置くと、ファイルが正常にダウンロードされることです。

enter image description here

これが私のexample.confファイルです。

<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>

そして、これが私の.htaccessです

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

また、/etc/Apache2/mods-enabled/autoindex.confIndexIgnoreをコメントアウトしました

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

chmod -R 755 /blah1/blah2chgrp -R www-data /blah1/blah2chmod a+x -R /blah1/blah2を実行しました。フォルダーの所有者はwww-dataのメンバーです。 Sudo usermod -a -G www-data myusernameを実行すると、すべてのファイルとフォルダを正常に参照して読み取ることができます。

いくつかのテストを行うと、ホームディレクトリの下に/ blah1/blah2を移動してエイリアスを変更すると、構成が正常に機能します。 Apacheはファイル自体を明確に読み取ることができますが、mod_autoindexをめちゃくちゃにしている別のマウント上にあることについて何かがあります。認証を削除しても効果はありません。 LogLevel warnを使用すると、ログに記録されたエラーは発生しません。 LogLevelをtrace4に変更した後、 これは私のエラーログです です。

これが/etc/fstabからのマウント行です:

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

[〜#〜] edit [〜#〜]最後の注意:www-dataが私のフォルダーに読み書きできることを確認して、次のphpを作成しました脚本:

<?php

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

?>

結果:ディレクトリtestdirが所有者www-data:www-dataで作成され、ディレクトリとファイルのリストが変数としてダンプされます。

EDIT2権限を正しく設定するために次のコマンドを実行しました。

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 {} +

まだ同じ結果。

7
user255406

構成で変更される可能性のあるものがいくつかあります。あなたを助けるために、デフォルトのApache2の設定に基づいて、以下のガイドをここに提供します。

ファイルシステムの権限に対処する

ファイルにアクセスするには、Apacheのユーザー_www-data_に、ファイルへの読み取り権限と、ディレクトリへの読み取り実行 権限 が必要です。パス全体に対する権限を実行します。特別な要件がない場合は、他のユーザーの権限を使用することをお勧めします。

Webサーバー経由でインデックスを作成するディレクトリの名前がbarであり、ユーザーfooのホームディレクトリにあるとします。デフォルトでは、ディレクトリ_/home_および_/home/foo_には_755_権限が必要です。 octal 数値_755_の最後のビットは、他のすべてのユーザーが_/home/foo_内のファイルへの読み取り実行権限(コンテンツradアクセス)を持っていることを意味します。

それでは、ディレクトリ_/home/foo/bar_を作成し、それ(およびそのパス)が他のユーザーに対して_r-x_権限を持っていることを確認しましょう。

_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
_

次に、3つのテストファイルを作成し、他のユーザーの読み取り権限があることを確認します。

_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
_

_www-data_が_/home/foo/bar_にコンテンツを書き込めるようにするには、ディレクトリのグループ所有権を変更し、rwxsグループ権限を追加します( 詳細 ):

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

別の3つの空のファイルを作成してテストします。

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


Apacheの構成に対処する

デフォルトでは、メインの構成ファイル_/etc/Apache2/Apache2.conf_内で、セキュリティ上の理由から、ルートディレクトリ_/_へのアクセスが制限されています。仮想ホスト構成を介してこれらのルールを上書きせず、_<Directory />_タグ(および囲まれたディレクティブ)を削除することをお勧めします。

特に、DocumentRootの外部のディレクトリにエイリアスを作成する場合は、ターゲットディレクトリへのアクセスを明示的に許可する必要がある場合があります(ソース Apache Module mod_alias )。

最初に、十分な権限を持つ_.htpasswd_ファイルを作成しましょう( 2FAを使用してセキュリティを強化-p.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
_

上記によると、仮想ホスト構成ファイルの関連部分は次のようになります。

_<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>
_

関連するモジュールを有効にし、Apache2を再起動して新しい構成を適用します。

_Sudo a2enmod authz_core authz_user authn_file
Sudo systemctl restart Apache2.service
_


サンプル結果

enter image description here


更新:

私は問題がファイルシステムのアクセス許可の問題に属していると仮定しています。 この回答 で説明されているように、bindfsを使用してDocumentRootディレクトリ内のターゲットディレクトリをマウントするのが、おそらく最も簡単な方法です。


実用的なソリューション:

最終的な解決策は次のとおりです。外部にマウントされたフォルダーに対してAliasを正しく機能させるという考えを捨て、代わりに@ pa4080の回避策のアドバイスとusebindfsを使用して、フォルダーをwebrootの/ blah2にマウントします。/etc/fsabでバインドを正しく初期化できなかったため、タスクのinitスクリプトを作成することにしました。

まず、bindfsをインストールします。

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

次に、起動時に実行するスクリプトファイル_/var/www/scripts/blahbind.sh_を作成しました。

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

次に、適切な権限を付与します。

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

次に、サービススクリプトを作成しました。

_vi /etc/systemd/system/blahbind.service 
_

内容:

_[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
_

_mydrive.mount_は、_/blah1/blah2_フォルダーのドライブに置き換える必要があります。 _systemctl list-units --type=mount_を使用してマウントのリストを取得します。

実行してサービススクリプトが機能することを確認する

_Sudo service blahbind start
_

次に、次のコマンドを使用して、再起動時にサービスが持続するようにします。

_Sudo systemctl enable blahbind.service
_

そして、私の簡略化されたLocationブロック、_example.com.conf_のAliasを除きます。

_   <Location /blah2>
            Options +Indexes +MultiViews +FollowSymLinks
            IndexOptions +FancyIndexing
   </Location>
_
1
pa4080

Apacheは、すべてのディレクトリ(/blah1および/blah2)の実行権限を必要とします。ディレクトリに遭遇した場合、それはディレクトリに対するグループ実行権限を持っていないので、リストを作成しません。

おそらく/blah1を変更して、パブリック実行権を持つか、またはwww-dataを変更して、グループ実行権を持つグループにする必要があります。 g+x

0
Kristopher Ives

example.confに基づいて、ドキュメントルートとして/var/www/example.com、ディレクトリext4として/blah1/blah2がマウントされています。

マウントされたディレクトリにシンボリックリンクされたドキュメントルートを想定します。ここで、ドキュメントルートの場所を確認する必要があります。 rsyncを使用してファイルをコピーします。 htmlを含む場所に転送するのではなく、マウントポイントに内容をダンプします。

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

これで、構成を更新する準備が整いました

<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>

mod_rewriteを有効にするのを忘れないでください docs を参照してください。

最後に構文をチェックし、Apacheを再起動します。

$Sudo apachectl configtest
$Sudo systemctl reload Apache

これがお役に立てば幸いです。