用户如何在没有 SSL 密钥权限的情况下转储 apache VHOSTS

用户如何在没有 SSL 密钥权限的情况下转储 apache VHOSTS

所以我有一个脚本,它的核心是apachectl -t -D DUMP_VHOSTS获取特定机器上所有虚拟主机的列表。然后它会从该响应中获取响应,并生成一个 json blob,其中包含有关机器上虚拟主机配置的机器可解析信息。

这将以非特权用户的身份运行,因为它只是对内容的分析,而不是改变任何内容的特权尝试。

然而,在 Debian 上,非特权用户根本无法读取任何内容/etc/ssl/private,因此我得到:-

AH00526: Syntax error on line 27 of /etc/apache2/sitesenabled/ssl_proxy.conf:
SSLCertificateKeyFile: file '/etc/ssl/private/ssl-cert-snakeoil.key' does not exist or is empty

该问题讨论于Apache:SSLCertificateKeyFile:文件不存在或为空

但是,我不希望运行脚本的用户访问密钥文件或以其他方式测试配置,我只是希望 apache 告诉我定义了哪些 vhosts。

在专门抛出此错误的服务器上,我甚至不使用 SSL,因此它抱怨一个与 VHOST 甚至不相关的密钥,但我可以看到它可能与 VHOST 有关,但似乎不能告诉 apache 继续运行,而忽略 SSL 模块或任何东西。

除了直接解析 apache 配置之外,还有什么想法可以做到这一点?

编辑。

因此,经过检查,apachectl 在 DUMP(s)_VHOSTS 时所做的并不像想象的那么愚蠢。它本质上是在验证配置文件,也就是说,检查指定的文件是否存在。它不是,而是试图读取文件的内容。因此,调用者不需要对文件的读取权限,只需对包含该文件的目录有读取权限即可。

答案1

两种方式:

  1. 设置权限,以便运行脚本的用户可以看到目录及其中的文件。这可以通过 ACL 而不是“常规”unix 权限来实现。(这man setfacl是一个起点。)

  2. 设置 sudoers 文件以允许此用户以可以读取文件的用户身份(可能是 root 用户或可能是 apache 用户)运行此命令。条目应如下所示:

    username ALL = (root) NOPASSWD: apachectl -t -D DUMP_VHOSTS

    这允许用户使用 sudo 以 root 身份运行此命令,而无需输入密码。

答案2

我对这个问题有一个不令人满意的解决方法,即将任何 vhost 定义中的所有 SSL 定义放在一个<IfDefine !APACHE_CONFIG_TEST>块中,这样我就可以传递一个-D APACHE_CONFIG_TEST选项来apachectl避免它考虑 SSL 密钥。

如果有办法使用 apache 来做到这一点,而不是必须将解决方案破解到单独的配置文件中,那就更好了。

答案3

因此,除了我建议的解决方法和@jenny-d 建议的 ACL/Sudo 方法(如果我没有因为无法编辑 sudoers 而束手无策的话,这种方法就很好了)之外,我建议使用以下答案(因为这是我要使用的答案):-

因为 apachectl 只需要查看所引用的文件,而不是访问它们:-

chmod a+rx /etc/ssl/private
chmod o-r /etc/ssl/private/*

因此,文件仍然无法被“其他人”读取,但其他人可以确定所提及的文件存在

相关内容