Solaris のシステム管理 (セキュリティサービス)

第 16 章 ファイルのセキュリティの適用 (手順)

この章では、Solaris 環境のファイルのセキュリティを設定する手順について説明します。

この章で説明する手順は次のとおりです。

ファイルのセキュリティに関する機能

この節では、ファイルのセキュリティを構成する機能について説明します。

ユーザークラス

各ファイルには、セキュリティのレベルを指定する 3 つのユーザークラスがあります。

ファイルのアクセス権を割り当てたり変更したりできるのは、そのファイルの所有者かスーパーユーザーだけです。

ファイルのアクセス権

次の表に、各ユーザークラスに与えることができるファイルのアクセス権を示します。

表 16–1 ファイルのアクセス権

記号 

アクセス権 

説明 

r

読み取り 

ファイルの内容を開いて読み込むことができる 

w

書き込み 

ファイルに対して書き込み (内容の変更)、追加、または削除を行うことができる 

x

実行 

ファイル (プログラムまたはシェルスクリプトの場合) を実行できる。または、exec(2) システムコールのいずれかを使用してプログラムを実行できる

-

拒否 

ファイルの読み込み、書き込み、または実行を行うことができない 

これらのファイルアクセス権は、通常のファイルと同様にデバイス、ソケット、名前付きパイプ (FIFO) などの特殊ファイルにも適用できます。

シンボリックリンクには、そのリンクが指すファイルのアクセス権が適用されます。

ディレクトリのアクセス権

次の表に、各ユーザークラスに与えることができるディレクトリのアクセス権を示します。

表 16–2 ディレクトリのアクセス権

記号 

アクセス権 

説明 

r

読み取り 

ディレクトリ内のファイルを一覧表示できる 

w

書き込み 

ディレクトリに対してファイルまたはリンクの追加または削除を行うことができる 

x

実行 

ディレクトリ内のファイルを開いたり、実行したりできる。また、ディレクトリを作成し、その下にサブディレクトリを作成できる 

ディレクトリとそのサブディレクトリ内のファイルを保護するには、ファイルのアクセス権を制限して、そのディレクトリに対するアクセスを拒否します。ただし、スーパーユーザーはシステム上のすべてのファイルとディレクトリにアクセスできます。

特殊なファイルアクセス権 (setuidsetgid、スティッキビット)

実行可能ファイルと公共ディレクトリには、3 種類の特殊なアクセス権を設定できます。これらのアクセス権を設定すると、その実行可能ファイルを実行するユーザーは、そのファイルの所有者 (またはグループ) のユーザー ID を持つことができます。

特殊なアクセス権はセキュリティ上の問題を引き起こすため、設定するときは十分な注意が必要です。たとえば、スーパーユーザー権限を取得するには、ユーザー ID (UID) を root に設定してプログラムを実行します。また、すべてのユーザーは、所有するファイルに対して特殊なアクセス権を設定できるため、これもセキュリティ上の問題の原因となります。

setuidsetgid アクセス権を使用して、不正にスーパーユーザー権限が取得されていないかどうかシステムを監視する必要があります。これらのアクセス権を使用しているファイルをすべて検索して表示する方法については、setuid アクセス権が設定されているファイルを検索する方法 を参照してください。このようなプログラムの所有権が、rootbin ではなく、一般ユーザーになっているものが疑わしいと考えられます。

setuid アクセス権

ユーザー ID 設定 (setuid) のアクセス権を実行可能ファイルに設定すると、このファイルを実行するプロセスには、その実行可能ファイルを実行しているユーザーではなく、ファイルの所有者 (通常は root) に基づいてアクセス権が与えられます。この特殊なアクセス権を使用すると、通常は所有者しか利用できないファイルやディレクトリにアクセスできます。たとえば次に示すように、passwd コマンドは rootsetuid アクセス権が設定されているので、ユーザーは root ID の権限でパスワードを変更できます。


-r-sr-sr-x   3 root     sys       104580 Sep 16 12:02 /usr/bin/passwd

この特殊なアクセス権は、プロセスの実行が終了したあとでも、高度な知識のあるユーザーは setuid プロセスによって与えられたアクセス権を維持する手段を見つけることができるため、セキュリティ上の危険が存在します。


注 –

プログラムから予約済み UID (0 – 99) で setuid アクセス権を使用しても、実効 UID は正しく設定されない場合があります。シェルスクリプトを代わりに使用するか、setuid アクセス権では予約済み UID を使用しないようにしてください。


setgid アクセス権

グループ ID 設定 (setgid) のアクセス権は setuid に似ていますが、プロセスの実効グループ ID (GID) はファイルのグループ所有者に変更され、ユーザーにはそのグループに与えられたアクセス権に基づくアクセス権が与えられます。/usr/bin/mail コマンドには次のように setgid アクセス権が設定されています。


-r-x--s--x   1 root     mail       63628 Sep 16 12:01 /usr/bin/mail

