为 sftp 帐户设置 umask?

Posted

技术标签:

【中文标题】为 sftp 帐户设置 umask?【英文标题】:Set umask for a sftp account? 【发布时间】:2011-04-22 19:23:51 【问题描述】:

谁能告诉我如何为单个sftp 用户设置umask?值得一提的是IBM AIX...

umask 002 添加到该用户的.profile 不起作用...(目标是同一组的人可以访问此用户文件)。

我已经看到了一些关于编辑 sftpd 配置的方法,虽然我只想为一个用户设置它,所以我希望找到不需要 root 访问权限的东西。

谢谢!

f.

【问题讨论】:

【参考方案1】:

我不知道为什么下面的行对我不起作用:

*匹配组

ForceCommand  internal-sftp  -u 73

最后添加 '-u 0002' for Subsystem 在 SUSE 11.3 上可以正常工作:

*Subsystem sftp /usr/lib64/ssh/sftp-server **-u 0002***

现在指定用户只能使用公钥登录:

Match User nappcpr, Group iwcopy

    PasswordAuthentication no

    PubkeyAuthentication yes

    **KbdInteractiveAuthentication no**

【讨论】:

【参考方案2】:

八进制的 111 的 umask 将产生十进制的 73,我们 将在本例中使用。

#vi /etc/ssh/sshd_config

在文件末尾添加以下两行来配置sftp umask 用于一组用户。

Match Group  <group name>
ForceCommand  internal-sftp  -u 73

或者,在文件末尾添加以下两行,为单个用户配置 sftp umask。

Match User   <user name>
ForceCommand  internal-sftp -u 73

重新启动 sshd 守护进程。

#stopsrc -s sshd

#startsrc -s sshd

这会有所帮助:Aamod chandra

【讨论】:

【参考方案3】:

对我来说效果很好。但是,需要进行一些研究,因为您提供的是文档的摘录。在我的例子中,一个具体的例子是在 /etc/ssh/sshd_config 的末尾放置两个连续的行

Match Group www-data
ForceCommand internal-sftp -u 2

在我的情况下,如果“www-data”组中的某个人登录,我想要将 umask 设置为“002”(十进制为 2)。

还有一个使用 env 的选项。变量 SSH_ORIGINAL_COMMAND 而不是 'internal-sftp',但我没有时间去追求。

【讨论】:

这样做时要小心。在上面的示例中,整个组“www-data”将无法通过控制台进行 ssh。我收到错误消息“此服务仅允许 sftp 连接。连接已关闭。”。 这对我也有用(在 Amazon Linux 上)。我以前一直在使用上述的 SSH_ORIGINAL_COMMAND 方法。由于某种原因,当我更改为 sftp-internal 并设置 Chroot 目录时,authorized_keys 中的 umask 停止了任何效果。谢谢! 对于我们大多数关心 sftp 用户安全的人来说,chroot 是解决方案。这个答案帮助我解决了这些没有 shell 访问权限或主目录的用户的 umask 问题。 +1。然而,这并没有在搜索中迅速出现。 我已经这样做了,当我通过命令行 sftp 而不是通过 FileZilla 创建文件时,它可以工作。有什么想法吗? 这对我有用,但必须将其设置为 internal-sftp -u 002【参考方案4】:

用户可以自行设置,无需 root 参与,无论是从客户端(每个连接)还是在服务器上(每个公钥)。

从客户端,我们可以使用-s 选项覆盖用于处理 sftp 交互的远程命令:

sftp -s 'umask 0777; env PATH=$PATH:/usr/libexec/openssh:/usr/lib/ssh:/usr/sbin sftp-server' username@hostname

(如果您的sftp-server 未安装在上述任一位置,请将其也添加到路径中。

只要使用特定的公钥建立连接,我们就可以从服务器强制运行特定的命令。这将为所有连接运行,而不仅仅是 SFTP 连接,但我们可以检查 $SSH_ORIGINAL_COMMAND 环境变量来决定采取什么行动。在authorized_keys 中添加如下内容可能足以满足您的需求:

command="umask 0777; if [[ -n $SSH_ORIGINAL_COMMAND ]]; then eval $SSH_ORIGINAL_COMMAND; else exec bash --login; fi" ssh-rsa AAAAB3NzaC1yc2EA...

(替换您最喜欢的 shell 来处理任何交互式登录,并注意如果您使用 tcsh,则必须对其进行修改以适应该 shell 的语法)。

【讨论】:

【参考方案5】:

我不了解 AIX,但您应该可以使用 OpenSSH 来执行此操作,尽管它需要 root 权限。您需要为 sftp 的服务器组件编写一个包装脚本。包装器需要选择性地更改用户的umask,然后更改exec sftp 服务器。对于选择用户,我偏爱:

id --user

如果您要创建像/usr/local/sbin/sftp-wrapper 这样的脚本,那么您将更改/etc/ssh/sshd_config 中sftp 子系统的配置:

Subsystem   sftp    /usr/libexec/openssh/sftp-server

到:

Subsystem   sftp    /usr/local/sbin/sftp-wrapper

除了编写包装脚本之外,每一步都需要 root 权限。

评论:我相信当你通过 sftp 连接时,sftp 服务器是由 root 启动的。因此,默认 umask 派生自 root 的 umask。我不相信有一种方法可以从该用户的配置中为特定用户更改此设置。如果要更改所有用户的 sftp umask,可以对 sftp 子系统配置进行更简单的修改:

Subsystem   sftp    /bin/bash -c ‘umask 002; /usr/libexec/openssh/sftp-server’

【讨论】:

以上是关于为 sftp 帐户设置 umask?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSch 通过 SFTP 或 SCP 更改文件权限

在Google Cloud Platform上为其他帐户创建SSH密钥

linux 权限

linux 权限

FileZilla-02

如何为 API 凭据设置/取消设置多个帐户