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.dev_minor |
1個目のパス名(デバイスファイル)のマイナー番号 |
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.dev_minor |
2個目のパス名(デバイスファイル)のマイナー番号 |
path2.parent.uid |
2個目のパス名の親ディレクトリの所有者ID |
path2.parent.gid |
2個目のパス名の親ディレクトリのグループID |
path2.parent.ino |
2個目のパス名の親ディレクトリのiノード番号 |
path2.parent.perm |
2個目のパス名の親ディレクトリのパーミッションの種類 |
exec.argc |
プログラムの実行要求時に渡されたコマンドライン引数( argv[] )の数 |
exec.envc |
プログラムの実行要求時に渡された環境変数( envp[] )の数 |
exec.argv[n] |
プログラムの実行要求時に渡された n 番目の引数の値 |
exec.envp[var] |
プログラムの実行要求時に渡された環境変数 var の値 |
exec.realpath |
プログラムの実行要求時の要求されたプログラムのシンボリックリンクを解決したパス名 |
symlink.target |
作成されるシンボリックリンクの内容 |
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. 比較
比較では以下の演算を行うことができます:
演算子 |
意味 |
使用例 |
---|---|---|
= |
文字列および数値およびビット演算の場合:一致する |
task.uid=0 |
!= |
文字列および数値およびビット演算の場合:一致しない |
task.gid!=0 |
10.3. 値
変数との比較の対象となる数値は1個の数値、数値の範囲、あるいは別の変数です:
値 |
例 |
---|---|
数値 |
task.uid=0 |
数値の範囲 |
task.uid=100-500 |
別の変数 |
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