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

Uno*_*ode 36 ssh umask

我一直在寻找一种方式来设置的OpenSSH的的umask0027在所有连接类型一致的方式。

通过连接类型,我指的是:

  1. sftp
  2. SCP
  3. SSH主机名
  4. ssh主机名程序

3. 和 4. 之间的区别在于前者启动一个通常读取/etc/profile信息的外壳,而后者不启动。

此外,通过阅读这篇文章,我了解到较新版本的 OpenSSH 中存在 -u 选项。然而这行不通。

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

逐点进行:

  • sftp --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
Run Code Online (Sandbox Code Playgroud)

当我使用 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
Run Code Online (Sandbox Code Playgroud)

但是,当我-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
Run Code Online (Sandbox Code Playgroud)

这不是预期的,因为它实际上应该是:

-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
Run Code Online (Sandbox Code Playgroud)

任何人都明白为什么会发生这种情况?

  • scp - 与sftp 的设置无关,权限总是umask 0022. 我目前不知道如何改变这一点。

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

  • ssh主机名程序- 与scp相同的情况。


总而言之,设置 umasksftp会改变结果,但不是它应该的那样,ssh hostname按预期阅读/etc/profile并且两者都工作,scp并且ssh hostname program似乎在umask 0022某处进行了硬编码。

欢迎对上述任何一点有任何见解。

编辑:我想避免需要手动编译 openssh 的补丁。该系统正在运行 Ubuntu Server 10.04.01 (lucid) LTS,其中openssh包含来自 Maverick 的软件包。

答:正如 poige 所指出的,使用 pam_umask 可以解决问题。

确切的变化是:

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

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

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

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

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

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

poi*_*ige 22

我可以建议尝试两件事:

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


lar*_*sks 15

这是一个解决方案,可让您在每个用户的基础上做您想做的事情。它仅使用本机sshd功能,不需要使用本地维护的补丁。此解决方案利用ForceCommandsshd的行为将环境设置脚本插入每个 ssh 连接,然后运行原始命令。

首先,在系统上的某处创建一个包含以下内容的脚本:

#!/bin/sh

umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$SHELL}"
Run Code Online (Sandbox Code Playgroud)

出于本示例的目的,我假设您已经调用了 this /usr/bin/umask-wrapper

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

ForceCommand /usr/bin/umask-wrapper
Run Code Online (Sandbox Code Playgroud)

如果您只想将此应用于某些用户,您可以使用一个Match块(这在您的 末尾sshd_config):

Match User user1,user2
ForceCommand /usr/bin/umask-wrapper
Run Code Online (Sandbox Code Playgroud)

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

command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test
Run Code Online (Sandbox Code Playgroud)

以下是我的一些测试结果:

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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

你有它。我相信这是您正在寻找的行为。如果您对此解决方案有任何疑问,我很乐意提供更多详细信息。

  • 我不知道维护起来有那么难。与基于 PAM 的解决方案相比,它的主要优势在于它不需要任何特殊权限——您可以为自己的帐户进行设置,无需管理员干预。 (4认同)

Eke*_*voo 5

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

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

session    optional     pam_umask.so
Run Code Online (Sandbox Code Playgroud)

这是在/etc/login.defs

UMASK           0027
Run Code Online (Sandbox Code Playgroud)