Linuxシステム上でタスクを実行しようとすると、アクセスが拒否されるという厄介な状況に陥ったことはありますか?それでは、Linuxの特殊パーミッションの世界へようこそ!
このチュートリアルでは、Linuxの特殊パーミッションであるSticky Bit、Set User ID(SUID)、およびSet Group ID(SGID)の細かなポイントをマスターするためのチケットです。
続けて、ファイルを確実かつ自信を持ってセキュアに管理しましょう!
前提条件
Linuxの特殊パーミッションの詳細に入る前に、Linuxマシンを用意してください。このチュートリアルでは、Ubuntu 22.04 LTS(Jammy Jellyfish)を使用して実演を行います。
Linuxで特殊パーミッションを持つファイルを実行する(SUID)
通常、Linuxのファイルパーミッションは、ユーザーとそのグループのパーミッションに基づいて、ファイルの読み取り、書き込み、実行の能力を決定します。しかし、ユーザーが自分自身のパーミッションではなく、ファイルの所有者のパーミッションでファイルを実行する必要がある場合もあります。
例えば、rootユーザーのみが実行できるプログラムがあるが、特定のタスクのために通常のユーザーがそれを実行する必要がある場合を考えてみましょう。そのような場合、SUIDは非常に貴重です。
SUID権限の設定方法を確認するには、次の手順に従ってください:
1. ターミナルを開き、次のコマンドを実行してユーザー(useradd
)を作成し、パスワード(passwd
)を設定します。

2. 次に、以下のstat
コマンドを実行して、cat
コマンドの現在の権限を表示します。
後で比較するために、以下のアクセス権限をメモしておいてください:
- 0755 – ファイルを所有者の権限で実行することを許可し、ファイルを実行するときに非特権ユーザーに昇格した権限を提供します。
- -rwxr-xr-x – 所有者にファイルを読み取り、書き込み、実行する権限(rwx)を設定し、グループメンバーや他のユーザーはファイルを読み取り、実行できます(r-xとr-x)。

cat
command3. そして、以下のchmod
コマンドを実行して、cat
コマンドにSUIDビットを設定します。
このコマンドにより、cat
コマンドはコマンドを実行しているユーザーの権限ではなく、ファイル所有者の権限で実行されます。
? SUIDを使用する際は注意が必要です。適切に実装されていない場合、セキュリティリスクを導入する可能性があります。SUIDは信頼できるコマンドとファイルにのみ適用するようにしてください。
4. SUIDビットを設定したら、次のstat
コマンドを実行して、cat
コマンドのアクセス許可を再確認してSUIDビットを確認します。
成功した場合、次のように表示されます。ここで、ステップ2でメモした情報と比較します:
- 0755が4755に変更されます。ここで、4はSUIDビットを表します。
- -rwxr-xr-xが-rwsr-xr-xに変更されます。ここで、sはユーザーの実行(x)権限スポットを表します。

5. 以下のcat
コマンドを実行して、現在ログインしているユーザーが/etc/shadow
ファイルにアクセスできるかをテストします。このファイルは暗号化されたユーザーパスワードと関連情報を格納する重要なシステムファイルで、ルートユーザーのみがアクセスできます。
cat
コマンドは通常、Linuxのファイルの内容を表示できます。ただし、すべてのファイルでこの動作が常に適用されるわけではありません。
現在のユーザーはファイルにアクセスする権限がないため、以下のメッセージが表示されます。

6. 以下の各コマンドを実行して、新しいユーザー(A-user
)に切り替えて、/etc/shadow
ファイルにアクセスしてみてください。
今回は、cat
コマンドが通常はrootの所有者の権限で実行されるため、コマンドを実行したユーザーの権限ではなく、ファイル所有者の権限で実行されます。
一時的にA-userにファイルの内容を読む権限を付与したので、以下のような出力が得られます。

7. セキュリティ上の理由から、現在のユーザー(A-user)からログアウトし、cat
コマンドの権限を元の状態に戻します。

