为一个用户设置简单的沙盒 sftp

为一个用户设置简单的沙盒 sftp

我正在为自己构建一个 UVPS,仅用作一个简单的游乐场。我需要拥有 sftp 访问权限的用户通过了身份验证,但被启动了。我相信这是由于我的强化,但这可能是我所不知道或不知道的事情。有人可以使用以下信息来提供帮助吗?

我已经安装了 Ubuntu 10.04 并对其进行了很好的强化(对于我的非系统管理员知识库而言),但我无法通过受限用户设置通过 SFTP 连接,因为只有 SFTP 用户(也可能用于 rsync/git/hg 访问,但一次只能做一件事)。我希望将此用户限制在其主目录中 - 所以我将其放入了 sshd_config 中。

该配置仅由一个 Sudo 用户组成,我们称之为sudouser以及我们称之为 sftp 用户sftp用户

混淆的 sshd_config 文件:

Port 22

Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 768

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication yes

X11Forwarding no
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes
UseDNS no

AllowUsers sudouser sftpuser

Match User sftpuser
    ChrootDirectory %h
    ForceCommand /usr/lib/openssh/sftp-server
    AllowTcpForwarding no

我已经为 sftpuser 生成了一对 rsa 密钥对,并将其公开放在 ~sftpuser/.ssh/ 中sftp用户它的 .ssh 目录上有 700 个,它的公钥上有 600 个。

当尝试在 Netbeans 中通过 sftp 连接时,我收到以下消息:

Host '123.45.678.910' is known and mathces the RSA host key
SSH_MSG_NEWKEYS sent
SSH_MSG_NEWKEYS received
SSH_MSG_SERVICE_REQUEST sent
SSH_MSG_SERVICE_ACCEPT received
Authentications that can continue: publickey,keyboard-interactive,password
Next authentication method: publickey
Authentication succeeded (publickey).
Caught an exception, leaving main loop due to Connection reset
Disconnecting from 123.45.678.910 port 22
QUIT
Goodbye

它也与 cyberduck 连接,但立即断开连接。

对于有兴趣提供帮助的任何人,我们还提供了一些其他详细信息。

iptable 规则:

*filter
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT

-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

杂项硬化

dpkg-statoverride --update --add root sudoers 4750 /bin/su
sudo sysctl -w net.ipv4.conf.all.accept_source_route=0
sudo sysctl -w net.ipv4.conf.default.accept_source_route=0

============================================================

EDIT01:对toxicbit 和 Gilles 的回应(因为有重叠)

在日志中我确实看到这是一个所有权问题。我的理解(或缺乏理解)是,当我以 root 身份添加用户时,权限和从 /etc/skeleton 创建的文件应该是正确的……但是现在我很困惑。

这一切都是以 root 身份完成的。

/usr/sbin/groupadd sudoers
/usr/sbin/adduser sudouser
mkdir ~sudouser/.ssh
mv /tmp/uploadpackage/sudouser.pub ~sudouser/.ssh/authorized_keys
chown -R sudouser:sudouser ~sudouser/.ssh
chmod 700 ~sudouser/.ssh
chmod 600 ~sudouser/.ssh/authorized_keys
/usr/sbin/usermod -a -G sudoers sudouser

:modified visudo:

/usr/sbin/adduser sftpuser
mkdir ~sftpuser/.ssh
mv /tmp/uploadpackage/sftpuser.pub ~sftpuser/.ssh/authorized_keys
chown -R sftpuser:sftpuser ~sftpuser/.ssh
chmod 700 ~sftpuser/.ssh
chmod 600 ~sftpuser/.ssh/authorized_keys

检查权限后,我看到的是以下内容:

sudouser@uvps:~$ sudo ls -l /

<snip>
drwxr-xr-x  4 root root   4096 Apr 10 16:39 home
<snip>

sudouser@uvps:~$ ls -l /home

drwxr-xr-x  4 sftpuser sftpuser 4096 Apr 10 17:03 sftpuser
drwxr-xr-x  4 sudouser sudouser 4096 Apr 10 16:58 sudouser

这些应该归 root 所有吗?

是否存在不是由添加用户成为基本用户需要什么?

我真的很抱歉,作为 Linux 的基本用户,我有能力...但是,尽管一旦你“明白”大多数事情都是合乎逻辑的,但我觉得我在做简单的事情时总是在手册页或谷歌搜索结果中阅读细节/怪癖的解释。


