我一直在寻找一种方式来设置OpenSSH的umask到所有连接types一致的方式0027
。
我指的是连接types:
3.和4.之间的区别在于前者启动一个通常读取/etc/profile
信息的shell,而后者则不会。
另外通过阅读这篇文章,我已经意识到在OpenSSH的新版本中存在的-u选项。 但是这不起作用。
我还必须补充说/etc/profile
现在包含了umask 0027
。
逐点进行:
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
并且scp
和ssh 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件事情:
这是一个解决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-pam
configuration标志来确保你“启用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:
localhost$ scp filename remotehost:umask-test/filename
localhost$ ssh remotehost "chmod go+r umask-test/filename"
最重要的是,不需要root权限来实现这个解决scheme。