Soracom

Users

ドキュメント
Home ドキュメント スイッチユーザー リファレンス

信頼ポリシー構文

SAM ユーザーに信頼ポリシーを設定するときの書式のことを「信頼ポリシー構文」と呼びます。

例: 2023-07-01 以降、IP アドレスレンジ「10.0.0.0/24」のクライアントで、「OP1123456789 のルートユーザー」および「OP1123456789 の SAM ユーザー example」が、信頼ポリシーを設定した SAM ユーザーにスイッチできるようにする場合の設定

{
  "statements": [
    {
      "effect": "allow",
      "principal": {
        "soracom": [
          "srn:soracom:OP1123456789::Operator:OP1123456789",
          "srn:soracom:OP1123456789::User:example"
        ]
      },
      "condition": "currentDate >= date(2023, 07, 01) and ipAddress('10.0.0.0/24')"
    }
  ]
}

パーミッション構文は、JSON フォーマットに従っています。ここでは、各プロパティの意味や、設定する内容を説明します。

プロパティ説明
statements[]Arrayステートメントブロック (principaleffectcondition の要素が入ったオブジェクト) の配列です。
statements[].principal *Array

ステートメントブロックが対象とするユーザーを表す SRN (Soracom Resource Name) を配列で指定します。

  • ルートユーザーを指定する場合: srn:soracom:${operator_id}::Operator:${operator_id}
  • SAM ユーザーを指定する場合: srn:soracom:${operator_id}::User:${sam_user_name}

${operator_id} にはオペレーター ID を指定します。${sam_user_name} には SAM ユーザー名を指定します。

信頼ポリシーに自分自身を表す SRN も指定できますが、自分自身にスイッチすることはできません。

statements[].effect *String

同じステートメントブロックの principal に指定したユーザーからのスイッチを許可するために、allow を指定します。 同じステートメントブロックの principal に指定したユーザーからのスイッチを許可するか、禁止するかを指定します。

  • allow : principal に指定したユーザーからのスイッチを許可します。
  • deny : principal に指定したユーザーからのスイッチを禁止します。
statements[].conditionStringIP アドレスやスイッチした時刻などを使用して、ステートメントブロックが有効になる条件を指定できます。詳しくは、条件を指定する を参照してください。
ワイルドカード (*) は利用できません

ワイルドカード (*) で複数のオペレーターをまとめて設定したり、複数の SAM ユーザーをまとめて指定したりすることはできません。

ステートメントブロックが有効になることとスイッチが許可されることは別の概念です

condition で指定した条件を満たしたときに有効になるのは「ステートメントブロック」です。

つまり effectallow の場合は、condition で指定した条件を満たしたときに限り、スイッチが許可 (allow) されます。

一方で effectdeny の場合は、condition で指定した条件を満たしたときに、スイッチが禁止 (deny) されます。たとえば、allow で指定した条件の中で、特定の条件を満たした場合にスイッチを禁止する場合に使います。

JSON を入力する画面について

信頼ポリシー構文に従った JSON は、以下の画面で入力します。

条件を指定する

condition には、IP アドレスやスイッチした時刻などを使用して、ステートメントブロックが有効になる条件を指定できます。

演算子、変数、関数の 3 つを組み合わせて、条件を指定できます。

項目説明
演算子比較演算子、論理演算子を利用できます。
変数currentDatecurrentDateTime などを利用できます。
関数currentDatecurrentDateTime と比較するための date(yyyy,MM,dd)dateTime(yyyy,MM,dd,HH,mm,ss) などを利用できます。
  • 例 1: 2023 年 1 月 27 日 15:00:00 以降に、ステートメントブロックを有効にする

    "condition": "currentDate >= dateTime(2023, 01, 27, 15, 00, 00);"
    
  • 例 2: クライアントの IP アドレスが「10.0.0.0/24」に一致する場合に、ステートメントブロックを有効にする

    "condition": "ipAddress('10.0.0.0/24')"
    

演算子

比較演算子、論理演算子を利用できます。

かっこ () を使って評価の優先順位を指定できます

以下のように記載すると、かっこの中が先に評価されます。

"condition": "not (currentDate eq date(2023,11,11))"

比較演算子

文字列や数値を比較できます。

例:

"condition": "currentDate eq date(2023,11,11)"
演算子説明
eq / ==

等しい

  • currentDate eq date(2023,11,11)
  • currentDate == date(2023,11,11)
ne / !=

等しくない

  • currentDate ne date(2023,11,11)
  • currentDate != date(2023,11,11)
lt / <

より小さい (*1)

  • currentDate lt date(2023,11,11)
  • currentDate < date(2023,11,11)
le / <=

より小さいか等しい (*1)

  • currentDate le date(2023,11,11)
  • currentDate <= date(2023,11,11)
gt / >

より大きい (*1)

  • currentDate gt date(2023,11,11)
  • currentDate > date(2023,11,11)
ge / >=

