この節では、ファイルのセキュリティを構成する機能について説明します。
各ファイルには、セキュリティのレベルを指定する 3 つのユーザークラスがあります。
ファイルやディレクトリの所有者 - 通常は、ファイルを作成したユーザーです。ファイルの所有者は、ファイルの読み取り権、書き込み権 (変更する権利)、または実行権 (コマンドの場合) を与えるユーザーを決定できます。
グループのメンバー
ファイルやグループの所有者以外のすべてのユーザー
ファイルのアクセス権を割り当てたり変更したりできるのは、スーパーユーザーかそのファイルの所有者だけです。
表 17-1 に、各ユーザークラスに与えることができるファイルのアクセス権を示します。
表 17-1 ファイルのアクセス権
記号 |
アクセス権 |
指定されたユーザーが実行できる操作 |
---|---|---|
r |
読み取り |
ファイルを開いて内容を読み取る |
w |
書き込み |
ファイルに書き込んだり (その内容を変更したり)、追加したり、削除したりできる |
x |
実行 |
ファイルを実行できる (プログラムまたはシェルスクリプトの場合)、あるいは exec(1) システムコールの 1 つを使用してファイルを実行できる |
- |
拒否 |
ファイルを読み取ったり、書き込んだり、実行したりできない |
これらのファイルアクセス権は、通常のファイルと同様にデバイス、ソケット、名前付きパイプ (FIFO) などの特殊ファイルにも適用できます。
シンボリックリンクには、そのリンクが指すファイルのアクセス権が適用されます。
表 17-2 に、各ユーザークラスに与えることができるディレクトリのアクセス権を示します。
表 17-2 ディレクトリのアクセス権
記号 |
アクセス権 |
指定されたユーザーが実行できる操作 |
---|---|---|
r |
読み取り |
ディレクトリ内のファイルを表示できる |
w |
書き込み |
ディレクトリ内のファイルやリンクを追加または削除できる |
x |
実行 |
ディレクトリ内のファイルを開いたり実行したりできる。また、ディレクトリを作成し、その下にサブディレクトリを作成できる |
ディレクトリへアクセスできないようにすると、そのディレクトリ (およびすべてのサブディレクトリ) 内のファイルを保護できます。ただし、スーパーユーザーはシステム上のすべてのファイルとディレクトリにアクセスできます。
実行可能ファイルと公共ディレクトリには、3 種類の特殊なアクセス権を設定できます。これらのアクセス権を設定すると、その実行可能ファイルを実行するユーザーは、そのファイルの所有者 (またはグループ) のユーザー ID を持つことができます。
特殊なアクセス権はセキュリティ上の問題を引き起こすため、特殊なアクセス権を設定するときは十分な注意が必要です。たとえば、ユーザーはユーザー ID が root に設定されているプログラムを実行することにより、スーパーユーザーのアクセス権を取得できます。また、すべてのユーザーは、所有するファイルに対して特殊なアクセス権を設定できるので、これもセキュリティ上の問題の原因となります。
setuid や setgid アクセス権を使用して、不正にスーパーユーザー権限が取得されていないかどうか絶えずシステムを監視しなければなりません。これらのアクセス権を使用しているすべてのプログラムを、ファイルシステム内で検索し、そのリストを出力する方法については、「setuid アクセス権が設定されているファイルを検索する方法」を参照してください。この種のプログラムの所有権を root や bin 以外のユーザーに与えているものが出力中にあれば、そのプログラムはセキュリティに違反している可能性があります。
set-user 識別 (setuid) アクセス権を実行可能ファイルに設定すると、このファイルを実行するプロセスには、その実行可能ファイルを実行しているユーザーではなく、ファイルの所有者 (通常は root) に基づいてアクセス権が与えられます。このため、通常は所有者しか利用できないファイルやディレクトリにユーザーがアクセスできます。たとえば次に示すように、passwd コマンドは root の setuid アクセス権が設定されているので、ユーザーは root の権限でパスワードを変更できます。
-r-sr-sr-x 3 root sys 104580 Sep 16 12:02 /usr/bin/passwd |
これは、プロセスの実行が終了した後でも、高度な知識のあるユーザーは setuid プロセスによって与えられたアクセス権を維持する手段を見つけることができるため、セキュリティ上危険であることを示しています。
プログラムから予約済み UID (0 - 99) で setuid アクセス権を使用しても、実効 UID は正しく設定されない場合があります。シェルスクリプトを代わりに使用するか、setuid アクセス権では予約済み UID を使用しないようにしてください。
set-group 識別 (setgid) アクセス権は setuid に似ていますが、プロセスの実効グループ ID (GID) はファイルのグループ所有者に変更され、ユーザーにはそのグループに与えられたアクセス権に基づくアクセス権が与えられます。/usr/bin/mail プログラムには setgid アクセス権が設定されています。
-r-x--s--x 1 root mail 63628 Sep 16 12:01 /usr/bin/mail |
setgid アクセス権がディレクトリに適用されると、このディレクトリ内で作成されたファイルは、生成するプロセスが所属するグループではなく、ディレクトリが所属するグループに含まれることになります。ディレクトリ内で書き込み権と実行権を持つユーザーは、そこでファイルを作成できます。ただし、そのファイルは、そのユーザーのグループではなく、ディレクトリを所有するグループに所属することになります。
管理者は、setuid アクセス権や setgid アクセス権の認証されていない使用によってスーパーユーザー特権が獲得されないようにシステムを監視しなければなりません。ファイルシステムを検索して、このようなアクセス権を使用しているすべてのプログラムのリストを出力する方法については、「setuid アクセス権が設定されているファイルを検索する方法」を参照してください。このようなプログラムの所有権が、root や bin ではなく、一般ユーザーになっているものが疑わしいと考えられます。これらのアクセス権を設定できるのは、スーパーユーザーだけです。
「スティッキビット」は、ディレクトリ内のファイルを保護するアクセス権ビットです。ディレクトリにスティッキビットが設定されている場合、そのファイルを削除できるのはその所有者、ディレクトリの所有者、または root だけです。これにより、ユーザーは /tmp などの公共ディレクトリから他のユーザーのファイルを削除できなくなります。
drwxrwxrwt 7 root sys 400 Sep 3 13:37 tmp |
TMPFS ファイルシステム上で公共ディレクトリを設定するときには、スティッキビットを手作業で設定してください。
ファイルやディレクトリを作成するときには、デフォルトのアクセス権が設定されます。これらのデフォルトのアクセス権は、システムファイル /etc/profile、.cshrc、または .login ファイル内の umask(1) の値によって決定されます。デフォルトでは、システムはテキストファイルのアクセス権を 666 に設定してユーザー、グループ、その他に読み取り権と書き込み権を与え、ディレクトリまたは実行可能ファイルに対しては 777 に設定します。
umask によって割り当てられる値は、デフォルトから差し引かれます。これには、chmod がアクセス権を与えるのと同じ方法で拒否する効果があります。たとえば、コマンド chmod 022 はグループとその他に書き込み権を与えますが、umask 022 はグループとその他の書き込み権を拒否します。
表 17-3 に、典型的な umask の設定とその設定が実行可能ファイルに与える影響を示します。
表 17-3 各種セキュリティレベルの umask 設定
セキュリティレベル |
umask |
使用できないユーザー |
---|---|---|
緩やか (744) |
022 |
グループとその他による w |
中程度 (740) |
027 |
グループによる w、その他による rwx |
中程度 (741) |
026 |
グループによる w、その他による rw |
厳しい (700) |
077 |
グループとその他による rwx |