我一直在寻找设置 OpenSSH 的方法umask在所有连接类型中以0027
一致的方式。
我所指的连接类型是:
- 安全FTP
- SCP
- 远程控制主机名
- 远程控制主机名程序
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/profile
,scp
而且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
我建议尝试两件事:
- pam_umask
- LD_PRELOAD 包装器(自写的?)
答案2
这是一个解决方案,可以让您根据每个用户执行所需的操作。它仅使用本机sshd
功能,不需要处理本地维护的补丁。此解决方案利用ForceCommand
sshd 的行为将环境设置脚本插入每个 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 一起使用。