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/'/'/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がどのポリシーに紐づくのが確認できます。