在 SSH chroot 目录中运行 ssh 命令时,不存在 uid 721001106 的用户

在 SSH chroot 目录中运行 ssh 命令时,不存在 uid 721001106 的用户

我正在运行带有 SSSD 身份验证的 debian 8。身份验证有效并且 ssh 工作正常。我已将所有库等复制到我的 SSH chrootdirectory,并且我的所有应用程序都可以工作,除了 ssh 之外,它有错误:

不存在 uid 721001106 的用户

我已运行 ltrace 以确保获得所有库和文件。接下来,我尝试了尽可能的文件符号链接。

Ltrace 其中trace=open

open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libkrb5.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libk5crypto.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libcom_err.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libkrb5support.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libkeyutils.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/dev/null", O_RDWR)               = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_compat.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnsl.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_nis.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_sss.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/var/lib/sss/mc/passwd", O_RDONLY|O_CLOEXEC) = 3
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port]
           [-Q cipher | cipher-auth | mac | kex | key]
           [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] [user@]hostname [command]
+++ exited with 255 +++

当我与用户一起运行 id 时,我得到相同的 UID 等,但名称信息不同。

没有 Chroot:

uid=721001106([email protected]) gid=721000513(domain [email protected]) groups=721000513(domain [email protected]),721001108([email protected])

在 Chroot 中:

uid=721001106 gid=721000513 groups=721000513,721001108

我的问题是,为什么会发生这种情况,它试图从哪里读取并失败。

哦,另外,我做了一个 mount --bind /proc /path/to/jail/proc 仍然没有区别......

有什么想法下一步要尝试什么吗?

非常感谢,

卢克

答案1

我遇到了同样的问题,发现 getent passwd 和 getent group 不会从 LDAP 返回用户。解决这个问题的方法是在 chroot 目录中输出 getent。

getent passwd > /<chroot directory>/etc/passwd
getent group >  /<chroot directory>/etc/group

答案2

做了更多的挖掘,如果您同意绑定挂载到 chroot 区域,您可以使用 ssh、scp 和 sftp 与 sssd 进行通信。

像这样:

cd /FileTransfer
mkdir -p var/lib/sss/pipes
cd var/lib/sss
mount --rbind /var/lib/sss/pipes pipes/ 
cp -p /etc/nsswitch.conf /FileTranser/etc

希望有帮助

答案3

看起来是 scp 试图为用户 UID 调用 getpwuid(),并且由于 sssd 在 chroot 外部运行,因此失败。只有 scp 可以进行此检查,sftp 或 ssh 都不会这样做。

if ((pwd = getpwuid(userid = getuid())) == NULL)
   fatal("unknown user %u", (u_int) userid);

奇怪的是他们后来没有使用它。我可能会在没有这个检查的情况下构建一个 scp 并看看它是否有效。但是让 chroot 与 sssd 一起工作会很高兴:)

相关内容