制限された権限を持つルートフォルダーがある場合、600としましょう。子フォルダー/ファイルに777権限がある場合、ルートフォルダーに600があっても、誰でも子ファイルを読み取り/書き込み/実行できますか?
正確なルールは次のとおりです。ディレクトリに対する実行権限がある場合にのみ、ディレクトリをトラバースできます。
したがって、たとえば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とファイルシステムに応じて重要な場合と重要でない場合があります(それらを尊重する場合と無視する場合があります)。
ルートディレクトリから実行権限を削除すると、ユーザーはディレクトリツリーの一部に制限されます(より特権のあるプロセスに変更する必要があります)。これには、アクセス制御リストを使用する必要があります。たとえば、/
と/home
がjoe
(setfacl -m user:joe:0 / /home
)の制限を超えており、/home/joe
がjoe
のホームディレクトリである場合、 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
親ディレクトリが書き込み不可であっても、子ディレクトリを書き込み可能にすることができます。これはグループで行います。
例:親ディレクトリはグループコーダーが所有しています
drwxr-sr-x
子ディレクトリ
drwxrwsr-x
あなた(コーダーグループの任意のメンバー)は引き続き子ディレクトリに書き込むことができますが、親ディレクトリには書き込むことができません。
親ディレクトリに対する実行権限がない場合でも、ハードリンクを作成してファイルにアクセスできます。ただし、ここでの問題は、親ディレクトリに対する実行権限を失う前にハードリンクを作成する必要があることです。
$ ln foo/bar/test_privs privs_test_checking