apache2 只允许用户 'x' 打开 url 'example.com/private/x'
apache2 allow only user 'x' to open url 'example.com/private/x'
我对 Apache 2 中的访问控制有疑问。我认为它不相关,但我 运行 它在 Raspberry Pi 2 和 Raspbian 上。
有多个用户可以使用该网站。但是,有一个文件夹,其中每个用户都有自己的文件夹。每个用户应该只能访问他自己的文件夹,不能访问其他文件夹。
我遇到的问题是,似乎唯一的方法是将每个文件夹添加到配置文件,这使得添加用户相当耗时。那么还有别的办法吗?
澄清一下:
假设有三个用户:用户 x
、y
和 z
.
他们所有人都可以访问 https://example.com/
,但除了用户 x
之外,没有其他用户可以访问 https://example.com/private/x/
,除了用户 y
之外,没有人可以访问 https://example.com/private/y/
,并且只有用户 z
应该有权访问 https://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
所以我仍在研究这个并发现了一些东西!
From 2.4.8 onwards, named groups and backreferences are captured and written to the environment with the corresponding name prefixed with "MATCH_" and in upper case. This allows elements of URLs to be referenced from within expressions and modules like mod_rewrite. In order to prevent confusion, numbered (unnamed) backreferences are ignored. Use named groups instead.
<LocationMatch "^/combined/(?<sitename>[^/]+)">
require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>
(LocationMatch directive 的最后一部分来自 apache 文档。)
现在我想通过以下方式使用它:
<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
造成了问题...
好的,我找到了答案。就在我编辑了我的问题之后,我在 Require Directives 找到了评论:Since 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>
感谢所有花时间阅读我的问题的人!
我希望有一天这个答案能对其他人有所帮助。
我对 Apache 2 中的访问控制有疑问。我认为它不相关,但我 运行 它在 Raspberry Pi 2 和 Raspbian 上。
有多个用户可以使用该网站。但是,有一个文件夹,其中每个用户都有自己的文件夹。每个用户应该只能访问他自己的文件夹,不能访问其他文件夹。
我遇到的问题是,似乎唯一的方法是将每个文件夹添加到配置文件,这使得添加用户相当耗时。那么还有别的办法吗?
澄清一下:
假设有三个用户:用户
x
、y
和 z
.他们所有人都可以访问
https://example.com/
,但除了用户 x
之外,没有其他用户可以访问 https://example.com/private/x/
,除了用户 y
之外,没有人可以访问 https://example.com/private/y/
,并且只有用户 z
应该有权访问 https://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
所以我仍在研究这个并发现了一些东西!
From 2.4.8 onwards, named groups and backreferences are captured and written to the environment with the corresponding name prefixed with "MATCH_" and in upper case. This allows elements of URLs to be referenced from within expressions and modules like mod_rewrite. In order to prevent confusion, numbered (unnamed) backreferences are ignored. Use named groups instead.
<LocationMatch "^/combined/(?<sitename>[^/]+)">
require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>
(LocationMatch directive 的最后一部分来自 apache 文档。)
现在我想通过以下方式使用它:
<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
造成了问题...
好的,我找到了答案。就在我编辑了我的问题之后,我在 Require Directives 找到了评论:Since 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>
感谢所有花时间阅读我的问题的人!
我希望有一天这个答案能对其他人有所帮助。