Linuxでの特別な権限:SUID、SGID、およびSticky Bit

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)を設定します。

sudo useradd A-user
sudo passwd A-user
Creating a new user

2. 次に、以下のstatコマンドを実行して、catコマンドの現在の権限を表示します。

stat /usr/bin/cat

後で比較するために、以下のアクセス権限をメモしておいてください:

  • 0755 – ファイルを所有者の権限で実行することを許可し、ファイルを実行するときに非特権ユーザーに昇格した権限を提供します。
  • -rwxr-xr-x – 所有者にファイルを読み取り、書き込み、実行する権限(rwx)を設定し、グループメンバーや他のユーザーはファイルを読み取り、実行できます(r-xr-x)。
Viewing access permissions of the cat command

3. そして、以下のchmodコマンドを実行して、catコマンドにSUIDビットを設定します。

このコマンドにより、catコマンドはコマンドを実行しているユーザーの権限ではなく、ファイル所有者の権限で実行されます。

? SUIDを使用する際は注意が必要です。適切に実装されていない場合、セキュリティリスクを導入する可能性があります。SUIDは信頼できるコマンドとファイルにのみ適用するようにしてください。

sudo chmod u+s /usr/bin/cat

4. SUIDビットを設定したら、次のstatコマンドを実行して、catコマンドのアクセス許可を再確認してSUIDビットを確認します。

stat /usr/bin/cat

成功した場合、次のように表示されます。ここで、ステップ2でメモした情報と比較します:

  • 07554755に変更されます。ここで、4はSUIDビットを表します。
  • -rwxr-xr-x-rwsr-xr-xに変更されます。ここで、sはユーザーの実行(x)権限スポットを表します。
Verifying the SUID bit

5. 以下のcatコマンドを実行して、現在ログインしているユーザーが/etc/shadowファイルにアクセスできるかをテストします。このファイルは暗号化されたユーザーパスワードと関連情報を格納する重要なシステムファイルで、ルートユーザーのみがアクセスできます。

catコマンドは通常、Linuxのファイルの内容を表示できます。ただし、すべてのファイルでこの動作が常に適用されるわけではありません。

cat /etc/shadow

現在のユーザーはファイルにアクセスする権限がないため、以下のメッセージが表示されます。

Viewing the /etc/shadow file’s content via a user without appropriate permissions

6. 以下の各コマンドを実行して、新しいユーザー(A-user)に切り替えて、/etc/shadow ファイルにアクセスしてみてください。

今回は、cat コマンドが通常はrootの所有者の権限で実行されるため、コマンドを実行したユーザーの権限ではなく、ファイル所有者の権限で実行されます。

# A-user に切り替える
su A-user
# /etc/shadow ファイルの内容を表示
cat /etc/shadow

一時的にA-userにファイルの内容を読む権限を付与したので、以下のような出力が得られます。

Viewing the /etc/shadow file’s content

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

exit
sudo chmod u-s /usr/bin/cat
Removing the SUID bit from the cat command

8. 最後に、以下のコマンドを実行して、SUIDビットが削除されたことを確認してください。

stat /usr/bin/cat

SUIDビット 4s がアクセス権限にないことに注意してください。

Confirming the SUID bit removal

Linuxディレクトリでの協力的なワークフローの有効化(SGID)

LinuxでSUIDを使用してファイルを実行することは確かにうまく機能します。しかし、複数のユーザーがプロジェクトで協力する協力的なワークフローを目指す場合はどうでしょうか?通常、新しく作成されたファイルが親ディレクトリのグループ所有権を継承するようにする必要があります。

このシナリオに直面した場合、SGIDはゲームチェンジャーとなります。この強力な機能は、共有リソースの管理を簡素化し、Linux環境でのグループベースのワークフローを強化します。

SGIDの動作を確認するために、以下の手順でグループを作成し、ユーザーを追加し、ディレクトリにSGIDパーミッションを設定し、その機能をテストします:

