Linuxファイルシステムの特殊権限による保護のためのベストプラクティス
Linuxのファイルパーミッションはシステムセキュリティの基盤を形成し、誰がファイルを読み取り、書き込み、実行できるかを制御します。標準の読み取り/書き込み/実行パーミッション(rwx)は基本的ですが、Linuxには実行コンテキストと共有リソースの整合性を管理するための特殊パーミッションビット—SUID、SGID、およびスティッキービット—が存在します。これらの権限を習得することで、管理者はセキュリティリスクを最小限に抑えつつ必要な機能を確保し、特定の昇格された機能を安全に付与できます。
本ガイドでは、Set User ID (SUID)、Set Group ID (SGID)、およびスティッキービットの実用的な適用とセキュリティ上の影響について深く掘り下げます。これらの機能をいつ、どのように展開するかを理解することは、Linux環境全体のセキュリティ体制を損なうことなく運用効率を維持するために不可欠です。
標準パーミッションの復習
特殊権限を探る前に、標準の三連記法(所有者、グループ、その他に対するrwx)を思い出すことが重要です。これらの権限は、8進数値(例:755や644)を使用して表現されます。
r(読み取り) = 4w(書き込み) = 2x(実行) = 1
特殊権限は、この基本動作を変更するものであり、4番目の先頭の8進数(4、2、または1)で表されます。
特殊権限:SUID、SGID、およびスティッキービット
特殊権限は標準のアクセス制御を超える機能を追加します。これらは通常、ロングリスト表示(ls -l)の出力で、標準のxフラグの代わりにsまたはtとして示されます。
| 権限 | 8進数値 | 効果 |
|---|---|---|
| SUID (Set User ID) | 4 | ファイルは(実行しているユーザーではなく)ファイルの所有者の権限で実行される。 |
| SGID (Set Group ID) | 2 | ファイルはファイルのグループの権限で実行されるか、新しいファイルは親ディレクトリのグループIDを継承する。 |
| スティッキービット | 1 | (ディレクトリに対する書き込み権限を持っていても)他のユーザーが所有するファイルを共有ディレクトリ内でユーザーが削除または名前変更するのを防ぐ。 |
1. Set User ID (SUID)
SUIDビットは強力であり、誤って使用されると危険な可能性があります。実行可能ファイルに設定されると、そのファイルを実行するすべてのユーザーは、所有者の権限でプロセスを実行します。
実用的なユースケース: 特定のタスクを実行するためにroot権限を必要とするが、ユーザーに一般的なrootアクセスを与えるべきではないユーティリティ。
例:/usr/bin/passwdに対するSUID
/usr/bin/passwdコマンドは、安全な/etc/shadowファイルを変更するために通常rootアクセスを必要とします。これはSUIDビットが設定されており、標準ユーザーが自分自身のパスワードを変更するためにpasswdを実行する間だけ、所有者(root)の権限を一時的に得ることができます。
SUIDの表示: 所有者の実行スロットのsに注目してください。
ls -l /usr/bin/passwd
# 出力例: -rwsr-xr-x 1 root root ... /usr/bin/passwd
SUIDの設定: 8進数値4を標準パーミッション(例:755は4755になる)と組み合わせて使用します。
# 'my_script'が'appuser'の所有であると仮定
chmod 4755 /path/to/my_script
SUIDに関するセキュリティ警告: 一般的なシェル(
/bin/bashなど)や外部入力を解釈するスクリプトには、実行する誰に対しても無制限のrootアクセスを許可するため、SUIDビットを設定しないでください。
2. Set Group ID (SGID)
SGIDビットは、ファイルまたはディレクトリのどちらに適用されるかによって、2つの主要な機能を持ちます。
A. 実行可能ファイル上のSGID
実行可能ファイルに設定されている場合、プロセスはユーザーのプライマリグループではなく、ファイルのグループ所有権に関連付けられた権限で実行されます。
B. ディレクトリ上のSGID(共有環境にとって重要)
ディレクトリに設定されている場合、そのディレクトリ内に作成された新しいファイルまたはサブディレクトリは、新しいファイルを作成したユーザーのプライマリグループではなく、親ディレクトリのグループ所有権を自動的に継承します。
実用的なユースケース: すべての貢献者がコラボレーションのために統一されたグループアクセスを必要とする共有プロジェクトフォルダ。
ディレクトリへのSGIDの設定: 8進数値2を標準パーミッション(例:775は2775になる)と組み合わせて使用します。
# グループ所有権を'developers'に設定し、SGIDを有効化
chgrp developers /srv/shared_project
chmod 2775 /srv/shared_project
3. スティッキービット
スティッキービット(またはセーブテキスト属性)は、ファイル削除を制御するために、共有ディレクトリに対してほぼ排他的に使用されます。
ディレクトリにスティッキービットが設定されている場合、そのディレクトリ内のファイルの所有者またはrootユーザーのみが、そのファイルを削除または名前変更できます。これは、ディレクトリ自体が'その他'に対して書き込みアクセス(o+w)を許可している場合でも同様です。
実用的なユースケース: /tmpや部門別アップロードフォルダなど、ユーザーが作成したファイルのみを管理できるようにする必要がある、一般公開された共有ディレクトリ。
例:/tmpディレクトリ
/tmpディレクトリは、多くの場合1777のようなパーミッションを持っています。1はスティッキービットがアクティブであることを示します。
ls -ld /tmp
# 出力例: drwxrwxrwt 15 root root 4096 Mar 10 11:30 /tmp
末尾のtはスティッキービットが設定されていることを確認します。これがなければ、/tmp内の他のユーザーが作成したファイルを任意のユーザーが削除できてしまいます。
スティッキービットの設定: 8進数値1を標準パーミッション(例:777は1777になる)と組み合わせて使用します。
chmod 1777 /var/public_uploads
総合的な管理:特殊権限の組み合わせ
特殊権限はしばしば組み合わされます。4番目の先頭の桁は、目的の特殊ビットの合計(4+2+1 = 7)です。
| 目的の権限 | 8進数値 |
|---|---|
標準 rwxr-xr-x (755) |
755 |
SUID + rwxr-xr-x |
4755 |
SGID + rwxr-xr-x |
2755 |
スティッキービット + rwxrwxrwx |
1777 |
SUID + SGID + スティッキービット + rwx(めったに必要ない) |
7777 |
SGIDとスティッキービットを共有フォルダのために組み合わせる例:
すべてのユーザーが'team'グループに属する安全な共有コラボレーションディレクトリを作成し、新しいファイルが'team'グループを継承し、ユーザーがお互いのファイルを削除できないようにする場合:
- グループ所有権の設定:
chgrp team /data/projectX - SGID (2) + 標準
rwx(7) + スティッキービット (1) $\rightarrow$ 特殊ビットの合計は $2+1 = 3$(グループ実行権限を含めない場合)。- 明示的な合計を使用:SGID (2) + スティッキービット (1) = 3。標準パーミッション
775。 - 合計コマンド:
chmod 3775 /data/projectX
- 明示的な合計を使用:SGID (2) + スティッキービット (1) = 3。標準パーミッション
これを確認すると:drwxrwxrw t(グループ実行権限も使用した場合はdrwxrwsrw t)。
特殊権限のセキュリティに関するベストプラクティス
SUIDおよびSGIDが付与する昇格された権限のため、これらは細心の注意を払って管理する必要があります。
- SUIDの範囲を制限する: SUIDは、標準的な操作に(
passwd、pingのように)必要なコンパイル済みバイナリ実行可能ファイルにのみ設定します。外部入力を検証する安全なラッパー実行可能ファイルにラップされていない限り、解釈型スクリプト(シェル、Python、Perl)にSUIDを適用しないでください。 - 定期的な監査:
findコマンドを使用して、ファイルシステムで異常なSUID/SGIDファイルを定期的にスキャンします。
bash # SUIDが設定されているすべてのファイルを見つける find / -perm /4000 2>/dev/null # SGIDが設定されているすべてのファイルを見つける find / -perm /2000 2>/dev/null - グループの一貫性のためにSGIDを使用する: 共有データ構造でファイルグループ所有権を手動で管理するよりも、SGIDを優先します。これにより、グループの継承が自動化されます。
- パブリック書き込み可能領域にはスティッキービットを使用する: スティッキービットは、所有者以外のユーザーによる削除を制限する必要がある一般ユーザーが使用することを意図したディレクトリ(例:
/tmp、/var/tmp)にとって不可欠です。
必要な昇格タスクに対してSUIDを慎重に使用し、グループ管理の一貫性のためにSGIDを使用し、共有ディレクトリの整合性のためにスティッキービットを採用することにより、管理者は非常に機能的でありながら堅牢に保護されたLinuxファイルシステム環境を構築できます。