view chapter3.tex @ 18:96fc201c4e8c

add bibi
author tatsuki
date Wed, 18 Feb 2015 12:24:03 +0900
parents b0fd781e3b05
children c197b5dc6e34
line wrap: on
line source

\chapter{組織中の許認可管理\\アプリケーションmaTrix}

maTrixとはSymphonies社が開発しているアカウント管理、許諾判定システムのことである。
人、組織、役割等の情報などを木構造として持っている、それらの情報を関連付けることで組織の構造を表現し、許認可管理を行う。
本章ではmaTrixの説明と、Jungle上におけるmaTrixの実装方法の説明を行う。

\label{chap:concept}

\section{maTrixの保持するデータ構造}
matrixは人、役職、役割、役割記述要素といったデータ(表\ref{list:maTrixData})を用いた組織構造と、許認可の判断に用いるポリシーファイルの2つのデータを持っている。

\begin{table}[h]
\caption{maTrixの保持する木構造データの例}
\label{list:maTrixData}
\begin{center}
\begin{tabular}{|l|l|} \hline
人物   & 人のデータが入っている。personIdを持つ \\ \hline
組織    & 組織のデータが入っている。orgIdを持つ ~\\ \hline
役割  & 人や組織の役割データが入っている。roleIdを持つ ~ \\ \hline
役割記述要素  & 役割が持っている要素が記述されている。rdeIdを持つ ~\\  \hline
\end{tabular}
\end{center}
\end{table}

これらのデータはIdを用いて他の木の参照を行い、組織構造を構築している。
組織構造の例として、人物と組織の組み合わせで組織運用モデルを表現しており、役割は自身のみで役割モデルを表現している。
このように様々な木構造が参照しあうことで多数のデータモデルを表現している。
以下にmaTrixの組織情報モデルを記す(図\ref{fig:sosikiTree})。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 10cm ,bb=0 0 563 325]{fig/sosikiTree.pdf}
\caption{組織モデル表現例}
\label{fig:sosikiTree}
\end{center}
\end{figure}

\newpage
maTrixのデータ構造は、保持している組織情報をxmlやjson形式で出力することができる。
以下に人物Treeをxml形式で出力したデータの一部として、1人分のデータを記述する

\begin{itembox}[l]{}
\begin{verbatim} 
<Persons> 
 <Person id="p:1" type="Person"> 
 <accountId>a:26</accountId> 
 <lastName>東</lastName> 
 <name>東俊一</name> 
 <nameReading>あずましゅんいちくん</nameReading> 
 <roleRefIds>r:10 r:34</roleRefIds> 
 <parentOrganizations type="OrganizationMappedByRole"> 
  <OrganizationMappedByRole type="OrganizationMappedByRole"> 
   <organizationRefId>o:2</organizationRefId> 
   <roleRefId>r:10</roleRefId> 
  </OrganizationMappedByRole> 
  <OrganizationMappedByRole type="OrganizationMappedByRole"> 
   <organizationRefId>o:11</organizationRefId> 
   <roleRefId>r:34</roleRefId> 
  </OrganizationMappedByRole> 
 </parentOrganizations> 
 <priorities type="PriorityMappedByRole"> 
  <PriorityMappedByRole type="PriorityMappedByRole"> 
   <priority>0</priority> 
   <roleRefId>r:10</roleRefId> 
  </PriorityMappedByRole> 
  <PriorityMappedByRole type="PriorityMappedByRole"> 
   <priority>1</priority> 
   <roleRefId>r:34</roleRefId> 
  </PriorityMappedByRole> 
 </priorities> 
 </Person> 
</Persons>
\end{verbatim}
\end{itembox}

\newpage

\begin{table}[h]
\caption{Person.xmlの要素}
\label{list:TreeNode}
\begin{center}
\begin{tabular}{|l|l|} \hline
Persons   & この要素以下にPersonの情報があることを意味する~ \\ \hline
Person    & 人の情報が以下にあることを示す。PersonIdが割り振られている ~\\ \hline
accontId  & そのPersonのアカウントId。Tree同士の参照に用いる。 ~ \\ \hline
lastName  & 苗字   ~ \\ \hline
name      & フルネーム ~\\ \hline
nameReading & 名前のふりがな ~\\ \hline
roleRefIds &  役割のIdを記述する  ~\\ \hline
parentOrganizations & この要素以下にその人が所属している組織のIdを記述する  ~\\ \hline
OrganizationMappedByRole & この要素以下に組織と、その組織の役割を記述する ~\\ \hline
organizationRefId & 所属している組織のId ~\\ \hline
priorities & 人物に割り振られている役割の優先順位を以下に記述する ~\\ \hline
PriorityMappedByRole & この要素以下に役割と優先順位をペアで記述する ~\\ \hline
priority & 役割の優先順位を記述する \\ \hline
\end{tabular}
\end{center}
\end{table}