1. ルートユーザーとしてログインし、次のコマンドを実行してdemoという名前の新しいグループを作成します(任意の名前)。このグループはSGIDの機能をテストするために使用されます。

これらのコマンドは実行後に出力を生成しません。

# ルートユーザーに切り替える
sudo su
# 新しいグループを作成する
groupadd demo
Switching to root and creating a job

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

useradd -s /bin/bash userA
passwd userA

useradd -s /bin/bash userB
passwd userB
Creating users with passwords for simulating a collaborative environment

3. 新しいユーザーを作成した後、以下のusermodコマンドを実行します。これらのコマンドはターミナルに出力を生成しませんが、ユーザー(userAおよびuserB)をdemoグループに追加します。

usermod -aG demo userA
usermod -aG demo userB

4. これで、以下の各コマンドを実行し、/demo-dirというディレクトリ(任意の名前)を作成し、ディレクトリの所有者をuserA、グループをdemoに設定します。

? 成功すると、これらのコマンドは出力を生成しません。このチュートリアル全体で同様のことが適用されます。

# ディレクトリを作成する
mkdir /demo-dir
# ディレクトリの所有者を変更する
chown userA:demo /demo-dir

5. 次に、以下のlsコマンドを実行して/demo-dirディレクトリのパーミッションを表示します。

ls -ld /demo-dir/

以下の出力は、/demo-dirディレクトリの所有者がuserAに設定され、グループがdemoに設定されていることを確認します。

Viewing the /demo-dir directory’s permissions

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.
chmod g+s,u+rwx,g+rwx,o-rwx /demo-dir/

7. SGIDが設定されたら、/demo-dirディレクトリの権限を確認するために次のコマンドを実行してください。

stat /demo-dir

成功した場合、グループ所有者の実行権(x)の場所に数値2とグループ所有者の実行権スポット(rws)の前にsが設定されているのが見えるでしょう。

Verifying the SGID bit set to the /demo-dir directory

8. 次に、userA/homeディレクトリを作成するために以下の各コマンドを実行してください。

mkdir /home/userA
chown userA:userA /home/userA

9. 次のコマンドを実行して、userAにスイッチ(su)して、/demo-dirディレクトリにtextA.txt(任意)という名前のファイルを作成してください。

これらのコマンドには出力がありません(このチュートリアル全体に適用されます)、が、次のステップでファイルの権限を確認します。

# userAに切り替え
su - userA
# ディレクトリを変更
cd /demo-dir
# テキストファイルを作成
touch textA.txt

10. 以下のlsコマンドを実行して、textA.txtファイルの権限を表示します。

ls -l textA.txt

以下、textA.txtファイルのグループ所有者はdemoであり、これは作成者userAの主要なグループです。 demoグループのメンバーはファイルを読み取り、変更できますが、他のユーザーは読み取りのみ可能です。

/demo-dirディレクトリ内の新しいファイルがディレクトリのグループ所有権を継承するようにするには、ディレクトリにSGIDビットを設定する必要があります。これについては、以下の手順で説明します。

Verifying the textA.txt file’s permissions

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

# ユーザーuserAをログアウト
exit
# /demo-dirにSGIDを設定
chmod g+s /demo-dir
Setting the SGID bit to the /demo-dir directory

12. SGIDが設定されたら、以下のコマンドを実行して、/demo-dirディレクトリに追加したSGIDビットを確認します。

stat /demo-dir

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

Verifying the SGID is set to the /demo-dir directory

13. 次に、userAに戻り、/demo-dirディレクトリに別のファイルtestA.txt(任意)を作成します。

# ユーザーuserAに切り替える
su - userA
# ディレクトリを変更する
cd /demo-dir
# テキストファイルを作成する
touch testA.txt

14. 作成したら、以下のlsコマンドを実行して、新しいファイル(testA.txt)の所有権を確認します。

ls -l testA.txt

SGIDが期待どおりに機能する場合、出力はユーザーAが所有者である一方、グループ所有権はデモであることを示します。/demo-dirディレクトリのSGIDビットが設定されているためです。

Verifying permissions of the testA.txt file