setgid アクセス権がディレクトリに適用されると、このディレクトリ内で作成されたファイルは、生成するプロセスが所属するグループではなく、ディレクトリが所属するグループに含まれることになります。ディレクトリに対する書き込み権および実行権を持つユーザーは、そのディレクトリにファイルを作成できます。ただし、作成したファイルの所有権は、ユーザーのグループではなく、ディレクトリを所有するグループに割り当てられます。

setuidsetgid アクセス権を使用して、不正にスーパーユーザー権限が取得されていないかどうかシステムを監視する必要があります。これらのアクセス権を使用しているファイルをすべて検索して表示する方法については、setuid アクセス権が設定されているファイルを検索する方法 を参照してください。このようなプログラムのグループ所有権が、rootbin ではなく、一般ユーザーになっているものが疑わしいと考えられます。

スティッキビット

「スティッキビット」は、ディレクトリ内のファイルを保護するアクセス権ビットです。ディレクトリにスティッキビットが設定されている場合、そのファイルを削除できるのはその所有者、ディレクトリの所有者、またはスーパーユーザーだけです。この特殊なアクセス権により、ユーザーは /tmp などの公共ディレクトリから他のユーザーのファイルを削除できなくなります。


drwxrwxrwt 7  root  sys   400 Sep  3 13:37 tmp

TMPFS ファイルシステム上で公共ディレクトリを設定するときには、スティッキビットを手動で設定してください。

デフォルトの umask 設定

ファイルやディレクトリを作成するときには、デフォルトのアクセス権が設定されます。デフォルトのアクセス権は、/etc/profile ファイル、またはユーザーの .cshrc .login ファイル内の umask 設定によって決定されます。デフォルトでは、システムはテキストファイルのアクセス権を 666 に設定してユーザー、グループ、その他のユーザーに読み取り権と書き込み権を与え、ディレクトリまたは実行可能ファイルに対しては 777 を設定します。

umask コマンドによって割り当てられる値は、デフォルトから差し引かれます。この処理には、chmod コマンドでアクセス権を与えるのと同じ方法でアクセス権を拒否する効果があります。たとえば、chmod 022 コマンドはグループとその他のユーザーに書き込み権を与えますが、umask 022 コマンドはグループとその他のユーザーの書き込み権を拒否します。

次の表に、典型的な umask の設定とその設定が実行可能ファイルに与える影響を示します。

表 16–3 各セキュリティレベルの umask 設定

セキュリティレベル 

umask 設定

許可されないアクセス権 

緩やか (744)

022

グループとその他のユーザーによる w

中程度 (740)

027

グループによる w、その他のユーザーによる rwx

中程度 (741)

026

グループによる w、その他のユーザーによる rw

厳しい (700)

077

グループとその他のユーザーによる rwx

umask 値の設定の詳細については、umask(1) のマニュアルページを参照してください。

ファイル情報の表示

この節では、ファイルの情報を表示する方法について説明します。

ファイル情報を表示する方法

ls コマンドを使用して、ディレクトリ内のすべてのファイルに関する情報を表示します。


$ ls -la

-l

ユーザーとグループの所有権およびファイルのアクセス権などを長形式で表示する 

-a

ドット (.) で始まる隠しファイルを含め、すべてのファイルを表示する 

ファイルに関する次の情報が各行に表示されます。

例 — ファイル情報を表示する

次の例では、/sbin ディレクトリ内のファイルを部分的に表示しています。


$ cd /sbin
$ ls -la
total 13456
drwxr-xr-x   2 root     sys          512 Sep  1 14:11 .
drwxr-xr-x  29 root     root        1024 Sep  1 15:40 ..
-r-xr-xr-x   1 root     bin       218188 Aug 18 15:17 autopush
lrwxrwxrwx   1 root     root          21 Sep  1 14:11 bpgetfile -> ...
-r-xr-xr-x   1 root     bin       505556 Aug 20 13:24 dhcpagent
-r-xr-xr-x   1 root     bin       456064 Aug 20 13:25 dhcpinfo
-r-xr-xr-x   1 root     bin       272360 Aug 18 15:19 fdisk
-r-xr-xr-x   1 root     bin       824728 Aug 20 13:29 hostconfig
-r-xr-xr-x   1 root     bin       603528 Aug 20 13:21 ifconfig
-r-xr-xr-x   1 root     sys       556008 Aug 20 13:21 init
-r-xr-xr-x   2 root     root      274020 Aug 18 15:28 jsh
-r-xr-xr-x   1 root     bin       238736 Aug 21 19:46 mount
-r-xr-xr-x   1 root     sys         7696 Aug 18 15:20 mountall
   .
   .
   .

ファイルの所有権の変更

この節では、ファイルの所有権とグループ所有権の変更方法について説明します。

デフォルトでは、所有者は chown コマンドを使用して、ファイルやディレクトリの所有者を変更できません。ただし、次の行をシステムの /etc/system ファイルに追加して、システムをリブートすると、所有者は chown コマンドを使用できるようになります。


set rstchown = 0

詳細は、chown(1) のマニュアルページを参照してください。

