view chapter_3.tex @ 12:558dcd1a4583

update abst
author tatsuki
date Tue, 17 Feb 2015 16:48:24 +0900
parents 470dc248d615
children
line wrap: on
line source

\chapter{組織の中の許認可を管理するアプリケーションmaTrix}
本章では、実際にJungleを使用したアプリケーションを紹介する。
\label{chap:concept}

\begin{comment}
\section{XMLReader}
実際にアプリケーション等で使用しているデータを書き出す際に、XML形式を使用することが多い。
JungleXMLReaderは、XMLファイルを読み込み、Jungleにデータとして格納するアプリケーションである。
XMLはデータが木構造になっているため、Jungleにそのまま格納することが可能である。

JungleXMLReaderの実装にはsax(Simple API for XML)を用いて実装を行った。
saxは、XMLのタグやテキストデータを読んだ際にイベントを発生させる。
プログラマは、ContentHandlerという特殊なイベントリスナをsaxのparserに登録すると、構文解析処理の過程でXMLの要素を読んだ際に、発生するイベントを取得できる。
イベントには、読み込んだタグの名前やテキストデータが含まれているため、プログラマは構文解析結果を随時受け取ることが出来る。
\clearpage

saxで構文解析の途中に発生するイベントは多数あるが、今回XMLReaderで使用したイベントだけ以下に記述する。

\begin{figure}[htpb]
\begin{center}
\includegraphics[height=10cm,bb= 0 0 358 500]{fig/sax.pdf}
\caption{イベントが呼ばれるタイミングの例}
\label{fig:sax}
\end{center}
\end{figure}

\begin{table}[h]
\caption{発生するイベント一覧}
\label{list:configTree}
\begin{center}
\begin{tabular}{|l|l|} \hline
イベント名  & 呼ばれるタイミング ~ \\ \hline
startDocument  & XMLのParseを始める際に呼ばれる ~ \\ \hline
startElement    & 要素を読み込んだ際に呼ばれる  ~\\ \hline
characters  &  要素のTextを読み込んだ際に呼ばれる ~ \\ \hline
endElement  &  要素が終わった時に呼ばれる ~ \\ \hline
endDocument & XMLのParseが終わった際に呼ばれる  ~\\ \hline
\end{tabular}
\end{center}
\end{table}

saxでは、org.xml.sax.helpers.DefaultHandlerという形で、ContentHandlerのデフォルト機能が提供されているため、プログラマはこれを継承することで、必要なイベント処理のみをoverrideして記述できるようになっている。
JungleXMLReaderで使用しているReadXmlHandlerは、要素を読み込んだ時、テキストを読み込んだ時、要素が終わった時、XMLのParseが終わった時、の4つのイベントを使用している。

\begin{itembox}[l]{sax example}
\begin{verbatim} 
SAXParser saxParser = saxParserFactory.newSAXParser();
ReadXmlHandler readXmlHandler = new ReadXmlHandler();
saxParser.parse(new FileInputStream(xmlPath), readXmlHandler);
\end{verbatim}
\end{itembox}

sax exampleは、実際にsaxPerserを生成し構文解析を発生させるまでのコードである。
\begin{enumerate}
\item 最初にsaxParserFactory.newSAXPerser()で新しいParserを生成する
\item 次にDefaultHandlerを継承したReadXmlHandlerのインスタンスを生成する
\item 最後にparser.parse(XMLFile,DefaultHandler)に読み込みたいXMLファイルと生成したContentHandlerを渡し構文解析を行う。
\end{enumerate}

\end{comment}


maTrixとはSymphonies社が開発しているアカウント管理、許諾判定システムのことである。
人や組織の情報などを保持しており、それらを関連付けることで表現している。
今現在maTixはPostgreSQLを使用している。本研究は実用アプリケーションであるmaTrix上にJungleを組み込み評価することが目的であるので、maTrixについても本章で解説することとする。


\section{maTrixにおけるアプリケーションのアカウント管理}


maTrixを使用しなかった場合、図\ref{fig:maTrix1}のようにアプリケーションごとにアカウントを作る必要があり、userの権限等が変わった際に、全てのアカウントの更新を行う必要があるため、手間がかかったり、ミスが発生するなど、業務に支障をきたすおそれがある。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 6cm , bb=0 0 538 339]{fig/maTrix1.pdf}
\caption{maTrixにおけるアカウント管理例1}
\label{fig:maTrix1}
\end{center}
\end{figure}

