我正在为自己构建一个 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选项,并将输出发送给我们。