在使用 Ubuntu server 14.04 作为共享驱动器的多用户环境中
所有用户均使用 Filezilla/WinSCP 通过 SFTP 连接并 chroot 到/home/company-folder/
每个用户在 下也有自己的个人文件夹/home/company-folder/users/
。例如/home/company-folder/users/username-1
,/home/company-folder/users/username-2
等等...
现在username-1
可以看到其他用户的个人文件夹(/home/company-folder/users/username-2
、/home/company-folder/users/username-3
等),他无法访问其他用户文件夹,但可以看到它们的列表。
问题是:我该怎么做才能让用户无法看到彼此的个人目录/home/company-folder/users/
?Ubuntu-Linux 中有没有办法隐藏不可读的文件夹?
因为在一个拥有 100 多个用户的系统中,用户不方便浏览整个用户文件夹列表来查找他的个人文件夹。
答案1
一般情况下,没有。只有(从你的角度来看)的许可父母目录决定了特定用户是否可以列出其内容。这包括该用户无法打开/读取的目录条目。SSH/SFTP 访问的机制与本地工具相同,因为 SSH/SFTP 服务器会为每个会话生成一个子进程,并在用户成功通过身份验证后立即将子进程的所有权更改为相应用户。
请考虑以下示例:
david@localhost:~$ ls -la /home
dr-xr-xr-x 1 root root 80 Nov 10 09:05 .
drwxr-xr-x 23 root root 4,0K Dec 17 11:09 ..
drwxr-xr-x 1 guest guest 836 Sep 4 20:58 guest
drwxr-x--- 1 david users 4,2K Dec 14 22:07 david
drwx------ 1 root root 614 Nov 10 12:42 root
如您所见,我david
,可以列出 的内容,/home
尽管我不是它的所有者,因为每个人都可以读取它(请参阅条目前面的权限掩码.
)。/home/guest
出于同样的原因,我可以列出 的内容。我还可以列出 的内容/home/david
,因为我是它的所有者,并且所有者具有读取权限。但是,我无法列出 的内容/home/root
,因为我不是所有者,除了所有者之外没有人对该目录具有读取权限:
david@localhost:~$ ls /home/root
ls: cannot open directory /home/root: Permission denied
如果有人改变了所有权,/home
删除了非所有者的读取权限,我就不能再列出内容了/home
:
david@localhost:~$ sudo chmod o-r /home
david@localhost:~$ ls -ld /home
drwxr-x--x 2 root root 40 Dez 17 21:17 /home
david@localhost:~$ ls -l /home
ls: cannot open directory /home: Permission denied
但是,我仍然可以遍历/home
和读取/home/david
,因为遍历权限(这是目录上“执行”位的语义)仍然设置在/home
(和/
)上:
david@localhost:~$ ls -l /home/david
total 732K
drwx------ 1 david users 4,2K Dec 14 22:07 .
dr-xr-x--x 1 root root 80 Nov 10 09:05 ..
drwx------ 1 david users 60 Aug 24 2014 .adobe
-rw------- 1 david users 83 Dec 6 19:49 .bash_aliases
-rw------- 1 david users 66 May 12 2011 .bash_completion
-rw------- 1 david users 703 Nov 23 05:41 .bash_exports
[etc...]
看Jakuje 的回答寻找一种可能的替代方法来实现您的根本目标。
答案2
我不知道有什么办法可以做到你所描述的,但是-d
openssh 有一个选项sftp-server
,它指定用户的起始目录,这可以解决你的问题
[...] 浏览整个用户文件夹列表以找到他的个人文件夹。
如果您指定您的sftp-server
例如:
Subsystem sftp internal-sftp -d /users/%u
(您需要省略/home/company-folder/
,因为您已经在那里进行了 chroot)。