またデフォルトでは、所有者は chgrp コマンドを使用しても、ファイルのグループをその所有者が属するグループ以外には変更できません。たとえば、ファイルの所有者が staffsysadm グループだけに属する場合、所有者は、ファイルのグループを staff または sysadm グループ以外には変更できません。

ただし、次の行をシステムの /etc/system ファイルに追加して、システムをリブートすると、所有者は、ファイルのグループを、所有者が属していないグループにも変更できるようになります。


set rstchown = 0

詳細は、chgrp(1) のマニュアルページを参照してください。

また、NFS マウントされているファイルシステム上で所有権およびグループを変更するときは、他にも制約があることに注意してください。

ファイルの所有者を変更する方法

次の手順でファイルの所有権を変更します。

  1. スーパーユーザーになるか、同等の役割を引き受けます。

  2. chown コマンドを使用してファイルの所有者を変更します。


    # chown new-owner  filename
    

    new-owner

    ファイルまたはディレクトリの新しい所有者のユーザー名または UID を指定する 

    filename

    ファイルまたはディレクトリを指定する 

  3. ファイルの所有者が変更されていることを確認します。


    # ls -l filename
    

例 — ファイルの所有者を変更する

次の例では、myfile の所有権をユーザー rimmer に変更します。


# chown rimmer myfile
# ls -l myfile
-rw-r--r--   1 rimmer   scifi   112640 May 24 10:49 myfile

ファイルのグループ所有権を変更する方法

次の手順を使用して、ファイルのグループ所有権を変更します。

  1. スーパーユーザーになるか、同等の役割を引き受けます。

  2. chgrp コマンドを使用して、ファイルのグループ所有者を変更します。


    # chgrp group filename
    

    group

    ファイルまたはディレクトリの新しいグループ名または GID を指定する 

    filename

    ファイルまたはディレクトリを指定する 

    グループの設定については、『Solaris のシステム管理 (基本編)』の「ユーザーアカウントとグループの管理 (概要)」を参照してください。

  3. ファイルの所有者が変更されていることを確認します。


    # ls -l filename
    

例 — ファイルのグループ所有権を変更する

次の例では、myself の所有権をグループ scifi に変更します。


# chgrp scifi myfile
# ls -l myfile
-rwxrw-- 1 rimmer scifi 12985 Nov 12 16:28 myfile

ファイルのアクセス権の変更

chmod コマンドを使用すると、ファイルのアクセス権を変更できます。ファイルまたはディレクトリの所有者、あるいはスーパーユーザーだけがそのアクセス権を変更できます。

chmod コマンドを使用して、次のどちらかのモードでアクセス権を設定できます。

次の表に、絶対モードでファイルのアクセス権を設定するための 8 進数値を示します。これらの数字を 3 つ組み合せて、所有者、グループ、その他のユーザーのファイルアクセス権をこの順に設定します。たとえば、値 644 は、所有者に対して読み取り権と書き込み権を設定し、グループとその他のユーザーに対しては読み取り権だけを設定します。

表 16–5 絶対モードによるファイルのアクセス権の設定

8 進数値 

ファイルのアクセス権 

設定されるアクセス権 

0

---

なし 

1

--x

実行権のみ 

2

-w-

書き込み権のみ 

3

-wx

書き込み権と実行権 

4

r--

読み取り権のみ 

5

r-x

読み取り権と実行権 

6

rw-

読み取り権と書き込み権 

7

rwx

読み取り権、書き込み権、実行権 

ファイルには、絶対モードまたは記号モードで特殊なアクセス権を設定できます。ただし、絶対モードを使用してディレクトリのsetuid アクセス権を設定または削除することはできません。この場合、記号モードを使用してください。絶対モードでは、3 つ 1 組のアクセス権の左端に新しい 8 進数値を追加して、特殊なアクセス権を設定します。次の表に、ファイルに特殊なアクセス権を設定する 8 進数値を示します。

表 16–6 絶対モードによる特殊なアクセス権の設定

8 進数値 

特殊なアクセス権の設定 

1

スティッキビット 

2

setguid

4

setuid

次の表に、記号モードでファイルのアクセス権を設定するための記号を示します。記号では、アクセス権を設定または変更できる対象ユーザー、実行される操作、あるいは割り当てるまたは変更するアクセス権を指定できます。

表 16–7 記号モードによるファイルのアクセス権の設定

記号 

機能 

説明 

u

対象ユーザー 

ユーザー (所有者) 

g

対象ユーザー 

グループ 

o

対象ユーザー 

その他のユーザー 

a

対象ユーザー 

すべてのユーザー 

=

操作 

割り当て 

+

操作 

追加 

-

操作 

削除 

r

アクセス権 

読み取り 

w

アクセス権 

書き込み 

x

アクセス権 

実行 

l

アクセス権 

強制ロック、setgid ビットはオン、グループ実行ビットはオフ

s

アクセス権 

setuid または setgid ビットはオン

S

アクセス権 

