Synology DS220+ NAS에 매우 이상한 문제가 발생했습니다. (커널 4.4.59+, x86_64 GNU/Linux, synology_geminilake_220+)
dovecot은 Entware의 opkg를 통해 설치되었으며 수년 동안 내 NAS에서 실행되어 왔습니다. IMAP을 통해 안전하게 연결할 때 갑자기 로그 파일에 오류가 표시됩니다.
Nov 06 00:59:51 imap-login: Error: Failed to initialize SSL server context: Can't load SSL certificate (ssl_cert setting): error:12800067:DSO support routines::could not load the shared library: filename(libz.so): libz.so: cannot open shared object file: No such file or directory, error:12800067:DSO support routines::could not load the shared library: user=<>, rip=x.x.x.x(puplic-ip), lip=192.168.1.111, session=<o4eBiHAJQozCYLu3>
Nov 06 00:59:51 imap-login: Info: Disconnected: TLS initialization failed. (no auth attempts in 0 secs): user=<>, rip=x.x.x.x(=puplic-ip), lip=192.168.1.111, session=<o4eBiHAJQozCYLu3>
dovecat과 zlib를 다시 설치해 보았지만 성공하지 못했습니다. 그래서 문제를 분석하기 시작했고 이제 dovecot이 /opt/bin/libz.so 공유 zlib 라이브러리를 찾을 수 없다고 생각한다는 것을 알게 되었습니다. 하지만 파일이 존재합니다!
나는 strace dovecot을 시도했습니다 (하위 프로세스를 사용하지 않으면 다음 줄이 나타나지 않습니다).
14836 openat(AT_FDCWD, "/opt/lib/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/opt/lib/dovecot/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/opt/lib/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/opt/lib/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/opt/lib/dovecot/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/opt/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/tls/x86_64/x86_64/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/tls/x86_64/x86_64", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/tls/x86_64/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/tls/x86_64", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/tls/x86_64/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/tls/x86_64", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/tls/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/tls", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/x86_64/x86_64/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/x86_64/x86_64", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/x86_64/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/x86_64", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/x86_64/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib/x86_64", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
14836 openat(AT_FDCWD, "/usr/lib/libz.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
14836 stat("/usr/lib", 0x7ffe27868180) = -1 ENOENT (No such file or directory)
따라서 시스템은 /opt/lib/libz.so가 존재하지 않는다고 생각합니다. (심볼릭 링크) 파일에 대한 권한은 644로 설정되어 있지만(777도 시도했습니다) 사용자와 그룹은 루트:루트입니다. dovecot은 루트로 실행됩니다.
ldd /opt/sbin/dovecot
linux-vdso.so.1 (0x00007fffc18f5000)
libcap.so.2 => /opt/lib/libcap.so.2 (0x00007f6a1faad000)
libdovecot.so.0 => /opt/lib/dovecot/libdovecot.so.0 (0x00007f6a1f8da000)
libssp.so.0 => /opt/lib/libssp.so.0 (0x00007f6a1f8d5000)
libc.so.6 => /opt/lib/libc.so.6 (0x00007f6a1f721000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00007f6a1f707000)
libiconv.so.2 => /opt/lib/libiconv.so.2 (0x00007f6a1f621000)
libdl.so.2 => /opt/lib/libdl.so.2 (0x00007f6a1f61a000)
/opt/lib/ld-linux-x86-64.so.2 (0x00005650ac854000)
file /opt/sbin/dovecot
/opt/sbin/dovecot: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /opt/lib/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped
ldd /opt/lib/libz.so
linux-vdso.so.1 (0x00007ffdf4899000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00007f2acc4bb000)
libc.so.6 => /opt/lib/libc.so.6 (0x00007f2acc307000)
/opt/lib/ld-linux-x86-64.so.2 (0x0000560240cf2000)
file /opt/lib/libz.so
/opt/lib/libz.so: symbolic link to libz.so.1
file /opt/lib/libz.so.1
/opt/lib/libz.so.1: symbolic link to libz.so.1.2.13
file /opt/lib/libz.so.1.2.13
/opt/lib/libz.so.1.2.13: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
/opt는 Synology 장치의 Entware 설치와 동일한 /volume1/@entware에 대한 심볼릭 링크입니다.
dovecot이 /opt/lib/libz.so에서 라이브러리를 찾을 수 없는 이유는 무엇입니까? strace에서 알 수 있듯이 이것은 dovecat의 문제가 아닌 것 같습니다. 시스템 호출 "openat"조차도 파일이 존재하고 콘솔에서 볼 수 있지만 파일을 볼 수 없습니다! ? (그런데 /opt/lib/ 및 /opt/lib/dovecot에서 다른 라이브러리를 찾습니다)
답변1
자, 몇 시간 동안 검색한 끝에 이 문제의 원인을 찾았습니다.
dovecot은 imap-login 프로세스를 포크(복제)하고
이 프로세스가 볼 수 있는 유일한 폴더인 /opt/var/run/dovecot/login에 루트를 지정합니다. 이 폴더에는 libz.so가 없고 로그인 이름만 있습니다. 소켓.
libz.so.1.2.13을 /opt/var/run/dovecot/login/opt/lib/libz.so (symlinks 없음!)에 복사했고 그 이후로 다시 작동하기 시작했습니다.
문서에 다음과 같이 나와 있음에도 불구하고 왜 이렇게 작동하는지 이해할 수 없기 때문에 누군가가 이에 대해 밝힐 수 있습니다.
로그인 프로세스는 사용자 로그인 외에 다른 작업을 수행할 필요가 없으므로 매우 제한된 환경에서 실행될 수 있습니다. 기본적으로 인증된 UNIX 소켓만 포함하는 쓰기 불가능한 디렉터리로 루트가 지정된 권한 없는 dovenull 사용자로 실행됩니다. 사용자가 로그인한 후에도 로그인 프로세스는 SSL 및 TLS 연결의 프록시를 처리합니다. 이러한 방식으로 모든 SSL 코드는 동일한 제한된 환경에서 실행됩니다. 이는 SSL 라이브러리의 보안 허점으로 인해 공격자가 모든 사용자의 메일이 아닌 제한된 chroot에만 액세스할 수 있음을 의미합니다.
...chroot가 TLS에 필요한 zlib 라이브러리에 대한 액세스를 거부하기 때문에 작동하지 않습니다. 이것이 dovecot 및 chroot의 일반적인 동작이라면 이에 대한 많은 지침, 스레드 및 블로그 게시물을 찾아야 한다고 생각했지만 어떤 정보도 찾을 수 없었습니다.
따라서 내 설치에 여전히 문제가 있는 것처럼 보이지만 libz.so가 chroot 디렉토리에 있으면 실행해도 안전하므로 지금은 조사를 중단하겠습니다.