より大きいか等しい (*1)

  • currentDate ge date(2023,11,11)
  • currentDate >= date(2023,11,11)
matches

文字列が正規表現と一致する

  • sourceIp matches '198\\.51\\.100\\..*'
  • JSON 形式の文字列で \ (バックスラッシュ) を指定する場合は、\\ を入力します。
  • 変数が currentDate または currentDateTime の場合は、演算子 matches は利用できません。
  • (*1) 文字列の比較には利用しないでください。

論理演算子

andornot を利用すると、複雑な条件を指定できます。

例:

"condition": "(currentDate < date(2023,7,20)) or (date(2023,8,31) < currentDate)"
演算子説明
and

演算子の前後の条件の、両方を満たす

  • (date(2023,7,20) <= currentDate) and (currentDate <= date(2023,8,31))
or

演算子の前後の条件の、両方もしくは一方を満たす

  • (currentDate < date(2023,7,20)) or (date(2023,8,31) < currentDate)
not / !

演算子の後の条件を満たさない

  • not (currentDate eq date(2023,11,11))

変数

ステートメントブロックを有効にする条件として、以下の変数を利用できます。

変数説明
currentDate現在の日付 (UTC) を表すオブジェクト。date(yyyy, MM, dd) で取得したオブジェクトと比較します。
currentDateTime現在の日時 (UTC) を表すオブジェクト。dateTime(yyyy, MM, dd, HH, mm, ss) で取得したオブジェクトと比較します。
sourceIpクライアントの IP アドレスを表す文字列。例: 10.0.0.1198.51.100.1
より柔軟に指定する場合は、この sourceIp ではなく ipAddress(CIDR...) を使用してください。

変数が currentDate または currentDateTime の場合は、演算子 matches は利用できません。

変数と関数の使用例については、使用例 を参照してください。

関数

ステートメントブロックを有効にする条件として、以下の関数を利用できます。

変数と関数の使用例については、使用例 を参照してください。

date(yyyy, MM, dd)

日付 (UTC) を表すオブジェクトを取得します。

引数:
引数説明
yyyyInteger
MMInteger月 (*1)
ddInteger日 (*1)
  • (*1) 数字が 1 桁の場合は、先頭の 0 は省略できます。
戻り値:

日付 (UTC) を表すオブジェクトを返します。

例:
date(2023, 01, 27)

dateTime(yyyy, MM, dd, HH, mm, ss)

日時 (UTC) を表すオブジェクトを取得します。

引数:
引数説明
yyyyInteger
MMInteger月 (*1)
ddInteger日 (*1)
HHInteger時 (*1)
mmInteger分 (*1)
ssInteger秒 (*1)
  • (*1) 数字が 1 桁の場合は、先頭の 0 は省略できます。
戻り値:

日時 (UTC) を表すオブジェクトを返します。

例:
dateTime(2023, 01, 27, 15, 00, 00)

date(2023, 01, 27)dateTime(2023, 01, 27, 00, 00, 00) は、同じ値です。

ipAddress(CIDR...)

API クライアントの IP アドレスが、CIDR に指定した範囲に含まれているかどうかを判定します。

引数:
引数説明
CIDRString (*1)API クライアントの IP アドレスの範囲。CIDR 表記で指定します。
  • (*1) 複数指定できます。
戻り値:

以下のいずれかの値を返します。

  • true : API クライアントの IP アドレスが、CIDR に指定した範囲のいずれかに含まれています。
  • false : API クライアントの IP アドレスが、CIDR に指定したどの範囲にも含まれていません。
例:

API クライアントの IP アドレスが 10.0.1.010.0.1.255 の範囲に含まれる場合に、true を返します。

ipAddress('10.0.1.0/24')

API クライアントの IP アドレスが 10.0.1.010.0.1.255 または 10.0.2.010.0.2.255 の範囲に含まれる場合に、true を返します。

ipAddress('10.0.1.0/24', '10.0.2.0/24');

使用例

condition に変数と関数を組み合わせた場合の使用例は以下のとおりです。

  • 例 1: 2023 年 1 月 27 日以降に、ステートメントブロックを有効にする

    "condition": "currentDate >= date(2023, 01, 27)"
    

    数字が 1 桁の場合は、以下のように先頭の 0 は省略できます。

    "condition": "currentDate >= date(2023, 1, 27)"
    
  • 例 2: 2023 年 1 月 27 日 15:00:00 以降に、ステートメントブロックを有効にする

    "condition": "currentDateTime >= dateTime(2023,01,27,15,00,00)"
    
  • 例 3: 特定の IP アドレス (10.0.0.1) からアクセスされた場合に、ステートメントブロックを有効にする

    "condition": "sourceIp == '10.0.0.1'"
    
  • 例 4: 特定の IP アドレス範囲 (10.0.0.0/24) からアクセスされた場合に、ステートメントブロックを有効にする

    "condition": "ipAddress('10.0.0.0/24')"