suid ビットはオン、ユーザー実行ビットはオフ

t

アクセス権 

スティッキビットはオン、その他の実行ビットはオン 

T

アクセス権 

スティッキビットはオン、その他の実行ビットはオフ 

機能列に <対象ユーザー> <操作> <アクセス権> の順で、ファイルまたはディレクトリのアクセス権を変更する記号を指定します。

<対象ユーザー> 

アクセス権を変更する対象となるユーザーを指定する 

<操作> 

実行する操作を指定する 

<アクセス権> 

変更するアクセス権を指定する 

アクセス権を絶対モードで変更する方法

次の手順を使用して、アクセス権を絶対モードで変更します。

  1. ファイルまたはディレクトリの所有者でない場合は、スーパーユーザーになるか、同等の役割を引き受けます。

    現在の所有者またはスーパーユーザーだけが、chmod コマンドを使用してファイルまたはディレクトリのアクセス権を変更できます。

  2. chmod コマンドを使用してアクセス権を絶対モードで変更します。


    $ chmod nnn filename
    

    nnn

    所有者、グループ、その他のユーザーのアクセス権をこの順序で表す 8 進数値を指定する。有効な 8 進数値については、表 16–5 を参照

    filename

    ファイルまたはディレクトリを指定する 


    注 –

    chmod コマンドを使用して ACL エントリを持つファイルのグループアクセス権を変更する場合、グループアクセス権と ACL マスクの両方が新しいアクセス権に変更されます。新しい ACL マスクのアクセス権は、そのファイル上に ACL エントリを持つ追加ユーザーおよびグループのアクセス権を変更する場合があるので注意が必要です。getfacl コマンドを使用して、すべての ACL エントリに適切なアクセス権が設定されていることを確認してください。詳細については、getfacl(1) のマニュアルページを参照してください。


  3. ファイルのアクセス権が変更されていることを確認します。


    # ls -l filename
    

例 — アクセス権を絶対モードで変更する

次の例では、公共ディレクトリのアクセス権が、744 (読み取り/書き込み/実行; 読み取り専用 ; 読み取り専用) から 755 (読み取り/書き込み/実行; 読み取り/実行; 読み取り/実行) に変更されます。


$ ls -ld public_dir
drwxr--r--  1 ignatz   staff    6023 Aug  5 12:06 public_dir
$ chmod 755 public_dir
$ ls -ld public_dir
drwxr-xr-x  1 ignatz   staff    6023 Aug  5 12:06 public_dir

次の例では、実行可能シェルスクリプトのアクセス権が、読み取り/書き込みから、読み取り/書き込み/実行に変更されます。


$ ls -l my_script
-rw------- 1 ignatz   staff    6023 Aug  5 12:06 my_script
$ chmod 700 my_script
$ ls -l my_script
-rwx------ 1 ignatz   staff    6023 Aug  5 12:06 my_script

特殊なアクセス権を絶対モードで変更する方法

次の手順を使用して、特殊なアクセス権を絶対モードで変更します。

  1. ファイルまたはディレクトリの所有者でない場合は、スーパーユーザーになるか、同等の役割を引き受けます。

    現在の所有者またはスーパーユーザーだけが、chmod コマンドを使用してファイルまたはディレクトリの所有者を変更できます。

  2. chmod コマンドを使用して特殊アクセス権を絶対モードで変更します。


    $ chmod nnnn filename
    

    nnnn

    ファイルまたはディレクトリのアクセス権を変更する 8 進数値を指定する。一番左端の 8 進数値で、ファイルに特殊なアクセス権を設定する。特殊なアクセス権に有効な 8 進数値のリストについては、表 16–6 を参照

    filename

    ファイルまたはディレクトリを指定する 


    注 –

    chmod コマンドを使用して ACL エントリを持つファイルのグループアクセス権を変更する場合、グループアクセス権と ACL マスクの両方が新しいアクセス権に変更されます。新しい ACL マスクのアクセス権は、そのファイル上に ACL エントリを持つ追加ユーザーおよびグループのアクセス権を変更する場合があるので注意が必要です。getfacl コマンドを使用して、すべての ACL エントリに適切なアクセス権が設定されていることを確認してください。詳細については、getfacl(1) のマニュアルページを参照してください。


  3. ファイルのアクセス権が変更されていることを確認します。


    # ls -l filename
    

例 — 特殊なアクセス権を絶対モードで設定する

次の例は、dbprog ファイルに setuid のアクセス権を設定します。


$ chmod 4555 dbprog
$ ls -l dbprog
-r-sr-xr-x   1 db     staff        12095 May  6 09:29 dbprog

次の例では、dbprog2 ファイルに setgid のアクセス権を設定します。


$ chmod 2551 dbprog2
$ ls -l dbprog2
-r-xr-s--x   1 db     staff       24576 May  6 09:30 dbprog2

次の例では、public_dir ディレクトリにスティッキビットのアクセス権を設定します。


$ chmod 1777 public_dir
$ ls -ld public_dir
drwxrwxrwt   2 ignatz   staff          512 May 15 15:27 public_dir

