ファイルパーミッションについて:SUID/SGID/Sticky Bitの解説
ls -l
コマンドは、ファイルやディレクトリの詳細情報を表示する際によく使いますが、正直どんな情報が出力されているのかわかっていませんでした...
それではいけないと思い、出力結果の各項目を一度調べ上げて整理してみました。
もし間違いなどあればご指摘ください<(_ _)>
ls -l
の出力例
まずそもそもls -l
の出力内容から見ていきたいと思います
drwxrwsr-x 2 root staff 4096 Sep 8 10:15 shared_directory
-rwsr-xr-x 1 root root 136 Sep 8 10:10 suid_program
-rwxr-sr-x 1 root staff 523 Sep 8 10:12 sgid_program
drwxrwxr-t 3 root users 4096 Sep 8 10:00 sticky_directory
一番最後がファイル名なのはわかるのですが、それ以外が何を指しているのか、パッと見ただけではわからないですね、、、
1. ファイルの種類とパーミッション
最初の列に表示される文字列は、ファイルの種類とパーミッションを表しています。この部分が非常に重要です!
drwxrwxrwx
この10文字で構成されたフィールドは、以下の3つの部分に分かれます。
-
1文字目: ファイルの種類
-
d
: ディレクトリ -
-
: 通常のファイル -
l
: シンボリックリンク
-
-
2~4文字目: 所有者(user)の権限
-
r
: 読み取り権限 (read) -
w
: 書き込み権限 (write) -
x
: 実行権限 (execute)
-
-
5~7文字目: グループ(group)の権限
-
r
: 読み取り権限 -
w
: 書き込み権限 -
x
: 実行権限
-
-
8~10文字目: その他のユーザー(others)の権限
-
r
: 読み取り権限 -
w
: 書き込み権限 -
x
: 実行権限
-
加えて、SUID、SGID、Sticky Bitが設定されている場合は特別な動作が可能になり、その設定位置はそれぞれ次のようになります
- SUID:4文字目
- SGID:7文字目
- Sticky Bit:10文字目
これらについても整理していきます!
SUID(Set User ID)
機能
SUID(Set User ID)は、プログラムが実行されると、そのファイルの所有者の権限で一時的に実行されるようにします。通常、ユーザーは自分の権限でファイルを実行しますが、SUIDが設定されている場合は、そのファイルの所有者の権限で実行されます。
よくある例としては、所有者がrootになっているファイルのSUIDがセットされていれば、root権限をもっていなくても実行できてしまいます(;^ω^)
表示
- 実行権限がある場合:
s
- 実行権限がない場合:
S
具体例
以下の例では、4文字目がs
になっていますね。
suid_program
はSUIDが設定されており、所有者root
の権限で実行されます。
-rwsr-xr-x 1 root root 136 Sep 8 10:10 suid_program
次は実行権限のない例をみておきますと、以下は4文字目にS
が入っていますので、所有者は実行権限を持たないです。
ただ、以下の例だと読み書きはできる設定になっています
-rwSr--r-- 1 root root 136 Sep 8 10:10 suid_file
SGID(Set Group ID)
機能
SGID(Set Group ID)は、ファイルが実行されると、そのファイルのグループの権限で実行されます。また、SGIDが設定されたディレクトリでは、作成されたファイルがそのディレクトリのグループに自動的に所属します。
表示
- 実行権限がある場合:
s
- 実行権限がない場合:
S
具体例
以下の例では7文字目にs
があるので、sgid_program
はstaff
グループの権限で実行されます。
-rwxr-sr-x 1 root staff 523 Sep 8 10:12 sgid_program
あわせて、実行権限のない例をみておくと以下になります。
-rw-r-Sr-- 1 root staff 523 Sep 8 10:12 sgid_file
Sticky Bit
機能
Sticky Bitが設定されたディレクトリ内では、そのディレクトリにファイルを作成したユーザーとrootのみがそのファイルを削除できるようになります。
これにより、共有ディレクトリ内で他のユーザーが作成したファイルを勝手に削除することを防ぐことができます。
表示
- 実行権限がある場合:
t
- 実行権限がない場合:
T
具体例
sticky_directory
内のファイルは、ファイルを作成したユーザーまたはroot
のみが削除可能です。
ただ、所有者以外のユーザーでも実行は可能になっています
drwxrwxr-t 3 root users 4096 Sep 8 10:00 sticky_directory
次の例は、削除権限を所有者とrootに限定し、かつその他のユーザーは実行できないように設定できます
drwxrwxr-T 2 admin users 4096 Aug 1 15:00 /tmp
SUID、SGID、Sticky Bitの利用例については末尾のSUID、SGID、Sticky Bitの利用例に記載しますので、ご興味があれば見てみてください!
2. リンクの数
次の列は、ファイルのリンクの数(ハードリンクの数)です。ディレクトリの場合は、サブディレクトリや自身へのリンクを含むため、2以上の値になることが多いです。
2
これは、そのファイルまたはディレクトリが他の場所から参照されている回数です。
3. 所有者
次の列は、ファイルの所有者を示しています。通常は、ファイルを作成したユーザー名が表示されます。
root
これは、ファイルの所有者がroot
ユーザーであることを意味します。
4. グループ
次の列は、ファイルの所有グループを示しています。ファイルやディレクトリには所有者だけでなく、グループも存在し、そのグループに属するユーザーがアクセス権を持つ場合があります。
staff
これは、このファイルやディレクトリがstaff
グループに属していることを意味します。
5. ファイルサイズ
次の列は、ファイルのサイズをバイト単位で示しています。ディレクトリの場合は、そのディレクトリ内のエントリの数に基づいたサイズが表示されます。
4096
これは、ファイルやディレクトリのサイズが4096バイトであることを意味します。
6. 最終更新日時
次の列は、ファイルやディレクトリが最後に更新された日時を示しています。通常、ファイルが作成された、修正された、またはアクセスされた日時です。
Sep 8 10:15
この例では、ファイルが9月8日10:15に最後に変更されたことを意味します。
7. ファイル名
最後の列は、ファイルやディレクトリの名前を表示します。
file1.txt
これは、ファイルの名前がfile1.txt
であることを示しています。
まとめ
ls -l
コマンドで表示される情報ってこんなにあったんだ、、、という驚きがありました。。。
特にパーミッションは、ほとんど理解できていなかった(怠惰)ので、勉強になりました!
この記事がどなたかの参考になれば幸いです!
参考
SUID、SGID、Sticky Bitの利用例
以下に、SUID、SGID、Sticky Bitの利用例をそれぞれ3つずつ、指定された形式で説明します。
SUIDの利用例
1. パスワードの変更
passwd
コマンドは、一般ユーザーが自身のパスワードを変更できるようにするため、SUIDが設定されています。このコマンドは、実行時にroot
権限で動作し、システムのパスワードファイルを安全に更新します。
-rwsr-xr-x 1 root root /usr/bin/passwd
2. 管理者権限でのコマンド実行
sudo
コマンドは、ユーザーが一時的に管理者権限でコマンドを実行できるようにするためにSUIDが設定されています。SUIDによって、通常のユーザーがroot
の権限で特定のタスクを実行できます。
-rwsr-xr-x 1 root root /usr/bin/sudo
SGIDの利用例
1. 共有ディレクトリのファイル管理
/srv/shared
のような共有ディレクトリにSGIDを設定すると、そのディレクトリ内で作成されたファイルは、そのディレクトリのグループに自動的に所属します。これにより、グループ内でのファイル共有が容易になります。
drwxrwsr-x 3 root shared /srv/shared
Sticky Bitの利用例
1. 一時ファイルディレクトリ
/tmp
ディレクトリは、全ユーザーがアクセスできる一時ファイル保存場所です。Sticky Bitが設定されているため、ユーザーは自分のファイルのみ削除でき、他のユーザーのファイルは削除できません。
drwxrwxrwt 1777 root root /tmp