如何要求对 OpenBSD httpd Web 服务器上的子目录进行身份验证?

如何要求对 OpenBSD httpd Web 服务器上的子目录进行身份验证?

我有一个正在运行的 VPSOpenBSD 7.4 x64其中托管我的个人网页。该网页使用 OpenBSD 提供的本机 http 守护进程,而不是 Apache 服务器。我希望我的网站的大部分内容向遇到该网站的任何人开放,但出于隐私目的,我希望某些页面仅对经过身份验证的用户可见。我在网上搜索了有关如何实现这一目标的文档,但大部分都是空手而归。

到目前为止,我发现我需要authenticate在文件中添加一条语句/etc/httpd.conf来提示用户输入用户名和密码,然后根据.htpasswd我之前为受保护领域创建的文件进行检查。我还发现,一个人可能有多个“领域”,.htpasswd每个“领域”都有不同的文件。我的问题是,我无法正确设置该/etc/httpd.conf文件,以便它要求身份验证,然后在收到正确的信息后允许用户通过。

看来,OpenBSD 原生 http 守护进程的采用率还比较小,至少与 Apache 服务器的采用率相比是这样。除了 OpenBSD 的联机帮助页之外,我还没有找到任何关于它如何工作的彻底解释,虽然很多人说它们非常彻底,但我在完全理解方面仍然遇到了一些困难。

这对我来说是一个非常新的事情,事实上我只能首先设置所有这些,因为我使用了脚本是别人写的并跟随他们的指示

为了总结这一切,我想以递归方式对文件夹/目录及其所有子文件夹/子目录进行密码保护。我想这类似于添加authenticate "realm" with "[.htpasswd file]"server我的httpd.conf.问题是,当我尝试此操作时,服务器仅提示输入密码并立即再次提示输入密码,无论密码是否与.htpasswd我之前创建的凭据匹配。如果我点击cancel密码提示,服务器就会给我一个"401 Unauthorized"页面。

这是一个将导致无限密码挑战的配置:

prefork 5

types {
  include "[TYPES_FILE_LOCATION]"
}

server "[DOMAIN_NAME.COM]" {
  listen on * port 80
  location * {
    block return 301 "https://$HTTP_HOST$REQUEST_URI"
  }
  location "/.well-known/acme-challenge/*" {
    root "/acme"
    request strip 2
  }
}

server "[DOMAIN_NAME.COM]" {
  listen on 127.0.0.1 port 8080
  default type text/html

[*** PROBLEM HERE v ***]
  location "/[PROTECTED_FOLDER]" {
    authenticate "realm" with "[.HTPASSWD_LOCATION]"
  }
[*** PROBLEM HERE ^ ***]

  location "/pub/*" {
    directory auto index
  }
}

此配置适用于常规 https 连接和 http -> https 连接。

我也尝试过

[*** PROBLEM HERE v ***]
  location "/[PROTECTED_FOLDER]/*" {
    authenticate "realm" with "[.HTPASSWD_LOCATION]"
  }
[*** PROBLEM HERE ^ ***]

达到类似的效果。

以下是 users.htpasswd 文件和所有父目录的权限:

drwxr-xr-x  13 root  wheel   512 Nov 29 19:00 /
drwxr-xr-x  27 root  wheel   512 Nov 15 05:22 /var
drwxr-xr-x  11 root  daemon  512 Jan  1 23:20 /var/www/
-rw-------   1 www   daemon   68 Jan  1 23:29 /var/www/users.htpasswd

有谁知道我在这里做错了什么?我可能错过了什么资源吗?以下是我迄今为止发现的一些资源。

类似的问题#1-misc.openbsd.narkive.com

类似的问题#2 - reddit.com/r/openbsd 档案

httpd.conf 手册页 - man.openbsd.org 档案

非常感谢任何提示/帮助/指示。

答案1

这个最小配置对我有用,假设默认chroot/var/www

server * {
  listen on * port 80
  root "/htdocs/default"
  directory auto index

  location "/protected/" {
    authenticate "realm" with "/auth/htpasswd"
  }
}

types {
  include "/usr/share/misc/mime.types"
}

/请注意受保护目录名称的尾随。因为你已经对配置文件进行了如此大量的编辑,所以我无法判断你是否有这个。

mkdir /var/www/htdocs/default              # Server document root
mkdir /var/www/htdocs/default/protected    # Protected subdirectory

mkdir /var/www/auth                        # Directory to store htpasswd
htpasswd /var/www/auth/htpasswd test       # User "test"; set your own password
chown www /var/www/auth/htpasswd           # Fix ownership

rcctl enable httpd                         # Enable the service
rcctl restart httpd                        # (Re)start the web server

location "/pub/*"如果您想使用诸如包含通配符之类的指令,则必须使用location match "/pub/*".但我认为location "/pub/"就足够了。

相关内容