1. 概要

Linuxでは、ファイルに読み取り、書き込み、および実行(rwx)許可フラグを設定できることがわかっています。

これらの標準のアクセス許可に加えて、3つの特別なアクセス許可が利用可能です。

このチュートリアルでは、特殊なタイプの権限を確認し、Linuxコマンドを使用してこれらのフラグを設定および削除する方法を学びましょう。

2. setuidビット

通常、プロセスがUnixライクなオペレーティングシステムで開始されると、プロセスは、対応する特権を使用して、プロセスを開始したユーザーの有効なユーザーIDとグループIDで実行されます。ただし、この動作は次の場合に変更できます。実行可能ファイルに特別な権限を設定します。

setuid 「ユーザーIDの設定」を意味します。 実行可能ファイルにsetuidビットを設定すると、ファイルは、誰が起動したかに関係なく、常にファイル所有者の権限で実行されます。 

setuid ビットは、実行可能ファイルに設定されている場合にのみ意味があります。 実行不可能なファイルまたはディレクトリにsetuidビットを設定した場合、実用的な意味はありません。

passwd コマンドは、次の特別なビットが設定された例です。

$ ls -l /bin/passwd
-rwsr-xr-x 1 root root 63624 Dec 15 21:06 /bin/passwd

所有者の実行権限は、通常の「x」ではなく小文字の「s」であることがわかります。 この「s」は、ファイルにsetuidビットが設定されていることを示します。 The passwd コマンドは常にで実行されますファイルの所有者は

chmod コマンドを使用して、ファイルのsetuidビットを設定できます。

chmod u+s FILE

setuid ビットを設定できるのは、ファイルの所有者またはrootユーザーのみです。 

ファイルにsetuidビットを設定する例を見てみましょう。

$ ls -l file
-rwxr-xr-x 1 kent kent 0 Feb 2 12:22 file

$ chmod u+s file
$ ls -l file   
-rwsr-xr-x 1 kent kent 0 Feb  2 12:22 file

または、モードの前に「4」を付けることにより、8進表記を使用してsetuidビットを設定することもできます。

$ chmod 4755 file
-rwsr-xr-x 1 kent kent 0 Feb  2 12:22 file

setuid ビットを削除するには、uschmodコマンドに渡します。

$ chmod u-s file
$ ls -l file
-rwxr-xr-x 1 kent kent 0 Feb  2 12:22 file

3. setgidビット

3.1. setgidファイルのビット

setgidは「setgroupid」の略です。 実行可能ファイルにsetgidビットを設定すると、誰がファイルを起動しても、所有グループの特権で実行されます。

Locate コマンドは、setgidビットが設定されたファイルの例です。

$ ls -l /usr/bin/locate
-rwxr-sr-x 1 root locate 43048 Nov 13 18:09 /usr/bin/locate

setuid ビットと同様に、 ls 出力に小文字の「s」がありますが、所有者セクションではなくグループセクションにある点が異なります。

chmodコマンドにg+sを渡すことで、ファイルにsetgidビットを設定できます

$ ls -l file2 
-rwxr-xr-x 1 kent kent 0 Feb 2 22:35 file2
$ chmod g+s file2
$ ls -l file2 
-rwxr-sr-x 1 kent kent 0 Feb 2 22:35 file2

または、モードの前に「2」を付けることにより、8進表記を使用してsetgidビットを設定できます。

chmod 2755 file2

ファイルのsetgidビットを削除したい場合は、gsをchmodコマンドに渡します

$ chmod g-s file2
$ ls -l file2
-rwxr-xr-x 1 kent kent 0 Feb  2 22:35 file2

3.2. ディレクトリのsetgidビット

ディレクトリにsetgidビットを設定すると、ディレクトリ内に新しく作成されたすべてのファイルとサブディレクトリがそのディレクトリのグループを継承します。ただし、既存のファイルとディレクトリはグループ変更を適用しません。

この動作を明確にするための例を見てみましょう。

