これは良い質問であり、いくつかの良い方法があります。1 つの例は、ロジックを書き直して次のように表現することです。
- first-applicable の結合アルゴリズムを持つ PolicySet
- 時間が間違っている場合は拒否します
- デバイスが無効な場合は拒否
- IP が有効な範囲にない場合は拒否します
- Permitを生成する一連の可能なアクションとリソースベースのポリシー。
ALFA では次のように表示されます。
namespace com.axiomatics.example{
policyset global{
apply firstApplicable
policy securityChecks{
apply firstApplicable
rule denyOutsideOfficeHours{
deny
}
rule denyInvalidDevice{
deny
}
rule denyInvalidIP{
deny
}
}
policyset myBusinessPolicies{
apply firstApplicable
/**
* Add your business policies here
*/
}
}
}
これは単なる足場です。必要な属性を見てみましょう。
- 現在の時刻
- ユーザーの現在の IP
- ユーザーのデバイスの種類
これらの値をどのように取得したかについては心配しません。それについて心配するのは、ポリシー実施ポイントまたはポリシー情報ポイント次第です。
最初のルールはcurrentTime属性を使用します。これは ALFA のデフォルト属性であり、次のように定義されています。
attribute currentTime {
id = "urn:oasis:names:tc:xacml:1.0:environment:current-time"
type = time
category = environmentCat
}
更新されたルールは次のようになります。
rule denyOutsideOfficeHours{
target clause currentTime<"09:00:00":time or currentTime>"17:00:00":time
deny
}
この例では、静的な下限と上限 (それぞれ午前 9 時と午後 5 時) を使用していますが、これらは属性でもあり、その場合はターゲットではなく条件を使用する必要があります。文字列値を関連するデータ型に変換するために使用される ALFA 表記法に注意してください"17:00:00":time
。
2 番目のルールは次のようになります。
rule denyInvalidDevice{
condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
deny
}
このルールでは、ターゲットで負の制約を表現できないため、条件を使用する必要があります。この条件は、呼び出された属性が存在すること、deviceType
およびそれが単一の値を含み、それ以上でもそれ以下でもないことを確認します。laptop
その値は、拒否を開始するために、またはのいずれとも等しくない必要がありますdesktop
。ところで、XACML の文字列比較では、デフォルトで大文字と小文字が区別されます。
最後のルールも同様で、条件を使用してテストを否定する必要があります。ここでは、ipAddressRegexpMAtch XACML 関数を使用して、ユーザーの IP (subjectLocalityIpAddress) が特定の IP アドレス パターンと一致するかどうかを確認します。
rule denyInvalidIP{
condition not(
ipAddressRegexpMatch(
"^(10)\\.(10)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\\:([80|443])$",
ipAddressOneAndOnly(subjectLocalityIpAddress)
)
)
deny
}
バックスラッシュは別のバックスラッシュでエスケープする必要があることに注意してください。これは ALFA 構文によるものです。XML に変換された XACML ポリシー自体には、2 つのバックスラッシュ文字は含まれません。
すべてを組み合わせた結果のポリシーは次のとおりです。
namespace com.axiomatics.example{
import Attributes.*
attribute deviceType{
category = subjectCat
id = "deviceType"
type = string
}
attribute userIP{
category = subjectCat
id = "deviceType"
type = string
}
policyset global{
apply firstApplicable
policy securityChecks{
apply firstApplicable
rule denyOutsideOfficeHours{
target clause currentTime<"09:00:00":time or currentTime>"17:00:00":time
deny
}
rule denyInvalidDevice{
condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
deny
}
rule denyInvalidIP{
condition not(
ipAddressRegexpMatch(
"^(10)\\.(10)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\\:([80|443])$",
ipAddressOneAndOnly(subjectLocalityIpAddress)
)
)
deny
}
}
policyset myBusinessPolicies{
apply firstApplicable
/**
* Add your business policies here
*/
}
}
}
これが役立つことを願っています。ご質問は、Stackoverflow または開発者のブログからお送りください。