我有 Debian 10 的 VPS 服务器。我想使用选项
PrivateTmp=true
启动 Apache2。
但在启动时它失败并出现错误:apache2.service:在步骤 NAMESPACE 生成 /usr/sbin/apachectl 时失败:权限被拒绝。
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2020-11-27 17:17:43 CET; 5s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 523 ExecStart=/usr/sbin/apachectl start (code=exited, status=226/NAMESPACE)
Nov 27 17:17:43 5091-server systemd[1]: Starting The Apache HTTP Server...
Nov 27 17:17:43 5091-server systemd[523]: apache2.service: Failed to set up mount namespacing: Permission denied
Nov 27 17:17:43 5091-server systemd[523]: apache2.service: Failed at step NAMESPACE spawning /usr/sbin/apachectl: Permission denied
Nov 27 17:17:43 5091-server systemd[1]: apache2.service: Control process exited, code=exited, status=226/NAMESPACE
Nov 27 17:17:43 5091-server systemd[1]: apache2.service: Failed with result 'exit-code'.
Nov 27 17:17:43 5091-server systemd[1]: Failed to start The Apache HTTP Server.
我检查了 tmp 的权限:
root@5091-server:~# ls -ld /tmp
drwxrwxrwt 8 root root 4096 Nov 27 17:17 /tmp
root@5091-server:~# ls -ld /var/tmp
drwxrwxrwt 2 root root 4096 Nov 27 17:17 /var/tmp
知道哪些权限是错误的吗?
这与新的 systemd 安全功能(v220+?)与 非特权 LXC 容器(如 Proxmox 中的容器)冲突有关。
编辑 apache 服务单元配置(干净的方式):
sudo systemctl edit apache2.service
添加此选项以禁用新的 systemd 安全功能(影响 LXC 容器,例如 Proxmox 中的容器)
[Service]
PrivateDevices=false
PrivateTmp=false
ProtectControlGroups=false
ProtectKernelModules=false
ProtectSystem=false
也许只需要:
ProtectHome=false
ProtectSystem=false
然后
sudo systemctl start apache2.service
sudo systemctl status apache2.service # Just to check the output
我在 apache2 和 memcached 上看到了这个。还可以使用 systemd-logind。在最后一种情况下,ssh 连接速度受到影响。
ssh -vvv
卡在 debug1: pledge: filesystem
(无 VPN)和 debug1: pledge: network
(有 VPN)上。正如here和here所述,问题已解决,在 Proxmox 容器上启用nesting(也here)。
可能简单地为容器启用“嵌套”功能(如果它没有特权)将允许 systemd 使用其命名空间功能。
这可以工作...
sudo sed -i -e 's,PrivateTmp=true,PrivateTmp=false\nNoNewPrivileges=yes,g' /lib/systemd/system/apache2.service
sudo systemctl daemon-reload
sudo systemctl start apache2.service
sudo systemctl status apache2.service
在较新的操作系统版本上,我在使用 systemd 的 docker 中遇到了同样的错误。我的用例是一个测试设置。
事实证明,我的 docker 主机系统启用了 apparmor,这限制了容器内的 systemd 使用。
我最终使用了
security_opts:
- "apparmor=unconfined"
在ansible molecular.yml中。
可以通过运行来检查设置
$ docker inspect $CONTAINERNAME --format '{{ .Id }}: SecurityOpt={{ .HostConfig.SecurityOpt }}'