Linux における SUID と SGID の例による説明
On 10月 1, 2021 by adminあるスクリプトまたは実行可能ファイルを、常に特定のユーザーによって実行する必要がある状況を想像してください。
デフォルトでは、Linux アプリケーションおよびプログラムは、それを実行するユーザーと同じ正確な権限で実行されます。 このため、上記の状況 (つまり、特定のユーザーによって所有されるプログラムを、所有者自身が実行したかのように、すべてのユーザーが実行できること) に対する良いソリューションが必要なのです。 SUID は Linux で利用可能な特別なパーミッション・ビットに過ぎず、これを非常に簡単に実現する。
もしあなたが実行可能ファイルの所有者なら、SUID パーミッションセットの助けを借りて、他のユーザーはあなたの許可で実行可能ファイルを実行し、彼らの許可では実行できなくなります。
SUID は通常 Linux で、実行中に一時的に昇格した特権を提供するために使用されます。 この特権の昇格は永久的なものでは全くありません。 プログラム/スクリプトが実行されている間だけ、一時的に昇格されるのです。
SUID許可ビットが設定されているLinuxの実行ファイルの例
例を見て、これを理解しよう。 上記の実行ファイル一覧のうち、/usr/bin/passwdはシステム内の全てのユーザが実行可能であるべきものです(これは全てのユーザが自分のパスワードを変更できる必要があるためです)。 もし、Linuxでパスワードがどのように動作するのか知らない場合は、以下の記事を読むことをお勧めします。
Read: How password work in Linux
Update a user’s password requires the user to edit the /etc/passwd, /etc/shadow file in linux. しかし、これはrootユーザにのみ許可されています。 これは、/usr/bin/passwd ファイルに SUID ビットが適用されているためです。 rootがこのファイルのオーナーであり、このファイルにSUIDが設定されているため、/usr/bin/passwdコマンドを実行するユーザーは、rootユーザーとして実行することになります。 実際に見てみましょう。
下に示すのは、sarathというユーザが実行したpasswdコマンドです。
$ passwdChanging password for user sarath.Changing password for sarath.(current) UNIX password:
別のターミナルを開いて、ps aux commad を起動し、passwd コマンドプロセスが root ユーザーで実行されているかどうか見てみましょう。
$ ps aux | grep passwdroot 24531 0.0 0.0 156928 1664 pts/0 S+ 07:24 0:00 passwd
passwd コマンドプロセスが root ユーザーで実行されていることがわかります (上記出力の最初のフィールドから確認できます)。 passwd コマンドと同様に、先に示した SUID 適用ファイルのリストにあるコマンドは、どのユーザーが実行するかにかかわらず、常にそのファイルの所有者の権限で実行されます。
Ping コマンドも SUID であることに注目してください (上記の最初のリストを参照)。これは、PING の実行にはいくつかのネットワーク操作が必要で、root によってのみ実行できるためです。
$ chmod u+s /path/to/file/or/executable上記のコマンドの “/path/to/file/or/executable” を、SUID ビットが必要なスクリプトの絶対パスに置き換えてください。 これは、chmodの数値メソッドでも実現可能です。
$ chmod 4755 /path/to/file/or/executable
「4755」の最初の「4」はSUIDを表します。 また、数値計算方法の例を以下に示します。
$ chmod 4750 /path/to/file/or/executable
基本的に、この方法では、そのファイルに必要な他の権限セットの前に4を付けるだけである。
ファイルにSUIDがかかっているかどうかを確認する方法
ファイルにSUIDがかかっているかどうかは、次のようにlsコマンドで確認することができます。
root@ip-10-12-2-217:# cd /usr/binroot@ip-10-12-2-217:/usr/bin# ls -l passwd-rwsr-xr-x 1 root root 47032 Jul 15 2015 passwd
ls -lコマンドを実行すると、SUIDが適用されているかどうかが表示されるはずです。 ls -l の出力の最初のフィールドを見るだけでよいのです。 rwsr-xr-x の s は SUID ビットを示しています。 場合によっては、上で見たような小さなsではなく、大文字のSが表示されます。 大文字のSは、そのファイルやスクリプトに実行権限がないことを示しています。
root@ip-10-12-2-217:/usr/bin# chmod -x passwdroot@ip-10-12-2-217:/usr/bin# ls -l passwd-rwSr--r-- 1 root root 47032 Jul 15 2015 passwd
上の出力からはっきりわかるのは、/usr/bin/passwd ファイルから実行権限を削除すると、ls -l の出力が大文字の S に変わるということです。
root@ip-10-12-2-217:/usr/bin# chmod +x passwdroot@ip-10-12-2-217:/usr/bin# ls -l passwd-rwsr-xr-x 1 root root 47032 Jul 15 2015 passwd
How to find all files, which has SUID bit enabled in linux?
下記の find コマンドでシステム内の SUID bit を有効にしたファイルを全て検索することが可能です。 もし、find コマンドを初めて使うのであれば、以下の記事を読むことをお勧めします。 Linuxのfindコマンドの例
root@ip-10-12-2-217:~# find / -perm -4000 -exec ls -l {} \;
上記のコマンドの最初の/を必要な場所に置き換えると、その場所にあるすべてのSUIDファイルを見つけることができます。 例えば、/usr/bin 内の SUID を持つすべてのファイルを見つけるには、以下のコマンドを実行します。
Linux では、SUID ビットはディレクトリでは無視されるという事実を覚えておいてください。 唯一の違いは、SGID が設定されたスクリプト/ファイルは、グループ所有者の同じパーミッションで実行されることです。
ディレクトリに SGID を設定すると、そのディレクトリ内に作成されたすべてのファイルまたはディレクトリは、同じ共通グループ (SGID が設定されたディレクトリのグループ所有者) によって所有されます。
Linux における SGID ファイルの例
どのようにして Linux で SGID を設定しますか?
SUIDと同様に、SGIDは以下のようにchmodコマンドで設定できます。
root@localhost:~# chmod g+s /path/to/file上記コマンドの「/path/to/file」をSGIDビットが必要なスクリプトの絶対パスで置き換えます。
root@localhost:~# chmod 2755 /path/to/fileファイルやスクリプトに SGID が適用されているかどうかを確認する方法
SUIDと同様に、ファイル/ディレクトリで ls -l コマンドを実行すると、SGIDが有効かどうかを簡単に確認できます。
root@ip-10-12-2-217:# cd /usr/binroot@ip-10-12-2-217:/usr/bin# ls -l chage-rwxr-sr-x 1 root shadow 54968 Jul 15 2015 chage出力されたaboutの最初のフィールド(-rwxr-sr-x)の小さなsの部分がSGIDのビットを示しています。 SUIDと同様に、グループに実行権限がない場合は、以下のように小さなSではなく大文字のSになります。
root@ip-10-12-2-217:/usr/bin# chmod g-x chageroot@ip-10-12-2-217:/usr/bin# ls -l chage-rwxr-Sr-x 1 root shadow 54968 Jul 15 2015 chageまた、グループの実行権限を有効にすると、小さなSになります(以下の図)
コメントを残す