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
SELinux を使用するFedoraを使用しています。 Systemdサービスはクリーンな環境で実行されます-それらはsystemctlによって直接生成されませんではありません-したがって、とりわけ、それらは異なるSELinuxコンテキストで開始されます(私は思うデフォルトはsystem_u:system_r:init_t:s0
?)です。
証明書ファイル(ls -lZ
とchcon
を使用)とhaproxyプロセス(systemdユニットでSELinuxContext=
を使用)の両方に正しいSELinuxコンテキストが設定されていることを確認してください。
id
を実行して、(またはサービスの)現在のコンテキストを確認してください。