アクセス権を記号モードで変更する方法

次の手順を使用して、アクセス権を記号モードで変更します。

  1. ファイルまたはディレクトリの所有者でない場合は、スーパーユーザーになります。

    現在の所有者またはスーパーユーザーだけが、chmod コマンドを使用してファイルまたはディレクトリの所有者を変更できます。

  2. chmod コマンドを使用してアクセス権を記号モードで変更します。


    $ chmod who operator permission filename
    

    who operator permission

    who では、アクセス権を変更するユーザーを指定し、operator では実行する操作を指定し、permission では変更後のアクセス権を指定する。有効な記号の一覧については 表 16–7 を参照

    filename

    ファイルまたはディレクトリを指定する 

  3. ファイルのアクセス権が変更されていることを確認します。


    # ls -l filename
    

例 — アクセス権を記号モードで変更する

次の例では、その他のユーザーから読み取り権を削除します。


$ chmod o-r filea

次の例では、ユーザー、グループ、およびその他のユーザーに、読み取り権と実行権を追加します。


$ chmod a+rx fileb

次の例では、グループに読み取り権、書き込み権、および実行権を割り当てます。


$ chmod g=rwx filec

特殊なアクセス権の検索

プログラムの setuidsetgid アクセス権を使用して、不正にスーパーユーザー権限が取得されていないかどうかシステムを監視する必要があります。このようなプログラムの所有権が、rootbin ではなく、一般ユーザーになっているものが疑わしいと考えられます。

setuid アクセス権が設定されているファイルを検索する方法

次の手順を使用して、setuid アクセス権が設定されているファイルを検索します。

  1. スーパーユーザーになるか、同等の役割を引き受けます。

  2. find コマンドを使用して setuid アクセス権が設定されているファイルを検索します。


    # find directory -user root -perm -4000 -exec ls -ldb {} \;>/tmp/filename
    

    find directory

    指定したディレクトリから始めて、マウントされているすべてのパスを検査する。ディレクトリとしてルート (/)、sysbin、または mail を指定できる

    -user root

    root が所有するファイルを表示する

    -perm -4000

    アクセス権が 4000 に設定されているファイルだけを表示する 

    -exec ls -ldb

    find コマンドの出力を ls -ldb 形式で表示する

    >/tmp/filename

    結果がこのファイルに書き込まれる 

  3. 結果を /tmp/filename に出力する。


    # more /tmp/filename
    

    setuid アクセス権の詳細については、setuid アクセス権を参照してください。

例 — setuid アクセス権が設定されているファイルを検索する


# find / -user root -perm -4000 -exec ls -ldb {} \;> /tmp/ckprm
# cat /tmp/ckprm
-r-sr-xr-x 1 root bin 38836 Aug 10 16:16 /usr/bin/at
-r-sr-xr-x 1 root bin 19812 Aug 10 16:16 /usr/bin/crontab
---s--x--x 1 root sys 46040 Aug 10 15:18 /usr/bin/ct
-r-sr-xr-x 1 root sys 12092 Aug 11 01:29 /usr/lib/mv_dir
-r-sr-sr-x 1 root bin 33208 Aug 10 15:55 /usr/lib/lpadmin
-r-sr-sr-x 1 root bin 38696 Aug 10 15:55 /usr/lib/lpsched
---s--x--- 1 root rar 45376 Aug 18 15:11 /usr/rar/bin/sh
-r-sr-xr-x 1 root bin 12524 Aug 11 01:27 /usr/bin/df
-rwsr-xr-x 1 root sys 21780 Aug 11 01:27 /usr/bin/newgrp
-r-sr-sr-x 1 root sys 23000 Aug 11 01:27 /usr/bin/passwd
-r-sr-xr-x 1 root sys 23824 Aug 11 01:27 /usr/bin/su

この出力は、rar というユーザーが /usr/bin/sh のコピーを作成し、そのアクセス権を root への setuid に設定したことを示しています。この結果、rar/usr/rar/bin/sh を実行して特権付きユーザーになることができます。この出力を参考のために保存したい場合は、ファイルを /tmp ディレクトリ以外のファイルへ移動してください。

実行可能スタックとセキュリティ

セキュリティのバグの多くは、デフォルトで読み取り権、書き込み権、および実行権が設定された実行可能スタックで発生します。実行可能スタックには実行権が割り当てられていますが、ほとんどのプログラムは実行可能スタックがなくても正しく機能します。

Solaris 2.6 から、noexec_user_stack 変数が利用できるようになりました。この変数によって、スタックを実行可能として割り当てるかどうかを指定できます。デフォルトでは、この変数は 0 に設定されるため (64 ビットアプリケーションを除く)、プログラムは ABI に準拠して動作します。この変数が 0 以外に設定された場合、システムはシステム中のすべてのプロセスのスタックに読み取り権と書き込み権のマークを付けますが、実行権のマークは付けません。

