このためのユニットファイルを作成したいのですが、stunnel
失敗の理由はわかりません。
私のstunnel.confは次のようになります。
#Provide the full path to your certificate-key pair file
cert = /etc/pki/tls/certs/stunnel.pem
#lock the process into a chroot jail
chroot = /var/run/stunnel
# and create the PID file in this jail
pid = /stunnel.pid
#change the UID and GID of the process for security reasons
setuid = nobody
setgid = nobody
#enable client mode
client = yes
socket = l:TCP_NODELAY=1
#socket = r:TCP:NODELAY=1
[mysqls]
accept = 127.0.0.1:3306
connect = 10.0.0.3:3307
実行するとstunnel /etc/stunnel/stunnel.conf
動作します。
これは私のStunnelシステムデバイスファイルです。
[Unit]
;Description=SSL tunnel for network daemons
;Documentation=man:stunnel https://www.stunnel.org/docs.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
Alias=stunnel.target
[Service]
Type=forking
User=nobody
Group=nobody
RuntimeDirectory=stunnel
ExecStartPre=-/usr/bin/mkdir /var/run/stunnel
ExecStartPre=-/user/bin/chown nobody:nobody /var/run/stunnel
ExecStart=/bin/stunnel /etc/stunnel/stunnel.conf
ExecStop=/bin/killall -9 stunnel
起動しようとするとsystemctl start mystunnel.service
失敗します。
Job for mystunnel.service failed because the control process exited with error code. See "systemctl status mystunnel.service" and "journalctl -xe" for details.
実装するjournalctl -xe
:
Feb 20 19:26:07 otrs1 polkitd[610]: Registered Authentication Agent for unix-process:14179:2643087 (system bus name :1.62 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, loc
Feb 20 19:26:07 otrs1 systemd[1]: Starting mystunnel.service...
-- Subject: Unit stunnel-otrs.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit mystunnel.service has begun starting up.
Feb 20 19:26:07 otrs1 mkdir[14185]: /usr/bin/mkdir: cannot create directory ‘/var/run/stunnel’: File exists
Feb 20 19:26:07 otrs1 systemd[14186]: Failed at step EXEC spawning /user/bin/chown: No such file or directory
-- Subject: Process /user/bin/chown could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /user/bin/chown could not be executed and failed.
--
-- The error number returned by this process is 2.
Feb 20 19:26:08 otrs1 stunnel[14188]: Clients allowed=500
Feb 20 19:26:08 otrs1 stunnel[14188]: stunnel 4.56 on x86_64-redhat-linux-gnu platform
Feb 20 19:26:08 otrs1 stunnel[14188]: Compiled/running with OpenSSL 1.0.1e-fips 11 Feb 2013
Feb 20 19:26:08 otrs1 stunnel[14188]: Threading:PTHREAD Sockets:POLL,IPv6 SSL:ENGINE,OCSP,FIPS Auth:LIBWRAP
Feb 20 19:26:08 otrs1 stunnel[14188]: Reading configuration from file /etc/stunnel/stunnel.conf
Feb 20 19:26:08 otrs1 stunnel[14188]: FIPS mode is enabled
Feb 20 19:26:08 otrs1 stunnel[14188]: Compression not enabled
Feb 20 19:26:08 otrs1 stunnel[14188]: PRNG seeded successfully
Feb 20 19:26:08 otrs1 stunnel[14188]: Initializing service [mysqls]
Feb 20 19:26:08 otrs1 stunnel[14188]: Certificate: /etc/pki/tls/certs/stunnel.pem
Feb 20 19:26:08 otrs1 stunnel[14188]: Error reading certificate file: /etc/pki/tls/certs/stunnel.pem
Feb 20 19:26:08 otrs1 stunnel[14188]: error queue: 140DC002: error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib
Feb 20 19:26:08 otrs1 stunnel[14188]: error queue: 20074002: error:20074002:BIO routines:FILE_CTRL:system lib
Feb 20 19:26:08 otrs1 stunnel[14188]: SSL_CTX_use_certificate_chain_file: 200100D: error:0200100D:system library:fopen:Permission denied
Feb 20 19:26:08 otrs1 stunnel[14188]: Service [mysqls]: Failed to initialize SSL context
Feb 20 19:26:08 otrs1 stunnel[14188]: str_stats: 12 block(s), 1050 data byte(s), 696 control byte(s)
Feb 20 19:26:08 otrs1 polkitd[610]: Unregistered Authentication Agent for unix-process:14179:2643087 (system bus name :1.62, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Feb 20 19:26:08 otrs1 systemd[1]: stunnel-otrs.service: control process exited, code=exited status=1
Feb 20 19:26:08 otrs1 systemd[1]: Failed to start stunnel-otrs.service.
-- Subject: Unit stunnel-otrs.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit stunnel-otrs.service has failed.
--
-- The result is failed.
Feb 20 19:26:08 otrs1 systemd[1]: Unit mystunnel.service entered failed state.
Feb 20 19:26:08 otrs1 systemd[1]: mystunnel.service failed.
ディレクトリを作成できないというエラーが発生する理由は理解できませんが(明らかに存在するため)、ディレクトリは作成されません!そしてなぜ証明書を読むことができないのですか?手動で実行するのはなぜですか? SELinuxが無効になっています。
編集する:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 14G 1.9G 13G 14% /
devtmpfs 234M 0 234M 0% /dev
tmpfs 245M 54M 191M 22% /dev/shm
tmpfs 245M 4.4M 240M 2% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
/dev/sda1 1014M 138M 877M 14% /boot
tmpfs 49M 0 49M 0% /run/user/0
編集2:
ErikFの提案を適用した後、ディレクトリ存在の問題は消えましたが、証明書の読み取りはまだ失敗します。
Feb 20 20:42:59 otrs1 polkitd[610]: Registered Authentication Agent for unix-process:16232:3104221 (system bus name :1.73 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, loc
Feb 20 20:42:59 otrs1 systemd[1]: Starting stunnel-otrs.service...
-- Subject: Unit stunnel-otrs.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit stunnel-otrs.service has begun starting up.
Feb 20 20:42:59 otrs1 stunnel[16239]: Clients allowed=500
Feb 20 20:42:59 otrs1 stunnel[16239]: stunnel 4.56 on x86_64-redhat-linux-gnu platform
Feb 20 20:42:59 otrs1 stunnel[16239]: Compiled/running with OpenSSL 1.0.1e-fips 11 Feb 2013
Feb 20 20:42:59 otrs1 stunnel[16239]: Threading:PTHREAD Sockets:POLL,IPv6 SSL:ENGINE,OCSP,FIPS Auth:LIBWRAP
Feb 20 20:42:59 otrs1 stunnel[16239]: Reading configuration from file /etc/stunnel/stunnel.conf
Feb 20 20:42:59 otrs1 stunnel[16239]: FIPS mode is enabled
Feb 20 20:42:59 otrs1 stunnel[16239]: Compression not enabled
Feb 20 20:42:59 otrs1 stunnel[16239]: PRNG seeded successfully
Feb 20 20:42:59 otrs1 stunnel[16239]: Initializing service [mysqls]
Feb 20 20:42:59 otrs1 stunnel[16239]: Certificate: /etc/pki/tls/certs/stunnel.pem
Feb 20 20:42:59 otrs1 stunnel[16239]: Error reading certificate file: /etc/pki/tls/certs/stunnel.pem
Feb 20 20:42:59 otrs1 stunnel[16239]: error queue: 140DC002: error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib
Feb 20 20:42:59 otrs1 stunnel[16239]: error queue: 20074002: error:20074002:BIO routines:FILE_CTRL:system lib
Feb 20 20:42:59 otrs1 stunnel[16239]: SSL_CTX_use_certificate_chain_file: 200100D: error:0200100D:system library:fopen:Permission denied
Feb 20 20:42:59 otrs1 stunnel[16239]: Service [mysqls]: Failed to initialize SSL context
Feb 20 20:42:59 otrs1 stunnel[16239]: str_stats: 12 block(s), 1050 data byte(s), 696 control byte(s)
Feb 20 20:42:59 otrs1 polkitd[610]: Unregistered Authentication Agent for unix-process:16232:3104221 (system bus name :1.73, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Feb 20 20:42:59 otrs1 systemd[1]: stunnel-otrs.service: control process exited, code=exited status=1
Feb 20 20:42:59 otrs1 systemd[1]: Failed to start stunnel-otrs.service.
-- Subject: Unit stunnel-otrs.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit stunnel-otrs.service has failed.
--
-- The result is failed.
Feb 20 20:42:59 otrs1 systemd[1]: Unit stunnel-otrs.service entered failed state.
Feb 20 20:42:59 otrs1 systemd[1]: stunnel-otrs.service failed.
Any ideas or hints please?
Appreciate or help!
答え1
この問題を解決する方法
サービスマネージャの下で実行されているサービスは自分自身をデーモン化しようとしないでください。不安定で危険なPIDファイルメカニズムを使用しないでください(ほとんどの一般的な場合)。これらの作業はすべて、サービス管理システムによって正しく実行されます。
stunnel
したがって、このようにコマンドラインで実行すると、プロセスを終了/停止するまでシェルが待機する必要があります。
許可されていないユーザーアカウントのスポンサーとして実行されるすべてのもの、削減されたファイルシステムアクセス設定、および実際に(オープンソケットファイル記述子を継承して使用できるプログラムの場合)、リスニングソケットを開くことはサービス管理の領域です。
これは、システム化された人々が素直にデーモンを実行する「新しいスタイル」方式と呼ぶことです。実際、これは、daemontoolsユーザーが過去20年間にデーモンを実行したと言った方法であり、IBMが過去25年間にデーモンを実行したと言った方法です。
権限のないユーザーアカウントは、nobody
ファイルの所有者としてリストしてはいけません。関連サービスには所有権の許可は必要ありません。どのファイルまたはディレクトリ別の言葉したがって、権限のないユーザーアカウントは、この目的のために特別に作成されたアカウントである必要があります。
useradd --shell /usr/bin/true mysql-stunnel-d
systemdで環境を設定することはchroot()
実際には簡単ではありません。なぜなら/bin/stunnel
、証明書ファイルと設定ファイルに加えて、docoに従って読み取られるすべてのファイルには、/dev/zero
NSS設定システムやタイムゾーンなどのシステムエントリがたくさん含まれているからです。データベース構成が必要なのはBindReadOnlyPaths
より簡単な方法ですProtect…
。
構成ファイル
ソケットはソケット単位で記述されます。プロトコルstunnel
を理解していませんが、LISTEN_FDS
UCSPI-TCPと互換性があります。したがって、ソケットデバイスは許容ソケットを記述する必要があります。
; /etc/systemd/service/mysql-stunnel.socket [単位] 説明=MySQL用SSLラッパー ドキュメント= [ソケット] ListenStream=127.0.0.1:mysql ListenStream=[::1]:mysql 承諾=はい 遅延なし=はい [インストールする] WantedBy =マルチユーザー。ターゲット
これはソケットsystemctl
ここで.thisを使用して有効化/無効化/開始/停止提供する、サービスユニットによって記述され、要求時に自動的に開始されます。ソケットを通して。承認ソケットなので、テンプレートサービス単位です。サービス管理を通じて行われたすべての権限の削除と設定について説明します。
; /etc/systemd/service/[Eメール保護] [単位] 説明=MySQL用SSLラッパー ドキュメント= [提供する] タイプ=シンプル user=mysql-stunnel-d ホームページ保護=はい 保護システム=厳格 PrivateTmp=はい 標準入力=ソケット 標準出力=ソケット 標準エラー = ジャーナル ExecStart=/bin/stunnel /etc/stunnel/mysql-stunnel.conf
これにより、構成stunnel
ファイルは処理されません。どのサービス管理コンテンツそのためにしなさい:
# /etc/stunnel/mysql-stunnel.conf 証明書 = /etc/pki/tls/certs/stunnel.pem 顧客=はい 前景=はい 接続=10.0.0.3:3307
ボーナスコンテンツ
はい、それはdaemontools方式です。これら2つのユニットファイルをconvert-systemd-units
次のように渡します。Noshツールセット私たちはdaemontools方式でこれを行い、適切なチェーンセットを使用してUCSPIや他のツールをロードする方法を示すrun
プログラム(他のいくつかのプログラムと一緒に)を受けました。service
%システム制御変換 systemd-units ./mysql-stunnel.socket システム単位変換: 警告: ./[Eメール保護]:必須設定:[サービス] StandardError =ログ Convert-systemd-units: 警告: ./mysql-stunnel.socket: 未使用の設定: [unit] docs = システム単位変換: 警告: ./[Eメール保護]:未使用設定:[service]標準エラー=ログ システム単位変換: 警告: ./[Eメール保護]:未使用の設定:[unit]document = %システム制御 cat./mysql-stunnel 開始: #!/bin/nosh start:#./mysql-stunnel.socket で生成されたスタートアップファイル 開始:事実 停止: #!/bin/nosh stop:#./mysql-stunnel.socket で生成されたファイルを停止します。 停止:事実 実行: #!/bin/nosh run:#./mysql-stunnel.socket で生成されたファイルを実行します。 実行:#MySQL用SSLラッパー 実行:tcp-socket-listen 127.0.0.1 mysql 実行: tcp-socket-listen "::1" mysql 実行:制御グループ../mysql-stunnel.serviceに移動します。 実行:envuidgid --additional --mysql-stunnel-d 実行:userenv-fromenv 実行:共有のキャンセル - マウント 実行:set-mount-object --recursiveスレーブ/ 実行: make-private-fs --temp --homes 実行: make-read-only-fs --os --etc 実行: set-mount-object --recursive share/ 実行: setuidgid --supplemental --mysql-stunnel-d 実行:tcp-socket-accept - 遅延なし 実行: ./service サービス: #!/bin/nosh service:# ./ によって生成されたサービスファイル[Eメール保護] サービス:#MySQL用SSLラッパー サービス:/bin/stunnel /etc/stunnel/mysql-stunnel.conf 再起動: #!/bin/sh restart:#Restart./生成されたファイル[Eメール保護] restart:exec false#スクリプトパラメータを無視します。 %
追加読書
- ジョナサンデボインポラード(2015)。[UNIXクライアント - サーバープログラムインターフェイスの作成](https://jdebp.uk/FGA/UCSPI.html)。よく与えられる答えです。
- ジョナサンデボインポラード(2018)。
convert-systemd-units
。 スナックガイド。ソフトウェア。 - ジョナサンデボインポラード(2018)。誰かが実行しているデーモンを乱用しないでください。。よく与えられる答えです。
- ジョナサンデボインポラード(2018)。Unixデーモンを設計する際に避けるべき間違い。よく与えられる答えです。
答え2
タイプミスがあります:
ExecStartPre=-/user/bin/chown nobody:nobody /var/run/stunnel
おそらくあなたは/usr/bin/chown
「いいえ」と言うでしょう/user/bin/chown
。
また、/var/run
シンボリックリンクの場合は、/run
ディレクトリ生成コマンドを次のように置き換えることができます。RuntimeDirectory=
RuntimeDirectory=stunnel
答え3
連続トンネル
stunnelはUDPではなくTCPを使用するSSL接続を処理するため、接続が長く続く必要があると仮定するのは無理ではありません。具体的には、Stunnelを使用する正しいアプローチの基準点です。
ただし、プロセスの開始コストがプロセスの寿命に比べて高い場合、システムソケットに接続を受信させることはほとんど意味がありません。比較すると、Webサーバーがすべての着信TCP接続に対して必ず新しいインスタンスを起動したくありません。特に軽量スレッドがオプションの場合はそうです。
同様に、stunnel が各接続に対して開始されず、継続的なプロセスとして実行されている場合は、いくつかの最適化を利用できます。また、各接続ごとに新しいプロセスを開始しませんが、私が理解しているように、stunnel(コンパイルオプションによって異なります)はインスタンス化にはるかに安価なスレッドを使用でき、一部のワークロード分散に対する潜在的なディスクヒットを防ぐことができます。
それでは、@JdeBPの答えが提供するすべての素晴らしいアドバイス(PIDファイルの防止、「誰も」を乱用しない、フォークしない)を聞きながら、stunnelを継続的なサービスとして実行するにはどうすればよいですか?
暗号化をサポートしていないクライアントを使用してSSLで保護されたサービスに接続する方法の基本は次のとおりです。ユースケースが異なる場合は、調整が必要な場合があります。
;/etc/stunneld.conf
client=yes
;presuming that the upstream is ssl protected and the downstream is not
foreground=yes
;no forking. Use `quiet` to get less noisy logs
pid=
;no PID File, note that it must be blank to avoid PID creation
[my-upstream-service]
accept=x.x.x.x:pppp
;optional address, and mandatory port to listen on - can be a hostname instead of an address
connect=x.x.x.x:pppp
;upstream ssl protected service
CApath=/etc/ssl/certs
;may be different in your distribution
verifyChain=yes
checkHost=example.com
;were required in my case as the ssl cert was specific to a hostname. Note that without the verification you're still vulnerable to MITM attacks.
;/etc/systemd/system/stunneld.service (location may be different in your distro)
[Unit]
Description=Stunnel Service
Documentation=
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=stunnel4
;my distro happened to provide a stunnel user as part of the package. YMMV
ProtectHome=yes
ProtectSystem=strict
PrivateTmp=yes
StandardError=journal
ExecStart=/usr/bin/stunnel /etc/stunneld.conf
これらの構成により、stunnel を継続的なタスクとして実行することができます。これは、いくつかの大きな接続の代わりに複数の小さな接続を実行するコンテキストに関連する最適化の利点を提供します。
答え4
私の場合、設定ファイルはありません。
これを行うには、次の設定ファイルがあります。
client = yes
[stunnel]
accept = 127.0.0.1:41194
connect = vpnserverhost:port
次のように配置/etc/stunnel/stunnel.conf