この章では、ファイルにセキュリティを適用する手順について説明します。この章で説明する手順は次のとおりです。
この節では、ファイルのセキュリティを構成する機能について説明します。
各ファイルには、セキュリティのレベルを指定する 3 つのユーザークラスがあります。
ファイルやディレクトリの所有者 - 通常は、ファイルを作成したユーザーです。ファイルの所有者は、ファイルの読み取り権、書き込み権 (変更する権利)、または実行権 (コマンドの場合) を与えるユーザーを決定できます。
グループのメンバー
ファイルやグループの所有者以外のすべてのユーザー
ファイルのアクセス権を割り当てたり変更したりできるのは、スーパーユーザーかそのファイルの所有者だけです。
表 13-1 に、各ユーザークラスに与えることができるファイルのアクセス権を示します。
表 13-1 ファイルのアクセス権
記号 |
アクセス権 |
指定されたユーザーが実行できる操作 |
---|---|---|
r |
読み取り |
ファイルを開いて内容を読み取る |
w |
書き込み |
ファイルに書き込んだり (その内容を変更したり)、追加したり、削除したりできる |
x |
実行 |
ファイルを実行できる (プログラムまたはシェルスクリプトの場合)、あるいは exec(1) システムコールの 1 つを使用してファイルを実行できる |
- |
拒否 |
ファイルを読み取ったり、書き込んだり、実行したりできない |
これらのファイルアクセス権は、通常のファイルと同様にデバイス、ソケット、名前付きパイプ (FIFO) などの特殊ファイルにも適用できます。
シンボリックリンクには、そのリンクが指すファイルのアクセス権が適用されます。
表 13-2 に、各ユーザークラスに与えることができるディレクトリのアクセス権を示します。
表 13-2 ディレクトリのアクセス権
記号 |
アクセス権 |
指定されたユーザーが実行できる操作 |
---|---|---|
r |
読み取り |
ディレクトリ内のファイルを表示できる |
w |
書き込み |
ディレクトリ内のファイルやリンクを追加または削除できる |
x |
実行 |
ディレクトリ内のファイルを開いたり実行したりできる。また、ディレクトリを作成し、その下にサブディレクトリを作成できる |
ディレクトリへアクセスできないようにすると、そのディレクトリ (およびすべてのサブディレクトリ) 内のファイルを保護できます。ただし、スーパーユーザーはシステム上のすべてのファイルとディレクトリにアクセスできます。
実行可能ファイルと公共ディレクトリには、3 種類の特殊なアクセス権を設定できます。これらのアクセス権を設定すると、その実行可能ファイルを実行するユーザーは、そのファイルの所有者 (またはグループ) のユーザー ID を持つことができます。
特殊なアクセス権はセキュリティ上の問題を引き起こすため、特殊なアクセス権を設定するときは十分な注意が必要です。たとえば、ユーザーはユーザー ID が root に設定されているプログラムを実行することにより、スーパーユーザーのアクセス権を取得できます。また、すべてのユーザーは、所有するファイルに対して特殊なアクセス権を設定できるので、これもセキュリティ上の問題の原因となります。
setuid や setgid アクセス権を使用して、不正にスーパーユーザー権限が取得されていないかどうか絶えずシステムを監視しなければなりません。これらのアクセス権を使用しているすべてのプログラムを、ファイルシステム内で検索し、そのリストを出力する方法については、「setuid アクセス権が設定されているファイルを検索する方法」を参照してください。この種のプログラムの所有権を bin や sys 以外のユーザーに与えているものが出力中にあれば、そのプログラムはセキュリティに違反している可能性があります。
set-user 識別 (setuid) アクセス権を実行可能ファイルに設定すると、このファイルを実行するプロセスには、その実行可能ファイルを実行しているユーザーではなく、ファイルの所有者 (通常は root) に基づいてアクセス権が与えられます。このため、通常は所有者しか利用できないファイルやディレクトリにユーザーがアクセスできます。たとえば次に示すように、passwd コマンドは root の setuid アクセス権が設定されているので、ユーザーは root の権限でパスワードを変更できます。
-r-sr-sr-x 1 root sys 10332 May 3 08:23 /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 bin mail 62504 May 3 07:58 /usr/bin/mail |
setgid アクセス権がディレクトリに適用されると、このディレクトリ内で作成されたファイルは、生成するプロセスが所属するグループではなく、ディレクトリが所属するグループに含まれることになります。ディレクトリ内で書き込み権と実行権を持つユーザーは、そこでファイルを作成できます。ただし、そのファイルは、そのユーザーのグループではなく、ディレクトリのグループに所属することになります。
管理者は、setuid アクセス権や setgid アクセス権の認証されていない使用によってスーパーユーザー特権が獲得されないようにシステムを監視しなければなりません。ファイルシステムを検索して、このようなアクセス権を使用しているすべてのプログラムのリストを出力する方法については、「setuid アクセス権が設定されているファイルを検索する方法」を参照してください。このようなプログラムの所有権が、bin や sys ではなく、一般ユーザーになっているものが疑わしいと考えられます。これらのアクセス権を設定できるのは、スーパーユーザーだけです。
「スティッキビット」は、ディレクトリ内のファイルを保護するアクセス権ビットです。ディレクトリにスティッキビットが設定されている場合、そのファイルを削除できるのはその所有者、ディレクトリの所有者、または root だけです。これにより、ユーザーは /tmp などの公共ディレクトリから他のユーザーのファイルを削除できなくなります。
drwxrwxrwt 7 sys sys 517 Mar 6 02:01 tmp |
TMPFS ファイルシステム上で公共ディレクトリを設定するときには、スティッキビットを手作業で設定してください。
ファイルやディレクトリを作成するときには、デフォルトのアクセス権が設定されます。これらのデフォルトのアクセス権は、システムファイル /etc/profile、.cshrc、または .login ファイル内の umask(1) の値によって決定されます。デフォルトでは、システムはテキストファイルのアクセス権を 666 に設定してユーザー、グループ、その他に読み取り権と書き込み権を与え、ディレクトリまたは実行可能ファイルに対しては 777 に設定します。
umask によって割り当てられる値は、デフォルトから差し引かれます。これには、chmod がアクセス権を与えるのと同じ方法で拒否する効果があります。たとえば、コマンド chmod 022 はグループとその他に書き込み権を与えますが、umask 022 はグループとその他の書き込み権を拒否します。
表 13-3 に、典型的な umask の設定とその設定が実行可能ファイルに与える影響を示します。
表 13-3 各種セキュリティレベルの umask 設定
セキュリティレベル |
umask |
使用できないユーザー |
---|---|---|
緩やか (744) |
022 |
グループとその他による w |
中程度 (740) |
027 |
グループによる w、その他による rwx |
中程度 (741) |
026 |
グループによる w、その他による rw |
厳しい (700) |
077 |
グループとその他による rwx |
この節では、ファイルの情報を表示する方法について説明します。
ls コマンドを使用して、ディレクトリ内のすべてのファイルに関する情報を表示します。
$ ls -la
-l |
長形式で表示する |
-a |
ドット (.) で始まるファイルを含め、すべてのファイルを表示する |
表示画面の各行には、ファイルに関して次の情報が表示されます。
ファイル形式
ファイルには 6 つの形式があります。表 13-4 にファイル形式を示します。
表 13-4 ファイル形式
記号 |
形式 |
---|---|
- |
テキストまたはプログラム |
d |
ディレクトリ |
b |
ブロック型特殊ファイル |
c |
キャラクタ型特殊ファイル |
p |
名前付きパイプ (FIFO) |
l |
シンボリックリンク |
ハードリンク数
ファイルの所有者
ファイルのグループ
ファイルのバイト数
ファイルの作成日または前回の変更日
ファイル名
次の例では、/sbin ディレクトリ内のファイルが部分的に表示されています。
$ cd /sbin $ ls -la total 11652 drwxrwxr-x 2 root sys 512 Jun 2 11:47 ./ drwxr-xr-x 30 root root 512 Jun 3 14:13 ../ -r-xr-xr-x 1 bin bin 199224 May 6 21:23 autopush* lrwxrwxrwx 1 root root 21 Jun 2 11:47 bpgetfile -> ... -r-xr-xr-x 1 bin bin 467856 May 6 21:23 dhcpagent* -r-xr-xr-x 1 bin bin 430172 May 6 21:23 dhcpinfo* -r-xr-xr-x 1 bin bin 251500 May 6 21:23 fdisk* -r-xr-xr-x 1 bin bin 762136 May 6 21:29 hostconfig* -r-xr-xr-x 1 bin bin 533272 May 6 21:30 ifconfig* -r-xr-xr-x 1 root sys 515296 May 6 21:25 init* -r-xr-xr-x 2 bin root 256272 May 6 21:27 jsh* -r-xr-xr-x 1 bin bin 223448 May 7 20:06 mount* -r-xr-xr-x 1 root sys 6935 Jan 1 1970 mountall* . . .
この節では、ファイルの所有権を変更する方法について説明します。
デフォルトでは、所有者は chown コマンドを使用して、ファイルやディレクトリの所有者を変更できません。ただし、システム管理者が次の行をシステムの /etc/system ファイルに追加して、システムをリブートすれば、所有者は chown コマンドを使用できるようになります。
set rstchown = 0
詳細は、chown(1) のマニュアルページを参照してください。また、NFS マウントされているファイルシステム上で所有者を変更するときは、他にも制約があるので注意してください。
chown コマンドを使用してファイルの所有者を変更します。
$ chown newowner filename
newowner |
ファイルまたはディレクトリの新しい所有者のユーザー名または UID を指定する |
filename |
ファイルまたはディレクトリを指定する |
ファイルの所有者が変更されていることを確認します。
$ ls -l filename
次の例は、myfile の所有権をユーザー rimmer に設定します。
$ chown rimmer myfile $ ls -l myfile -rw-r--r-- 1 rimmer scifi 112640 May 24 10:49 myfile
デフォルトでは、所有者は chgrp コマンドを使用しても、ファイルのグループをその所有者が属するグループ以外には変更できません。たとえば、ファイルの所有者が staff と sysadm グループだけに属する場合、所有者は、ファイルのグループを staff か sysadm グループ以外には変更できません。
ただし、システム管理者が次の行をシステムの /etc/system ファイルに追加して、システムをリブートすれば、所有者は、ファイルのグループを、所有者が属していないグループにも変更できるようになります。
set rstchown = 0
詳細は、chgrp(1) のマニュアルページを参照してください。また、NFS マウントされているファイルシステムでグループを変更するときは、他にも制約があるので注意してください。
chgrp コマンドを使用して、ファイルのグループ所有者を変更します。
$ chgrp group filename
group |
ファイルまたはディレクトリの新しいグループ名を指定する |
filename |
ファイルまたはディレクトリを指定する |
グループアカウントの編集方法については、第 13 章「ファイルのセキュリティの適用手順」を参照してください。
ファイルのグループ所有権が変更されていることを確認します。
$ ls -l filename
次の例は、myfile のグループ所有権をグループ scifi に設定します。
$ chgrp scifi myfile $ ls -l myfile -rwxrw-- 1 rimmer scifi 12985 Nov 12 16:28 myfile
chmod コマンドを使用すると、ファイルのアクセス権を変更できます。ファイルまたはディレクトリの所有者、あるいはスーパーユーザーだけがそのアクセス権を変更できます。
chmod コマンドを使用して、次のどちらかのモードでアクセス権を設定できます。
絶対モード - ファイルのアクセス権を表す数値を使用します。これは、アクセス権を設定するときに最も一般的に使用される方法です。絶対モードを使用してアクセス権を変更するときは、3 つ 1 組のアクセス権を 8 進数で表します。
表 13-5 に、絶対モードでファイルのアクセス権を設定するための 8 進数値を示します。これらの数字を 3 つ組み合せて、所有者、グループ、その他のファイルアクセス権をこの順に設定します。たとえば、値 644 は、所有者に対して読み取り権と書き込み権を設定し、グループとその他に対しては読み取り権だけを設定します。
表 13-5 絶対モードによるファイルのアクセス権の設定
8 進数値 |
ファイルのアクセス権 |
設定されるアクセス権 |
---|---|---|
0 |
--- |
なし |
1 |
--x |
実行権のみ |
2 |
-w- |
書き込み権のみ |
3 |
-wx |
書き込み権と実行権 |
4 |
r-- |
読み取り権のみ |
5 |
r-x |
読み取り権と実行権 |
6 |
rw- |
読み取り権と書き込み権 |
7 |
rwx |
読み取り権、書き込み権、実行権 |
ファイルには、絶対モードまたは記号モードで特殊アクセス権を設定できます。絶対モードでは、3 つ 1 組のアクセス権の左端に新しい 8 進数値を追加して、特殊アクセス権を設定します。表 13-6 に、ファイルに特殊アクセス権を設定する 8 進数値を示します。
表 13-6 絶対モードによる特殊アクセス権の設定
8 進数値 |
特殊アクセス権の設定 |
---|---|
1 |
スティッキビット |
2 |
setguid |
4 |
setuid |
表 13-7 に、記号モードでファイルのアクセス権を設定するための記号を示します。記号では、アクセス権を設定または変更できる対象ユーザー、実行される操作、あるいは割り当てるまたは変更するアクセス権を指定できます。
表 13-7 記号モードによるファイルのアクセス権の設定
記号 |
機能 |
説明 |
---|---|---|
u |
対象ユーザー |
ユーザー (所有者) |
g |
対象ユーザー |
グループ |
o |
対象ユーザー |
その他 |
a |
対象ユーザー |
すべて |
= |
操作 |
割り当て |
+ |
操作 |
追加 |
- |
操作 |
削除 |
r |
アクセス権 |
読み取り |
w |
アクセス権 |
書き込み |
x |
アクセス権 |
実行 |
l |
アクセス権 |
強制ロック、setgid ビットはオン、グループ実行ビットはオフ |
s |
アクセス権 |
setuid または setgid ビットはオン |
S |
アクセス権 |
suid ビットはオン、ユーザー実行ビットはオフ |
t |
アクセス権 |
スティッキビットはオン、その他の実行ビットはオン |
T |
アクセス権 |
スティッキビットはオン、その他の実行ビットはオフ |
機能列の「対象ユーザー」、「操作」、および「アクセス権」を順番に連結した文字列によって、ファイルまたはディレクトリのアクセス権を変更する記号を指定します。
対象ユーザー |
アクセス権を変更する対象となるユーザーを指定する |
操作 |
実行する操作を指定する |
アクセス権 |
変更するアクセス権を指定する |
ファイルまたはディレクトリの所有者でない場合は、スーパーユーザーになります。
現在の所有者またはスーパーユーザーだけが、chmod コマンドを使用してファイルまたはディレクトリのアクセス権を変更できます。
chmod コマンドを使用してアクセス権を絶対モードで変更します。
$ chmod nnn filename
nnn |
ファイル所有者、ファイルグループ、その他のアクセス権をこの順序で表す 8 進数値を指定する。有効な 8 進数値については、表 13-5 を参照 |
filename |
ファイルまたはディレクトリを指定する |
chmod を使用して ACL エントリを持つファイルのファイルグループアクセス権を変更する場合、ファイルグループアクセス権と ACL マスクの両方が新しいアクセス権に変更されます。新しい ACL マスクアクセス権は、そのファイル上に ACL エントリを持つ追加ユーザーおよびグループの実効アクセス権を変更する場合があるので注意が必要です。getfacl(1) コマンドを使用して、適切なアクセス権がすべての ACL エントリに設定されていることを確認してください。
ファイルのアクセス権が変更されていることを確認します。
$ 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
ファイルまたはディレクトリの所有者でない場合は、スーパーユーザーになります。
現在の所有者またはスーパーユーザーだけが、chmod コマンドを使用してファイルまたはディレクトリの所有者を変更できます。
chmod コマンドを使用して特殊アクセス権を絶対モードで変更します。
$ chmod nnnn filename
nnnn |
ファイルまたはディレクトリのアクセス権を変更する 8 進数値。左端の 8 進数値で、ファイルの特殊アクセス権を設定する。特殊アクセス権に有効な 8 進数値のリストについては、表 13-6 を参照 |
filename |
ファイルまたはディレクトリを指定する |
chmod を使用して ACL エントリを持つファイルのファイルグループアクセス権を変更する場合、ファイルグループアクセス権と ACL マスクの両方が新しいアクセス権に変更されます。新しい ACL マスクアクセス権は、そのファイル上に ACL エントリを持つ追加ユーザーおよびグループの実効アクセス権を変更する場合があるので注意が必要です。getfacl(1) コマンドを使用して、適切なアクセス権がすべての ACL エントリに設定されていることを確認してください。
ファイルのアクセス権が変更されていることを確認します。
$ 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
次の例は、pubdir ディレクトリにスティッキビットアクセス権を設定します。
$ chmod 1777 pubdir
ファイルまたはディレクトリの所有者でない場合は、スーパーユーザーになります。
現在の所有者またはスーパーユーザーだけが、chmod コマンドを使用してファイルまたはディレクトリの所有者を変更できます。
chmod コマンドを使用してアクセス権を記号モードで変更します。
$ chmod who operator permission filename
who operator permission |
who では、アクセス権を変更するユーザーを指定し、operator では実行する操作を指定し、permission では変更後のアクセス権を指定する。有効な記号については、表 13-7 を参照 |
filename |
ファイルまたはディレクトリを指定する |
ファイルのアクセス権が変更されていることを確認します。
$ ls -l filename
次の例は、その他のユーザーの読み取り権を削除します。
$ chmod o-r filea
次の例は、ユーザー、グループ、その他のユーザーの読み取り権と実行権を追加します。
$ chmod a+rx fileb
次の例は、グループに読み取り権、書き込み権、実行権を割り当てます。
$ chmod g=rwx filec
setuid や setgid アクセス権を使用して、不正にスーパーユーザー権限が取得されていないかどうか絶えずシステムを監視しなければなりません。この種のプログラムの所有権を bin や sys 以外のユーザーに与えているものが出力中にあれば、そのプログラムはセキュリティに違反している可能性があります。
find コマンドを使用して setuid アクセス権が設定されているファイルを検索します。
# find directory -user root -perm -4000 -exec ls -ldb {}¥; >/tmp/filename
結果を /tmp/filename に出力する。
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 の個人用コピーを作成し、setuid としてのアクセス権を root に設定しています。これは、rar は /usr/rar/bin/sh を実行して特権付きユーザーになれることを意味します。この出力を参考のために保存したい場合は、ファイルを /tmp ディレクトリの外へ移動してください。
セキュリティのバグの多くは、デフォルトの実行可能スタックのアクセス権が読み取り可能、書き込み可能、および実行可能に設定されたときに発生します。実行権が設定されたスタックは SPARC ABI と Intel ABI によって許可されていますが、ほとんどのプログラムは、実行可能スタックを使用しなくても正常に機能します。
Solaris 2.6 リリースより、noexec_user_stack 変数が利用できるようになりました。この変数によって、システム管理者は、スタックを実行可能としてマッピングするかどうかを指定できます。デフォルトではこの変数はゼロで、ABI 準拠の動作を提供します。この変数がゼロ以外に設定された場合、システムはシステム中のすべてのプロセスのスタックに読み取り可能と書き込み可能のマークをつけますが、実行可能のマークは付けません。
この変数が設定されている場合、プログラムがスタック上でコードを実行しようとすると SIGSEGV シグナルが送信されます。通常、このシグナルが送信されると、プログラムはコアダンプして終了します。このようなプログラムは、違反しているプログラム名、プロセス ID、およびプログラムを実行した実ユーザー ID を含む警告メッセージも生成します。たとえば、次のとおりです。
a.out[347] attempt to execute code on stack by uid 555 |
メッセージは、syslog kern 機能が notice レベルに設定されているときに、syslogd(1M) デーモンによってログに記録されます。このログへの記録は、デフォルトで syslog.conf(4) ファイルに設定されていて、メッセージがコンソールと /var/adm/messages ファイルの両方に送信されることを意味します。
このメッセージは、潜在的なセキュリティの問題を調べるときに役立ちます。また、この変数を設定することによって、正しく動作しなくなった、実行可能スタックに依存する有効なプログラムを確認するのにも役立ちます。メッセージを記録しない場合、管理者は、/etc/system ファイルで noexec_user_stack_log 変数をゼロに設定して無効にします。この場合でも実行プログラムは、SIGSEGV シグナルによってコアダンプします。
プログラムのスタックが実行可能であると明示的にマークを付ける場合は、mprotect(2) を使用します。
ハードウェアの制限のため、実行可能スタックの問題を捕捉して報告する機能は、sun4m、sun4d、および sun4u プラットフォームでしか利用できません。
従来の UNIX ファイル保護機能は、所有者、グループ、その他という 3 つのユーザークラスに読み取り権、書き込み権、実行権を提供します。ACL を使用すると、所有者、所有者のグループ、その他、特定のユーザーおよびグループのファイルアクセス権を定義でき、またこれらのカテゴリごとにデフォルトのアクセス権を定義できるため、ファイルのセキュリティが強化されます。
たとえば、グループ内のすべてのユーザーがファイルを読み取れるようにしたい場合は、単にそのファイルにグループの読み取り権を設定します。そして、そのグループ内の 1 人のユーザーだけに書き込み権を与えたいとすると、標準の UNIX ではこのようなファイルセキュリティを設定できませんが、ACL ではこれが可能です。
ACL エントリはファイルの ACL を定義する手段であり、setfacl(1) コマンドにより設定します。ACL エントリは、次のようにコロンで区切ったフィールドからなっています。
entry_type:[uid|gid]:perms |
entry_type |
ファイルのアクセス権を設定する ACL エントリのタイプ。たとえば、entry_type は user (ファイルの所有者) または mask (ACL マスク) に設定できる |
uid |
ユーザー名または識別番号 |
gid |
グループ名または識別番号 |
perms |
entry_type に設定するアクセス権を表す。perms は、記号文字 rwx または番号 (chmod コマンドに使用するのと同じアクセス権番号) で指定できる |
次の例に、ユーザー nathan の読み取り権および書き取り権を設定する ACL エントリを示します。
user:nathan:rw- |
ACL などの UFS ファイルシステム属性は UFS ファイルシステムだけでサポートされます。つまり、/tmp ディレクトリ (通常は、TMPFS ファイルシステムとしてマウントされている) で ACL エントリを持つファイルを復元またはコピーすると、その ACL エントリは失われます。UFS ファイルの一時的な格納には、/var/tmp ディレクトリを使用してください。
表 13-8 に、有効な ACL エントリを示します。最初の 3 つの ACL エントリは、基本的な UNIX のファイル保護機能を提供します。
表 13-8 ファイルの ACL エントリ
表 13-8 に示した ACL エントリの他に、ディレクトリにはデフォルトの ACL エントリも設定できます。デフォルトの ACL エントリを持つディレクトリ内で作成されたファイルまたはディレクトリは、デフォルトの ACL エントリと同じ ACL エントリを持つことになります。表 13-9 に、ディレクトリのデフォルト ACL エントリを示します。
ディレクトリ上で特定のユーザーとグループのデフォルトの ACL エントリを初めて設定するときは、ファイル所有者、ファイルグループ、その他、およびACL マスクにデフォルトの ACL エントリも設定しなければなりません (表 13-9 の最初の 4 つのデフォルト ACL エントリでは、この設定は必須です)。
表 13-9 ディレクトリのデフォルト ACL エントリ
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 エントリについては、表 13-8 と表 13-9 を参照 |
filename |
ACL を設定するファイルまたはディレクトリ |
ファイルに ACL が設定されたかどうかを確認する方法については、「ファイルに ACL が設定されているかどうかをチェックする方法」を参照してください。ファイルにどの ACL エントリが設定されているかを確認するには、getfacl コマンドを使用します。
$ getfacl filename
すでにファイル上に ACL が存在する場合、-s オプションを指定すると、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:---
getfacl の出力先を変更することにより、ファイルの ACL を他のファイルへコピーできます。
$ getfacl filename1 | setfacl --f - filename2
file1 |
ACL のコピー元ファイルを指定する |
file2 |
ACL のコピー先ファイルを指定する |
次の例は、ACL を ch2.doc から ch3.doc へコピーします。
$ getfacl ch2.doc | setfacl -f - ch3.doc
ls コマンドを使用して、ファイルに ACL が設定されているかどうかをチェックします。
$ ls -l filename
filename |
チェックするファイルまたはディレクトリを指定する |
モードフィールドの右側の「+」は、ファイルに ACL が設定されていることを示します。
さらにユーザーやグループの ACL エントリをファイルに追加しないかぎり、ファイルの ACL は「弱い」とみなされ、「+」は表示されません。
次の例は、モードフィールドの右側に + が付いているため、ch1.doc に ACL が設定されていることを示します。
$ ls -l ch1.doc -rwxr-----+ 1 nathan sysadmin 167 Nov 11 11:13 ch1.doc
setfacl コマンドを使用してファイルの ACL エントリを変更します。
$ setfacl -m acl_entry_list filename1 [filename2...]
-m |
既存の ACL エントリを変更する |
acl_entry_list |
ファイルまたはディレクトリで変更する 1 つ以上の ACL エントリのリスト。ディレクトリのデフォルト ACL エントリを変更することもできる。有効な ACL エントリについては、表 13-8 と表 13-9 を参照を指定する |
filename ... |
ファイルまたはディレクトリを指定する |
ファイルの ACL エントリが追加または変更されたことを確認するには、getfacl コマンドを使用します。
$ getfacl filename
次の例は、ch3.doc ファイルのユーザー george のアクセス権を読み取り権/書き込み権に変更します。
$ setfacl -m user:george:6 ch3.doc $ getfacl ch3.doc # file: ch3.doc # owner: george # group: staff user::rw- user::george:rw- #effective:rw- group::r- #effective:r-- mask:r-- other:r--
次の例は、book ディレクトリに関して、グループ staff のデフォルトのアクセス権を読み取りに変更し、デフォルトの ACL マスクを読み取り権/書き込み権に変更します。
$ setfacl -m default:group:staff:4,default:mask:6 book
setfacl コマンドを使用してファイルから ACL エントリを削除します。
$ setfacl -d acl_entry_list filename1 ...
-d |
指定した ACL エントリを削除する |
acl_entry_list |
ファイルまたはディレクトリから (アクセス権を指定せずに) 削除する ACL エントリのリスト。特定のユーザーとグループの ACL エントリとデフォルトの ACL エントリ以外は削除できない。有効な ACL エントリについては、表 13-8 と表 13-9 を参照 |
filename ... |
ファイルまたはディレクトリを指定する |
setfacl -s コマンドを使用すると、ファイルからすべての ACL エントリを削除して、新たに指定した ACL エントリに置き換えることができます。
ファイルから ACL エントリが削除されたことを確認するには、getfacl コマンドを使用します。
$ getfacl filename
次の例は、ユーザー george を ch4.doc ファイルから削除します。
$ setfacl -d user:george ch4.doc
getfacl コマンドを使用してファイルの ACL エントリを表示します。
$ getfacl [-a | -d] filename1 ...
-a |
指定したファイルまたはディレクトリのファイル名、ファイル所有者、ファイルグループ、ACL エントリを表示する |
-d |
指定したディレクトリのファイル名、ファイル所有者、ファイルグループ、デフォルトの ACL エントリを表示する |
filename ... |
ファイルまたはディレクトリを指定する |
コマンド行で複数のファイル名を指定すると、各 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:---