この変数が設定されている場合、プログラムがスタック上でコードを実行しようとすると SIGSEGV シグナルが送信されます。通常、このシグナルが送信されると、プログラムはコアダンプして終了します。このようなプログラムは、違反しているプログラム名、プロセス ID、およびプログラムを実行した実ユーザー ID を含む警告メッセージも生成します。次に例を示します。


a.out[347] attempt to execute code on stack by uid 555 

メッセージは、syslog kern 機能が notice レベルに設定されているときに、syslog デーモンによってログに記録されます。このログへの記録は、デフォルトで syslog.conf ファイルに設定されていて、メッセージがコンソールと /var/adm/messages ファイルの両方に送信されることを意味します。詳細は、syslogd(1M)syslog.conf(4) のマニュアルページを参照してください。

このメッセージは、潜在的なセキュリティの問題を調べるときに役立ちます。また、この変数を設定することによって、正しく動作しなくなった、実行可能スタックに依存する有効なプログラムを確認するのにも役立ちます。メッセージを記録したくない場合、システム管理者は、/etc/system ファイルで noexec_user_stack_log 変数を 0 に設定して無効にします。この場合でも実行プログラムは、SIGSEGV シグナルによってコアダンプします。

プログラムのスタックが実行可能であると明示的にマークを付ける場合は、mprotect を使用します。詳細は、mprotect(2) のマニュアルページを参照してください。

ハードウェアの制限のため、実行可能スタックの問題を捕捉して報告する機能は、sun4m と sun4u プラットフォームでしか利用できません。

プログラムが実行可能スタックを使用できないようにする方法

  1. スーパーユーザーになるか、同等の役割を引き受けます。

  2. /etc/system ファイルを編集して、次の行を追加します。


    set noexec_user_stack=1
  3. リブートします。


    # init 6
    

実行可能スタックのメッセージ記録を無効にする方法

  1. スーパーユーザーになるか、同等の役割を引き受けます。

  2. /etc/system ファイルを編集して、次の行を追加します。


    set noexec_user_stack_log=0
  3. リブートします。


    # init 6
    

アクセス制御リスト (ACL) の使用

従来の UNIX ファイル保護機能は、所有者、グループ、その他のユーザーという 3 つのユーザークラスに読み取り権、書き込み権、実行権を提供します。 ACL を使用すると、所有者、所有者のグループ、その他のユーザー、特定のユーザーおよびグループのファイルアクセス権を定義でき、これらのカテゴリごとにデフォルトのアクセス権を定義できるため、ファイルのセキュリティを強化できます。

たとえば、グループ内のすべてのユーザーがファイルを読み取れるようにしたい場合は、単にそのファイルにグループの読み取り権を設定します。その場合に、そのグループ内の 1 人のユーザーだけに書き込み権を与えたいとします。標準の UNIX ではファイルセキュリティをこのように設定することはできませんが、ACL では可能です。

ACL エントリはファイルの ACL を定義する手段であり、setfacl コマンドにより設定します。ACL エントリは、次のようにコロンで区切ったフィールドで構成されます。


entry-type:[uid|gid]:perms

entry-type

ファイルのアクセス権を設定する ACL エントリの種類。たとえば、entry-typeuser (ファイルの所有者) または mask (ACL マスク) に設定できる。ACL エントリの一覧については、表 16–8表 16–9 を参照

uid

ユーザー名またはユーザー ID (UID)  

gid

グループ名またはグループ ID (GID)  

perms

entry-type に設定するアクセス権を表す。perms は、記号文字 rwx または番号 (chmod コマンドに使用するのと同じアクセス権番号) で指定できる

次の例に、ユーザー nathan の読み取り権および書き込み権を設定する ACL エントリを示します。


user:nathan:rw-

注意 – 注意 –

ACL などの UFS ファイルシステム属性は UFS ファイルシステムだけでサポートされます。そのため、/tmp ディレクトリ (通常は、TMPFS ファイルシステムとしてマウントされている) で ACL エントリを持つファイルを復元またはコピーすると、その ACL エントリは失われます。UFS ファイルを一時的に格納するには、/var/tmp ディレクトリを使用してください。


ファイルの ACL エントリ

次の表は、ファイルに ACL を設定するときに使用する有効な ACL エントリの一覧です。最初の 3 つの ACL エントリは、基本的な UNIX のファイル保護機能を提供します。

表 16–8 ファイルの ACL エントリ

ACL エントリ 

説明 

u[ser]::perms

所有者のアクセス権 

g[roup]::perms

グループのアクセス権 

o[ther]:perms

所有者やグループのメンバー以外のユーザーのアクセス権 

m[ask]:perms

ACL マスク。マスクエントリは、ユーザー (所有者以外) とグループに許可される最大アクセス権を示す。マスクは、すべてのユーザーとグループのアクセス権を即時に変更する手段である。 

たとえば、mask:r-- マスクエントリは、ユーザーとグループが書き込み権および実行権を持っていても、読み取り権しか使用できないことを示す

u[ser]:uid:perms