しかしmaTrixを用いることで図\ref{fig:maTrix2}の様に、maTrixのアカウント1つで全ての業務アプリケーションにアクセスできるため、userの権限が変わったとしてもmaTrixのアカウントの更新だけしか行う必要がないので、手間もかからず、ミスも発生しづらい。


\begin{figure}[h]
\begin{center}
\includegraphics[height = 6cm , bb=0 0 538 301]{fig/maTrix2.pdf}
\caption{maTrixにおけるアカウント管理例2}
\label{fig:maTrix2}
\end{center}
\end{figure}




\section{maTrixの保持するデータ構造}
matrixは人、役職、役割、権限と言った木構造の組織、許認可の判断に用いるポリシーファイルの2つのデータを持っている。
maTrixが保持しているデータはお互いに参照している。%(図\ref{fig:refmaTrixData})。
また、過去のデータも全て保持し、それらのデータはまとめて構成情報モデルとして版管理している。

%\begin{figure}[h]
%\begin{center}
%\includegraphics[bb=0 0 388 201]{fig/refMatrixData.pdf}
%\caption{maTrixにおけるアカウント管理例2}
%\label{fig:refmaTrixData}
%\end{center}
%\end{figure}



\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}
構成情報モデルのversion1の人物Treeのデータを更新した場合、新しくversion:2の構成情報が構築され、maTrixはversion:1の構成情報とversion:2の構成情報の両方を保持し、両方の構成情報にアクセスすることが可能である。

maTrixのデータ構造は、木構造であるため、組織のTreeをxmlやjson形式で出力することができる。
以下に人物Treeをxml形式で出力したデータの一部を記述する。

\begin{itembox}[l]{}
\begin{verbatim} 
<Persons> 
<Person id="p:1" type="Person"> 
<accountId>a:26</accountId> 
<lastName>東</lastName> 
<name>東俊一</name> 
<nameReading>あずましゅんいちくん</nameReading> 
<roleRefIds>
<roleRefId>r:10</roleRefId> 
<roleRefId>r:34</roleRefId> 
</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}

\clearpage

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

Person.xmlを例で上げたが、役職Treeや役割Treeも同じような構造でデータを保持している。

\section{Jungle上でのmaTrixのデータ構造の表現}
本節では、前節で述べた、maTrixのデータ構造をどのようにJungleで表現するかを記述する。
人物Treeや役職Treeは、木構造のデータであるためそのままJungleに格納することができる。
実際に人物Treeを格納した際のデータの形(図\ref{fig:PersonTree})を以下に示す。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 23cm , bb=150 0 1407 1603]{fig/JungleXmlTree.pdf}
\caption{Jungle上での人物Tree表現例}
\label{fig:PersonTree}
\end{center}
\end{figure}


\clearpage

Jungle上での、構成情報モデルの表現は、構成情報モデルTreeを作成し管理する(図\ref{fig:configTree})。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 8cm ,bb=0 0 530 347]{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が記述されている(図\ref{fig:configTree})ので、人物Treeのverson(v:5)を取得する
\item 2で取得したversionの人物Treeにアクセスする。
\end{enumerate}
といった手順でJungleではmaTrixの構成情報モデルを表現する。
以下にJungle上での構成情報モデル表現の図(\ref{fig:configTree2})を記す。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 15cm ,bb=0 0 1092 703]{fig/configModel.pdf}
\caption{構成情報モデルTree表現例2}
\label{fig:configTree2}
\end{center}
\end{figure}

\clearpage
\section{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 439 610]{fig/XACML.pdf}
\caption{XACMLのデータ構造}
\label{fig:xacml}
\end{center}
\end{figure}


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



Ruleは、Targetに対する規則を定めるもので、ルールにそれぞれ適合した場合に決定する値(Permit、Deny)を、Effectとして設定しておく。
また、それとは別にオプションとしてConditionsを付けることも可能である。
ルールの評価は、ルール結合アルゴリズム(表\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}

maTrixでは、許認可を行う際に使用するPolicyFileをXACMLで記述している。