まず、2つのファイルを含むディレクトリを準備します。

$ ls -ld parent
drwxrwxrwx 2 root kent 4096 Feb  3 00:33 parent/

$ ls -l parent
total 2
-rwxr-xr-x 1 guest guest    0 Feb  3 00:30 existing_grp_guest1
-rwxr-xr-x 1 guest guest    0 Feb  3 00:30 existing_grp_guest2

parent は、ユーザーrootとグループkentによって所有されています。 2つのファイルが含まれており、グループguestが両方を所有しています。

次に、 chmod を使用して、parentsetgidビットを設定しましょう。

root# chmod g+s parent
root# ls -ld parent
drwxrwsrwx 2 root kent 4096 Feb  3 00:33 parent/

次に、parentの下にrootを使用して新しいファイルとサブディレクトリを作成します。

root# touch parent/new_file_by_root
root# mkdir parent/new_dir_by_root

次に、parentの下にあるすべてのファイルとサブディレクトリのグループ所有者を確認します。

root# ls -l parent
total 4
-rwxr-xr-x 1 guest guest    0 Feb  3 00:30 existing_grp_guest1
-rwxr-xr-x 1 guest guest    0 Feb  3 00:30 existing_grp_guest2
drwxr-sr-x 2 root  kent  4096 Feb  3 00:54 new_dir_by_root/
-rw-r--r-- 1 root  kent     0 Feb  3 00:54 new_file_by_root

上記の出力では、parentsetuidビットを設定した後、2つの既存のファイルが変更されていないことがわかります。

ただし、新しく作成されたファイルとサブディレクトリは、 root が作成した場合でも、rootではなくkentが所有します。 これは、parentsetgidビットが設定されており、その下に新しく作成されたファイルとディレクトリがparentのグループを継承したためです。

4. スティッキービット

4.1. スティッキービット

スティッキービットは、ディレクトリ内のファイルを保護することです。 ディレクトリにスティッキービットを設定した場合、このディレクトリの下にあるファイルは、次のいずれかによってのみ削除できます。

  • ファイルの所有者
  • ディレクトリの所有者
  • rootユーザー

つまり、この特別なアクセス許可は、ユーザーがパブリックディレクトリ内の他のユーザーのファイルを削除できないようにします。

典型的な実世界のスティッキービットの例は、 /tmpディレクトリです。

$ ls -ld /tmp
drwxrwxrwt 24 root root 980 Feb  3 21:41 /tmp/

「その他」の権限セクションの「w」により、すべてのユーザーが /tmpディレクトリの下にあるファイルを作成および削除できることがわかります。

ただし、上記の ls の出力を注意深く読むと、「other」セクションの実行許可ビットが通常の「x」ではなく小文字の「t」であることがわかります。

のこの小文字のe“ t”は、 /tmpディレクトリにスティッキービットが設定されていることを示します。 スティッキービットを使用すると、すべてのユーザーが /tmpの下にファイルを作成できます。ただし、ユーザーが削除できるのは自分が所有するファイルのみです。

4.2. ディレクトリのスティッキービット

ディレクトリにスティッキービットを設定するために、モード+tでchmodコマンドを使用できます。

chmod +t DIRECTORY

または、ディレクトリのモードの前に「1」を追加して、スティッキービットを設定することもできます。

chmod 1777 DIRECTORY

-t を使用して、ディレクトリからスティッキービットを削除することもできます。

chmod -t DIRECTORY

いつものように、スティッキービットがディレクトリの下のファイルを保護する方法と、ディレクトリのスティッキービットを設定および削除する方法を理解するための例を見てみましょう。

public というパブリックディレクトリの準備から始めて、すべてのユーザーがそれに書き込むことができるようにします。

$ ls -ld public              
drwxrwxrwx 2 root root 40 Feb  3 22:22 public/

次に、さまざまなユーザーがpublicの下にいくつかのファイルを作成します。

