2016-07-07 7 views
1

Apache 2のアクセス制御に関する質問があります。関連性はありませんが、ラズベリーパイ2とラスビアン。apache2は、ユーザー 'x'のみが「example.com/private/x」というURLを開くことを許可します。

ウェブサイトを使用できるユーザーは複数います。ただし、すべてのユーザーが自分のフォルダを持つフォルダが1つあります。すべてのユーザーは自分のフォルダにのみアクセスでき、他のフォルダにはアクセスできません。

問題は、これを行う唯一の方法は、各フォルダを構成ファイルに追加することで、ユーザーを追加するのに時間がかかることです。それでは別の方法がありますか?


明確にする:
ユーザー x, yおよび zの3人のユーザーがいるとします。
それらのすべてが https://example.com/へのアクセス権を持っていますが、ユーザー x以外のユーザーが https://example.com/private/x/へのアクセス権を持つべきではない、ユーザー y以外に誰も https://example.com/private/y/へのアクセス権を持つべきではない、とだけユーザー zhttps://example.com/private/z/へのアクセス権を持っている必要があります。
これまでにやったこと:
私は場所 /privateへのすべてのアクセスを拒否しました。それで、さまざまなユーザーにそれぞれのフォルダへのアクセス権を与えることができました。
私は場所 /private/%{REMOTE_USER}//private/%{REMOTE_IDENT}/へのアクセスを許可することによってそれを試みましたが、どちらも動作しませんでした。
また、 <If>というディレクティブを使用してURLが /private/%{REMOTE_USER}/に一致するかどうかを確認しようとしましたが、それでも問題はありませんでした。

私はApacheのドキュメントで何かを見つけようとしましたが、私は答えに近づけることができない何かを見つけることができませんでした。


まとめ:設定ファイルにすべての場所を追加することなくこれを行うことは可能ですか?もしそうなら、どうすれば可能ですか?あなたの入力を事前に
おかげで、Desirius


PS:私はほとんど忘れてしまった、それが関連するのですが、認証には、以下の方法についてで、PAMを使用して行われているかどうかはわからない。

<IfModule mod_authnz_external.c> 
    AddExternalAuth pwauth /usr/sbin/pwauth 
    SetExternalAuthMethod pwauth pipe 
    AddExternalGroupMethod unixgroup environment 
</IfModule> 

AuthType Basic 
AuthBasicProvider external 
AuthExternal pwauth 
GroupExternal unixgroup 
Require unix-group www-priv 


私はまだこれを調べていて、何かを見つけました。

2.4.8以降、名前付きグループとバックリファレンスは、対応する名前に接頭辞「MATCH_」と大文字を使用して環境に取り込まれ、書き込まれます。これにより、mod_rewriteのような式やモジュールの中からURLの要素を参照することができます。混乱を避けるため、番号の付いた(名前のない)後方参照は無視されます。代わりに名前付きグループを使用してください。

<LocationMatch "^/combined/(?<sitename>[^/]+)"> 
    require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example 
</LocationMatch> 

(ApacheドキュメントからLocationMatch directiveの最後の部分。

<LocationMatch "^/private/(?<user>[^/]+)"> 
    Require expr "%{REMOTE_USER} == %{MATCH_USER}" 
</LocationMatch> 

しかし、Apacheはすぐに再起動しません。)

今、私は次のようにこれを使用することを考えました。 Require行がコメントアウトされている場合は再起動されますが、それ以外の場合は再開されません。次のいずれかが動作しませんでした:

<LocationMatch "^/private/(?<user>[^/]+)"> 
    <RequireAll> 
     Require valid-user 
     Require expr "%{REMOTE_USER} == %{MATCH_USER}" 
    <RequireAll> 
</LocationMatch> 

私はまだこの問題を解決しようとしていますが、焦点は少しずれています。 への回答がある場合Requireを使用して、認証されたユーザーが変数のユーザーであるかどうかを確認するにはどうすればよいですか?、それはおそらく全体の問題を解決するだろう。

いつものように、どんな入力にも感謝しています。
Desirius

編集2
私もRequire expr "true"動作しないことが分かりました。私は問題を作成するためにRequire exprを疑っています...

答えて

1

私は答えを見つけました。私が質問を編集した直後に、Require DirectivesSince v2.4.8, expressions are supported within the user require directives.でその発言を見つけました。

だから私はRequire user "%{env:MATCH_USER}"(私の編集の部分と一緒に)を使うことができたことに気づいた。より完全な画像を得ることが

、この構成は、今のように見えるものです:

<IfModule mod_authnz_external.c> 
    AddExternalAuth pwauth /usr/sbin/pwauth 
    SetExternalAuthMethod pwauth pipe 
    AddExternalGroupMethod unixgroup environment 
</IfModule> 

AuthType Basic 
AuthBasicProvider external 
AuthExternal pwauth 
GroupExternal unixgroup 
Require unix-group www-priv 

<Location /private> 
    Require all denied 
</Location> 

<LocationMatch "^/radicale/(?<user>[^/]+)"> 
    Require user "%{env:MATCH_USER}" 
</LocationMatch> 

私の質問を読むために時間がかかったみんなに、私はあなたに感謝!

この回答が他の誰かに役立つことを願っています。

関連する問題