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も試みました)、ユーザーとグループはroot:rootです。 dovecotはrootとして実行されます。
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ソケットのみを含む書き込み不可能なディレクトリとして、rootは指定された権限のないdovenullユーザーとして実行されます。ユーザーがログインした後も、ログインプロセスはSSLおよびTLS接続のプロキシを処理します。このようにして、すべてのSSLコードは同じ制限された環境で実行されます。これは、SSLライブラリのセキュリティ抜け穴のため、攻撃者がすべてのユーザーのメールではなく制限付きchrootにのみアクセスできることを意味します。
... chrootがTLSに必要なzlibライブラリへのアクセスを拒否するため、機能しません。これがdovecotとchrootの一般的な振る舞いであれば、それに関する多くのガイドライン、スレッド、ブログ記事を見つける必要があると思いましたが、情報は見つかりませんでした。
したがって、私のインストールにはまだ問題があるようですが、libz.soがchrootディレクトリにある場合は実行しても安全なので、今は調査を中止します。