允许用户在 chrooted 环境中更改密码

允许用户在 chrooted 环境中更改密码

我正在尝试在 Ubuntu 服务器 16.04.3 LTS 下设置 chrooted ssh 和 sftp 服务器。我遵循了本教程: https://rp29blog.wordpress.com/2016/06/26/setting-up-chroot-sftp-and-ssh

我成功了。我可以对 chrooted 环境执行 ssh 和 sftp,但无法更改 chrooted 用户的密码。我尝试了以下方法:-bash-4.3$ passwd

但我收到:passwd:无法确定您的用户名。

顺便说一下,我还在 chrooted 环境中包含了“/usr/bin/passwd”命令,并将文件:group、group-、gshadow、gshadow-、passwd 和 passwd- 复制到 chrooted 环境中。

我还意识到,如果我在 chrooted 环境中执行“ls -l”,则不会显示组名称。我将看到类似以下内容的内容:drwxr-xr-x 3 0 33 4096 Feb 15 12:26 home

但在真实环境中,此条目如下所示:drwxr-xr-x 3 root www-data 4096 Feb 15 13:26 home

如果我执行 sftp,那么我将看到用户和组名而不是他们的 ID。

可能是什么问题?我确实需要用户至少能够更改自己的密码。

谨致问候 Josef

这是我的 /etc/ssh/sshd_config:

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 1024
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin prohibit-password
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp internal-sftp
UsePAM yes

Match group chrooted
    ChrootDirectory /home/ssh_chroot
    X11Forwarding no
    AllowTcpForwarding no
    #Uncomment to allow only sftp to the chrooted jail, ssh access will be denied
    #ForceCommand internal-sftp

这是我的文件夹结构:

/home/ssh_chroot
├── bin
│   ├── bash
│   ├── cat
│   ├── chown
│   ├── cp
│   ├── date
│   ├── ls
│   ├── mkdir
│   ├── mv
│   ├── rm
│   ├── rmdir
│   ├── sh
│   └── touch
├── dev
│   ├── null
│   ├── random
│   ├── tty
│   └── zero
├── etc
│   ├── group
│   ├── group-
│   ├── gshadow
│   ├── gshadow-
│   ├── hosts
│   ├── ld.so.cache
│   ├── ld.so.conf
│   ├── nsswitch.conf
│   ├── passwd
│   └── passwd-
├── home
│   └── chusr
├── lib
│   ├── libc.so.6
│   ├── libdl.so.2
│   ├── libncurses.so.5
│   ├── libtinfo.so.5
│   └── x86_64-linux-gnu
│       ├── libacl.so.1
│       ├── libattr.so.1
│       ├── libaudit.so.1
│       ├── libcrypt.so.1
│       ├── libc.so.6
│       ├── libdl.so.2
│       ├── libexpat.so.1
│       ├── libm.so.6
│       ├── libpam_misc.so.0
│       ├── libpam.so.0
│       ├── libpcre.so.3
│       ├── libpthread.so.0
│       ├── libselinux.so.1
│       ├── libtinfo.so.5
│       ├── libutil.so.1
│       └── libz.so.1
├── lib64
│   └── ld-linux-x86-64.so.2
├── sbin
│   └── unix_chkpwd
├── usr
│   ├── bin
│   │   ├── clear
│   │   ├── dircolors
│   │   ├── groups
│   │   ├── id
│   │   ├── passwd
│   │   ├── tree
│   │   └── vi
│   └── lib
│       └── x86_64-linux-gnu
│           ├── libgpm.so.2
│           └── libpython3.5m.so.1.0
└── var
    └── www

答案1

我的问题其实还没有解决,但我想我会放弃。我只是认为将文件:group、group-、gshadow、gshadow-、passwd 和 passwd- 以及 shadow 复制到新环境不是一个好主意。

我猜我会尝试使用身份验证密钥来解决这个问题,而不是使用密码。这样用户就可以使用一些密码生成自己的密钥,然后我会将它们加载到服务器。

这种方法仍然不安全,因为用户将使用密钥工作很长时间,但我想我可以时不时地使它们失效,即每 6 个月。

对于感兴趣的人:我没有收到错误:“无法确定您的用户名。“。相反,我得到的是:

passwd: Authentication token manipulation error
passwd: password unchanged

输入当前用户的密码后。我通过以下操作发现在 chroot 环境中找不到某些文件:

strace passwd

特别是我观察了每个 stat()、read()、open()、connect()、access()、statfs() 和 readlink() 调用的路径。因此,我复制了一些文件或整个文件夹并链接/绑定了一些设备。但我没有让它工作。

无论如何,我放弃这样做有两个原因:

  1. 我的目标之一是将系统的某些部分隐藏在 chroot 中。但是,如果我必须从主系统复制大量文件,那么这样做有什么意义呢?

  2. 我还认为复制主密码文件可能会出现一些问题:您将在两个不同的地方拥有它:在主系统上和在 chroot 上。那么,如果我让“passwd”工作,新密码将存储在哪里?我猜是在 chroot 副本中,所以,下次用户登录时,其密码仍将是存储在主 passwd 文件中的旧密码,不是吗?

我只是想知道托管公司如何通过他们的“共享托管”程序解决这个问题。我曾经是其中几家公司的客户,我发现当我使用他们提供的 ssh 访问时,我只能看到一个有限的系统;甚至连密码文件都找不到。我想我只看到了我的主文件夹和一些来自我网站的日志文件。

答案2

好的,我用公钥和私钥解决了密码问题。这里的技巧是将公钥放在:/home/your_user/.ssh/authorized_keys

它必须位于真正的根目录中,而不是位于 chroot 内的主目录中;否则,密钥认证将不起作用。

这里只剩下一个问题,那就是您无法强制使用复杂的密码短语。如果用户愿意,他可以输入一个空短语或类似“1234”的内容。

我真的希望能够使用密码验证。您至少可以使用 pam 强制设置一些密码复杂性。

相关内容