Linux - SUID / SGID / Sticky Bit



 ◆ SUID ( Set User ID )

 Linuxでは、ユーザは
UIDと呼ばれるID番号で管理されています。一時的に別のUIDのユーザに変更できる
 機能のことを
SUID(Set User ID)といいます。SUIDで一般ユーザがroot権限でファイルを実行できます。
 ※ 通常の実行ファイルは実行者の権限で動作しますが、SUIDが設定されていると実行ファイルの所有者権限で動作させられます。

 SUIDの使用例を見てみます。例えばパスワード変更は、/etc/shadowファイルを編集する必要があるが、
 このファイルの変更権限は一般ユーザにはありません。しかしパスワード変更コマンド(
passwd )には
 SUIDが設定されているため、一般ユーザがpasswdコマンドを実行した場合においても、passwdコマンド
 の所有者であるroot権限で実行できます。なおSUIDが設定されているファイル(プログラム)においては
 所有者の実行権限が「
s」と表記されます。


 $ ls -l /usr/bin/passwd

 -rwsr-xr-x. 1 root root 25980 Feb 22 2012 /usr/bin/passwd


 上のコマンド結果では所有者(root)のアクセス権は「rws」となっており、実行権が「s」だと分かります。
 つまり、このコマンドを実行可能なアクセス権を有する一般ユーザーによりプログラムが実行された場合は
 このファイルの所有者(root)の権限で実行できることを意味します。

 アクセス権を設定するchmodコマンドでSUIDを設定する場合は、アクセス権表記に「4000」を加算します。
 つまり元が755(rwx r-x r-x)のファイルの場合は「4755」と設定します。すると rws r-x r-x となります。
 chmodによるアクセス権の設定は数値で定義する方法と、3つの記号(u+s)を用いた方法の2種類があります。

 ◆ 実行例 : testdata.txt ファイルのアクセス権を「 rws r-x r-x 」にする設定
 $ chmod 4755 testdata.txt


 ◆ 実行例 : testdata.txt ファイルのアクセス権が変更前「 755 」である値を、変更後に「 4755 」とする設定 (SUID)
 $ chmod u+s testdata.txt


 ◆ SGID ( Set Group ID )

 SUIDは所有者の権限で動作するのに対して、SGIDは
グループの権限で動作します。SUIDの場合は、
 所有者の実行権限が「s」となるが、SGIDではグループの実行権限が「s」となります。chmodコマンド
 でSGIDを設定する場合、アクセス権表記に「2000」を加算します。文字列の場合には(g+s)を定義。

 ◆ 実行例 : testdata.txt ファイルのアクセス権を「 rwx r-s r-x 」にする設定
 $ chmod 2755 testdata.txt


 ◆ 実行例 : testdata.txt ファイルのアクセス権が変更前「 755 」である値を、変更後に「 2755 」とする設定(GUID)
 $ chmod g+s testdata.txt


 ディレクトリに対してSGIDが設定された場合、そのディレクトリ以下において作成したファイルや
 ディレクトリの所有グループには、自動的にディレクトリ自体の所有グループが適用されます。




 ◆ スティッキービット

 スティッキービット(Sticky bit)が設定されたディレクトリ以下のファイルとディレクトリは、実際に設定
 したアクセス権に関係なくて、所有者とrootユーザのみが名前の変更と削除を行えます。このスティッキー
 ビットが使用されるケースは「全ユーザーがファイルを作成できるが作成したファイルを他人がファイル名の
 変更や削除をできないようにしたい」場合です。例えば
/tmp ディレクトリにはスティッキービットが設定済。


 $ ls -ld /tmp

 drwxrwxrwt. 10 root root 4096 May 30 06:25 /tmp


 スティッキービットでは他のユーザの実行権限が「t」となります。chmodコマンドでスティッキービット
 を設定する場合、アクセス権表記に
1000 を加算します。文字列の場合は3つの記号(o+t)を定義します。


 ◆ 実行例 : testdir ディレクトリのアクセス権を「 rwx rwx rwt 」にする設定
 $ chmod 1755 testdir


 ◆ 実行例 : testdir ディレクトリのアクセス権が変更前「755」である値を、変更後に「1755」とする設定(スティッキービット)
 $ chmod o+t testdir



 ◆ SUID、SGID、スティッキービットの違い

比較項目 実行権限の設定対象 加算するアクセス権の表記(数値) 加算するアクセス権の表記(数値)
SUID 所有者 4000 u+s
SGID グループ 2000 g+s
スティッキービット その他のユーザ 1000 o+t


 ◆ umask コマンド

 umaskコマンドは、umask値の確認とumask値の設定を行うコマンド。新規作成したファイルやディレクトリ
 のアクセス権はファイルの場合「666」からumask値を引いた値、ディレクトリの場合「777」からumask値を
 引いた値となります。rootユーザのumask値のデフォルト値は「0022」。従い、新規に作成されるファイルの
 アクセス権は 644(666-022=644)となり、新規作成のディレクトリのアクセス権は 755(777-022=755)


 ◆ 構文 : umask [ マスク値 ]

 ◆ 実行例 : 現在のumask値の確認

 $ umask
 0022

 ※ umask値は、ユーザごとに設定されます。


 ◆ 実行例 : umask値を0022から、0027に変更する設定
 $ umask 0027

 ※ このumask値が適用されるユーザが作成した新規ファイルのアクセス権は(-rw r-- ---)となります。



 ◆ chownコマンド

 chownコマンドはファイルやディレクトリの所有者を変更するコマンド。root権限のユーザのみ実行できます。

 ◆ 構文 : chown [ オプション ] ユーザ [ :グループ ] ファイル名 ディレクトリ名

オプション 説明
-R  指定したディレクトリ以下の全てのファイルの所有者の変更


 ◆ 実行例 : data.txt ファイルの所有者を「 mike 」に変更
 # chown mike data.txt


 ◆ 実行例 : data.txt ファイルの所有者を「 mike 」に変更、グループを「 group1 」に変更
 # chown mike:group1 data.txt




 ◆ chgrpコマンド

 chgrpコマンドは、ファイルやディレクトリの所属するグループを変更するコマンドです。一般ユーザでも
 chgrpを使用する場合、このコマンドを実行するユーザが所属するグループのみが変更できます。スーパー
 ユーザの場合、どのグループでも変更することができます。

 ◆ 構文 : chgrp [ オプション ] グループ ファイル名 ディレクトリ名

オプション 説明
-R  指定したディレクトリ以下の全てのファイルの所有グループの変更


 ◆ 実行例 : data.txt ファイルの所有グループを「 group1 」に変更
 # chgrp group1 data.txt



Linux 技術入門

Copyright(C) 2002-2024 ネットワークエンジニアとして All Rights Reserved