Linux

為什麼嵌套目錄的預設 setfacl 失敗?

  • July 4, 2019

我將 sftp 與用於 debian 的 internal-sftp 一起使用。我想要完成的是將所有使用者監禁到一個工作正常的特定文件夾。我還需要一個對 sftp 具有“管理員”權限但不是 root 使用者的使用者。管理員使用者將把文件放在 sftp 使用者目錄中,這樣他們就可以訪問它們。管理員使用者將是使用 winscp 或其他客戶端執行操作的“非技術”人員。我無法強迫他使用 bash。

我想出了以下解決方案:

  1. SFTP 配置

使用 sshd_config 我設置了這個:

Match group users
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -d %u

Match group sftponly
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -d admin/sftp/%u

所以我的“管理員”使用者在他家擁有所有 sftp 使用者。“管理員”也在使用者組中。所有其他使用者都在 sftponly 組中創建。‘admin’ 也在 sftponly 組中。

  1. 目錄設置

目錄設置如下:

-/
-home
 -admin
  -sftp
   -user1
   -user2

我創建了一個腳本來創建執行以下操作的 sftp 使用者:

  1. 添加使用者$U:
useradd -d / -g 1000 -M -N -s /usr/sbin/nologin $U
  1. 設置使用者 $U 密碼
echo "$U:$P" | chpasswd
  1. 創建目錄 /home/admin/sftp/$U
mkdir $SFTP_PATH/$U
  1. 設置所有權
chown $U:sftponly $SFTP_PATH/$U
  1. 設置權限
chmod u=rx,go= -R $SFTP_PATH/$U
chmod g+s $SFTP_PATH/$U
  1. 設置 ACL
setfacl -Rm u:admin:rwx,u:$U:r-x,g::--- $SFTP_PATH/$U
setfacl -d -Rm u:admin:rwx,u:$U:r-x,g::--- $SFTP_PATH/$U

到現在為止還挺好。現在我在第 6 點中不希望有一個設置,該設置將允許使用者管理員$SFTP_PATH/$U在 $U 本身可以訪問的子目錄中創建一個子目錄。這適用於創建的第一個目錄(使用者tester):

# pwd
/home/admin/sftp/tester
# ls -alh
dr-xrwx---+  2 tester          sftponly 4.0K Oct 22 16:06 tester
# su admin
$ cd /home/admin/sftp/tester
$ mkdir subdir
$ ls -alh
admin@server:/home/admin/sftp/tester$ ls -alh
total 20K
dr-xrwx---+  3 tester   sftponly 4.0K Oct 22 22:41 .
drwxrwx---+ 28 admin sftponly 4.0K Oct 22 15:19 ..
dr-xrwx---+  2 admin users    4.0K Oct 22 22:41 subdir
$ cd subdir
admin@storage:/home/admin/sftp/tester/subdir$ mkdir nesteddir
mkdir: cannot create directory ‘nesteddir’: Permission denied

當我測試acl時,我得到:

admin@storage:/home/admin/sftp/tester$ getfacl subdir/
# file: subdir/
# owner: admin
# group: users
user::r-x
user:admin:rwx
user:tester:r-x
group::---
mask::rwx
other::---
default:user::r-x
default:user:admin:rwx
default:user:tester:r-x
default:group::---
default:mask::rwx
default:other::---

所以我的問題是:作為管理員並將管理員的 setfacl 設置為 rwx,為什麼我可以創建目錄subdir但不能創建目錄嵌套

我在這裡缺少什麼嗎?我知道 proftpd 和 pureftp 但如果可能的話我想使用ssh 方式。如果沒有辦法以這種方式做到這一點,我希望能指出我正確的方向並推薦能夠開箱即用地實現此設置的軟體。

請注意:使用者 admin 在 /home/admin/sharedfiles/ 下有自己的目錄,他儲存的文件隨後會與 sftp 使用者共享。這些文件使用其文件夾中的硬連結共享。例如,如果管理員想要與 3 個使用者共享一個文件(文件非常大,例如 500GB),他只需將硬連結放在他們的文件夾中指向這些文件,然後就可以下載它們,而無需將大文件複製到每個使用者的文件夾中。

當管理員想要將不同類別的共享放在使用者的不同文件夾中時,就會出現此問題。

編輯:

我注意到,如果我將新創建的文件夾的所有權更改為“tester”,那麼管理員使用者可以創建嵌套目錄。但是,我仍然必須更改嵌套目錄的所有權以允許進一步的目錄嵌套。

# chown tester:sftponly subdir
# su admin
$ cd /home/admin/sftp/tester/subdir
$ mkdir nested                            # <----- works fine
$ cd nested
$ mkdir deepdir
mkdir: cannot create directory ‘deepdir’: Permission denied

因此,如果我想創建下一個嵌套目錄,那麼我必須這樣做chown tester:sftponly nested,然後作為使用者管理員我可以創建該deepdir目錄。

請注意,ACL 是繼承的,理論上使用者 admin 對第一個文件夾下的所有文件和目錄具有 rwx 權限,即subdir.

也許這將有助於找到 setfacl 失敗的原因?

創建子目錄時組有所不同:

drwxrwx---+ 28 admin sftponly 4.0K Oct 22 15:19 ..
dr-xrwx---+  2 admin *users* 4.0K Oct 22 22:41 subdir

嵌套目錄的創建可能受子目錄的不同組的限制。

似乎還必須設置預設組 ACL,以便它不會為組分配原始所有權。

getfacl subdir/
# file: subdir/
# owner: admin
# group: users (It appears to then default to this)
user::r-x
user:admin:rwx
user:tester:r-x
group::--- (this is not set)
mask::rwx
other::---
default:user::r-x
default:user:admin:rwx
default:user:tester:r-x
default:group::---(this is not set)
default:mask::rwx
default:other::---

引用自:https://unix.stackexchange.com/questions/238016