============================================================

EDIT02:相关的 /var/log/auth.log 条目。

Apr 11 00:18:22 uvps sshd[8694]: Accepted publickey for sftpuser from 109.87.654.321 port 55555 ssh2
Apr 11 00:18:22 uvps sshd[8694]: pam_env(sshd:setcred): Unable to open env file: /etc/default/locale: No such file or directory
Apr 11 00:18:22 uvps sshd[8694]: pam_unix(sshd:session): session opened for user sftpuser by (uid=0)
Apr 11 00:18:22 uvps sshd[8706]: pam_env(sshd:setcred): Unable to open env file: /etc/default/locale: No such file or directory
Apr 11 00:18:22 uvps sshd[8706]: fatal: bad ownership or modes for chroot directory "/home/sftpuser"
Apr 11 00:18:22 uvps sshd[8694]: pam_unix(sshd:session): session closed for user sftpuser
Apr 11 00:18:22 uvps sshd[8694]: pam_env(sshd:setcred): Unable to open env file: /etc/default/locale: No such file or directory

pam 消息似乎与 Ubuntu Bug #155794 有关,并且可能没有造成影响 -致命进入另一方面 :p


============================================================

EDIT03:更新。

递归更改 ~sftpuser 的所有者会导致身份验证失败。通过将 ~sftpuser/.ssh (-R) 的所有权归还给sftp用户sftp 客户端可以连接。新的日志条目是:

Apr 11 01:02:36 uvps sshd[8745]: Accepted publickey for sftpuser from 109.87.654.321 port 55555 ssh2
Apr 11 01:02:36 uvps sshd[8745]: pam_env(sshd:setcred): Unable to open env file: /etc/default/locale: No such file or directory
Apr 11 01:02:36 uvps sshd[8745]: pam_unix(sshd:session): session opened for user sftpuser by (uid=0)
Apr 11 01:02:36 uvps sshd[8756]: pam_env(sshd:setcred): Unable to open env file: /etc/default/locale: No such file or directory
Apr 11 01:02:36 uvps sshd[8756]: subsystem request for sftp
Apr 11 01:02:36 uvps sshd[8745]: pam_unix(sshd:session): session closed for user sftpuser
Apr 11 01:02:36 uvps sshd[8745]: pam_env(sshd:setcred): Unable to open env file: /etc/default/locale: No such file or directory

所以也许PAM 错误(或 ubuntu 提供的默认配置)需要一些关注。我正在阅读有关 PAM 的资料,它比我希望了解的要多得多,只是为了获得一个简单的沙盒 sftp 操作员。嗯。


============================================================

EDIT04:合理确认。

在 sshd_config 文件中禁用 PAM 使其正常工作。因此,现在以后任何以此为参考的人都应该能够在没有 PAM 的情况下实现这一点。至于 PAM,我需要评估我可能需要/不需要它的原因,如果/当我理解它并确定启用它是否会为我的使用带来任何实质性的好处时,我会更新此内容。

非常感谢那些贡献者……你们让我发现了这个问题,并让我明白我真的需要更好地记录和分析日志。坦率地说,使用 ubuntudesktop/osx/windows 从来没有真正让我需要花很多时间在日志上。然而,即使是配置一个简单的服务器……我可以把答案归功于谁?每个人都帮助了我。


============================================================

EDIT05:怪癖?

重新启用 PAM 以执行推荐的更深入的日志记录并重新加载 SSH……并且一切都继续像禁用 PAM 一样工作。oO

答案1

在 Subsystem 和 ForceCommand 下更改

Subsystem sftp /usr/lib/openssh/sftp-server

Subsystem       sftp    internal-sftp

并改变

ForceCommand /usr/lib/openssh/sftp-server

ForceCommand internal-sftp

答案2

认证成功(公钥)。所以应该是某物之后...让我们检查一下:

ChrootDirectory
         Specifies the pathname of a directory to chroot(2) to after
         authentication.  All components of the pathname must be root-
         owned directories that are not writable by any other user or
         group.  After the chroot, sshd(8) changes the working directory
         to the user's home directory.

...

sftpuser 用户的主目录(和父路径)是否归 root 和 700(drwx------)所有?

如果目录所有者没有问题,并且也有写入权限,您可以在 ssh 服务器上的 /var/log 中搜索更多信息,或者尝试从命令行使用 sftp 客户端,添加-v选项,并将输出发送给我们。

相关内容