HAProxy 手动运行时运行良好,但作为 Systemd 服务无法加载 SSL pem 文件

HAProxy 手动运行时运行良好,但作为 Systemd 服务无法加载 SSL pem 文件

我正在尝试在运行 HAProxy 的 Fedora 22 服务器上设置 SSL。以下是配置(/etc/haproxy/haproxy.cfg):

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    tune.ssl.default-dh-param 2048

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    option  http-server-close
    option  forwardfor
    option  redispatch
    retries 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s

frontend main
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certificate.pem
    redirect scheme https if !{ ssl_fc }
    default_backend app

backend app
    balance roundrobin
    server app1 127.0.0.1:8000 check

现在,当我运行时systemctl restart haproxy && journalctl -u haproxy.service -f,出现此错误:

Sep 13 15:39:31 fedora-server systemd[1]: Started HAProxy Load Balancer.
Sep 13 15:39:31 fedora-server systemd[1]: Starting HAProxy Load Balancer...
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : parsing [/etc/haproxy/haproxy.cfg:30] : 'bind *:443' : unable to load SSL private key from PEM file '/etc/haproxy/certificate.pem'.
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : Proxy 'main': no SSL certificate specified for bind '*:443' at [/etc/haproxy/haproxy.cfg:30] (use 'crt').
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : Fatal errors found in configuration.
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: haproxy-systemd-wrapper: exit, haproxy RC=256

这是服务配置:

# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
EnvironmentFile=/etc/sysconfig/haproxy
ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

但是,我可以复制服务尝试运行的命令,并且它可以正常工作。

首先,当我手动运行它时,它是有效的(取自服务配置):

# whoami
root
# /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid

这也有效(取自服务日志,显然haproxy-systemd-wrapper运行这个:

# whoami
root
# /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds

需要澄清的是:当我以 root 身份手动运行这些命令时,它们可以正常工作,并且我可以通过 SSL 访问我的网站。

因此,我假设当作为服务运行时,HAProxy 无法读取证书。

以下是我迄今为止尝试过的方法:

  • chown haproxy:haproxy /etc/haproxy/certificate.pem
  • 将用户和组切换为 roothaproxy.cfg
  • User=root和添加Group=root到服务配置下[Service]
  • sudo -u haproxy /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds给出了不同的错误(关于端口),因此很可能该服务未使用用户 haproxy,否则会得到进一步

我可以以用户 haproxy 身份访问该文件sudo -u haproxy cat /etc/haproxy/certificate.pem

编辑:

以下是根据您的回答更新的服务配置:

[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
SELinuxContext=unconfined_u:object_r:var_t:s0

现在发生了什么:

Sep 13 17:51:21 ServiceName systemd[1]: Starting HAProxy Load Balancer...
Sep 13 17:51:21 ServiceName systemd[1]: haproxy.service: main process exited, code=exited, status=203/EXEC
Sep 13 17:51:21 ServiceName systemd[1]: Unit haproxy.service entered failed state.
Sep 13 17:51:21 ServiceName systemd[1]: haproxy.service failed.

我如何获得价值SELinuxContext

# ls -lZ /etc/haproxy/certificate.pem
-rw-r--r--. 1 root root unconfined_u:object_r:var_t:s0 9245 Sep 13 17:43 /etc/haproxy/certificate.pem

答案1

你使用的是 Fedora,它使用SELinux. Systemd 服务在干净的环境中运行 - 它们不是由 systemctl 直接生成 - 因此除其他外,它们在不同的 SELinux 上下文中启动(我认为默认是system_u:system_r:init_t:s0?)。

确保设置了正确的 SELinux 上下文,包括证书文件(使用ls -lZchcon)和 haproxy 进程(可能SELinuxContext=在 systemd 单元中使用)。

尝试运行id以查看您(或服务)的当前上下文。

相关内容