web-dev-qa-db-ja.com

HAProxyは手動で正常に実行されましたが、SystemdサービスがSSLpemファイルのロードに失敗したため

HAProxyを実行しているFedora22サーバーで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

ただし、サービスが実行しようとするコマンドをコピーすることはでき、正常に機能します。

まず、これは手動で実行すると機能します(service configから取得)。

# 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
  • 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
Martti Laine

SELinux を使用するFedoraを使用しています。 Systemdサービスはクリーンな環境で実行されます-それらはsystemctlによって直接生成されませんではありません-したがって、とりわけ、それらは異なるSELinuxコンテキストで開始されます(私は思うデフォルトはsystem_u:system_r:init_t:s0?)です。

証明書ファイル(ls -lZchconを使用)とhaproxyプロセス(systemdユニットでSELinuxContext=を使用)の両方に正しいSELinuxコンテキストが設定されていることを確認してください。

idを実行して、(またはサービスの)現在のコンテキストを確認してください。

2
user1686