web-dev-qa-db-ja.com

プライベートディレクトリの下にパブリックディレクトリを作成できますか?

サーバーに個人用フォルダ/ a/bがあり、アクセス権700があります。他の人に/ a/bの内容を一覧表示させたくありません。/aの所有者はrootです。

次に、すべてのユーザーに対して/ a/b/cディレクトリの完全な権限を開く必要があります。

/ a/b/cのアクセス許可を777に変更しましたが、他のユーザーは引き続きアクセスできません。

20
Lee

あなたはできる。 /a/bディレクトリに実行可能ビットを設定するだけです。これにより、bに何も表示されなくなりますが、a/b/cに直接アクセスすれば、すべてを行うことができます。

% mkdir -p a/b/c
% chmod 711 a/b
% Sudo chown root a/b
% ll a/b
  ls: cannot open directory a/b: Permission denied
% touch a/b/c/this.txt
% ls a/b/c
  this.txt

他の人は/a/bの内容をリストできませんが、ファイルの名前を推測すると、そのディレクトリ内のファイルにアクセスできることに注意してください。

% echo hello | Sudo tee a/b/f
% cat a/b/f
hello
% cat a/b/doesntexist
cat: a/b/doesntexist: No such file or directory

したがって、この警告を回避するために、bディレクトリ内の他のすべてのファイル/ディレクトリに対する適切な権限(グループ/世界ではない)を維持してください。

34
stevieb

これらの権限があると、目標を達成できません。ディレクトリcにアクセスするには、他のすべてのユーザーがディレクトリbを通過できるようにする必要があります。これは、そのディレクトリの実行権限を与えることによって行われます。 /a/bモード711に設定すると、ディレクトリトラバーサルは許可されますが、読み取りと書き込みは拒否されるため、目的の動作を実現できます。ただし、他のユーザーはlist内のファイルを/a/b、名前を推測し、ファイルに十分なオープン権限がある場合、ファイルにアクセスしている可能性があります。

9
John

ユーザーが/a/bにアクセスできない場合、/a/b/cの下にあるファイルにはアクセスできません。ディレクトリトラバーサルは/a/b/cで停止するため、/a/bの権限は無関係です。

ディレクトリ/a/bがリストされないようにすることだけが目的である場合、/a/b内のファイルにアクセスするユーザーがファイル名を推測しても問題ない場合は、/a/bを実行可能にすることができます。しかし、読めません。ディレクトリでは、読み取り権限はディレクトリの内容の一覧表示のみを制御し、実行権限はそのディレクトリのエントリへのアクセスを制御します。

# chmod u=rwx,go=x /a/b
# chmod u=rwx,go=rx /a/b/c
# echo 'hello' >/a/b/existingfile
# su bob -c 'ls -l /a/b'
ls: /a/b: Permission denied
# su bob -c 'cat /a/b/nosuchfile'
cat: /a/b/nosuchfile: No such file or directory
# su bob -c 'cat /a/b/existingfile'
hello
# su bob -c 'ls -l /a/b/c'
… contents of /a/b/c …

他のユーザーが/a/b以外の/a/b/c内のファイルにアクセスできないようにする場合は、別のビューから bind mount を使用して/a/b/cを公開できます。 =。

# chmod u=rwx,go=x /a/b
# chmod u=rwx,go=rx /a/b/c
# mkdir /c
# mount --bind /a/b/c /c
# su bob -c 'ls /a/b/c'
ls: /a/b/c: Permission denied
# su bob -c 'ls -l /c'
… contents of /a/b/c …