tomoyotitle.png

Chapter 10: 条件付きアクセス許可の使用

アクセス許可を記述する際には、以下の構文をとります:

カテゴリ 操作 対象 条件

「カテゴリ 操作 対象」の部分が「必須(省略不可能)パラメータ」で「条件」の部分が「任意(省略可能)パラメータ」です。この章では、「任意(省略可能)パラメータ」について説明します。

10.1. 利用可能な条件

より詳細なアクセス制御を行うために、アクセス許可に対して条件を指定することができます。これは、アクセス可否の判断基準にユーザIDを利用したい場合などに役に立ちます。以下に、指定可能な条件パラメータを示します:

条件

内容

task.uid

カレントプロセスのユーザID

task.euid

カレントプロセスの実効ユーザID

task.suid

カレントプロセスの保存ユーザID

task.fsuid

カレントプロセスのファイルシステムユーザID

task.gid

カレントプロセスのグループID

task.egid

カレントプロセスの実効グループID

task.sgid

カレントプロセスの保存グループID

task.fsgid

カレントプロセスのファイルシステムグループID

task.pid

カレントプロセスのプロセスID

task.ppid

カレントプロセスの親プロセスID

path1.type

1個目のパス名のファイルの種類

path1.uid

1個目のパス名の所有者ID

path1.gid

1個目のパス名のグループID

path1.ino

1個目のパス名のiノード番号

path1.perm

1個目のパス名のパーミッションの種類

path1.major

1個目のパス名の置かれているデバイスファイルのメジャー番号

path1.minor

1個目のパス名の置かれているデバイスファイルのマイナー番号

path1.dev_major

1個目のパス名(デバイスファイル)のメジャー番号
path1.type=block または path1.type=char という条件との組み合わせが可能。

path1.dev_minor

1個目のパス名(デバイスファイル)のマイナー番号
path1.type=block または path1.type=char という条件との組み合わせが可能。

path1.parent.uid

1個目のパス名の親ディレクトリの所有者ID

path1.parent.gid

1個目のパス名の親ディレクトリのグループID

path1.parent.ino

1個目のパス名の親ディレクトリのiノード番号

path1.parent.perm

1個目のパス名の親ディレクトリのパーミッションの種類

path2.type

2個目のパス名のファイルの種類

path2.uid

2個目のパス名の所有者ID

path2.gid

2個目のパス名のグループID

path2.ino

2個目のパス名のiノード番号

path2.perm

2個目のパス名のパーミッションの種類

path2.major

2個目のパス名の置かれているデバイスファイルのメジャー番号

path2.minor

2個目のパス名の置かれているデバイスファイルのマイナー番号

path2.dev_major

2個目のパス名(デバイスファイル)のメジャー番号
path2.type=block または path2.type=char という条件との組み合わせが可能。

path2.dev_minor

2個目のパス名(デバイスファイル)のマイナー番号
path2.type=block または path2.type=char という条件との組み合わせが可能。

path2.parent.uid

2個目のパス名の親ディレクトリの所有者ID

path2.parent.gid

2個目のパス名の親ディレクトリのグループID

path2.parent.ino

2個目のパス名の親ディレクトリのiノード番号

path2.parent.perm

2個目のパス名の親ディレクトリのパーミッションの種類

exec.argc

プログラムの実行要求時に渡されたコマンドライン引数( argv[] )の数
file execute ディレクティブおよび misc env ディレクティブでのみ指定可能

exec.envc

プログラムの実行要求時に渡された環境変数( envp[] )の数
file execute ディレクティブおよび misc env ディレクティブでのみ指定可能

exec.argv[n]

プログラムの実行要求時に渡された n 番目の引数の値
file execute ディレクティブおよび misc env ディレクティブでのみ指定可能

exec.envp[var]

プログラムの実行要求時に渡された環境変数 var の値
file execute ディレクティブおよび misc env ディレクティブでのみ指定可能

exec.realpath

プログラムの実行要求時の要求されたプログラムのシンボリックリンクを解決したパス名
file execute ディレクティブおよび misc env ディレクティブでのみ指定可能

symlink.target

作成されるシンボリックリンクの内容
file symlink ディレクティブでのみ指定可能

path1 および path2 はそれぞれディレクティブの1個目のパス名と2個目のパス名に対応しています。以下の例では、 path1 が /dev/sda1 に、 path2 が /mnt/sda1/ に対応しています:

file mount /dev/sda1 /mnt/sda1/ ext3 0 path1.uid=0 path2.uid=0

しかし、以下の例では、パーミッションチェックの時点では2つめのパス名は存在していないため、 path2.uid=0 のような条件を指定することはできません:

file rename /tmp/file1 /tmp/file2 path1.uid=0 path2.parent.uid=0

同様に、以下の例では、パーミッションチェックの時点では存在しないパス名であるため、 path1.uid=0 のような条件を指定することはできません:

file create /tmp/file 0644 path1.parent.uid=0

10.2. 比較

