web-dev-qa-db-ja.com

サブディレクトリにアクセスするとき、親ディレクトリの権限は重要ですか?

制限された権限を持つルートフォルダーがある場合、600としましょう。子フォルダー/ファイルに777権限がある場合、ルートフォルダーに600があっても、誰でも子ファイルを読み取り/書き込み/実行できますか?

168
Ken Li

正確なルールは次のとおりです。ディレクトリに対する実行権限がある場合にのみ、ディレクトリをトラバースできます。

したがって、たとえばdir/subdir/fileにアクセスするには、dirおよびdir/subdirに対する実行権限に加えて、必要な種類のアクセスに対するfileに対する権限が必要です。コーナーケースに入ると、相対パスを介してファイルにアクセスするために現在のディレクトリで実行権限が必要かどうかが普遍的かどうかはわかりません(Linuxの場合)。

ファイルにアクセスする方法は重要です。たとえば、/foo/barに対する実行権限はあるが/fooに対する権限はないが、現在のディレクトリが/foo/barである場合、相対パスを通じて/foo/bar内のファイルにアクセスできますが、絶対パスを介して。このシナリオでは、/foo/barに変更することはできません。より特権のあるプロセスは、おそらく特権を失う前にcd /foo/barを実行したと考えられます。ファイルに複数のハードリンクがある場合は、ファイルへのアクセスに使用するパスによってアクセス制限が決まります。

シンボリックリンクは何も変更しません。カーネルは、呼び出しプロセスのアクセス権を使用して、それらを通過します。たとえば、symがディレクトリdirへのシンボリックリンクである場合、sym/fooにアクセスするには、dirに対する実行権限が必要です。シンボリックリンク自体の権限は、OSとファイルシステムに応じて重要な場合と重要でない場合があります(それらを尊重する場合と無視する場合があります)。

ルートディレクトリから実行権限を削除すると、ユーザーはディレクトリツリーの一部に制限されます(より特権のあるプロセスに変更する必要があります)。これには、アクセス制御リストを使用する必要があります。たとえば、//homejoesetfacl -m user:joe:0 / /home)の制限を超えており、/home/joejoeのホームディレクトリである場合、 joeはシステムの残りの部分にアクセスできなくなります(/bin/shまたは動的にリンクされたバイナリを使用して/libにアクセスする必要があるシェルスクリプトを実行するため、実用化のためにさらに深く、例えばsetfacl -m user:joe:0 /*; setfacl -d user:joe /bin /lib)。

ディレクトリの読み取り権限は、エントリを列挙する権利を与えます。読み取りパーミッションを与えずに実行パーミッションを与えることは時々役に立ちます:エントリーの名前はそれらにアクセスするためのパスワードとして機能します。実行権限なしでディレクトリに読み取りまたは書き込み権限を与える用途は考えられません。

いいえ。ルートフォルダのアクセス許可は、子ファイルのアクセス許可を制限します。あなたはそれを試すことができます。

$ mkdir rootdir
$ touch ./rootdir/childfile
$ chmod 777 ./rootdir/childfile
$ chmod 600 rootdir
$ cat ./rootdir/childfile

私はこれを手に入れます:

$ cat: ./rootfolder/childfile: permission denied
34
goovim

親ディレクトリが書き込み不可であっても、子ディレクトリを書き込み可能にすることができます。これはグループで行います。

例:親ディレクトリはグループコーダーが所有しています

drwxr-sr-x

子ディレクトリ

drwxrwsr-x

あなた(コーダーグループの任意のメンバー)は引き続き子ディレクトリに書き込むことができますが、親ディレクトリには書き込むことができません。

4
Kemin Zhou

親ディレクトリに対する実行権限がない場合でも、ハードリンクを作成してファイルにアクセスできます。ただし、ここでの問題は、親ディレクトリに対する実行権限を失う前にハードリンクを作成する必要があることです。

$ ln foo/bar/test_privs privs_test_checking
1
Kamal