Person.xmlを例で上げたが、役職や役割も同じような構造でデータを保持しており、maTrixには組織情報からデータを取得するFunctionが15種類実装されている。


\section{Jungle上でのmaTrixのデータ構造の表現}

maTrixが保持している、人物や役職は、木構造のデータであるため直接Jungleに格納できる。
実際に人物のデータを格納したJungleの構造を(図\ref{fig:PersonTree}、図\ref{fig:PersonTree})に示した。

\newpage

\begin{figure}[h]
\begin{center}
\includegraphics[height = 8cm , bb=0 0 398 367]{fig/TreePersonJungle.pdf}
\caption{Jungle上での人物Treeの表現例(1)}
\label{fig:PersonTree}
\end{center}
\end{figure}

\begin{table}[h]
\caption{図\ref{fig:PersonTree}に対応したXML}
\label{list:PersonTree}
\begin{center}
\begin{tabular}{|l|} \hline
\verb|<|Persons\verb|>| \\
\ \verb|<|Person id="p:1" type="Person"\verb|>| \\
\ \ \verb|<|PersonData\verb|>| \verb|<|/PersonData\verb|>| \\ 
\ \verb|<|/Person\verb|>|  \\
\ \verb|<|Person id="p:2" type="Person"\verb|>| \\ 
\ \ \verb|<|PersonData\verb|>| \verb|<|/PersonData\verb|>| \\
\ \verb|<|/Person\verb|>| \\
\verb|<|/Persons\verb|>|\\ \hline
\end{tabular}
\end{center}
\end{table}



図\ref{fig:PersonTree}は、表\ref{list:PersonTree}をJungleに格納したものである。
Jungleは、TreeNodeに\verb|<|Key String, Value Attribtue\verb|>|の組み合わせでデータを保持する。
そのため、XMLのデータをTreeNodeに格納する際、要素の格納は\verb|<| Key "element", Value "要素名"\verb|>|、属性の格納は\verb|<|Key "要素名-属性名", Value "属性値"\verb|>|で格納する。
属性格納時のKeyを、"要素名-属性名"にした理由は、Indexで検索を行う際にKeyの重複を避けるためである。

\clearpage

\begin{figure}[h]
\begin{center}
\includegraphics[height = 12cm , bb=100 0 823 502]{fig/TreePersonJungle2.pdf}
\caption{Jungle上での人物Treeの表現例(2)}
\label{fig:PersonTree2}
\end{center}
\end{figure}

\clearpage

\begin{table}[h]
\caption{図\ref{fig:PersonTree2}に対応したXML}
\label{list:PersonTree2}
\begin{center}
\begin{tabular}{|l|} \hline
\verb|<|Person id="p:1" type="Person"\verb|>| \\
 \ \verb|<|accountId\verb|>|a:26\verb|<|/accountId\verb|>| \\
 \ \verb|<|lastName\verb|>|東\verb|<|/lastName\verb|>| \\
 \ \verb|<|name\verb|>|東俊一\verb|<|/name\verb|>| \\
 \ \verb|<|nameReading\verb|>|あずましゅんいちくん\verb|<|/nameReading\verb|>| \\
 \ \verb|<|roleRefIds\verb|>|r:10 r:34\verb|<|/roleRefIds\verb|>| \\
 \ \verb|<|その他の値\verb|>| \verb|<|/その他の値\verb|>| \\
\verb|<|/Person\verb|>| \\
\hline
\end{tabular}
\end{center}
\end{table}

図\ref{fig:PersonTree2}と表\ref{list:PersonTree2}も同じくPersonTreeの一部をJungleに格納した時の図である。
基本的な構造は図\ref{fig:PersonTree}と変わらないが、1箇所XMLの構造を変えてJungleに格納した箇所があるのでそこの解説を行う。
Jungleはノードにデータを格納する際に、List構造を持つことが出来ないため、keyに対応するvalueは1つしか格納できない。
よって、表\ref{list:PersonTree2}の\verb|<|roleRefIds\verb|>|r:10 r:34\verb|<|/roleRefId\verb|>| の様に、2つの値をテキスト部分が保持している場合どちらか片方しか格納することが出来ない。
そこで、読み込む際にデータ構造を、表\ref{list:maTrixDataChild}の様に書き換えてJungleに格納する。

\begin{table}[h]
\caption{Jungleに対応したXML文例}
\label{list:maTrixDataChild}
\begin{center}
\begin{tabular}{|l|} \hline
\verb|<|roleRefIds\verb|>| \\
\verb|<|roleRefId\verb|>|r:10\verb|<|/roleRefId\verb|>| \\
\verb|<|roleRefId\verb|>|r:34\verb|<|/roleRefId\verb|>| \\
\verb|<|/roleRefIds\verb|>| \\
\hline

