我正在尝试使用 AuthExternal 和 pwauth 在我的 Apache2 服务器上设置基本身份验证。因此使用系统用户而不是另一个用户数据库来执行身份验证。
我可以无缝安装和启用所有内容。Apache2 (2.4.12-2ubuntu2)、libapache2-mod-authnz-external (3.3.2-0.1) 和 pwauth (2.3.11-0.1)。它们都在我的 Ubuntu 15.10 桌面版和 Linux 4.2.0-30-generic 上运行。真的没什么特别的,所有标准 willy repo 安装。
Apache2 正在运行,并且 AuthExternal 模块已正确加载,至少据我所知:
me@bla:~$ systemctl status apache2.service | grep Active
Active: active (running) since Thu 2016-02-25 13:41:02 CET; 33s ago
me@bla:~$ apache2ctl -M | grep external
authnz_external_module (shared)
我在 VHost 配置文件中定义了要使用的模块以及要应用身份验证的 Derictory。请参阅下面的 /etc/apache2/sites-enabled/000-default.conf:
<IfModule mod_authnz_external.c>
AddExternalAuth pwauth /usr/sbin/pwauth
SetExternalAuthMethod pwauth pipe
</IfModule>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/sec>
AuthType Basic
AuthName "Restricted Area"
AuthBasicProvider external
AuthExternal pwauth
Require user pat
</Directory>
</VirtualHost>
现在,当我尝试在浏览器中打开 loclahost/sec 时,系统提示我登录。我输入 pat 作为用户名和密码,然后等待奇迹发生。不幸的是,我收到内部服务器错误,而不是预期的 index.html“Hello World”......
因此,我检查了 apache2 错误日志,并在其中找到了“无效的 AuthExternal 关键字 (pwauth)”。经过一番挖掘,我意识到,这个错误是由 AuthExternal 引发的,因为它找不到指定的 pwauth。因此,我通过运行以下命令进行了检查:
sudo -u www-data which pwauth
返回与上面的配置文件中指定的相同路径,因此可以排除......
然后,我尝试将 AuthExternal 重定向到 shell 脚本,以独立于 pwauth 测试模块。该脚本只是将一个字符串附加到文件,以便我查看它是否被 AuthExternal 调用。我在文件上运行了“chmod u+s a+x”以允许它以 root 权限运行,因为 pwauth 需要该权限才能访问 passwd,然后再次尝试。我还尝试了不使用 u+s 的相同操作,因为这里不需要它,但情况没有任何改善。这个测试让我认为,我的 apache2 有问题,而不是 pwauth。
我使用 Cromium 和 Firefox 测试了所有这些,虽然这在他的案例中并不重要,但你知道......人们永远无法完全确定,对吧?我还尝试了所有我能想到的关于放置指令的变体。所有这些都直接在 appache2.conf 中,appache2.conf 中的目录和 ./conf-enable/security.conf 中的模块包含,security 中的模块和 vhost 中的目录等......这些变体都没有帮助,但有些却使情况变得更糟......
然后我进行了大量谷歌搜索……但我只能找到与 httpd.conf 时代有关的信息,而这些信息实际上不再适用。即使它仍然提供了一些有效且有用的提示……此外,大多数(如果不是全部)线程都使用 .htaccess 方法。我试图通过使用 Directory 指令来避免这种情况,以避免 .htaccess 导致的性能下降。
无论如何,我不知道该去哪里找或尝试什么。说实话,我陷入了困境,如果能得到任何提示、想法或解决方案,我将不胜感激。
答案1
事实证明,AddExternalAuth 和 SetExternalAuthMethod 必须放在 VirtualHost 声明中。因此,以下配置可以正常工作:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
AddExternalAuth pwauth /usr/sbin/pwauth
SetExternalAuthMethod pwauth pipe
<Directory /var/www/html/sec>
AuthType Basic
AuthName "Restricted Area"
AuthBasicProvider external
AuthExternal pwauth
Require user pat
</Directory>
</VirtualHost>
我仍然不明白为什么全局声明(因此直接在 apache2.conf 中声明)的方案不起作用。尽管如此,最初的问题已经解决了……
答案2
不同版本的 apache 似乎有所不同。对于 apache2.4,mod-auth-external 的 GitHub引导我走上正确的道路。
创建
apache2.conf
身份验证方法(此处为:checkEtcPasswd):<IfModule mod_authnz_external.c> DefineExternalAuth checkEtcPasswd pipe /usr/sbin/pwauth # AddExternalAuth pwauth /usr/sbin/pwauth # SetExternalAuthMethod pwauth pipe </IfModule>
在区块中引用此验证器:
AuthType Basic AuthName "Your AuthName" AuthBasicProvider external AuthExternal checkEtcPasswd Require valid-user
就是这样。很简单,如果你知道的话...