1. 概要
この記事では、アクセス許可がシンボリックリンクにどのように適用されるかについて学習します。
まず、シンボリックリンクの関連する権限について説明します。 次に、chmodとchownがそれらに対してどのように動作するかを確認します。
2. アクセス許可はシンボリックリンクにどのように関連していますか?
関連するシンボリックリンクのアクセス許可を理解するために、アクセス許可と所有権を確認することから始めます。
デスクトップ上のファイルを指すシンボリックリンクを作成することから始めましょう。 su を使用して、コマンド ln をuser1として実行できます。これにより、作成されたシンボリックリンクの所有権が確実に付与されます。
$ su user1 -c 'ln -s "/home/user1/Desktop/subdir/file.txt" "/home/user1/links/user1_symlink"'
次に、 stat を使用して、作成したシンボリックリンクのアクセス許可と所有権を出力しましょう。
$ stat -c "%n | %A | %G:%U" '/home/user1/links/user1_symlink'
/home/user1/links/user1_symlink | lrwxrwxrwx | user1:user1
シンボリック表記lrwxrwxrwxは、シンボリックリンクが持つことができる唯一のアクセス許可のセットです。 さらに、これらの権限は、どの操作にも使用されないため、代表的なものにすぎません。
代わりに、ユーザーがシンボリックリンクを操作する方法を決定するのは親ディレクトリ次第です。
readlinkコマンドを使用してこのシンボリックリンクにアクセスできるかどうかを見てみましょう。
$ su user2 -c 'readlink -v "/home/user1/links/user1_symlink"'
readlink: /home/user1/links/user1_symlink: Permission denied
シンボリックリンクにアクセスするための適切なアクセス許可がないため、パス内のディレクトリに実行アクセス許可を追加してみましょう。 次に、 fc を使用して前のコマンドを再実行し、異なる結果が得られるかどうかを確認できます。
$ chmod +x "/home/user1/links/" "/home/user1/"; fc -s -1
...
/home/user1/Desktop/subdir/file.txt
ユーザーは、シンボリックリンク自体にアクセスできるようにするために、シンボリックリンクの親ディレクトリにアクセスする権限を持っている必要があります。
readlink にアクセスするだけでなく、シンボリックリンクをたどる場合は、-fフラグを使用できます。
$ su user2 -c 'readlink -v -f "/home/user1/links/user1_symlink"'
readlink: /home/user1/links/user1_symlink: Permission denied
$ chmod +x "/home/user1/Desktop" "/home/user1/Desktop/subdir/"; fc -s -1
...
/home/user1/Desktop/subdir/file.txt
シンボリックリンクをたどるには、ターゲットファイルの親ディレクトリにアクセスできる必要があります。 シンボリックリンクが指すファイルを実際に操作する場合は、そのファイルに対しても適切なアクセス許可が必要です。
2.1. スティッキーディレクトリ内のシンボリックリンク
1つの例外を除いて、親ディレクトリの実行および書き込み権限を持っている場合、すべてのユーザーがシンボリックリンクを削除できます。 シンボリックリンクがスティッキーディレクトリ内にある場合、その所有者のみがそれを削除できます。 これは、スティッキーディレクトリ内のすべてのファイルのデフォルトの動作です。
誰でも書き込み可能なスティッキーディレクトリ内のシンボリックリンクに固有のルールもあります。
$ su user1 -c 'ln -s "/home/user1/Desktop/subdir" "/tmp/user1_tmp_symlink"'
$ su user2 -c 'cd "/tmp/user1_tmp_symlink"'
bash: line 1: cd: /tmp/user1_tmp_symlink: Permission denied
$ su user2 -c 'cd "/home/user1/Desktop/subdir" && echo "${PWD}"'
/home/user1/Desktop/subdir
ここには、ターゲットファイルとシンボリックリンクにアクセスするための適切な権限を持つユーザーがいます。 ただし、シンボリックリンクを逆参照しようとすると、拒否されます。
これは、symlinkの所有者のみが、誰でも書き込み可能なスティッキーディレクトリ内のシンボリックリンクをたどることができるために発生します。
3. chmodおよびchownシンボリックリンクへのアクセス許可の適用方法
アクセス許可を適用するために使用される2つの重要なコマンドは、chmodとchownです。 このセクションでは、それらがシンボリックリンクにどのように適用されるかについて説明します。
Desktopディレクトリを指すシンボリックリンクでこれらのコマンドを実行することから始めましょう。
$ su user1 -c 'ln -s "/home/user1/Desktop/" "/home/user1/links/user1_symlink2"'
$ chmod 740 '/home/user1/links/user1_symlink2'; chown user2:user2 "$_"
$ stat -c "%n - %a - %U:%G" '/home/user1/Desktop/'
"/home/user1/Desktop/" - 740 - user2:user2
コマンドラインからchmodまたはchownに渡されたシンボリックリンクがたどられます。これにより、シンボリックリンクではなく、ターゲットファイルのみが変更されます。
chownを使用してシンボリックリンクの所有権を変更することもできます。
$ chown -h user2:user2 '/home/user1/links/user1_symlink2'
$ stat -c "%n %U:%G" "$_"
/home/user1/links/user1_symlink2 - user2:user2
-hフラグは、chown と一緒に使用すると、シンボリックリンクがたどられないようにします。 シンボリックリンクではアクセス許可を編集できないため、chmodに相当するフラグはありません。
chmodまたはchown、で再帰を使用する場合は、-Rフラグを使用できます。
$ chmod -R 740 '/home/user1/links'; chown -R user2:user2 "$_"
$ stat -c "%n - %a - %U:%G" '/home/user1/Desktop/subdir/file.txt'
/home/user1/Desktop/subdir/file.txt - 700 - user1:user1
$ chmod 740 -R '/home/user1/links'{/,/*}; chown user1:user1 -R "$_"; fc -s -1
...
/home/user1/Desktop/subdir/file.txt - 740 - user1:user1
ご覧のとおり、 chmodは、コマンドラインを明示的に渡さない限り、再帰を使用して検出されたシンボリックリンクをトラバースしません。 これは、特定のファイルを手動で渡す場合に機能しますが、Bashファイル名拡張でも機能します。
一方、 chown、は、コマンドラインで引数として渡された場合でも、再帰中にシンボリックリンクをトラバースしません。 代わりに、再帰中に chown でシンボリックリンクをトラバースする場合は、-Hフラグを使用できます。
$ chown -R -H user2:user2 '/home/user1/links/'*
$ stat -c "%n - %U:%G" '/home/user1/Desktop/subdir/file.txt'
/home/user1/Desktop/subdir/file.txt - user2:user2
-Hをchown とともに使用すると、コマンドラインで渡されたシンボリックリンクがトラバースされます。
このフラグは、chownを使用して権限を適用するときに-Rで使用される3つのフラグの1つにすぎません。
2番目のフラグは-Lフラグであり、再帰中にすべてのシンボリックリンクをトラバースします。 最後に、 -P フラグは、 -R を使用する場合のデフォルトの動作であり、再帰中にシンボリックリンクが逆参照されるのを防ぎます。
4. 結論
結論として、シンボリックリンクには無関係なアクセス許可があります。 ユーザーは、親ディレクトリとターゲットファイルのアクセス許可によってのみシンボリックリンクを操作できなくなります。
特にchownまたはchmodにシンボリックリンクを渡すと、ターゲットファイルが操作されます。 シンボリックリンクを再帰的にトラバースする場合は、-Hまたは-Lフラグをchownとともに使用するか、コマンドライン引数としてに渡す必要があります。 ]chmod。