\end{tabular}
\end{center}
\end{table}

この様にmaTrixのデータ構造をJungleにマッピングしていく。
また木構造同士の参照を用いて行う組織構造の表現は、JungleではTreeに対する検索で表現する。
\clearpage



\section{maTrixのデータの版管理}

maTrixは、組織構造を構成情報モデルとして表現し、版管理している。
構成情報モデルはversion毎に存在し、各versionに対応した組織構造を構成する木構造の集合を保持している。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 6cm , bb=0 0 463 271]{fig/maTrixVersion1.pdf}
\caption{maTrixの構成情報例1}
\label{fig:maTrixVersion1}
\end{center}
\end{figure}

人物と役職のTreeのversionが共に1の時、構成情報モデルのversionも1とする。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 6cm , bb=0 0 463 271]{fig/maTrixVersion2.pdf}
\caption{maTrixの構成情報例1}
\label{fig:maTrixVersion2}
\end{center}
\end{figure}
構成情報モデルのversion:1の人物Treeを更新した場合、version:2の構成情報が構築され、maTrixはversion:1の構成情報とversion:2の構成情報の両方を保持し、両方の構成情報にアクセスすることが可能である。

\clearpage

\section{JungleでのmaTrixの版管理の表現}

JungleのTreeは、全てのversionのTreeで単一なIdを保持しているため、Idを指定すれば、過去のTreeにアクセスすることが可能である。
それを利用し、Jungle上での過去の変更履歴を保持する構成情報モデルの表現は、構成情報モデルのversionと、各Treeのversionを保持し、関連付ける構成情報モデルTreeを作成し表現した。(図\ref{fig:configTree})。
\begin{figure}[h]
\begin{center}
\includegraphics[height = 8cm ,bb=0 0 563 325]{fig/configTree.pdf}
\caption{構成情報モデルTree表現例}
\label{fig:configTree}
\end{center}
\end{figure}



\begin{table}[h]
\caption{構成情報TreeのTreeNodeが保持しているAttribute}
\label{list:configTree}
\begin{center}
\begin{tabular}{|l|l|} \hline
version   & 構成情報モデルのversion ~ \\ \hline
person    & 構成情報モデルのversionに対応する人物Treeのversion ~\\ \hline
organization  & 構成情報モデルのversionに対応する組織Treeのversion ~ \\ \hline
role  & 構成情報モデルのversionに対応する役割Treeのversion  ~ \\ \hline
rde      & 構成情報モデルのversionに対応する役割記述要素Treeのversion ~\\ \hline
\end{tabular}
\end{center}
\end{table}




実際にどのようにJungle上で過去の構成情報モデルにアクセスするか、例題を用いて説明する。
構成情報モデルversion:3に対応する人物Treeにアクセスする手順を以下に示す。

\begin{enumerate}
\item 構成情報Treeからアクセスしたいversion情報を保持しているNodeを取得する(今回の例題ではversion3)
\item 取得したTreeNodeには、構成情報:version:3に対応した人物Treeなどのversionが記述されているため、人物Treeのverson(v:5)を取得する
\item 2で取得したversionの人物Treeにアクセスする。
\end{enumerate}
といった手順でJungleではmaTrixの構成情報モデルを表現する。


\section{申請の許認可}
maTrixを用いた許認可は、組織構造だけで判断されるわけではない。
アクセス可能な時間や、貸出の場合は同時貸出数の上限など、組織構造以外のアクセスルールは組織構造だけでは表現できない。
そのため、maTrixはアクセス管理のルールを表現方法を定義するXACMLという言語で記述された、ポリシーファイルを用いて許認可判断を行う。。
ポリシーファイルは、リポジトリで管理されており、アクセス要求にあったポリシーファイルが利用される。
以下にmaTrixでの申請の許認可の流れを記述する。

\begin{enumerate}
\item Aさんが、学科のノートPCの借りるために、maTrixに貸出許可を求める。
\item maTrixはリポジトリから、貸出許可を与えるかを判断するためのポリシーを取得する。
\item ポリシーファイルを元に、データにアクセスを行い権限を与えるかどうかを判断する。
\item maTrixは権限に応じて、ノートPCをAさんに貸出許可を与える。
\end{enumerate}
といった流れになる。

maTrixの許認可を使用するメリットとして、許認可のログをとっておくことで、いつ、誰が、どのポリシーを元に、どんなことをしたか、の情報がいつでも取得可能であるため、データの不正改竄等の問題発生時の解決等役立つ。
といったメリットもある。

