特定のディレクトリのすべてのサブディレクトリへのアクセスを拒否するにはどうすればよいですか? (ディレクトリツリー内の単一のアイテムのアクセス権を手動で変更することはできますが。)
<Directory(Match)>
ディレクティブを使ってやってみました。サーバー構成(000サイト対応)は次のようになります。
_DocumentRoot /var/www
<Directory /var/www>
Allow from all
Deny from none
Order deny,allow
</Directory>
<Directory /var/www/*>
Deny from all
</Directory>
_
_http://localhost/
_へのクエリは正常に_/var/www/index.html
_を表示し、サブディレクトリへのすべてのクエリは失敗します。
問題は、httproot内のファイルへのクエリが失敗することです。つまり、_http://localhost/index.html
_を要求すると、_403 Forbidden
_になります。
<Directory(Match)>
ディレクティブは、実際にはディレクトリとファイルに一致しているようです!?
これが本当かどうかを確認するために、私は試しました:
_<Directory /var/www/i*>
Deny from all
</Directory>
_
これは、「i」で始まるファイル/ディレクトリへのアクセスのみを拒否します。
この動作を変更して、_<Directory>
_をディレクトリのみに一致させる方法はありますか?すべてのサブディレクトリが拒否されることを達成する別の方法はありますか? (それらすべてを手動で拒否するか、すべてのファイルを手動で有効にする以外に)
結局、解決策は非常に単純であることがわかります。
<Directory /var/www/*/>
Allow from None
Order allow,deny
</Directory>
ディレクトリパターンの後の末尾のスラッシュ/
に注意してください。これにより、ファイルではなくディレクトリのみに一致するようになります。
これは、<Directory>
-ディレクティブから期待されるのとまったく同じように機能します-/var/www/
の直接サブディレクトリへのアクセスのみを拒否します。指定されたサブディレクトリ(ツリー内の任意の場所)は、<Directory>
ディレクティブを使用して手動で再度有効にすることができます。
これは、<DirectoryMatch>
とは対照的です。
-ツリー内のすべてのファイルとディレクトリにも一致し、
-overrideツリー内の任意のアイテムに対するすべての<Files>
または<Directory>
ディレクティブ。
これは私のためにそれをしました。
<DirectoryMatch "^/var/www/(.+)/"> # don't put $ at the end
Order Allow,Deny
Deny From All
</DirectoryMatch>
サブサブディレクトリ(以下のコメント)を拒否しないようにするには、構成ファイルの上記のDirectoryMatchの下に次のDirectoryMatchを追加します。
<DirectoryMatch "^/var/www/(.+?)/(.+)/"> # again no $, see comment
Order Deny,Allow
Allow From All
</DirectoryMatch>
これを使って:
<Directory /var/www/public>
allow from all
</Directory>
<DirectoryMatch "^/var/www/public/(.+)/">
deny from all
</DirectoryMatch>
オプションなどを追加することをお勧めします。
秘訣は ディレクティブのマージ方法 です。
最善のアプローチは、一般に公開されていないすべてのコンテンツを、/ home/my/app /のようなルートツリーの外のディレクトリに移動することです。
<Directory /home/my/app>
Order Allow,Deny
Deny from all
</Directory>
次に、そのディレクトリと、そのディレクトリにつながるすべてのディレクトリ(たとえば、/ homeと/ my)のApacheユーザーに読み取り権限を付与します。
このようにして、ルートディレクトリ構成エラーが発生したときにそのコンテンツの一部がリークするリスクはありません。
だから、私は助けになるかもしれない(または役に立たないかもしれない)2つの考えを持っています。
1つ目は、場所によってディレクトリのアクセス許可が上書きされる可能性があることです。だからあなたがそれらを持っていないことを確認してください。 localhost /を押すと、rootとして設定したものがすべてヒットします。これは、おそらくセキュリティを上書きします。そのため、ファイルを直接指定すると、そのファイルにアクセスできません。したがって、他の人があなたのルートに到達できないようにする場合は、 ルートを指定しないでください 。
サブディレクトリへのアクセスを制限することについてのあなたのポイントについては、私はこの別の投稿をチェックします。 ...多分役に立たない。おそらく、ユースケースの詳細が役立つでしょう。
構成ファイル内のIndexes
ディレクティブからOptions
オプションを削除することにより、すべてのサブディレクトリで自動インデックス作成を無効にできます。したがって、デフォルト構成の場合、Options
ディレクティブは次のようになります。
httpd.conf:
...
Options FollowSymLinks
...
(「インデックス」オプションは設定されていません。)
次に、クライアントアクセスに使用できるようにする特定の各サブディレクトリ内にindex.html
またはindex.php
ファイルを配置します。特定のディレクトリで自動インデックス作成を有効にしたい場合は、それらのディレクトリ内に.htaccess
ファイルを追加し、次の行を.htaccess
ファイル内に配置できます。
Options Indexes
.htaccess
はそのディレクトリとそのすべてのサブディレクトリに再帰的に影響することに注意してください。したがって、.htaccess
を追加し、次の方法で自動インデックスを無効にすることにより、このオプションを必要としない再帰的なサブディレクトリを除外する必要があります。
Options -Indexes
注:.htaccess
ファイルを有効にしてApache構成に影響を与えるには、AllowOveride All
ファイルを配置するディレクトリの一致に.htaccess
を配置する必要があります。