web-dev-qa-db-ja.com

setuidおよび8進数4000のファイル許可

setuidをファイルに設定すると、ターミナルで次のようになります。

chmod u+s filename

これは正常に動作します。しかし、8進数の4000は常に(本などの)setuidに関連付けられています。

(ある程度)ファイルのアクセス許可、umask、setuidの概念、およびchmodでの8進数の使用を理解しています。しかし、8進数の4000とsetuidの関係はまだわかりません。説明してください。

7
DUKE

それは単なる慣習です。すべての定数識別子は、Linuxソースコード内の番号に関連付けられています。それらのいくつかは非常に古く、カーネルの最初のリリースに由来するものもあれば、最近追加されたものもあります。

定数S_ISUID "setuid"に関連付けられているのは、多数のLinuxヘッダーの1つである include/uapi/linux/stat.h で定義されています。何にでも定義できたはずですが、たまたま04000でした。

@steeldriverで述べたように、man 2 statは、ファイル許可に使用されるさまざまな定数の意味を理解するのに役立ちます。

       S_IFMT     0170000   bit mask for the file type bit fields
       S_IFSOCK   0140000   socket
       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO
       S_ISUID    0004000   set-user-ID bit
       S_ISGID    0002000   set-group-ID bit (see below)
       S_ISVTX    0001000   sticky bit (see below)
       S_IRWXU    00700     mask for file owner permissions
       S_IRUSR    00400     owner has read permission
       S_IWUSR    00200     owner has write permission
       S_IXUSR    00100     owner has execute permission
       S_IRWXG    00070     mask for group permissions
       S_IRGRP    00040     group has read permission
       S_IWGRP    00020     group has write permission
       S_IXGRP    00010     group has execute permission
       S_IRWXO    00007     mask for permissions for others (not in group)
       S_IROTH    00004     others have read permission
       S_IWOTH    00002     others have write permission
       S_IXOTH    00001     others have execute permission

このexcertでは、定数とその数値だけでなく、それらの選択方法も確認できます。開発者/設計者は、定数を組み合わせるように選択しています。例えば ​​S_ISUID and S_IRWXU and S_IRUSR and S_IRGRP = 04740、許可04740は、正確に「所有者のsetuidとすべての権限、および所有グループの読み取り権限」を意味します。

10
lgeorget

ほとんどのUnixライクなシステムでは、ファイル、ディレクトリ、またはその他のファイルシステムオブジェクトは、inodeで表されます。 modeと呼ばれ、オブジェクトのタイプとその権限の一部を記述します。 POSIX stat.h で説明されています。

The following symbolic names for the values of type mode_t shall also be defined:

File type:
    S_IFREG
        Regular.
    S_IFDIR
        Directory.
    S_IFLNK
        Symbolic link.

File mode bits:

S_IRWXU
    Read, write, execute/search by owner.

    S_IRUSR
        Read permission, owner.
    S_IWUSR
        Write permission, owner.
    S_IXUSR
        Execute/search permission, owner.
...

S_ISUID
    Set-user-ID on execution.
S_ISGID
    Set-group-ID on execution.
...

これらはすべて整数定数の記号名です。 S_IFREGは0100000です。S_IRUSRは000400です。S_ISUIDは004000です。使いやすさのために8進数になっています。ファイルモードビットは、論理的にはそれぞれ3ビットの4つのグループと見なすことができます。

ここで、.profileのファイルタイプビットとファイルモードビットを確認できます。

$ Perl -e 'printf("%#o\n", (stat(".profile"))[2]);'
0100644

ユーザーは、chmodシステムコールを使用してモードビットを設定できます(ただし、ファイルタイプは設定できません)。整数の引数(これらのS_ *シンボリック定数の一部を使用する可能性があります)またはchmodユーティリティを使用できます。 、整数またはシンボリック名(u+rなど)を取ります。

実際には、モードビットの組み合わせはそれほど多くないため、何十年にもわたって多くのUnixユーザーがchmod(システムコールとコマンドの両方)をシンボリック名ではなく数値引数で呼び出してきました。 0755は「所有者が書き込み可能、​​他のすべてのユーザーが読み取りおよび実行可能」を意味し、0644は「所有者が書き込み可能、​​他のすべてのユーザーが読み取り可能」を意味し、04755は「所有者が書き込み可能、​​他のすべてのユーザーが読み取りおよび実行可能」を意味します。

4
Mark Plotnick

chmod(debian jessy)の(英語)マニュアルページから:(Highlight by me)

数値モードは、1から4の8進数(0から7)であり、値4、2、1のビットを加算することによって得られます。省略された桁は先行ゼロと見なされます。 最初の数字は、設定されたユーザーID(4)と設定されたグループID(2)および制限された削除またはスティッキー(1)属性を選択します。 2番目の数字は、ファイルを所有するユーザーの権限を選択します。読み取り( 4)、書き込み(2)、実行(1); 3番目は、同じ値を持つ、ファイルのグループ内の他のユーザーのアクセス許可を選択します。ファイルのグループに含まれていない他のユーザーの4番目は、同じ値です。

これがあなたの質問に答えるかどうかはわかりませんが、数字の意味を説明しています。

2
Fabian