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
  • ユーザーとグループを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

答え1

Fedoraを使用していますが、カーネルSystemdサービスはクリーンな環境で実行されます。ないsystemctl によって直接生成されるため、とりわけ異なる SELinux コンテキストで起動します (デフォルトはsystem_u:system_r:init_t:s0? だと思います)。

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

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

関連情報