HAProxy funktioniert einwandfrei und wurde manuell ausgeführt, aber da ein Systemd-Dienst die SSL-Pem-Datei nicht laden kann

5472
Martti Laine

Ich versuche, SSL auf einem Fedora 22-Server einzurichten, auf dem HAProxy ausgeführt wird. Hier ist die config ( /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 

Wenn ich jetzt renne systemctl restart haproxy && journalctl -u haproxy.service -f, erhalte ich diesen Fehler:

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 

Hier ist die Service-Konfiguration:

# 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 

Ich kann jedoch den Befehl kopieren, den der Dienst auszuführen versucht, und er funktioniert einwandfrei.

Erstens funktioniert das, wenn ich es manuell ausführe (von Service Config übernommen):

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

Das funktioniert auch (aus Serviceprotokollen genommen, führt anscheinend haproxy-systemd-wrapperFolgendes aus:

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

Um dies zu klären: Wenn ich einen dieser Befehle manuell als root ausführe, funktionieren sie und ich kann über SSL auf meine Site zugreifen.

Ich gehe also davon aus, dass HAProxy das Zertifikat nicht lesen kann, wenn es als Dienst ausgeführt wird.

Folgendes habe ich bisher ausprobiert:

  • chown haproxy:haproxy /etc/haproxy/certificate.pem
  • Benutzer und Gruppe auf root wechseln haproxy.cfg
  • Hinzufügen User=rootund Group=rootzur Servicekonfiguration unter[Service]
  • sudo -u haproxy /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds gibt einen anderen Fehler (in Bezug auf Ports) aus, sodass der Benutzer haproxy höchstwahrscheinlich nicht vom Dienst verwendet wird, andernfalls würde er weiter kommen

Ich kann die Datei als Benutzer haproxy zugreifen sudo -u haproxy cat /etc/haproxy/certificate.pem.

Bearbeiten:

Hier ist die aktualisierte Dienstkonfiguration basierend auf Ihrer Antwort:

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

Was passiert jetzt:

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. 

Wie habe ich den Wert für 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 
4

1 Antwort auf die Frage

2
grawity

Sie sind auf Fedora, die SELinux verwendet . Systemd-Dienste werden in einer sauberen Umgebung ausgeführt - sie werden nicht direkt von systemctl erzeugt - sie starten also unter anderem in einem anderen SELinux-Kontext (ich denke, die Standardeinstellung ist system_u:system_r:init_t:s0?).

Stellen Sie sicher, dass der richtige SELinux-Kontext festgelegt ist, und zwar sowohl für die Zertifikatdatei (mithilfe von ls -lZund chcon) als auch für den Haproxy-Prozess (möglicherweise SELinuxContext=in der systemd-Einheit).

Versuchen Sie zu laufen id, um den aktuellen Kontext (oder den Dienst) anzuzeigen.

Danke für die Antwort! Ich habe es ausprobiert, ohne Glück, siehe die Bearbeitung. Martti Laine vor 8 Jahren 0
Eigentlich hätte ich es vielleicht mit etwas erreichen können (das letzte was ich getan habe war restorecon für das Zertifikat). Kann nach einem DNS-Update einwandfrei testen, danach kommentieren. Martti Laine vor 8 Jahren 0
Ja es funktioniert. Vielen Dank! Martti Laine vor 8 Jahren 0
Übrigens gehört SELinuxContext = zu dem Abschnitt [Service]. grawity vor 8 Jahren 1