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


34

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

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

  1. ftp
  2. scp
  3. ssh主机名
  4. ssh主机名程序

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

另外,通过阅读这篇文章,我了解了OpenSSH较新版本中的-u选项。但是,这不起作用。

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

逐点进行:

  • SFTP -设置-u 0027sshd_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-sftp的设置无关,权限始终是umask 0022。我目前不知道该如何更改。

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

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


总之,设置的umask上sftp改变了结果,但并不像它应该ssh hostname工作正常阅读/etc/profile和双方scpssh hostname program似乎已经umask 0022硬编码的地方。

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

编辑:我想避免需要手动编译openssh的补丁。系统正在运行openssh来自maverick的软件包的Ubuntu Server 10.04.01(透明)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

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

编辑:经过一些评论后,我重新测试了此问题。

至少在Ubuntu(我测试过)中,如果用户在其外壳的init文件中设置了不同的umask(.bashrc,.zshrc等),似乎会忽略PAM umask,而改用用户定义的umask。/etc/profile除非用户在初始化文件中显式提供这些更改,否则更改不会影响结果。

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


Unode:“我想避免需要手动编译openssh的补丁。” 为什么?
desasteralex

5
@desasteralex-因为(如果可能的话)我想避免具有基于源的软件包附带的额外维护/管理任务,并且因为我很难相信除了修补openssh之外没有其他方法可以更改umask。特别考虑到这是任何系统上相当基本的安全性方面。
Unode

1
更改/etc/pam.d/sshd(并登录)并重新启动ssh之后,我看不到任何行为更改。是否有其他需要隐含但此处未提及的更改?
史蒂夫·克莱

@mrclay- UsePAM yes您的sshd_config中有吗?
Unode

1
要解决用户的.bashrc问题,请尝试在中删除别名umask命令/etc/profile。像alias umask=/bin/true
Tobia

Answers:


22

我可以建议尝试2件事:

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

1
+ 1,pam_umask似乎是迄今为止最简单的解决方案
Flexo

pam_umask可以解决问题。编辑问题以反映和阐述答案
Unode

只需使用stackoverflow.com/q/10220531/220060即可。但是请小心,如果您键入错误的内容,则会将自己锁定在服务器之外。在关闭当前会话之前,请始终检查是否可以再次登录。
2014年

1
除了由@nalply注释:确保有备份会话开放的,因为打破PAM意味着你将不能够sudosudo su等。
Zero3'6

13

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

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

#!/bin/sh

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

出于本示例的目的,我假设您已经调用了this /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

而且你有它。我相信这是您想要的行为。如果您对此解决方案有任何疑问,我们将很乐意提供其他详细信息。


尽管此方法似乎可行,但看起来有点维护噩梦。不过,对于无法使用pam的情况,请+1。
Unode

3
我不知道这一切都很难维护。相对于基于PAM的解决方案,主要优点是它不需要任何特殊特权-您可以在没有管理员干预的情况下为自己的帐户设置此特权。
larsks 2011年

我一直在考虑保留选定的用户列表,但实际上我没有注意到在普通用户设置上进行此操作的方面。当我第一次阅读它时,我以为ForceCommand是“必需的”,而不是“设置它的一种方式”。command=确实是ssh的简洁功能。
Unode

5

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

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

session    optional     pam_umask.so

修改/etc/login.defs如下:

UMASK           0027

2

我已经将pam_umask与ssh一起使用,但不能与scp或sftp一起使用。

包装方法对sftp或scp也不起作用。我不确定027是一个很好的例子,因为大多数发行版已将umask设置为该值。尝试使用002,看看是否可行。


1

没有设置自己的umask的程序将继承启动它的应用程序的umask。完全停止sshd,将umask设置为0027,然后再次启动它。(您可以在初始化脚本中添加umask命令,以供将来重新引导。)

经测试可与scp一起使用。


对不起,DerfK,但这是我尝试未成功的第一件事。所有登录Shell都具有umask 0027(如果它们读取/etc/profile),但是重新启动ssh不会影响scp或ssh。
Unode

1

如果pam_umask似乎并没有影响到自己的SFTP会话,然后检查是否UsePam设置为Yes/etc/ssh/sshd_config文件。

如果您已禁用密码身份验证,并且已将UsePam其设置或默认为No。您可能需要ChallengeResponseAuthentication Nosshd_config文件中进行设置,因为否则可能会无意间通过该系统启用密码验证。


1

上面对user188737的回答的补充说明:

这可能不言而喻,但是如果您没有使用openssh-server软件包,并且已经手动编译了OpenSSH,请通过传递--with-pam配置标志来确保“启用PAM支持” 。

否则,UsePAM=yes在sshd_config中,加上的任何更改/etc/pam.d/*将被忽略sshd

终于让我明白为什么为什么没有推荐的PAM解决方案通过非交互式SFTP连接进行任何影响测试...


1

由于umask是从父进程继承而来的,因此在/etc/rc.d/rc.sshd用于启动/停止/重新启动sshd 的Slackware系统上,您可以简单地将umask 0027其自身直接放在“ sshd_start”或“ sshd_restart”上方的一行上,或者放置在主要执行部分开始于/etc/rc.d/rc.sshd

case "$1" in
'start')
  umask 0027
  sshd_start
  ;;
'stop')
  sshd_stop
  ;;
'restart')
  umask 0027
  sshd_restart
  ;;
*)

或者,或者,在文件顶部:

#!/bin/sh
# Start/stop/restart the secure shell server:
umask 0027

0

我刚刚测试了solaris 11上的Larsks sshd_config选项的可能改进

与要管理的用户建立一个组,然后将脚本移入配置文件本身,在我的情况下,我想将umask设置为0002。

结果配置变为...。

Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$SHELL}'

0

我一直在为这个问题而苦苦挣扎,特别是在使用scp复制文件后,在文件权限上遇到了麻烦,最终我想到了简单地使用ssh在复制后更改权限。

解决方法如下:

  1. 复制文件: localhost$ scp filename remotehost:umask-test/filename
  2. 修复权限: localhost$ ssh remotehost "chmod go+r umask-test/filename"

最重要的是,无需根访问权限即可实现此解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.