Interstage Application Server セキュリティシステム運用ガイド |
目次
索引
![]() ![]() |
第2部 認証とアクセス制御 | > 第5章 Interstage ディレクトリサービスのアクセス制御の設定 | > 5.2 アクセス制御リストの定義 |
クライアントからアクセスするユーザに、エントリや属性に対するアクセス権を与えるかどうかの評価は、以下の順序で行われます。
クライアントから指定されたエントリや属性を、アクセス制御リストで指定されている <アクセス対象> と比較します。
各エントリや属性について、アクセス制御リストの先頭行から順に access ディレクティブを調べます。リポジトリサーバは、アクセス制御リストで指定されているエントリや属性と一致する、最初の <アクセス対象> を見つけたところで調査をやめます。
たとえば、以下のようにアクセス制御リストを定義した場合、telephoneNumber 属性へのアクセス要求があると、(1)でアクセス対象と一致するので、(3)の調査はしません。
access to attr=telephoneNumber ・・・(1) by self write ・・・(2) access to attr=telephoneNumber ・・・(3) by users read ・・・(4) |
次に、リポジトリサーバは、手順1で選択された access ディレクティブの <アクセスユーザ> を、by 節の出現順に、アクセスを要求するクライアントのバインドDNと比較します。リポジトリサーバは、クライアントのバインドDNと一致する、最初の <アクセスユーザ> を見つけたところで比較をやめます。
手順1のアクセス制御リストで、クライアントのバインドDNとエントリのDNとが一致するエントリの telephoneNumber 属性へのアクセス要求があると、(2)で一致するので、比較を終了します。クライアントのバインドDNとエントリのDNとが一致するエントリではなく、他のエントリの telephoneNumber 属性へのアクセス要求の場合は、(2)では一致しません。また、アクセス対象の評価を(1)で終了するので、(3)、および(4)のアクセス対象、およびアクセスユーザの評価はされず、アクセスを拒否します。
最後に、リポジトリサーバは、手順2で選択された <アクセスユーザ> の <アクセス権> に与えられているアクセス権を、クライアントによって要求されたアクセス(操作)と比較します。アクセス権が、実際のアクセス(操作)以上のものであれば、アクセスが認められます。そうでない場合は、アクセスが拒否されます。
また、上記の各手順で、どの <アクセス対象> とも一致しない場合、あるいはどの <アクセスユーザ> とも一致しない場合には、アクセスが拒否されます。
あらゆる access ディレクティブの by 節は、暗黙の「by * none」で終わっていて、あらゆるアクセス制御リストは、暗黙の「access to * by * none」で終わっているためです。
このため、access ディレクティブの評価順序により、アクセス制御リスト定義ファイル中での access ディレクティブの出現位置がとても重要となります。
ある access ディレクティブの <アクセス対象> が、別の access ディレクティブの <アクセス対象> よりも限定的な <アクセス対象> であった場合、定義ファイルの中では、より前に出現するように定義しなければなりません。同様に、ある <アクセスユーザ> が、別の <アクセスユーザ> よりも限定的な <アクセスユーザ> であった場合、access ディレクティブの中で、より前に出現するように定義しなければなりません。
access to attr=telephoneNumber by users read ・・・ここで、評価をやめてしまうので、次の文の意味がなくなる。 by self write |
この例では、エントリとして登録されているユーザが、自身のエントリの telephoneNumber 属性を更新できるように定義しようとしています。しかし、アクセスユーザの「self」は、「users」に含まれるため、リポジトリサーバは、「by users read」で評価をやめてしまいます。その結果、エントリして登録されているユーザがアクセスしようとした時に、アクセス対象が自身のエントリであっても、エントリの更新ができなくなります。
これに対して、以下の正しい定義例のように、by 節の記述順序を逆にすることで、意図した定義となります。
access to attr=telephoneNumber by self write by users read |
access to attr=mail by self write ・・・ここで、mail属性の評価をやめてしまう。 access to attr=mail by users read access to attr=userPassword by self write ・・・ここで、userPassword 属性の評価 access to attr=userPassword by * auth をやめてしまう。 |
この例では、同一のアクセス対象に、アクセスユーザごとに access ディレクティブを分けて記述しています。これでは、各アクセス対象の1つ目のaccess ディレクティブで評価をやめてしまいますので、意図したアクセス制御になりません。
これに対して、以下の正しい定義例のように、同一のアクセス対象に対して、複数回 by 節を指定してまとめることで、意図した定義となり、定義内容も確認しやすくなります。
access to attr=mail by self write by users read access to attr=userPassword by self write by * auth |
access ディレクティブは、<アクセス対象> や <アクセスユーザ> の指定を工夫し、少ない数で簡潔に定義することを強く推奨します。大量の access ディレクティブを定義した場合、リポジトリの起動時や、クライアントからのアクセス(操作)要求時などの、運用性能に影響を与える可能性があります。
access to attr=mail by dn="cn=User001,ou=User,o=fujitsu,dc=com" write by dn="cn=User002,ou=User,o=fujitsu,dc=com" write by dn="cn=User003,ou=User,o=fujitsu,dc=com" write by users read access to attr=userPassword by dn="cn=User001,ou=User,o=fujitsu,dc=com" write by dn="cn=User002,ou=User,o=fujitsu,dc=com" write by dn="cn=User003,ou=User,o=fujitsu,dc=com" write by * auth |
この例では、エントリとして登録されているユーザが、自身のエントリのmail 属性、およびuserPassword 属性を更新できるように、ユーザごとに定義しています。
これに対して、以下の良い定義例のように、<アクセスユーザ> を「self」で定義することで、簡潔に少ない行で定義することができます。
access to attr=mail by self write by users read access to attr=userPassword by self write by * auth |
目次
索引
![]() ![]() |