如何完全控制 umask/PAM/权限?

如何完全控制 umask/PAM/权限?

// 2 月 8 日更新 - 突出问题简要:

  • 如何以不同于文件的方式对目录进行 umask?
  • 如何在 Nautilus 复制/粘贴时设置 umask?
  • 如何为 SSHFS 设置 umask?

我们的情况

我们公司的几个人登录服务器并上传文件。他们都需要能够上传和覆盖相同的文件。他们有不同的用户名,但都属于同一组。但是,这是一个互联网服务器,因此“其他”用户(通常)应该只具有只读访问权限。所以我想要的是这些标准权限:

文件:664
目录:771

我的目标是让所有用户都无需担心权限问题。服务器应配置为这些权限适用于所有文件和目录,无论是新建的、复制的还是覆盖的。只有当我们需要某些特殊权限时,我们才会手动更改这一点。

我们通过在 Nautilus 中使用 SFTP 将文件上传到服务器,通过使用 sshfs 安装服务器并在 Nautilus 中像访问本地文件夹一样访问它,以及通过在命令行中使用 SCP 将文件上传到服务器。这基本上涵盖了我们的情况和我们想要做的事情。

现在,我已经阅读了很多关于漂亮的 umask 功能的文章。据我了解,umask(与 PAM 一起)应该允许我做我想做的事:为新文件和目录设置标准权限。然而,经过许多小时的阅读和反复试验,我仍然无法做到这一点。我得到了许多意想不到的结果。我真的很想牢牢掌握 umask,但有很多问题没有得到解答。我将在下面发布这些问题,以及我的发现和导致这些问题的试验的解释。鉴于许多事情似乎出了问题,我认为我做错了几件事。因此,有很多问题。

注意:我使用的是 Ubuntu 9.10,因此无法更改 sshd_config设置 SFTP 服务器的 umask。已安装 SSH OpenSSH_5.1p1 Debian-6ubuntu2 < 需要 OpenSSH 5.4p1。因此,问题来了。

1. 我是否需要重新启动才能使 PAM 更改生效?

让我们从这个开始。涉及的文件太多了,我无法弄清楚什么会影响什么不会影响,也因为我不知道是否必须重新启动整个系统才能使 PAM 更改生效。在没有看到预期结果后我确实这样做了,但这真的有必要吗?或者我可以从服务器注销并重新登录,新的 PAM 策略应该生效吗?或者是否有一些“PAM”程序需要重新加载?

2. 是否有一个文件的更改会影响所有会话的所有用户?

因此,我最终修改了许多文件,因为我读到了许多不同的东西。我最终在以下文件中设置了 umask:

~/.profile -> umask=0002
~/.bashrc -> umask=0002
/etc/profile -> umask=0002
/etc/pam.d/common-session -> umask=0002
/etc/pam.d/sshd -> umask=0002
/etc/pam.d/login -> umask=0002

我希望此更改适用于所有用户,因此最好进行某种系统范围的更改。这能实现吗?

3. 毕竟,这个 UMASK 东西有用吗?

因此,在所有可能的地方将 umask 更改为 0002 后,我运行了测试。

------------SCP---------------

测试 1:

scp testfile (which has 777 permissions for testing purposes) server:/home/
testfile                                      100%    4     0.0KB/s   00:00   

让我们检查权限:

user@server:/home$ ls -l
total 4
-rwx--x--x 1 user uploaders 4 2011-02-05 17:59 testfile (711)

更新:仅通过在 pam.d/common-sessions 中设置 umask 即可修复(参见评论)

---------SSH------------

测试2:

ssh server
user@server:/home$ touch anotherfile
user@server:/home$ ls -l
total 4
-rw-rw-r-- 1 user uploaders 0 2011-02-05 18:03 anotherfile (664)

--------SFTP-----------

Nautilus: sftp://server/home/

将新文件从客户端复制并粘贴到服务器(客户端为 777)

测试 3:

user@server:/home$ ls -l
total 4
-rwxrwxrwx 1 user uploaders 3 2011-02-05 18:05 newfile (777)

通过 Nautilus 创建一个新文件。在终端中检查文件权限:

测试4:

user@server:/home$ ls -l
total 4
-rw------- 1 user uploaders    0 2011-02-05 18:06 newfile (600)

我的意思是...这里刚刚发生了什么?!我们应该每次都得到 644。而我得到的是 711、777、600,然后是一次 644。而且只有通过 SSH 创建新的空白文件时才会得到 644,这是最不可能的情况。

所以我想问一下,umask/pam 到底能不能用?

更新:通过仅在 pam.d/common-sessions 中设置 umask 来修复测试 4(参见评论)

4.那么 UMASK SSHFS 意味着什么?

有时我们会使用 sshfs 在本地安装服务器。非常有用。但我们又遇到了权限问题。

以下是我们的安装方式:

sshfs -o idmap=user -o umask=0113 user@server:/home/ /mnt

注意:我们使用 umask = 113,因为显然 sshfs 从 777 而不是 666 开始,因此使用 113 我们得到 664,这是所需的文件权限。

但现在的情况是,我们所有文件和目录都视为 664。我们在 Nautilus 中浏览到 /mnt 并:

  • 右键->新建文件(newfile)---测试 5
  • 右键->新建文件夹(newfolder)---测试 6
  • 从我们本地客户端复制并粘贴 777 文件 ---测试 7