比較では以下の演算を行うことができます:

演算子

意味

使用例

=

文字列および数値およびビット演算の場合:一致する
数値の範囲比較の場合:1つ以上一致する値が存在する

task.uid=0

!=

文字列および数値およびビット演算の場合:一致しない
数値の範囲比較の場合:1つも一致する値が存在しない

task.gid!=0

10.3. 値

変数との比較の対象となる数値は1個の数値、数値の範囲、あるいは別の変数です:

数値

task.uid=0
task.uid!=0

数値の範囲

task.uid=100-500
task.uid!=100-500

別の変数

task.uid=path1.uid
task.uid!=path1.uid

1つの例外があります。 exec.argv[n] exec.envp[var] exec.realpath および symlink.target は常に文字列が比較の対象です。

10.4. ファイルの種類

ファイルの種類については、以下の条件を指定することができます:

条件

内容

path1.type=block

path1 はブロックデバイスファイルである

path1.type=char

path1 はキャラクタデバイスファイルである

path1.type=directory

path1 はディレクトリである

path1.type=fifo

path1 は FIFO である

path1.type=file

path1 は通常のファイルである

path1.type=socket

path1 はソケットである

path1.type=symlink

path1 はシンボリックリンクである

path1.type!=block

path1 はブロックデバイスファイルではない

path1.type!=char

path1 はキャラクタデバイスファイルではない

path1.type!=directory

path1 はディレクトリではない

path1.type!=fifo

path1 は FIFO ではない

path1.type!=file

path1 は通常のファイルではない

path1.type!=socket

path1 はソケットではない

path1.type!=symlink

path1 はシンボリックリンクではない

path2 についても path1 と同様に指定ができます。しかし、 path1.parent および path2.parent については定義からディレクトリであるため指定できません。

10.5. パーミッションの種類

ファイルのパーミッションについては、以下の条件を指定することができます:

条件

内容

path1.perm=num1-num2

path1 のパーミッションが「 num1 ~ num2 」である

path1.perm=setuid

path1 に関して setuid ビットが on である

path1.perm=setgid

path1 に関して setgid ビットが on である

path1.perm=sticky

path1 に関して sticky ビットが on である

path1.perm=owner_read

path1 に関して owner に対する read ビットが on である

path1.perm=owner_write

path1 に関して owner に対する write ビットが on である

path1.perm=owner_execute

path1 に関して owner に対する execute ビットが on である

path1.perm=group_read

path1 に関して group に対する read ビットが on である

path1.perm=group_write

path1 に関して group に対する write ビットが on である

path1.perm=group_execute

path1 に関して group に対する execute ビットが on である

path1.perm=others_read

path1 に関して others に対する read ビットが on である

path1.perm=others_write

path1 に関して others に対する write ビットが on である

path1.perm=others_execute

path1 に関して others に対する execute ビットが on である

path1.perm!=num1-num2

path1 のパーミッションが「 num1 ~ num2 」ではない

path1.perm!=setuid

path1 に関して setuid ビットが off である

path1.perm!=setgid

path1 に関して setgid ビットが off である

path1.perm!=sticky

path1 に関して sticky ビットが off である

path1.perm!=owner_read

path1 に関して owner に対する read ビットが off である

path1.perm!=owner_write

path1 に関して owner に対する write ビットが off である

path1.perm!=owner_execute

path1 に関して owner に対する execute ビットが off である

path1.perm!=group_read

path1 に関して group に対する read ビットが off である

path1.perm!=group_write

path1 に関して group に対する write ビットが off である

path1.perm!=group_execute

path1 に関して group に対する execute ビットが off である

path1.perm!=others_read

path1 に関して others に対する read ビットが off である

path1.perm!=others_write

path1 に関して others に対する write ビットが off である

path1.perm!=others_execute

path1 に関して others に対する execute ビットが off である

path1.parent path2 および path2.parent についても path1 と同様に指定ができます。

10.6. 指定例

特定のドメイン(例えば <kernel> /sbin/agetty /bin/login )から root ユーザとしてログインシェルを実行することを禁止したい場合、以下のように指定することができます:

file execute /bin/bash task.uid!=0

特定のドメイン(例えば <kernel> /sbin/agetty /bin/login )から特定の範囲のユーザIDを持つユーザのログインだけを認めたい場合、以下のように指定することができます:

file execute /bin/bash task.uid=500-1000

カレントプロセスがテンポラリファイルの所有者である場合だけそのファイルの参照を認めたい場合、以下のように指定することができます:

file read /tmp/file001.tmp task.uid=path1.uid

特定のコマンドライン引数や環境変数が渡された場合だけプログラムの実行を認めたい場合、以下のように指定することができます:

file execute /usr/bin/ssh exec.realpath="/usr/bin/ssh" exec.argv[0]="ssh"
file execute /usr/bin/firefox exec.realpath="/usr/lib/firefox-3.6/firefox" exec.argv[0]="/usr/bin/firefox" exec.envc=0