$ ls -l
-rw-r--r-- 1 guest guest 0 Feb  3 22:28 file1_by_guest
-rw-r--r-- 1 guest guest 0 Feb  3 22:28 file2_by_guest
-rw-r--r-- 1 kent  kent  0 Feb  3 22:28 file_by_kent

これまでのところ、スティッキービットはどこにも設定していません。 ユーザーkentguestが所有するファイルを削除できるかどうかを見てみましょう。

kent$ rm file1_by_guest 
rm: remove write-protected regular empty file 'file1_by_guest'? y

kent$ ls -l
-rw-r--r-- 1 guest guest 0 Feb  3 22:28 file2_by_guest
-rw-r--r-- 1 kent  kent  0 Feb  3 22:28 file_by_kent

したがって、スティッキービットがなくても、他のユーザーが所有するファイルを削除できます。

それでは、スティッキービットを設定して、変更があるかどうかを確認しましょう。

root# chmod +t public
root# ls -ld public 
drwxrwxrwt 2 root root 80 Feb  3 22:33 public/
root# su kent

kent$ rm file2_by_guest 
rm: remove write-protected regular empty file 'file2_by_guest'? y
rm: cannot remove 'file2_by_guest': Operation not permitted
kent$ ls -l 
-rw-r--r-- 1 guest guest 0 Feb 3 22:28 file2_by_guest
-rw-r--r-- 1 kent kent 0 Feb 3 22:28 file_by_kent

スティッキービットを設定した後、 publicの下のファイルはファイル所有者のみが削除できました。

5. 安全

setuid ビットは、さまざまなアプリケーションで非常に便利です。 ただし、セキュリティ上の懸念が生じる可能性があるため、これらの特別な権限を設定する場合は注意が必要です。

たとえば、一般的なユーザーは、UIDrootに設定するプログラムを実行することでスーパーユーザー権限を取得できます。

5.1. 特権の昇格

スーパーユーザー権限を取得するために、setuidビットの疑わしい使用法についてシステムを監視することをお勧めします。 rootおよびsetuid[で所有されているすべてのファイルを見つけることができます。 X197X]ビット検索コマンドを使用:

root# find / -user root -perm -4000 -exec ls -ldb {} \;
...
-rwsr-xr-x 1 root root 30744 Dec 12 22:11 /usr/lib/virtualbox/VBoxNetAdpCtl
-rwsr-xr-x 1 root root 161720 Dec 12 22:11 /usr/lib/virtualbox/VBoxNetDHCP
-rwsr-xr-x 1 root root 71728 Dec 15 21:06 /usr/bin/chage
-rwsr-xr-x 1 root root 145176 Jan  1 13:17 /usr/bin/sudo
-rwsr-sr-x 1 root root 38664 Nov 13 18:49 /usr/bin/unix_chkpwd
-rwsr-xr-x 1 root root 12360 Dec 15  2013 /usr/bin/sflock
...

5.2. setuidおよび解釈された実行可能ファイル

インタプリタ実行可能ファイルは通常、shebangによってインタプリタを宣言する実行可能ファイルです。 例としては、「#!/ bin / bash 」で始まるBashファイルや「#!/ usr / bin /envpython」で始まる実行可能Pythonソースファイルがあります。

Linuxは、セキュリティ上の理由から、解釈されたすべての実行可能ファイルのsetuidビットを無視します。 シェルスクリプトにsetuid権限を付与する場合は、 sudo コマンドを使用して、スクリプトファイルの所有者の特権を取得できます。

6. 結論

この記事では、Linuxの3つの特別なファイル許可フラグについて説明しました。 setuid ビット、 setgid ビット、およびスティッキービットです。

それらがどのように機能するかについて話し、chmodでそれらを管理する方法を学びました。

これらの3つの特別なフラグは、プライマリの読み取り、書き込み、および実行のアクセス許可ほど標準的ではありません。 ただし、ユーザーに付与されているものとは異なる特権を必要とするタスクなど、特定の問題に直面している場合は便利です。