インフラ系SEの技術メモ

雑なエンジニアが低信頼性のメモを書いています。参考程度にとどめてください。

(SiteMinder)XPSExportのXMLから情報を抜き出してみた

Symantec SiteMinderにはXPSExportというポリシーストアデータを移行するためのツールがありますが、そのXMLファイルからリソース情報やポリシー情報を引き抜いた際の試行錯誤をメモとして残しておきます。バージョンはSymantec SiteMinder Ver 12です。

ASCIIコードの前処理

出力したファイルはUTF-8のように見えますが、ファイルがASCII textだったため

$ head test.xml 
<?xml version="1.0" encoding="UTF-8"?>
<XPS>
    <XPSVersion>1</XPSVersion>
    <HostInformation>xx</HostInformation>
    <XPSAdmin>os:xx</XPSAdmin>
    <PolicyData IsDumpExport="true">
        <References>
..

中を見ると以下のように%2F(テキストの終わり)や%03(/)といったASCIIコードが含まれていました。

<StringValue>IgnoreUrl=2=%2Fhoge%2Fhoge%2Ftest.html%03%2Fhoge%2Fhoge%2Fhoge%2Fhoge%03%...

なので力技で%2Fを改行に、%2Fを/に変換しています。

$ cat test.xml |  sed -e "s/%03/@@@/g" | tr '@@@' '\n'  | sed -e "s/%2F/\//g"

リソース関連

URLを定義しているリソース設定が以下のように囲まれているため

<StringValue>HOGE/fuga*</StringValue>

それを抜き出すためにルール名は

$ cat test.xml | grep -A 1 "CA.SM::Rule.Name" | grep String | more | cut -d">" -f2 | cut -d"<" -f1 > RuleName.list

ルールの中身は以下で出力して

$ cat test.xml | grep -A 1 "CA.SM::Rule.Resource" | grep String | cut -d">" -f2| cut -d"<" -f1 > RuleResource.list

以下で結合をすることで「ルール名,ルールの中身」というCSVファイルを作成します。

$ paste -d , RuleName.list RuleResource.list > RuleNameResource.csv

ポリシー関連

ポリシー名は以下のようなXML文のため

<Property Name="CA.SM::Policy.Name">
 <StringValue>xx</StringValue>

Policy.Nameで検索を行うことでポリシー名の一覧が取得できます。

$ cat test.xml | grep -A 1 "CA.SM::Policy.Name"  | grep String | cut -d">" -f2 | cut -d"<" -f1

そのポリシーの条件はUserPolicy.FilterPathに格納されているので下記にて取得を行うことで

$ cat test.xml | grep -A 1 "CA.SM::UserPolicy.FilterPath"  | grep String | cut -d">" -f2 | cut -d"<" -f1 | sed -e "s/&apos;/'/g" | sed -e "s/'//g" 

例えばSQL文による条件が確認できます。

select HOG from xx where XX in (1,2,3,4,5)

最後はポリシー名とポリシー条件ですが、ポリシー名にFilterPathが存在しないものがあるのでtailコマンドで数合わせを行った上で

$ paste -d , PolicyName.list PolicyFilter.list > PolicyNameFilter.csv

リソースとポリシーの関係を紐付ける

ポリシー名の下にリソース名が来る法則を利用し、次のポリシー名が来るまでに出てきたリソース名を
「ポリシー名,リソースのXID、リソース名」で出力するスクリプトです。

#!/bin/bash
I_FILE_NAME=$1
O_FILE_NAME=$2
i=1
key1="0"
key2="0"
PoliCheck="0"
MyP=""
while read LINE
do
if [ "$key1" = "1" ]; then
MyP=`echo $LINE| cut -d">" -f2 | cut -d "<" -f1`
fi
if [ "$key2" = "1" ]; then
MyR=`echo $LINE | cut -d "<" -f1`
MyU=`cat $I_FILE_NAME | grep -A 100 "$MyR" | grep -A 1 Rule.Name  |grep -v "Rule.Name" | head -n 1 | cut -d">" -f2 | cut -d "<" -f1`
echo "$MyP","$MyR","$MyU" >> $O_FILE_NAME
fi
PoliCheck=`echo $LINE | grep "CA.SM::Policy.Name" | wc -l`
ResoCheck=`echo $LINE | grep "<XID>CA.SM::Rule" | wc -l`
if [ "$PoliCheck" = "1" ]; then
key1="1"
else
key1="0"
fi
if [ "$ResoCheck" = "1" ]; then
key2="1"
else
key2="0"
fi
i=$((i+1))
done < ${I_FILE_NAME}

以下のように出力されます。

policy_1,0b-0000XXX,hoge
policy_1,0b-0000YYY,fuga
policy_2,0b-0000ZZZ,piyo

あとはこの関係を元に既に作成すみのリソースとURL&ポリシーと条件を組み合わせれば、各URLがどのポリシーに紐づくのが確認できます。