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

我一直在寻找一种方式来设置OpenSSH的umask到所有连接types一致的方式0027

我指的是连接types:

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

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

另外通过阅读这篇文章,我已经意识到在OpenSSH的新版本中存在的-u选项。 但是这不起作用。

我还必须补充说/etc/profile现在包含了umask 0027

逐点进行:

  • sftp – 如上所述,在sshd_config设置-u 0027是不够的。

如果我不设置这个参数,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 

但是当我在目标机器的sshd_config上设置-u 0027时,我实际上得到:

 -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主机名 – 这里没有问题,因为shell读取默认的/etc/profile ,这意味着umask 0027在当前的设置。

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


总而言之,在sftp上设置umask会改变结果,但不会像应该那样, ssh hostname作为预期读取/etc/profile并且scpssh hostname program似乎在某处具有umask 0022硬编码。

对以上任何一点的任何见解都是值得欢迎的。

编辑:我想避免需要手动编译openssh的修补程序。 系统运行Ubuntu Server 10.04.01(lucid)LTS与来自特立独行的openssh软件包。

答:正如poige指出的那样,使用pam_umask做了个窍门。

确切的变化是:

添加到/etc/pam.d/sshd

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

另外,为了影响所有的loginshell,无论它们是否源于/etc/profile ,同样的行也被添加到/etc/pam.d/login

编辑 :在一些评论后,我重新testing了这个问题。

至less在Ubuntu(我testing过的地方)中,如果用户在其shell的初始化文件(.bashrc,.zshrc,…)中设置了不同的umask,那么PAM umask将被忽略,并使用用户定义的umask来代替。 /etc/profile更改不会影响结果,除非用户在init文件中显式地引用这些更改。

目前还不清楚这种行为是否发生在所有发行人。

我可以build议尝试2件事情:

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

这是一个解决scheme,可以让你按照每个用户来做你想做的事情。 它只使用本地的sshd特性,并不需要使用本地维护的补丁。 该解决scheme利用sshd的ForceCommand行为将环境设置脚本插入每个ssh连接,然后运行原始命令。

首先,在系统的某个地方创build一个脚本,其内容如下:

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

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

现在,你有几个选项来设置这个。 如果你希望这是所有用户的强制configuration(这似乎有点不太可能),你可以修改你的sshdconfiguration以包含以下内容:

 ForceCommand /usr/bin/umask-wrapper 

如果你只想把它应用到一些用户,你可以使用一个Match块(这是在你的sshd_config的末尾):

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

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

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

以下是我的testing结果:

使用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 

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

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

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

 session optional pam_umask.so 

这是在/etc/login.defs中修改的:

 UMASK 0027 

我已经得到了pam_umask与ssh协同工作,但没有与scp或sftp协同工作。

包装方法也没有为sftp或scp做任何事情。 我不知道027是一个很好的例子,因为大多数发行版都已经设置了umask。 试试002,看看是否有效。

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

经testing与scp一起工作。

如果pam_umask似乎没有影响您的SFTP会话,请检查/etc/ssh/sshd_config文件中的UsePam是否设置为Yes

如果您禁用了密码validation,并且UsePam已设置或默认为No 您可能需要在sshd_config文件中设置ChallengeResponseAuthentication No ,否则可能会无意中通过该系统启用密码身份validation。

上面给user188737的回答添加了一个注释:

这可能不用说,但是如果你没有使用openssh-server软件包,并且手动编译了OpenSSH,那么通过传递--with-pamconfiguration标志来确保你“启用PAM支持”。

否则,在sshd_config中UsePAM=yes ,加上对/etc/pam.d/*所做的更改将被sshd有效地忽略。

它终于明白了为什么没有推荐的PAM解决scheme通过非交互式SFTP连接进行任何影响testing。

由于umask是从父进程inheritance的,所以在使用/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 

我刚刚在solaris 11上testing了对sshd_config选项的可能改进

设置一个用户组进行pipe理,并将脚本移动到configuration文件本身,在我的情况下,我想设置umask为0002。

由此产生的configuration变成….

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

我一直在努力解决这个问题,尤其是使用scp复制文件后的文件权限,最后我发现只需使用ssh来更改复制后的权限即可。

这是解决scheme:

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

最重要的是,不需要root权限来实现这个解决scheme。