이에 대한 단위 파일을 만들고 싶지만 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/[이메일 보호됨] [단위] 설명=MySQL용 SSL 래퍼 문서= [제공하다] 유형=단순 사용자=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 방식입니다. 이 두 개의 유닛 파일을 convert-systemd-units
다음 으로 전달하세요.Nosh 도구 세트우리는 daemontools 방식을 통해 이를 수행하고 적절한 체인 세트를 사용하여 UCSPI 및 기타 도구를 로드하는 방법을 보여주는 run
프로그램 (다른 여러 프로그램과 함께) 을 받았습니다 .service
%시스템 제어 변환 systemd-units ./mysql-stunnel.socket 시스템 단위 변환: 경고: ./[이메일 보호됨]: 필수설정 : [서비스] StandardError = 로그 Convert-systemd-units: 경고: ./mysql-stunnel.socket: 사용되지 않는 설정: [unit] docs = 시스템 단위 변환: 경고: ./[이메일 보호됨]: 사용하지 않는 설정: [service] 표준오류 = 로그 시스템 단위 변환: 경고: ./[이메일 보호됨]:사용되지 않는 설정:[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:# ./에 의해 생성된 서비스 파일[이메일 보호됨] 서비스: #MySQL용 SSL 래퍼 서비스: /bin/stunnel /etc/stunnel/mysql-stunnel.conf 다시 시작: #!/bin/sh restart:#Restart./생성된 파일[이메일 보호됨] 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을 사용하는 올바른 접근 방식에 대한 기준점입니다.
그러나 프로세스 시작 비용이 프로세스 수명에 비해 높은 경우 시스템 소켓이 연결을 수신하도록 하는 것은 거의 의미가 없습니다. 비교해 보면 웹 서버가 들어오는 모든 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