cat
command8. 最後に、以下のコマンドを実行して、SUIDビットが削除されたことを確認してください。
SUIDビット 4 と s がアクセス権限にないことに注意してください。

Linuxディレクトリでの協力的なワークフローの有効化(SGID)
LinuxでSUIDを使用してファイルを実行することは確かにうまく機能します。しかし、複数のユーザーがプロジェクトで協力する協力的なワークフローを目指す場合はどうでしょうか?通常、新しく作成されたファイルが親ディレクトリのグループ所有権を継承するようにする必要があります。
このシナリオに直面した場合、SGIDはゲームチェンジャーとなります。この強力な機能は、共有リソースの管理を簡素化し、Linux環境でのグループベースのワークフローを強化します。
SGIDの動作を確認するために、以下の手順でグループを作成し、ユーザーを追加し、ディレクトリにSGIDパーミッションを設定し、その機能をテストします:
1. ルートユーザーとしてログインし、次のコマンドを実行してdemo
という名前の新しいグループを作成します(任意の名前)。このグループはSGIDの機能をテストするために使用されます。
これらのコマンドは実行後に出力を生成しません。

2. 次に、以下のコマンドを実行して、共同作業環境をシミュレートするために使用する2つのユーザー(userA
およびuserB
)を作成します。

3. 新しいユーザーを作成した後、以下のusermod
コマンドを実行します。これらのコマンドはターミナルに出力を生成しませんが、ユーザー(userA
およびuserB
)をdemo
グループに追加します。
4. これで、以下の各コマンドを実行し、/demo-dir
というディレクトリ(任意の名前)を作成し、ディレクトリの所有者をuserA
、グループをdemo
に設定します。
? 成功すると、これらのコマンドは出力を生成しません。このチュートリアル全体で同様のことが適用されます。
5. 次に、以下のls
コマンドを実行して/demo-dir
ディレクトリのパーミッションを表示します。
以下の出力は、/demo-dirディレクトリの所有者がuserAに設定され、グループがdemoに設定されていることを確認します。

6. 権限が確認されたら、次のように/demo-dir/
ディレクトリにSGIDビットを設定するために以下のchmod
コマンドを実行してください:
g+s
– Set the SGID bit on the/demo-dir/
directory.o-rwx
– Remove all permissions (read, write, execute) for others.u+rwx
– Grant read, write, and execute permissions to the owner.g+rwx
– Grant read, write, and execute permissions to the group.
7. SGIDが設定されたら、/demo-dir
ディレクトリの権限を確認するために次のコマンドを実行してください。
成功した場合、グループ所有者の実行権(x
)の場所に数値2
とグループ所有者の実行権スポット(rws
)の前にs
が設定されているのが見えるでしょう。

8. 次に、userA
の/home
ディレクトリを作成するために以下の各コマンドを実行してください。
9. 次のコマンドを実行して、userA
にスイッチ(su
)して、/demo-dir
ディレクトリにtextA.txt
(任意)という名前のファイルを作成してください。
これらのコマンドには出力がありません(このチュートリアル全体に適用されます)、が、次のステップでファイルの権限を確認します。
10. 以下のls
コマンドを実行して、textA.txt
ファイルの権限を表示します。
以下、textA.txtファイルのグループ所有者はdemoであり、これは作成者userAの主要なグループです。 demoグループのメンバーはファイルを読み取り、変更できますが、他のユーザーは読み取りのみ可能です。
/demo-dirディレクトリ内の新しいファイルがディレクトリのグループ所有権を継承するようにするには、ディレクトリにSGIDビットを設定する必要があります。これについては、以下の手順で説明します。

11. 現在のユーザー(userA)からログアウトし、/demo-dir
ディレクトリにSGIDビット(chmod g+s
)を設定するには、以下のコマンドを実行します。

12. SGIDが設定されたら、以下のコマンドを実行して、/demo-dir
ディレクトリに追加したSGIDビットを確認します。
以下のように、/demo-dir
ディレクトリにSGIDビットが正常に設定されたことが確認されます。2のSUIDビットが追加され、グループ所有者の実行スポットにsが表示されます。 /demo-dirディレクトリ。