特定のユーザーのアクセス権。uid には、ユーザー名または UID の数値を指定できる

g[roup]:gid:perms

特定のグループのアクセス権。gid には、グループ名または GID の数値を指定できる

ディレクトリの ACL エントリ

表 16–8 に示した ACL エントリの他に、ディレクトリにはデフォルトの ACL エントリも設定できます。デフォルトの ACL エントリを持つディレクトリ内で作成されたファイルまたはディレクトリは、デフォルトの ACL エントリと同じ ACL エントリを持つことになります。表 16–9 は、ディレクトリに使用するデフォルトの ACL エントリの一覧です。

ディレクトリ上の特定のユーザーおよびグループに対してデフォルトの ACL エントリを初めて設定するときは、所有者、グループ、その他のユーザー、および ACL マスクにもデフォルトの ACL エントリを設定する必要があります。これらのエントリは、必ず設定しなければなりません。具体的には、次の表のデフォルト ACL エントリのうち、最初の 4 つを設定する必要があります。

表 16–9 ディレクトリのデフォルト ACL エントリ

デフォルトの ACL エントリ 

説明 

d[efault]:u[ser]::perms

所有者のデフォルトアクセス権 

d[efault]:g[roup]::perms

グループのデフォルトアクセス権 

d[efault]:o[ther]:perms

所有者やグループのメンバー以外のユーザーのデフォルトアクセス権 

d[efault]:m[ask]:perms

デフォルトの ACL マスク 

d[efault]:u[ser]:uid:perms

特定のユーザーのデフォルトアクセス権。uid には、ユーザー名または UID の数値を指定できる

d[efault]:g[roup]:gid:perms

特定のグループのデフォルトアクセス権。gid には、グループ名または GID の数値を指定できる

ファイルの ACL を設定する方法

  1. setfacl コマンドを使用してファイルの ACL エントリを設定します。


    $ setfacl -s user::perms,group::perms,other:perms,mask:perms,acl-entry-list filename ...
    

    -s

    ファイルに対して ACL を設定する。すでに ACL が設定されている場合、新しい ACL に置き換える。このオプションには、少なくとも所有者、グループ、およびその他のユーザーのエントリを指定する必要がある 

    user::perms

    所有者のアクセス権を指定する 

    group::perms

    グループのアクセス権を指定する 

    other:perms

    所有者またはグループのメンバー以外のユーザーのアクセス権を指定する 

    mask:perms

    ACL マスクのアクセス権を指定する。マスクは、ユーザー (所有者以外) とグループに許される最大アクセス権を示す 

    acl-entry-list

    ファイルまたはディレクトリ上で特定のユーザーとグループに設定する 1 つまたは複数の ACL エントリのリスト。ディレクトリ上でデフォルトの ACL エントリを設定することもできる。有効な ACL エントリについては、表 16–8表 16–9 を参照

    filename ...

    ACL に設定する 1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 


    注意 – 注意 –

    すでにファイル上に ACL が存在する場合、-s オプションを指定すると、ACL 全体が新しい ACL に置き換えられます。


    詳細は、setfacl(1) のマニュアルページを参照してください。

  2. ACL (ACL エントリ) がファイルに設定されたことを確認します。


    $ getfacl filename
    

    詳細は、ファイルに ACL が設定されているかどうかを検査する方法を参照してください。

例 — ファイルの ACL を設定する

次の例では、ch1.doc ファイルのアクセス権を設定しています。所有者には読み取り権と書き込み権が設定され、グループには読み取り専用が設定され、その他のユーザーには何も設定されません。また、ユーザー george には、このファイルの読み取り権および書き込み権が与えられ、ACL マスクには読み取り権および書き込み権が設定されます。これは、ユーザーやグループは実行権を持たないことを意味します。


$ setfacl -s user::rw-,group::r--,other:---,mask:rw-,user:george:rw- ch1.doc
$ ls -l
total 124
-rw-r-----+  1 nathan  sysadmin   34816 Nov 11 14:16 ch1.doc
-rw-r--r--   1 nathan  sysadmin   20167 Nov 11 14:16 ch2.doc
-rw-r--r--   1 nathan  sysadmin    8192 Nov 11 14:16 notes
$ getfacl ch1.doc
# file: ch1.doc
# owner: nathan
# group: sysadmin
user::rw-
user:george:rw-    #effective:rw-
group::r--         #effective:r--
mask:rw-
other:---

次の例では、ch2.doc ファイルのアクセス権を設定します。所有者には読み取り権、書き込み権、および実行権が設定され、グループには読み取り専用が設定され、その他のユーザーには何も設定されません。また、ACL マスクには読み取り権が設定されます。さらに、ユーザー george には読み取り権および書き込み権が与えられます。ただし、ACL マスクの設定により、george のアクセス権は読み取り専用です。


$ setfacl -s u::7,g::4,o:0,m:4,u:george:7 ch2.doc
$ getfacl ch2.doc
# file: ch2.doc
# owner: nathan
# group: sysadmin
user::rwx
user:george:rwx         #effective:r--
group::r--              #effective:r--
mask:r--
other:---