\clearpage
\section{XACML}
本節ではmaTrixのポリシーファイルの記述に用いられているXACMLについての説明を行う。
XACMLは、データに関するアクセス要求について、その要求元の情報と要求の内容、アクセス対象の組み合わせから、その
アクセス要求が許可されるか否認されるかを判断するためのルールを記述できる。
実際に使用する際は、XACML自体がアクセス制御を行うのではなく、アクセス管理アプリケーションがXACMLを参照しアクセス制御を行う。XACMLは以下の様なデータ構造を持つ(図\ref{fig:xacml})

%\begin{figure}[h]
%\begin{center}
%\includegraphics[height=10cm,bb=0 0 439 610]{fig/XACMLDataflow.pdf}
%\caption{アクセス制御のデータフロー}
%\label{fig:xacmlDataflow}
%\end{center}
%\end{figure}

\begin{figure}[h]
\begin{center}
\includegraphics[height=10cm,bb=0 0 526 308]{fig/XACML.pdf}
\caption{XACMLのデータ構造}
\label{fig:xacml}
\end{center}
\end{figure}


Targetは、誰に対して(Subject)、どのような資源を(Resource)、どのように扱うか(Action)の3つの要素を持ち、それぞれの要素で、評価関数を用いて評価を行う。評価の結果は、Match、No-Match、Indeterminate(評価不能)の3つである



Ruleは、Targetに対する規則を定めるもので、ルールの方針にそってアクセス要求がこのルールに適合した場合に決定する値(Permit、Deny)を、Effectとして設定しておく。
また、Targetとは別にオプションとして条件(Conditions)を付けることも可能である(条件の例としては、アクセスを許可する時間の指定などがある)。
ルールの評価は、Targetの評価関数の結果とConditionの、ルール結合アルゴリズム(表\ref{list:rule})にそって結合する。

\begin{table}[h]
\caption{Ruleの評価}
\label{list:rule}
\begin{center}
\begin{tabular}{|l|l|l|} \hline
Target   & Condition & 評価 ~ \\ \hline
Match   & true & Efferct(Permit or Deny)  ~\\ \hline
Match& false & NotApplicable ~ \\ \hline
Match& Indeteminate & Indeteminate ~ \\ \hline
No-Macth & - & NotApplicate ~ \\ \hline
Indeterminate & - & Indeteminate \\ \hline
\end{tabular}
\end{center}
\end{table}
\newpage

Policy

複数のRuleをまとめたものをPolicyという。
Policyの子要素には、Target、Rule、Obligations(責務)がある。
もしも、PolicyにObligationsが規定された場合は、たとえ、ルール結合後の結果がpermitであったとしても、Obiligationsに記述されていることを同時に実施することが出来なかった場合、承認を拒否する必要がある。
またPolicyが複数のRuleを評価するときは、ルール結合アルゴリズム(表\ref{list:policy})を用いる。

\begin{table}[h]
\caption{XACMLのルール結合アルゴリズム}
\label{list:policy}
\begin{center}
\begin{tabular}{|l|l|} \hline
Deny-overrides   & どれか1つのルールのEffectがDenyであれば結果はDenyとする ~ \\ \hline
Permit-overrides    & どれか1つのルールのEffectががPermitであれば結果はPermitとする ~\\ \hline
First-applicable  & ポリシー内のすべてのルールについて順番に評価して、対象がマッチした場合、\\
& 対象の評価結果をMatchとし、次にConditionを評価し、これがTrueなら\\
&結果はEffectで指定されたPermitまたはDenyとする。 ~ \\ \hline
\end{tabular}
\end{center}
\end{table}

XACMLの評価が終わり、最終的にPermitだった場合その申請は許可される。

\section{Jungle上の許認可}
Jungle上でmaTrixの許認可を行う際は、ポリシーファイルを読み込み、各Treeに対して検索関数を用いて、その結果から許
認可を行う。

maTrixと同じ例題で、Aさんが、学科のノートPCの借りるために貸出申請を行った際の許認可の流れを以下に記す。

\begin{enumerate}
\item 人物Treeから、Aさんのデータを取得し、Aさんに割り振られている役割のIDを取得する。
\item 役割Treeから、1で取得した役割IDのデータを取得し、その役割IDに割り振られている役割記述要素IDを取得する
\item 役割記述要素Treeから、2で取得した役割記述要素IDのデータを取得し、役割記述要素名を取得する
\item 3で取得した役割記述要素名が、琉球大学工学部学生かどうかを調べ、一致した場合は貸出を許可し、一致しなかった場合は貸出を許可しない。
\end{enumerate}

といった流れになる。
Jungleが提供しているのはあくまで組織構造であるため、アクセス可能な時間等の条件に関してJungleは一切関与しない。