如何为所有类型的连接设置 ssh 的 umask

如何为所有类型的连接设置 ssh 的 umask

我一直在寻找设置 OpenSSH 的方法umask在所有连接类型中以0027一致的方式。

我所指的连接类型是:

  1. 安全FTP
  2. SCP
  3. 远程控制主机名
  4. 远程控制主机名程序

3.和4.的区别在于前者启动一个shell,该shell通常会读取/etc/profile信息,而后者则不会。

此外,通过阅读这个帖子我注意到 OpenSSH 的新版本中有一个 -u 选项。但是它不起作用。

我还必须补充一点,/etc/profile现在包括umask 0027

逐点来看:

  • 安全FTP-如上所述-u 0027设置sshd_config这里, 是不足够的。

如果我不设置此参数,sftp 默认使用umask 0022。这意味着如果我有两个文件:

-rwxrwxrwx 1 user user 0 2011-01-29 02:04 execute
-rw-rw-rw- 1 user user 0 2011-01-29 02:04 read-write

当我使用 sftp 将它们放入目标机器时,我实际上得到:

-rwxr-xr-x 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

然而,当我设置-u 0027目标sshd_config机器时,我实际上得到了:

-rwxr--r-- 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

这是意料之外的,因为实际上应该是:

-rwxr-x--- 1 user user 0 2011-01-29 02:04 execute
-rw-r----- 1 user user 0 2011-01-29 02:04 read-write

有人知道为什么会发生这种情况吗?

  • SCP- 独立于设置安全FTP,权限始终为umask 0022。我目前不知道如何改变这一点。

  • 远程控制主机名-这里没有问题,因为 shell/etc/profile默认读取,这意味着umask 0027在当前设置中。

  • 远程控制主机名程序- 情况相同SCP


总而言之,设置 umasksftp会改变结果,但不会达到应有的效果,ssh hostname读取效果符合预期/etc/profilescp而且ssh hostname program似乎umask 0022在某处进行了硬编码。

欢迎对以上任何一点提出见解。

编辑:我想避免需要手动编译 openssh 的补丁。系统正在运行openssh带有 maverick 软件包的 Ubuntu Server 10.04.01 (lucid) LTS。

回答:正如 poige 所指出的,使用 pam_umask 就可以了。

具体变化如下:

添加到的行/etc/pam.d/sshd

# Setting UMASK for all ssh based connections (ssh, sftp, scp)
session    optional     pam_umask.so umask=0027

此外,为了影响所有登录 shell,无论它们是否有源/etc/profile,还将相同的行添加到了/etc/pam.d/login

编辑:在听了一些评论之后我重新测试了这个问题。

至少在 Ubuntu(我测试过的地方)中,如果用户在其 shell 的 init 文件(.bashrc、.zshrc 等)中设置了不同的 umask,则 PAM umask 将被忽略,而改用用户定义的 umask。除非用户/etc/profile在 init 文件中明确引用这些更改,否则更改不会影响结果。

目前尚不清楚这种行为是否发生在所有发行版中。

答案1

我建议尝试两件事:

  1. pam_umask
  2. LD_PRELOAD 包装器(自写的?)

答案2

这是一个解决方案,可以让您根据每个用户执行所需的操作。它仅使用本机sshd功能,不需要处理本地维护的补丁。此解决方案利用ForceCommandsshd 的行为将环境设置脚本插入每个 ssh 连接,然后运行原始命令。

首先,在系统的某处创建一个脚本,其内容如下:

#!/bin/sh

umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$SHELL}"

为了本例的目的,我假设您已经调用了这个/usr/bin/umask-wrapper

现在,您有几个选项可以进行设置。如果您希望这成为所有用户的强制配置(这似乎不太可能),您可以修改 sshd 配置以包含以下内容:

ForceCommand /usr/bin/umask-wrapper

如果你只希望这适用于一些用户,您可以使用一个Match块(这位于您的末尾sshd_config):

Match User user1,user2
ForceCommand /usr/bin/umask-wrapper

如果您希望这是用户可控制的行为,那么您可以使用文件command=中的选项authorized_key为特定键选择此行为。例如,在测试时,我在文件中添加了一个authorized_keys如下所示的条目:

command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test

以下是我的测试结果:

ssh不使用命令:

localhost$ ssh remotehost
remotehost$ touch umask-test/file1
remotehost$ ls -l umask-test/file1
-rw-r-----. 1 lars lars 0 Feb  2 06:02 file1

使用ssh命令:

localhost$ ssh remotehost touch umask-test/file2
localhost$ ssh remotehost ls -l umask-test/file2
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file2

使用scp

localhost$ touch file3
localhost$ ls -l file3
-rw-r--r--  1 lars  staff  0 Feb  2 06:03 file3
localhost$ scp file3 remotehost:umask-test/file3
localhost$ ssh remotehost ls -l umask-test/file3
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file3

使用sftp

localhost$ sftp remotehost
sftp> put file3 umask-test/file4
sftp> ls -l umask-test/file4
-rw-r-----    0 500      500             0 Feb  2 06:05 umask-test/file4

就是这样。我相信这就是你想要的行为。如果您对此解决方案有任何疑问,我很乐意提供更多详细信息。

答案3

我采取了稍微不同的方法来集中设置。

这被添加到/etc/pam.d/common-session

session    optional     pam_umask.so

修改于/etc/login.defs

UMASK           0027

答案4

未设置自己的 umask 的程序将继承启动它的应用程序的 umask。完全停止 sshd,将 umask 设置为 0027,然后重新启动它。(您可以在 init 脚本中添加 umask 命令,以便将来重新启动。)

经过测试可与 scp 一起使用。

相关内容