\clearpage
\begin{itembox}[l]{xacmlの記述例}
\begin{verbatim}
<?xml version="1.0" encoding="UTF-8"?>
<Policy
PolicyId="urn:srl-oasis:names:matrix:tank:aso-sample:01-01:policy"
RuleCombiningAlgId = ここにXACMLのルール結合アルゴリズムを記述する`
<Target>
//誰が、どこに、何を出来るかのルールを記述する
</Target>
<Rule 
RuleId="urn:srl-oasis:names:matrix:tank:aso-sample:01-01-01:rule"
Effect="Deny">
<Target>
<Subjects>
<Subject>//操作できる人の条件を記述</Subject>
</Subjects>
<Redources>
<Redource>//どのリソースに対してアクセスできるかを記述</Redource>
</Redources>
<Actions>
<Action>//どんな操作を許可するかを記述</Action>
</Actions>
</Target> 
<Condition>
ターゲット意外に対する規則があればここに記述する
</Condition>
</Rule>
<Rule>
//省略
</Rule>
</Policy>
\end{verbatim}
\end{itembox}

\newpage

\section{Jungle上でのmaTrixの許認可}
Jungle上でmaTrixの許認可を行う際は、XACMLを読み込み、各Treeに対して検索を行いその結果から許認可を行う。

例えば、Aさんが、管理者しか閲覧出来ない資料を閲覧しようとした場合は

\begin{enumerate}
\item 人物Treeから、Aさんのデータを取得し、Aさんに割り振られている役割のIDを取得する。
\item 役割Treeから、1で取得した役割IDのデータを取得し、その役割IDに割り振られている役割記述要素IDを取得する
\item 役割記述要素Treeから、2で取得した役割記述要素IDのデータを取得し、役割記述要素名を取得する
\item 3で取得した役割記述要素名が、管理者かどうかを調べ、一致した場合はアクセスを許可し、一致しなかった場合はアクセスを拒否する。
\end{enumerate}

といった流れになる。

\section{XACMLInterpreter}
XMLReaderと同じようsaxにを用いて実装している。
XACMLInterpreterは、引数に、使用するpolicyFile名、どのResourceにアクセスするか、どんな処理を行うか(action)、許認可を求める人のUserID等を与える。

XAMLInterpreterでHandlerが使用しているイベントは、XMLReaderと同じで、startElement、charactor、endElement、endDocumentの4つを使用している。

startElementでは、主に評価関数や、評価関数の引数等を取得する。
また評価関数が入れ子になっていることがあるため、functionStackとattributeStackを用いて評価関数と引数を関連付けている。\ref{fig:functionStack}

\begin{figure}[h]
\begin{center}
\includegraphics[height=5cm,bb=0 0 426 299]{fig/xacmlStack.pdf}
\caption{XACMLのデータ構造}
\label{fig:functionStack}
\end{center}
\end{figure}

charactorでは、評価関数の引数を取得し、AttributeStackにpushする

endElementでは。評価関数の実行を行う。
以下に入れ子になっている評価関数例と、その時の処理の流れを記述する。
\clearpage
\begin{itembox}{入れ子になっている関数の例}
\begin{verbatim}
<Apply FunctionId=評価関数1>
 <Apply FunctionId=評価関数2>
  <ResourceAttributeDesignator
  AttributeId=評価関数2の引数
  DataType=評価関数2の引数のデータ型>
 </Apply>                    
 <SubjectAttributeDesignator
 AttributeId=評価関数1
 DataType=評価関数1のデータ型>
</Apply>
\end{verbatim}
\end{itembox}



\begin{enumerate}
\item $<$Apply$>$を読み込んだ際に、functionStackに評価関数1をpushする
\item 新しい評価関数1に対応する引数(List<String>)をattributeStackにpushする。
\item 2つ目の$<$Apply$>$を読み込んだ際に、functionStackに評価関数2をpushする
\item 新しい評価関数2に対応する引数(List<String>)をattributeStackにpushする。
\item $<$ResourceAttributeDesignator$>$を読み込んだ際に、attributeListから評価関数2に対応するattirbuteListを取得する

\item attributeListに評価関数2の引数をaddし、attirbuteStackにpushする。
\item $<$/Apply$>$を読み込んだ際に、attributeStackから評価関数2の引数を取得する
\item 7で取得した引数を用いてfunctionStackから取得した評価関数2を実行する
\item attributeStackから評価関数1のattributeListを取得し、評価関数2の結果をaddする
\item 評価関数1のattribtueListをattributeStackにpushする
\item $<$SubjectAttributeDesignator$>$を読み込んだ際に、attributeStackから評価関数1のattributeListを取得し、評価関数1の引数をaddする。
\item $<$/Apply$>$を読み込んだ際に、attributeStackから評価関数1の引数を取得する
\item 12で取得した引数を用いてfunctionStackから取得した評価関数1を実行する
\end{enumerate}

endDocumentでは、これまでに実行した評価関数等の結果から今回の許認可を判断する。