ACL をコピーする方法

getfacl の出力先を変更することにより、ファイルの ACL を他のファイルへコピーします。


$ getfacl filename1 | setfacl -f - filename2

filename1

ACL のコピー元ファイルを指定する 

filename2

ACL のコピー先ファイルを指定する 

例 — ACL をコピーする

次の例では、ch2.doc の ACL が ch3.doc にコピーされます。


$ getfacl ch2.doc | setfacl -f - ch3.doc

ファイルに ACL が設定されているかどうかを検査する方法

ls コマンドを使用して、ファイルに ACL が設定されているかどうかを検査します。


# ls -l filename

filename には、ファイルまたはディレクトリを指定します。

出力のモードフィールドの右側にプラス記号 (+) が表示されているときは、そのファイルに ACL が設定されています。


注 –

ユーザーやグループの ACL エントリをファイルに追加しない場合、ファイルの ACL は「弱い」とみなされ、「+」は表示されません。


例 — ファイルに ACL が設定されているかどうかを検査する

次の例の ch1.doc ファイルでは、モードフィールドの右側にプラス記号 (+) が表示されているため、ACL が設定されています。


$ ls -l ch1.doc
-rwxr-----+  1 nathan   sysadmin      167 Nov 11 11:13 ch1.doc

ファイルの ACL エントリを変更する方法

  1. setfacl コマンドを使用してファイルの ACL エントリを変更します。


    $ setfacl -m acl-entry-list filename ... 
    
    -m

    既存の ACL エントリを変更する 

    acl-entry-list

    ファイルまたはディレクトリで変更する 1 つまたは複数の ACL エントリのリスト。ディレクトリのデフォルト ACL エントリを変更することもできる。有効な ACL エントリについては、表 16–8表 16–9 を参照

    filename ...

    1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 

  2. ファイルの ACL エントリが変更されたことを確認するには、getfacl コマンドを使用します。


    $ getfacl filename
    

例 — ファイルの ACL エントリを変更する

次の例では、ユーザー george のアクセス権を読み取りおよび書き込みに変更します。


$ setfacl -m user:george:6 ch3.doc
$ getfacl ch3.doc
# file: ch3.doc
# owner: nathan
# group: staff
user::rw-				
user::george:rw-         #effective:r--
group::r-                #effective:r--
mask:r--
other:r-

次の例では、book ディレクトリのデフォルトアクセス権を変更します。グループ staff のデフォルトアクセス権を読み取りに変更し、ACL マスクのデフォルトアクセス権を読み取りおよび書き込みに変更します。


$ setfacl -m default:group:staff:4,default:mask:6 book

ファイルから ACL エントリを削除する方法

  1. setfacl コマンドを使用してファイルから ACL エントリを削除します。


    $ setfacl -d acl-entry-list filename ... 
    

    -d

    指定した ACL エントリを削除する 

    acl-entry-list

    ファイルまたはディレクトリから (アクセス権を指定せずに) 削除する ACL エントリのリスト。特定のユーザーとグループの ACL エントリとデフォルトの ACL エントリ以外は削除できない。有効な ACL エントリについては、表 16–8表 16–9 を参照

    filename ...

    1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 

    setfacl -s を使用してファイルのすべての ACL エントリを削除してから、指定した新しい ACL エントリで置き換えることもできます。

  2. ファイルから ACL エントリが削除されたことを確認するには、getfacl コマンドを使用します。


    $ getfacl filename
    

例 — ファイルから ACL エントリを削除する

次の例では、ch4.doc ファイルからユーザー george を削除します。


$ setfacl -d user:george ch4.doc

ファイルの ACL エントリを表示する方法

getfacl コマンドを使用してファイルの ACL エントリを表示します。


$ getfacl [-a | -d] filename ...

-a

指定したファイルまたはディレクトリのファイル名、所有者、グループ、ACL エントリを表示する 

-d

指定したディレクトリのファイル名、所有者、グループ、デフォルトの ACL エントリを表示する 

filename ...

1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 

複数のファイル名をコマンド行に指定した場合は、各 ACL エントリの間に空白行が表示されます。

例 — ファイルの ACL エントリを表示する

次の例は、ch1.doc ファイルのすべての ACL エントリを示します。ユーザーエントリとグループエントリの隣の #effective: は、ACL マスクによって変更された後のアクセス権の設定を示します。


$ getfacl ch1.doc

# file: ch1.doc
# owner: nathan
# group: sysadmin
user::rw-
user:george:r--         #effective:r--
group::rw-              #effective:rw-
mask:rw-
other:---

次の例は、book ディレクトリのデフォルトの ACL エントリを示します。


$ getfacl -d book

# file: book
# owner: nathan
# group: sysadmin
user::rwx
user:george:r-x         #effective:r-x
group::rwx              #effective:rwx
mask:rwx
other:---
default:user::rw-
default:user:george:r--
default:group::rw-
default:mask:rw-
default:other:---