web-dev-qa-db-ja.com

Apacheの.svnフォルダーへのアクセスを拒否する

CapistranoでデプロイするSubversionのRailsアプリケーションがありますが、 '/。svn'のファイルにアクセスできることに気づきました。これはセキュリティ上の懸念を示しています。

これを行う最善の方法を知りたいと思いました。いくつかのアイデア:

  • アクセスを拒否するためのグローバルApache設定
  • パブリックフォルダーとすべてのサブフォルダーに.htaccessファイルを追加する
  • 権限を変更するキャップタスク

「svn info」を保持したいので、フォルダを削除したり、svn exportを使用したりするアイデアはあまり好きではありません。

56
csexton

最適なオプションは、Apache構成を使用することです。

Htaccessまたはグローバル構成の使用は、主にサーバーを制御するかどうかに依存します。

そうした場合、次のようなものを使用できます

 <DirectoryMatch。* \。svn /.*>
すべてから拒否
 </ DirectoryMatch> 

そうしないと、FilesMatchで.htaccessファイルで同様のことができます

62
Vinko Vrsalovic

.svnファイルを保護するもう1つの方法は、Apache構成でリダイレクトを使用することです。

RedirectMatch 404 /\\.svn(/|$)

したがって、403を禁止する(および攻撃者になる手がかりを提供する)代わりに、404を取得します。これは、パスをランダムに入力するときに予想されるものです。

43
csexton

各ファイルをドットで開始する404のアイデアは好きではありません。私はプロジェクトで使用しているcvs(例のsvn)のどちらかで、より選択的なアプローチを使用します

RedirectMatch 404 /\\.svn(/|$)

またはすべてのCVSシステムをキャッチ

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

-古い回答が続きます(コメントを参照)-

私はまだコメントを書くことができません... csextonの答えは間違っています。ユーザーは.svnフォルダーにアクセスできませんが、その中のファイルにはアクセスできるからです!例えばアクセスできます http://myserver.com/.svn/entries

正しいルールは

RedirectMatch 404 /\\.svn(/.*|$)
30
Riccardo Galli

リカルド・ガリは正しかったと思う。 Apacheでさえ、.svnのセットアップはすでに禁止されていますが、.svn/entriesは確かに利用できました...私のsvnサーバー、ポート番号、ユーザー名などを公開しています。

私は実際に、予防策として.gitを制限しない理由を考えています(たとえば、まだgitを使用していないが、いつかディレクトリの制限について考えないかもしれません)。

そして、私は、とにかく非表示にする必要があるすべてのものを制限しないのだと思いましたか?誰でもこれに関する問題を思い付くことができますか?

RedirectMatch 404 /\\..*(/.*|$)

最初の期間の後に「。*」を追加しました。リカルドとの違いのみです。 404 .svn、.git、.blahなどのようです。

14
triemstr

通常はWebアクセス可能である必要がないため、すべてのドットファイル(例:.htaccess、.svn、.xxxなど)へのアクセスを拒否します。

これは、これを達成するためのルールです(Apache 2.2が含まれるまで):

<LocationMatch "\/\..*">
    Order allow,deny
    Deny from all
</LocationMatch>

(UPDATE)または、以下を使用できます(Apache 2.2および2.4で動作します):

# Deny access to dot-files, as 404 error
# (not giving hint about potential existence to the file)
RedirectMatch 404 ".*\/\..*"
6

この:

RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /

エラーをユーザーに返送したくない場合にも使用できます。

サイトのルートページにリダイレクトするだけです。また、これは永続的なリダイレクトであるため、ロボットはこのURLのインデックスを再作成しようとしません。

2
Mikaciù

RedirectMatchは404で応答しますが、これは素晴らしいことです。

ただし、「オプション+インデックス」が有効になっている場合、ユーザーは引き続き親ディレクトリから「.svn」ディレクトリを表示できます。

ユーザーはディレクトリに入ることができません。これが「404 Not Found」の出番です。しかし、ディレクトリを見ることができ、攻撃者である手がかりを提供することができます。

1

Mod_aliasの他のディレクティブと同様に、RedirectMatchは、大文字と小文字を区別しないファイルシステムでも大文字と小文字を区別します( mod_alias documentation を参照)。したがって、すべてのバージョン管理システムのファイルのマッチングとブロックに関する上記の答えは正しくありません。

の代わりに

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

または

RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /

このようなものが必要です

RedirectMatch 404 "(?i)/\.?(cvs|svn|git|hg|bzr)"

本当にすべてをブロックします

  • CVSディレクトリは大文字です。そして
  • 先頭にドット(。)を付けないでください。

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

1

私はRedirectMatchがあまり好きではないので、代わりにRewriteRuleを使用しました。

RewriteRule /\..*(/.*|$) - [R=404,L]

ハイフンは「置換を行わない」ことを意味します。上記の例で、正規表現に2つのバックスラッシュが含まれている理由もわかりませんでした。

/\\..*(/.*|$)

だから私はそれを取り出して、それはうまく動作します。そこで2つを使用する理由がわかりません。誰かが私を啓発したいですか?

1
Spanky

Apache Subversion FAQはこのソリューションをサポートしています:

# Disallow browsing of Subversion working copy administrative dirs.
<DirectoryMatch "^/.*/\.svn/">
    Order deny,allow
    Deny from all
</DirectoryMatch>

ソース: https://Subversion.Apache.org/faq.html#website-auto-update

1
M_per

私には、Apache confは次のようになっているはずです。

<Directory ~ "\.svn">
    Order allow,deny
    Deny from all
</Directory>
1
Xorax

サーバー構成ファイルの.htaccess内。

(1)

RewriteEngine on
RewriteRule "^(.*/)?\.git/" - [F,L]

そして(2)

RedirectMatch 404 /\.git

この両方のメソッドを.htaccessファイルに配置します。

404を返すことにより、.gitディレクトリまたは.gitignoreファイルのように、名前が.gitで始まるファイルまたはディレクトリを非表示にします。

0
Pratik Kamani