1

最初のレイヤーが常に次のような環境をチェックするように、階層化されたポリシーを作成したいと考えています。

  • ユーザーが有効な IP アドレスを持っていることを確認し、
  • 時刻が有効な時間枠と曜日内であることを確認する
  • ユーザーのデバイスは有効なデバイスです

add下位層は、viewupdatedeleteなどの特定のリソースのセットに対してmedical recordsinsurance data、などの実際に要求されたアクションを処理しbank accountsます。

平易な英語では、ルールは次のようになります。

すべての環境ルールが許可を返す場合に許可するポリシー

  • Rule1: [bag with ip-address ranges] の範囲内の IP アドレスを持つユーザーのみを許可する
  • ルール 2: 月曜日から金曜日までのアクションの要求のみを許可する
  • ルール 3: 午前 7 時から午後 22 時までのアクションの要求のみを許可する
  • ルール 4: デスクトップまたはラップトップからのアクションの要求のみを許可する

これは、承認のための公理言語である ALFA を使用してどのように行うことができますか?

4

1 に答える 1

1

これは良い質問であり、いくつかの良い方法があります。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 または開発者のブログからお送りください。

于 2014-12-02T17:17:31.783 に答える