シンボリックリンクについて調べていたところ、どうやらシンボリックリンク自体のパーミッションは意味がないらしいということを発見したのでメモしておきます。
man chmodには以下のような記述があります。
chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. This is not a problem since the permissions of symbolic links are never used. However, for each symbolic link listed on the command line, chmod changes the permissions of the pointed-to file.
chmodコマンドはシンボリックリンク自体のパーミッションは操作せず代わりに指している先のファイルのパーミッションを変えるとのことです。 なぜこのような挙動となっているかというと、シンボリックリンク自体のパーミッションは意味を持たないためです。
文章で書いても腑に落ちないと思うので実験してみます。
まずは適当なディレクトリに一般ユーザーとrootユーザーが所有するディレクトリをパーミッション700で作ります。
koutarou@koutarou-desktop/INS> ls -lh
合計 8.0K
drwx------ 2 koutarou koutarou 4.0K 6月 7 20:38 general
drwx------ 2 root root 4.0K 6月 7 20:37 root
それぞれのディレクトリには所有者・パーミッションがディレクトリと同じであるテキストファイルtext.txtが入っています。
koutarou@koutarou-desktop/INS> ls -l general
合計 4
-rwx------ 1 koutarou koutarou 13 6月 7 20:38 text.txt
koutarou@koutarou-desktop/INS> sudo ls -l root
合計 4
-rwx------ 1 root root 13 6月 7 20:37 text.txt
パーミッションは700にしているのでroot配下のファイルにアクセスできないのはもちろん、cdやlsをすることもできません。
一般ユーザー所有のファイルへ一般ユーザー権限でシンボリックリンクを作る
koutarou@koutarou-desktop/INS> ln -s general/text.txt general-general
koutarou@koutarou-desktop/INS> ls -l
合計 8
drwx------ 2 koutarou koutarou 4096 6月 7 20:38 general
lrwxrwxrwx 1 koutarou koutarou 16 6月 7 21:16 general-general -> general/text.txt
drwx------ 2 root root 4096 6月 7 20:37 root
koutarou@koutarou-desktop/INS> cat general-general
general user
lnコマンドを実行するユーザーとファイルの所有者が同じなので当然シンボリックリンクは作れるし、リンク経由でのアクセスも可能です。
root所有のファイルへ一般ユーザー権限でシンボリックリンクを作る
root所有のファイルに対してのリンクなので、cdやlsができないのと同じくシンボリックリンク自体が作れないと普通は思います(私は思いました)。
koutarou@koutarou-desktop/INS> ln -s root/text.txt general-root
koutarou@koutarou-desktop/INS> ls -l
合計 8
drwx------ 2 koutarou koutarou 4096 6月 7 20:38 general
lrwxrwxrwx 1 koutarou koutarou 13 6月 7 21:20 general-root -> root/text.txt
drwx------ 2 root root 4096 6月 7 20:37 root
koutarou@koutarou-desktop/INS> cat general-root
cat: general-root: 許可がありません
koutarou@koutarou-desktop/INS> sudo cat general-root
require root
ところがどっこい普通に作れてしまいます。
しかし、シンボリックリンク自体のパーミッションが777であるにも関わらず指している先のファイルにアクセスすることはできません。 これは、シンボリックリンク自体のパーミッションはアクセスには関係なく、代わりに指している先のパーミッション(上の例ではrootの700)が使われるからです。
シンボリックリンク自体のパーミッションを変えてみる
最後にchmodのmanで説明されていたことが本当なのかを確認してみます。
koutarou@koutarou-desktop/INS> chmod 755 general-root
chmod: 'general-root' にアクセスできません: 許可がありません
chmodで先程作ったシンボリックリンクのパーミッションを変えようとすると、許可がないというエラーが出ます。 シンボリックリンク自体のパーミッションは777なので字面通りに受け取るとそんなことはないのですが、これはmanで説明されていたように指し示している先のファイル(今回はroot/text.txt)のパーミッションを書き換えようとしているため怒られています。