13. 次に、userA
に戻り、/demo-dir
ディレクトリに別のファイルtestA.txt
(任意)を作成します。
14. 作成したら、以下のls
コマンドを実行して、新しいファイル(testA.txt
)の所有権を確認します。
SGIDが期待どおりに機能する場合、出力はユーザーAが所有者である一方、グループ所有権はデモであることを示します。/demo-dirディレクトリのSGIDビットが設定されているためです。

15. 次に、SGID機能をさらにテストするために、/home
ディレクトリをユーザーB
のために作成します。
16. ユーザーB
に切り替えて、同じ/demo-dir
ディレクトリにtestB.txt
(任意の)という名前のファイルを作成します。

17. 新しいファイル(testB.txt
)の情報を表示(ls
)します。
textB.txtファイルの所有権を確認してください。

ディレクトリ内のファイルの保護(スティッキービット)
Linuxディレクトリ内でのファイルの保護を有効にすると、チームワークとシームレスな共同作業が促進されます。ただし、ファイルを効果的に管理するための安全な環境を確立する必要がある場合は、スティッキービット権限を使用します。
スティッキービットを設定することで、実質的に「城の鍵」をファイル所有者、ディレクトリ所有者、またはルートユーザーの手に渡します。これにより、ディレクトリ内でファイルを削除または名前を変更できるのは彼らだけであり、機密データの追加の保護が提供されます。
スティッキービット権限を設定するには、まず次の手順で共有ディレクトリを作成する必要があります:
1. ルートユーザーとしてログインし、複数のユーザーがファイルを作成できる(共有)ディレクトリを作成します。
2. 次に、以下のコマンドを実行して、/shared-dir
ディレクトリのアクセス許可を変更し、誰もが書き込み権限を持つようにします。
最初の数字(1
)はStickyビットを設定し、残りの部分(777
)はディレクトリを誰もが読み書き実行できるようにします。
以下は、LinuxシステムでのStickyビットの特徴または属性です:
Feature | Function |
Directory Protection | When the Sticky Bit is set on a directory, it allows only the owner of a file within that directory to delete or rename their own files. Other users, even if they have write permissions to the directory, cannot delete or rename files owned by other users. |
Shared Directories | The sticky bit is handy for directories that are shared among multiple users. For example, on a system with a /tmp directory used by all users to store temporary files, setting the Sticky Bit prevents users from accidentally or maliciously deleting files owned by other users. |
以下では、アクセス許可フィールドの後半に文字「t」が表示されており、これはStickyビットが/shared-dirディレクトリに設定されていることを示しています。

3. userA
に切り替えて、/shared-dir
ディレクトリにfileA.txt
(任意の名前)というファイルを作成します:
4. userAからログアウトし、userB
に切り替え、同じ/shared-dir
ディレクトリに別のファイルfileB.txt
(任意の名前)を作成します。
5. 今、ユーザーB
を終了し、ユーザーA
に切り替えて、ユーザーB
のfileB.txt
ファイルを削除しようとします。
ファイルの所有者のみが変更または削除を行うことができるため、以下のような出力が得られます。

6. 最後に、共有ディレクトリ(/shared-dir
)内のすべてのファイルをリストアップする次のコマンドを実行してください。
Sticky Bit権限が機能している場合、ユーザーBによって作成されたfileB.txtファイルが安全であり、削除されていないことが確認できます。

結論
Linuxにおける特別な権限の探求をまとめると、SUID、SGID、およびSticky Bitという強力なツールセットが解除されました。この知識を武器に、アクセス制御を微調整し、ファイルを精密に保護できるようになります。
しかし、ここで止まらないでください!なぜSGIDを使用して共有ディレクトリを設定し、ファイルがグループ所有権を継承する方法を試してみないのですか?Linuxの世界はあなたの手のひらにあり、それぞれの取り組みによって、システムを繊細に保護する技術をマスターしていきます!
Source:
https://adamtheautomator.com/special-permissions-in-linux/