Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
Linuxのファイルパーミッションは、通常「所有者」「グループ」「その他」の3つの権限(読み・書き・実行)で構成されています。しかし、これら以外にも、特定の動作を制御するための特別なパーミッションが存在します。それが、setuid、setgid、stickyビットです。
これらの特殊ビットは、一見すると複雑に見えますが、システムのセキュリティを維持したり、特定のディレクトリを安全に共有したりするために不可欠な要素です。この記事では、それぞれの特殊パーミッションが持つ役割と、その設定・確認方法、そして注意点について詳しく解説します。
setuid(Set User ID)は、実行ファイルに設定する特殊なパーミッションです。このビットが有効になっている実行ファイルをユーザーが実行すると、そのプロセスは一時的にファイルの所有者の権限で動作します。
たとえば、/usr/bin/passwd
コマンドは、ユーザーのパスワードを変更するためのコマンドです。パスワードの情報は/etc/shadow
というファイルに保存されていますが、このファイルはrootユーザー以外は読み書きできません。
通常なら一般ユーザーは/etc/shadow
を編集できませんが、passwd
コマンドにはsetuidビットが付与されているため、コマンドを実行している間だけrootユーザーの権限で動作し、ファイルの変更を可能にしています。
ls -l
コマンドで、実行ファイルのパーミッションを確認してみましょう。
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 64152 3月 18 2024 /usr/bin/passwd
ls -l
の出力結果を見てください。所有者の実行権限(x
)があるべき場所にs
が表示されています。これは、setuidビットが設定されていることを示しています。
もし、所有者の実行権限(x
)が元々なく、setuidビットだけを設定した場合は、大文字のS
と表示されます。S
は「実行権限がないのにsetuidが設定されている」という、ほとんど意味をなさない状態であることを示唆しており、設定ミスやセキュリティ上の警告サインとみなせます。
chmod
コマンドでsetuidを設定できます。設定方法は、記号(u+s
)または8進数(4000
)の2種類があります。
記号で設定・解除
コマンド | 説明 |
---|---|
chmod u+s ファイル名 |
setuidビットを設定 |
chmod u-s ファイル名 |
setuidビットを解除 |
8進数で設定・解除
通常のパーミッションは3桁の8進数(例:755
)で表されますが、setuid、setgid、stickyビットは4桁目の数字で表します。
8進数 | ビット |
---|---|
4 |
setuid |
2 |
setgid |
1 |
stickyビット |
例えば、パーミッションが755
のファイルにsetuidを設定したい場合は、4755
と指定します。
# setuidを設定する例
chmod 4755 my_script.sh
# setuidを解除する例
chmod 755 my_script.sh
setgid(Set Group ID)は、実行ファイルとディレクトリの両方に設定できます。
この機能は、複数のユーザーで共有するプロジェクトディレクトリなどで非常に役立ちます。
ls -l
コマンドで確認してみましょう。グループの実行権限(x
)があるべき場所にs
が表示されていれば、setgidビットが設定されています。
ls -ld /srv/project_shared
drwxrwsr-x 2 user1 project 4096 8月 6 01:00 /srv/project_shared
この例では、グループの実行権限の部分にs
が表示されています。このディレクトリ内で作成されたファイルやディレクトリは、自動的にproject
グループが割り当てられます。
実際に確認してみましょう。
# setgidが設定されたディレクトリに移動
cd /srv/project_shared
# ファイルを作成
touch newfile.txt
# ファイルのパーミッションを確認
ls -l newfile.txt
-rw-r--r-- 1 user1 project 0 8月 6 01:00 newfile.txt
user1
が作成したにもかかわらず、グループ所有者がproject
になっていることがわかります。
chmod
コマンドでsetgidを設定できます。
記号で設定・解除
コマンド | 説明 |
---|---|
chmod g+s ファイル/ディレクトリ名 |
setgidビットを設定 |
chmod g-s ファイル/ディレクトリ名 |
setgidビットを解除 |
8進数で設定・解除
setgidは8進数の2
で表されます。パーミッション775
のディレクトリにsetgidを設定したい場合は、2775
と指定します。
# setgidを設定する例
chmod 2775 /srv/project_shared
stickyビットは、主にディレクトリに設定する特殊なパーミッションです。このビットが設定されているディレクトリでは、そのディレクトリ内のファイルやディレクトリを削除・名前変更できるのは、以下のいずれかに該当する場合のみとなります。
この機能は、複数のユーザーが書き込み権限を持つ共有ディレクトリで特に重要です。例えば、/tmp
ディレクトリは誰でも書き込みが可能ですが、他のユーザーが作成したファイルを勝手に削除することはできません。これは、/tmp
にstickyビットが設定されているためです。
ls -l
コマンドで確認してみましょう。その他の実行権限(x
)があるべき場所にt
が表示されていれば、stickyビットが設定されています。
ls -ld /tmp
drwxrwxrwt 12 root root 4096 8月 6 01:00 /tmp
この例では、その他の実行権限の部分にt
が表示されています。
もし、その他の実行権限(x
)が元々なく、stickyビットだけを設定した場合は、大文字のT
と表示されます。t
と同様に、T
もほとんど意味をなさない状態です。
chmod
コマンドでstickyビットを設定できます。
記号で設定・解除
コマンド | 説明 |
---|---|
chmod o+t ディレクトリ名 |
stickyビットを設定 |
chmod o-t ディレクトリ名 |
stickyビットを解除 |
8進数で設定・解除
stickyビットは8進数の1
で表されます。パーミッション777
のディレクトリにstickyビットを設定したい場合は、1777
と指定します。
# stickyビットを設定する例
chmod 1777 /shared_directory
setuidやsetgidは便利な機能ですが、安易に設定すると深刻なセキュリティリスクにつながる可能性があります。特にsetuidは、悪意のあるユーザーが特権を利用してシステムを乗っ取るための足がかりとなる場合があるため、使用するファイルは慎重に選定する必要があります。
また、これらの特殊ビットは組み合わせて設定することも可能です。
組み合わせ例(8進数) | 説明 |
---|---|
6755 |
setuidとsetgidを両方設定 |
5777 |
setuidとstickyビットを両方設定 |
3770 |
setgidとstickyビットを両方設定 |
7755 |
setuid, setgid, stickyビットをすべて設定 |
この記事では、Linuxの特殊パーミッションであるsetuid、setgid、stickyビットについて解説しました。
特殊ビット | 対象 | 役割 | ls -l 表示 |
---|---|---|---|
setuid | 実行ファイル | 実行時にファイルの所有者権限で動作 | s (所有者の実行権限部分) |
setgid | 実行ファイル / ディレクトリ | 実行時にグループ所有者権限で動作<br>ディレクトリ内の新規ファイルが親のグループを継承 | s (グループの実行権限部分) |
stickyビット | ディレクトリ | 他のユーザーが作成したファイルを削除・変更できなくする | t (その他の実行権限部分) |
これらの特殊ビットを正しく理解し、適切に使うことで、システムを安全に保ちながら、必要な権限を柔軟に管理できるようになります。特にsetuidとsetgidは、セキュリティ上のリスクを伴うため、その役割と影響を十分に理解してから使用するようにしましょう。
この記事が特殊パーミッションについての理解を深める一助となれば幸いです。ご覧いただきありがとうございました。次回は、rsync
コマンドを使ったファイル同期とバックアップの方法について解説します。