HAProxy отлично работает, запускается вручную, но как Systemd-сервис не может загрузить pem-файл SSL

5169
Martti Laine

Я пытаюсь настроить SSL на сервере Fedora 22 с HAProxy. Вот конфиг ( /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
  • Переключение пользователя и группы в root haproxy.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 
4

1 ответ на вопрос

2
grawity

You're on Fedora, which uses SELinux. Systemd services are run in a clean environment – they're not spawned by systemctl directly – so among other things they start in a different SELinux context (I think the default is system_u:system_r:init_t:s0?).

Make sure that the correct SELinux context is set, both for the certificate file (using ls -lZ and chcon) and for the haproxy process (possibly using SELinuxContext= in the systemd unit).

Try running id to see your (or the service's) current context.

Спасибо за ответ! Я попробовал, без удачи, см. Редактирование. Martti Laine 8 лет назад 0
На самом деле, возможно, получилось сделать что-то (последнее, что я сделал, это восстановил сертификат для сертификата). Можно проверить правильно после обновления DNS, поэтому буду комментировать после этого. Martti Laine 8 лет назад 0
Да, это работает. Спасибо! Martti Laine 8 лет назад 0
Кстати, `SELinuxContext =` относится к разделу `[Service]`. grawity 8 лет назад 1

Похожие вопросы