シンボリックリンクを読み取り専用にする方法( `chattr +i /location/symlink`)?

シンボリックリンクを読み取り専用にする方法( `chattr +i /location/symlink`)?

削除できないようにシンボリックリンクをどのようにロックできますか?

これは通常のファイル/ディレクトリを使用して可能ですchattr +i /file/locationが、シンボリックリンクを使用してこれを達成するにはchattr: Operation not supported while reading flags on my-file

同様の質問がありますが、「/etc/resolv.conf」に「chattr +i」を設定するには?しかし、ここに適用できるソリューションはありません。

答え1

これは解決策を提供しませんが、chattrシンボリックリンクを不変にすることができない理由を説明します。

Linuxでは、不変属性は使用されるフラグのセットの一部ですFS_IOC_SETFLAGS ioctl。歴史的には、これはext2で最初に実装されており、chattrまだですe2fsprogs検索フラグchattr、処理中のファイルが通常のファイルかディレクトリかを設定する前に明示的に確認してください。

    if (!lstat(name, &buf) &&
        !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
        goto notsupp;
    }

これらのチェックを削除したり、シンボリックリンクを許可するように変更することは、シンボリックリンクを変更できないようにするための良い最初のステップであると思うかもしれませんが、chattrその直後に次の障害が発生します。

    fd = open (name, OPEN_FLAGS);
    if (fd == -1)
        return -1;
    r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);

ioctlファイル記述子で動作します。つまり、フラグを設定する前にターゲットを開く必要があります。のシンボリックリンクを開けませんioctlopenO_NOFOLLOWそしてシンボリックリンクをサポートするO_NOPATHと、前者はそれ自体が失敗し、ELOOP後者は一緒に使用できないファイル記述子を返しますioctl

答え2

シンボリックリンクはchattrをサポートしていませんが、バインドマウントを使用して削除できないリンクを作成できます。

ディレクトリの場合:

$ mkdir a b
$ echo a>a/ok
$ sudo mount --bind a b
$ cat b/ok
a
$ rmdir b
rmdir: failed to remove 'b': Device or resource busy

ファイルの場合:

$ mkdir c d
$ echo c>c/ok
$ echo d>d/ok
$ sudo mount --bind c/ok d/ok
$ cat d/ok
c
$ rm d/ok
rm: cannot remove 'd/ok': Device or resource busy

答え3

コメントできないので:

chattrは、chmod、fchmod()、またはfchmodat()システムコールのいずれかを使用するか、ioctl(シンボリックリンクについては何も言及しません)を使用する可能性があります。しかし、今は何も見つかりません。ここではUbuntuのマニュアルページを使用してください。これらの一部が変更された可能性があります。

chmodのマニュアルページから:

chmod はシンボリックリンクの権限を変更しません。 chmod システムコールはその権限を変更できません。シンボリックリンクの権限は絶対に使用されないため、これは問題ではありません。ただし、コマンドラインにリストされているすべてのシンボリックリンクに対して、chmodはポインティングファイルの権限を変更します。代わりに、chmodは再帰ディレクトリの探索中に見つかったシンボリックリンクを無視します。

fchmod、chmod、およびfchmodatシステムコールのマニュアルページを見ると、どちらも実装しません。 Chmod-ingはパス参照のみを解放し、fchmodat()システムコールはまだAT_SYMLINK_NOFOLLOWを実装していません。

AT_SYMLINK_NOFOLLOWパス名がシンボリックリンクの場合は、それを逆参照せずに、代わりにリンク自体で作業してください。このフラグは現在実装されていません。

関連情報