XACMLは、OASISのeXtensible Access Control Markup Language TCにおいて検討されている、アクセス制御のための言語仕様です。当初の計画よりも遅れてはいますが、OASIS内部でのレビュー用のドラフト仕様発行に向けて、現在活発に議論されており、日々その内容が更新されています。ここでは、そのXACMLについて、概要を簡単にご紹介します。詳細に関しては、OASISのXACMLのページをご参照ください。
XACMLは、OASISのeXtensible Access Control Markup Language TCにおいて検討されている、アクセス制御のための言語仕様です。当初の計画よりも遅れてはいますが、OASIS内部でのレビュー用のドラフト仕様発行に向けて、現在活発に議論されており、日々その内容が更新されています。ここでは、そのXACMLについて、概要を簡単にご紹介します。詳細に関しては、OASISのXACMLのページをご参照ください。
XACMLでは、XMLで表現されるデータに関するアクセス要求について、その要求元の情報と要求の内容、アクセス対象の組み合わせから、そのアクセス要求が許可されるか否認されるかを判断するためのルールを記述することができます。つまり、XACMLは、アクセス制御を実際に行うのではなくて、アクセス制御を実施するためのもととなるデータの表現方法を定義しています。そして、このもととなるデータを「ルール」または「ポリシー」と呼びます。
また、XACMLでは、アクセス制御に関する全ての項目を定義するのではなく、他の有効な規格/勧告(案)と協調し、それを利用することで、重複定義に伴ういろいろな問題を回避しようとしています。例えば、アクセス要求の内容としてはたくさんの候補が考えられます(例えば、読む、書くなど)が、その定義はSAMLを利用します。さらに、「ポリシー」の正当性(だれも改竄していないことの証明)は、XML Digital Signatureを用いることを推奨しています。
XACMLは上記のようなものですから、一般の利用者が、直接XACMLを理解して編集したり参照したりすることはないはずです。おそらく、実際のシステムにおいては、専用のエディタ(アクセス管理アプリケーション)を使って設定し運用するのでしょうから、XACML自身は縁の下の力持ちとして、人目につかないところで活躍することになるでしょう。
近年、インターネットの利用の拡大によりセキュリティ技術が注目されていることは言うまでもありません。こういった流れの中で、XMLにおいても、署名や暗号化などが提案され勧告となってきています。そして、2000年には、IBMからはXML Security Suiteとしていくつかのセキュリティ技術の実装と仕様のパッケージが提案されました。この中に、XML文書に対するアクセス制御を行うための仕様としてXACL(XML Access Control)がありました。
この提案されたXACLの仕様は、とてもシンプルで有効なものです。アクセスを管理するXML文書に対して、3つのプリミティブで制御します。そのプリミティブは、「サブジェクト(ユーザID、グループ、役割名)」、「対象(XML文書を示します)」と「動作」から成っています。そして、その「動作」としては、読み込み、書き込み、生成と削除が定義されています。これは、XACLのシンプルな動作モデルにおいては問題になりません。しかし、制御の対象となるXML文書の種類を増やそうと考えると、大きな問題となってしまいます。例えば、「動作」が事前に定義された典型的な4つに制限されてしまっていることは、アクセス制御の対象に大きな制限を加えてしまっています(制限の対象が電話機を示していた場合、その利用許可はどの「動作」に基づけばいいのでしょう?)。このように、XMLが表現できるデータと同様の汎用性を持つという観点では、XACLには課題があります。
そこで、このXACLの課題を解決し、より適用範囲を広げた形で、アクセスの制御ポリシーを表現するための言語を提案する活動が、2001年4月からOASISのXACML TCで行われるようになりました。
「背景」でも説明しましたように、XACMLでは、XMLを使って参照できる全ての対象に関して、アクセス制御ポリシーを表現できることを目標としています。また、中心となるスキーマに関しては、将来的な未知の機能に関しての拡張性を持つことを目指しています。
そして、既存のプロトコルへのバインドが可能であることを確認したり、必要であれば新しいプロトコルの定義も行ったりするようです。ただし、他の標準的な技術(規格/勧告(案))を可能な限り採用することで、シンプルで保守のしやすい仕様であることを前提としています。
これらの概念的な目標を基本として、具体的なユースケースを挙げて、言語仕様の検討を進めています。そのユースケースには、以下のようなものがあり、応用範囲としては当然ながら多岐にわたっています。
これらのユースケースを視野に入れ、XACMLの言語仕様は設計されています。
ここでは、XACMLの想定するアクセス制御におけるモデルについて説明します。
この文書では、いくつかの特別な用語が出てきますので、事前に説明しておきます。
XACMLでは、以下の図のようなデータの流れで、アクセス制御を実施します。
このモデルでは、以下のような順番で処理が行われます。
XACMLでは、ルール、ポリシーステートメントとポリシーセットステートメントをモデルとして、アクセス制御ポリシーを表現します。
ルール(rule)は主に「対象(target)」、「結果(effect)」と「条件(condition)」から成り立っていて、アクセス制御のもととなる部分です。
まず、「対象」はルールが適用される「資源(resources)」、「サブジェクト(subjects)」と「動作(actions)」の組み合わせを表します。「結果」はルールの作成者の意図を表し、「許可(allow)」か「不許可(deny)」のどちらかの値になります。そして、「条件」はルールを適用するかどうかを示す条件式を表し、その条件式の評価結果は「真(true)」、「偽(false)」または「不定(indeterminate)」の値になります。
PDPは権限に関する意思決定の際、要求に対応する「対象」を探し、そのルールが「条件」によって有効かどうかを判断し、「結果」によって許可か不許可かを判断します。
ポリシーステートメントは、複数のルールをまとめたものです。PAPは複数のルールをひとつのポリシーにまとめることができます。このポリシーは、「対象」、「ルール結合アルゴリズム識別子(rule-combining algorithm identifier)」、「ルールの集合(rules)」と「責務(obligation)」から成り立ちます。
「対象」はルール内の「対象」と同様です。「ルール結合アルゴリズム識別子」は、ルールをまとめる際に用いたアルゴリズムの識別子です。現在では「deny overrides」を示す値のみが定義されています。ルールには「責務」は記述できませんでしたが、権限付与の決定の際に使われたポリシーに記載された「責務」は、PDPによって、PEPに通知されます。
ポリシーセットステートメントは、複数のポリシーステートメントをまとめたものです。ほとんどは、ポリシーステートメントとの相違はありません。「ポリシー結合アルゴリズム識別子(policy-combining algorithm identifier)」が異なりますが、ポリシーステートメントにおける「ルール結合アルゴリズム識別子」とほぼ同様のものです。
上述した様々な要素の関係を図に示すと、以下のようになります。
ここでは、医療記録のXML文書を例にして、そのXML文書に対するアクセス制御ポリシーがXACMLによってどのように表現されるかを説明します。
以下に示すのは、この例でアクセス制御の対象となるXML文書です。これは、架空の患者に関する医療の記録です。ここには、患者の住所や生年月日、保険、薬、血圧の測定結果などが記載されています。
| <?xml version="1.0" encoding="UTF-8"?> |
| <record xmlns="medico.com/records.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="medico.com/records.xsd |
| D:\MYDOCU~1\Standards\XACML\record.xsd"> |
| <patient> |
| <patientName> |
| <first>Bartholomew</first> |
| <last>Simpson</last> |
| </patientName> |
| <patientContact> |
| <street>27 Shelbyville Road</street> |
| <city>Springfield</city> |
| <state>MA</state> |
| <zip>12345</zip> |
| <phone>555.123.4567</phone> |
| <fax/> |
| <email/> |
| </patientContact> |
| <patientDoB xsi:type="date">1992-03-21</patientDoB> |
| <patientGender xsi:type="string">male</patientGender> |
| <policyNumber xsi:type="string">555555</policyNumber> |
| </patient> |
| <parentGuardian> |
| <parentGuardianName> |
| <first>Homer</first> |
| <last>Simpson</last> |
| </parentGuardianName> |
| <parentGuardianContact> |
| <street>27 Shelbyville Road</street> |
| <city>Springfield</city> |
| <state>MA</state> |
| <zip>12345</zip> |
| <phone>555.123.4567</phone> |
| <fax/> |
| <email>homers@aol.com</email> |
| </parentGuardianContact> |
| </parentGuardian> |
| <primaryCarePhysician> |
| <physicianName> |
| <first>Julius</first> |
| <last>Hibbert</last> |
| </physicianName> |
| <physicianContact> |
| <street>1 First St</street> |
| <city>Springfield</city> |
| <state>MA</state> |
| <zip>12345</zip> |
| <phone>555.123.9012</phone> |
| <fax>555.123.9013</fax> |
| <email/> |
| </physicianContact> |
| <registrationID>ABC123</registrationID> |
| </primaryCarePhysician> |
| <insurer> |
| <name>Blue Cross</name> |
| <street>1234 Main St</street> |
| <city>Springfield</city> |
| <state>MA</state> |
| <zip>12345</zip> |
| <phone>555.123.5678</phone> |
| <fax>555.123.5679</fax> |
| <email/> |
| </insurer> |
| <medical> |
| <treatment> |
| <drug> |
| <name>methylphenidate hydrochloride</name> |
| <dailyDosage>30mgs</dailyDosage> |
| <startDate>1999-01-12</startDate> |
| </drug> |
| <comment>patient exhibits side-effects of skin coloration and carpal degeneration</comment> |
| </treatment> |
| <result> |
| <test>blood pressure</test> |
| <value>120/80</value> |
| <date>2001-06-09</date> |
| <performedBy>Nurse Betty</performedBy> |
| </result> |
| </medical> |
| </record> |
この文書のアクセス制御のポリシーが、XACMLどのように表現されるかを見ていくことにしましょう。
最初の例には、「患者であれば全てのレコードを読むことができる」というルールが記述されています。
| <rule ruleId="//medico.com/rules/rule1" effect="Permit" xmlns="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd" xmlns:saml="http://www.oasis- |
| open.org/committees/security/docs/draft-sstc-schema-assertion-28.xsd" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd |
| D:\MYDOCU~1\Standards\XACML\V12SCH~1\XACMLV~3.XSD"> |
| <description>A person may read any record for which he or she is the designated patient</description> |
| <target> |
| <subjects> |
| <saml:Attribute AttributeName="RFC822Name" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>*</saml:AttributeValue> |
| </saml:Attribute> |
| </subjects> |
| <resources> |
| <saml:Attribute AttributeName="documentURI" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>//medico.com/record.*</saml:AttributeValue> |
| </saml:Attribute> |
| </resources> |
| <actions> |
| <saml:Action>read</saml:Action> |
| </actions> |
| </target> |
| <condition> |
| <equal> |
| <saml:AttributeDesignator AttributeName="requestor" AttributeNamespace="//oasis- |
| open.org/committees/xacml/docs/identifiers/"/> |
| <saml:AttributeDesignator AttributeName="patientName" |
| AttributeNamespace="//medico.com/record/patient/"/> |
| </equal> |
| </condition> |
| </rule> |
まず、<target>要素で、「すべてのもの(“RFC822Name”という名前の属性を持つもの)」は、「文書中の全てのレコード(“documentURI”という名前の属性の値が、”//medico.com/record.*”にマッチするもの)」に対して、「読み取り(read)」の権利を持つことがわかります。しかし、このとき条件が<condition>要素中に記述されており、「要求者(requester)が、患者(patientNameを持つ)である」ときということになります。
次の例には、「患者が16歳以下であれば、その患者の親や保護者が全てのレコードを読むことができる」というルールが記述されています。
| <?xml version="1.0" encoding="UTF-8"?> |
| <rule ruleId="//medico.com/rules/rule2" effect="Permit" xmlns="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd" xmlns:saml="http://www.oasis- |
| open.org/committees/security/docs/draft-sstc-schema-assertion-28.xsd" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd |
| D:\MYDOCU~1\Standards\XACML\V12SCH~1\XACMLV~3.XSD"> |
| <description>A person may read any record for which he or she is the designated parent or guardian, and for which the patient is under 16 years of age</description> |
| <target> |
| <subjects> |
| <saml:Attribute AttributeName="RFC822Name" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>*</saml:AttributeValue> |
| </saml:Attribute> |
| </subjects> |
| <resources> |
| <saml:Attribute AttributeName="documentURI" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>//medico.com/record.*</saml:AttributeValue> |
| </saml:Attribute> |
| </resources> |
| <actions> |
| <saml:Action>read</saml:Action> |
| </actions> |
| </target> |
| <condition> |
| <and> |
| <equal> |
| <saml:AttributeDesignator AttributeName="requestor" AttributeNamespace="//oasis- |
| open.org/committees/xacml/docs/identifiers/"/> |
| <saml:AttributeDesignator AttributeName="parentGuardianName" |
| AttributeNamespace="//medico.com/record/parentGuardian/"/> |
| </equal> |
| <not> |
| <greaterOrEqual> |
| <minus> |
| <saml:AttributeDesignator AttributeName="today'sDate" AttributeNamespace="//medico.com/"/> |
| <saml:AttributeDesignator AttributeName="patientDoB" AttributeNamespace="//medico.com/record/patient/"/> |
| </minus> |
| <saml:Attribute AttributeName="ageOfConsent" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>16-0-0</saml:AttributeValue> |
| </saml:Attribute> |
| </greaterOrEqual> |
| </not> |
| </and> |
| </condition> |
| </rule> |
<target>要素は、前に示した例と同様です。異なるのは<condition>要素で、まず「要求者(requester)が親か保護者(parentGuardianNameを持つ)」であり、「患者の年齢が16歳以上でない」場合に、条件が「真」になります。ここで、患者の年齢を算出するための演算と、大小比較が行われていることがわかります。
この例には、「患者の主担当の医師は全ての要素に書き込みが可能だが、記録が変更された場合には患者に電子メールで通知する」というルールが記述されています。
| <?xml version="1.0" encoding="UTF-8"?> |
| <saml:Assertion MajorVersion="0" MinorVersion="24" AssertionID="A7F34K90" Issuer="medico.com" |
| IssueInstant="2002-03-22T08:23:47-05:00"> |
| <policyStatement policyId="//medico.com/rules/policy3" ruleCombiningAlgId="//www.oasis- |
| open.org/committees/xacml/docs/ruleCombiningAlgorithms/denyOverrides" xmlns="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd" xmlns:saml="http://www.oasis- |
| open.org/committees/security/docs/draft-sstc-schema-assertion-28.xsd" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd |
| D:\MYDOCU~1\Standards\XACML\V12SCH~1\XACMLV~3.XSD"> |
| <description>A physician may write any medical element for which he or she is the designated primary care |
| physician, provided an email is sent to the patient</description> |
| <target> |
| <subjects> |
| <saml:Attribute AttributeName="role" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>physician</saml:AttributeValue> |
| </saml:Attribute> |
| </subjects> |
| <saml:Attribute AttributeName="documentURI" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>//medico.com/record/medical.*</saml:AttributeValue> |
| </saml:Attribute> |
| </resources> |
| <actions> |
| <saml:Action>write</saml:Action> |
| </actions> |
| </target> |
| <ruleSet> |
| <rule ruleId="//medico.com/rules/rule3" effect="Permit"> |
| <description>A physician may write any medical element for which he or she is the designated primary care physician</description> |
| <target> |
| <subjects> |
| <saml:Attribute AttributeName="role" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>physician</saml:AttributeValue> |
| </saml:Attribute> |
| </subjects> |
| <resources> |
| <saml:Attribute AttributeName="documentURI" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>//medico.com/record/medical.*</saml:AttributeValue> |
| </saml:Attribute> |
| </resources> |
| <actions> |
| <saml:Action>write</saml:Action> |
| </actions> |
| </target> |
| <condition> |
| <and> |
| <equal> |
| <saml:AttributeDesignator AttributeName="requestor" AttributeNamespace="//oasis- |
| open.org/committees/xacml/docs/identifiers/"/> |
| <saml:AttributeDesignator AttributeName="physicianName" |
| AttributeNamespace="//medico.com/record/primaryCarePhysician/"/> |
| </equal> |
| <present> |
| <saml:AttributeDesignator AttributeName="patient/email" |
| AttributeNamespace="//medico.com/record/"/> |
| </present> |
| </and> |
| </condition> |
| </rule> |
| </ruleSet> |
| <obligations> |
| <obligation ObligationId="//medico.com/emailer" fulfilOn="Permit"> |
| <saml:AttributeDesignator AttributeName="patient/email" AttributeNamespace="//medico.com/record/"/> |
| <saml:Attribute AttributeName="messageText" AttributeNamespace="//medico.com/"> |
| <saml:AttributeValue>Your medical record has been accessed by:</saml:AttributeValue> |
| </saml:Attribute> |
| <saml:AttributeDesignator AttributeName="requestor" AttributeNamespace="//oasis-open.org/committees/xacml/docs/identifiers/"/> |
| </obligation> |
| </obligations> |
| </policyStatement> |
| </saml:Assertion> |
今までの例と異なり、この記述ではルートの要素が<policyStatement>になっています。これは、<rule>要素では責務(obligation)が記述できないためです。また、<policyStatement>要素は、<ruleSet>要素の子要素として複数の<rule>要素をもつことができます。しかし、ここでは、ひとつの<rule>要素しか記述されていません。ここで記述されている<rule>は、前述した例とほぼ同じです(動作が「書き込み(write)」になっているなどという違いがあります)。
このルールに適合した場合、PDPは、このポリシーに記述された<obligations>要素を参照します。その中にある<obligation>要素の記述に従い、権限が与えられた(permit)場合には、<obligation>要素の内容をPEPに送ります。PEPは、送られた内容に従い、患者に対して「医療記録が医師により更新された」という内容の電子メールを送付します。
この例では、「システム管理者は、患者の医療関連の要素にはアクセスできない(読むことも書くこともできない)」というルールが記述されています。
| <?xml version="1.0" encoding="UTF-8"?> |
| <rule ruleId="//medico.com/rules/rule4" effect="Deny" xmlns="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd" xmlns:saml="http://www.oasis- |
| open.org/committees/security/docs/draft-sstc-schema-assertion-28.xsd" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oasis- |
| open.org/committees/xacml/docs/draft-xacml-schema-policy-12.xsd |
| D:\MYDOCU~1\Standards\XACML\V12SCH~1\XACMLV~3.XSD"> |
| <description>An administrator shall not be permitted to read or write medical elements of a patient record</description> |
| <target> |
| <subjects> |
| <saml:Attribute AttributeName="role" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>administrator</saml:AttributeValue> |
| </saml:Attribute> |
| </subjects> |
| <resources> |
| <saml:Attribute AttributeName="documentURI" AttributeNamespace="//medico.com"> |
| <saml:AttributeValue>//medico.com/record/medical.*</saml:AttributeValue> |
| </saml:Attribute> |
| </resources> |
| <actions> |
| <saml:Action>read write</saml:Action> |
| </actions> |
| </target> |
| </rule> |
<rule>要素の属性として、「effect=”deny”」と記述されています。これは、ルールの適合した要求は、権限が否認されることを示します。そのため、「役割(role)が管理者(administrator)であり、医療関連のレコードに対する、読み書きの操作(read write)」は、PDPによって権限を与えられず、操作が拒否されます。
前述したように、XACMLでは他のさまざまな規格/勧告(案)を利用し、仕様をシンプルに保つよう考慮しています。ここでは、そのような他の規格/勧告(案)との関連について言及します。
基本的なXML技術である、XML 1.0、XML SchemaやNamespaceは、もちろん利用されています。それ以外には、以下のような技術が使われています。また、ここでは挙げませんが、個人やグループを認証する機構や、それをXML文書の中に表現するための方法も、必要となります。
アクセス制御の対象となるXML文書のひとつのノード、またはノードの集合を指し示すために用いられています。
実に様々な場所でSAMLの仕様が用いられています。基本的な部分では、PEP/PDP間とPDP/PIP間のメッセージ交換は、SAMLの形式です。そして、PEP/PDP間のメッセージにはXACMLの<obligates>要素などが含まれます。
XACMLのポリシーの記述においても、SAMLの果たす役割は大きいです。例えば、ほとんどのXACMLの子要素として、SAMLの<Attribute> / <AttributeValue>要素が使われており、<actions>要素では、SAMLの<Action>要素を子要素として持ちます。
このようにSAMLと密接に結びついているわけですが、XACMLからSAMLに対する仕様拡張の提案もあるようですから、これからもより緊密に協調して仕様策定されるでしょう。
XACMLで記述されたアクセス制御ポリシーは、XML文書ですから、それをそのままの形で放置しておくと、誰かが、そのポリシーを変更し、ユーザの期待したアクセス制御が行われなくなってしまいます。また、XACMLのシステムで使われるサブシステム間のメッセージの交換においても、途中でメッセージ(XACMLの記述を含む)が改竄される可能性もあります。
これらを回避、もしくは改竄を検知するためには、XACMLでは特別な機構を用意せず、XML Digital Signatureを適切に使用することを推奨しています。さらに、SSL/TLS、XML Encryptionといった技術と組み合わせることによって、強固なアクセス制御機構を実現することができるでしょう。
XACMLで記述されたポリシーは、LDAPによって配布されることも想定されています。