因此让我们检查一下命令行:

user@client:/mnt$ ls -l
total 8
-rw-rw-r-- 1 user 1007    3 Feb  5 18:05 copyfile (664)
-rw-rw-r-- 1 user 1007    0 Feb  5 18:15 newfile (664)
drw-rw-r-- 1 user 1007 4096 Feb  5 18:15 newfolder (664)

但是嘿,让我们检查一下服务器端的同一个文件夹:

user@server:/home$ ls -l
total 8
-rwxrwxrwx 1 user uploaders    3 2011-02-05 18:05 copyfile (777)
-rw------- 1 user uploaders    0 2011-02-05 18:15 newfile (600)
drwx--x--x 2 user uploaders 4096 2011-02-05 18:15 newfolder (711)

什么?!真正的文件权限与我们在 Nautilus 中看到的权限非常不同。那么 sshfs 上的这个 umask 是否只是创建了一个显示虚假文件权限的“过滤器”?我尝试打开来自同一组的另一个用户的文件,该文件具有真正的 600 个权限,但“假”权限为 644 个,但我仍然无法读取它,那么这个过滤器有什么用呢??

5. UMASK 只与文件有关。那么目录呢?

从我的测试中我可以看到,所应用的 umask 也会以某种方式影响目录权限。但是,我希望我的文件为 664 (002),目录为 771 (006)。那么目录是否可以有不同的 umask?

6. 也许 UMASK/PAM 确实很酷,但 UBUNTU 有缺陷?

一方面,我读过成功使用 PAM/UMASK 和 Ubuntu 的人们发表的主题。另一方面,我发现了许多有关 Ubuntu 上的 umask/PAM/fuse 的旧错误和新错误:

所以我不知道该相信什么了。我是不是应该放弃?访问控制列表解决了我所有的问题吗?还是我使用 Ubuntu 时又遇到了问题?

使用 tar 进行备份时需要注意一点。Red Hat/Centos 发行版在 tar 程序中支持 acl,但 Ubuntu 在备份时不支持 acl。这意味着创建备份时所有 acl 都将丢失。

如果这也能解决我的问题,我非常愿意升级到 Ubuntu 10.04,但首先我想了解发生了什么。

答案1

这里可能发生很多事情。

首先想到的是:

  • 是的,pam.d 更改立即生效
  • /etc/pam.d/common-session是设置默认值的最佳位置umask
  • 任何 pam.d umask 都会被 中的任何条目覆盖.bashrc
    .bashrc只能在特定情况下读取(交互式、非登录 shell)
  • testfile (711)很奇怪
    • 如何/home安装,您是否使用 ACL?
      (例如执行什么操作ls -ld /homegetfacl /home打印?)
    • testfile在复制之前已经存在,因为不会scp更改已存在的文件的权限(除非您使用该-p标志)
  • 众所周知,Nautilus 以不同的方式创建文件,不知道为什么,或者规则是什么
  • umask=0113可能会引起问题
  • 服务器和客户端是否运行相同的操作系统?
    例如,如果客户端启用了 ACL,或者是 Cygwin,则行为可能会有所不同
  • 强制合理权限的最佳方式是使用默认 ACL,正如您所发现的,这是因为umask用户可以在.bashrc和中覆盖它.bash_profile

更新:

  • umask=0113对于 sshfs 来说是错误的。
    1. 尝试在不指定umask
    2. 使用 在挂载点内创建一个新文件touch
    3. 您应该看到它只获取例如-rw-r--r--,没有x
    4. 通过屏蔽x位,你可能会破坏目录
      ,并且编译器可能无法正确创建可执行文件

解决方法:

如果我们想不出更好的办法,您可以使用famgamin来监视正在创建的新文件并修复它们的权限,甚至只是定期运行并设置所有文件的权限的脚本。

答案2

ACL 应该可以正常工作。

为组的所有文件夹设置一个默认 ACL,然后所有未来的文件和目录都将继承该默认 ACL。

类似的东西setfacl -m d:g:uploaders:rwx应该可以工作。

要修复您现有的权限:

find /shared/folder -type d -exec setfacl -m d:g:uploaders:rwx {} \;
find /shared/folder -type f -exec setfacl -m g:uploaders:rw {} \;

看起来,如果在复制文件时设置了“preserve”,则默认 ACL 不起作用。在这种情况下,我只能建议在 cron 中运行 find 命令或监视文件系统的更改。

答案3

这与 PAM/umask 无关,但可能对您有用。

如果你设置组ID目录,则其中创建的所有文件和目录都将自动分配到其组。

root@ricarda ~ # mkdir hello      
root@ricarda ~ # chown :users hello 
root@ricarda ~ # chmod g+s hello
root@ricarda ~ # ls -l |grep hello 
drwxr-sr-x. 2 root users  4096 Feb  7 04:05 hello
root@ricarda ~ # touch hello/some_file
root@ricarda ~ # mkdir hello/some_dir
root@ricarda ~ # ls -l hello/       
total 4
drwxr-sr-x. 2 root users 4096 Feb  7 04:16 some_dir
-rw-r--r--. 1 root users    0 Feb  7 04:06 some_file

答案4

相关内容