15. 次に、SGID機能をさらにテストするために、/homeディレクトリをユーザーBのために作成します。

mkdir /home/userB
chown userB:userB /home/userB

16. ユーザーBに切り替えて、同じ/demo-dirディレクトリにtestB.txt(任意の)という名前のファイルを作成します。

# ユーザーBに切り替え
su - userB
# ディレクトリを変更
cd /demo-dir
# テキストファイルを作成
touch testB.txt
Switching to userB and creating the testB.txt file

17. 新しいファイル(testB.txt)の情報を表示(ls)します。

ls -l testB.txt

textB.txtファイルの所有権を確認してください。

Checking the ownership of the textB.txt file

ディレクトリ内のファイルの保護(スティッキービット)

Linuxディレクトリ内でのファイルの保護を有効にすると、チームワークとシームレスな共同作業が促進されます。ただし、ファイルを効果的に管理するための安全な環境を確立する必要がある場合は、スティッキービット権限を使用します。

スティッキービットを設定することで、実質的に「城の鍵」をファイル所有者、ディレクトリ所有者、またはルートユーザーの手に渡します。これにより、ディレクトリ内でファイルを削除または名前を変更できるのは彼らだけであり、機密データの追加の保護が提供されます。

スティッキービット権限を設定するには、まず次の手順で共有ディレクトリを作成する必要があります:

1. ルートユーザーとしてログインし、複数のユーザーがファイルを作成できる(共有)ディレクトリを作成します。

# ルートに切り替え
sudo su
# ディレクトリ(共有)を作成
mkdir /shared-dir

2. 次に、以下のコマンドを実行して、/shared-dirディレクトリのアクセス許可を変更し、誰もが書き込み権限を持つようにします。

最初の数字(1)はStickyビットを設定し、残りの部分(777)はディレクトリを誰もが読み書き実行できるようにします。

# アクセス許可を変更し、Stickyビットを設定
chmod 1777 /shared-dir
# ディレクトリのアクセス許可を表示
ls -ld /shared-dir

以下は、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ディレクトリに設定されていることを示しています。

Viewing permissions of the /shared-dir directory

3. userAに切り替えて、/shared-dirディレクトリにfileA.txt(任意の名前)というファイルを作成します:

# userAに切り替え
su - userA
# テキストファイルを作成
touch /shared-dir/fileA.txt

4. userAからログアウトし、userBに切り替え、同じ/shared-dirディレクトリに別のファイルfileB.txt(任意の名前)を作成します。

# ユーザーAから退出
exit
# ユーザーBに切り替える
su - userB
# テキストファイルを作成
touch /shared-dir/fileB.txt

5. 今、ユーザーBを終了し、ユーザーAに切り替えて、ユーザーBfileB.txtファイルを削除しようとします。

# ユーザーBを終了
exit
# ユーザーAに切り替える
su - userA
# ユーザーBが所有するファイルを削除
rm /shared-dir/fileB.txt

ファイルの所有者のみが変更または削除を行うことができるため、以下のような出力が得られます。

Attempting to delete a file (fileB.txt) owned by another user (userB)

6. 最後に、共有ディレクトリ(/shared-dir)内のすべてのファイルをリストアップする次のコマンドを実行してください。

ls /shared-dir/

Sticky Bit権限が機能している場合、ユーザーBによって作成されたfileB.txtファイルが安全であり、削除されていないことが確認できます。

Confirming the fileB.txt file still exists

結論

Linuxにおける特別な権限の探求をまとめると、SUID、SGID、およびSticky Bitという強力なツールセットが解除されました。この知識を武器に、アクセス制御を微調整し、ファイルを精密に保護できるようになります。

しかし、ここで止まらないでください!なぜSGIDを使用して共有ディレクトリを設定し、ファイルがグループ所有権を継承する方法を試してみないのですか?Linuxの世界はあなたの手のひらにあり、それぞれの取り組みによって、システムを繊細に保護する技術をマスターしていきます!

Source:
https://adamtheautomator.com/special-permissions-in-linux/