SAM ユーザーに信頼ポリシーを設定するときの書式のことを「信頼ポリシー構文」と呼びます。
例 1: 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')"
}
]
}
例 2: Flux アプリ が、信頼ポリシーを設定した SAM ユーザーの権限で SORACOM API を実行できるようにする場合の設定
{
"statements": [
{
"effect": "allow",
"principal": {
"service": [
"Flux"
]
}
}
]
}
パーミッション構文は、JSON フォーマットに従っています。ここでは、各プロパティの意味や、設定する内容を説明します。
プロパティ | 型 | 説明 |
---|---|---|
statements[] | Array | ステートメントブロック (principal 、effect 、condition の要素が入ったオブジェクト) の配列です。 |
statements[].principal.soracom * | Array | ステートメントブロックが対象とするユーザーを表す SRN (Soracom Resource Name) を配列で指定します。指定できる値は以下のとおりです。
信頼ポリシーに自分自身を表す SRN も指定できますが、自分自身にスイッチすることはできません。 |
statements[].principal.service * | Array | ステートメントブロックが対象とするサービスを配列で指定します。指定できる値は以下のとおりです。
|
statements[].effect * | String | 同じステートメントブロックの
|
statements[].condition | String | IP アドレスやスイッチした時刻などを使用して、ステートメントブロックが有効になる条件を指定できます。詳しくは、条件を指定する を参照してください。 |
ワイルドカード (*) は利用できません
ワイルドカード (*) で複数のオペレーターをまとめて設定したり、複数の SAM ユーザーをまとめて指定したりすることはできません。
ステートメントブロックが有効になることとスイッチが許可されることは別の概念です
condition
で指定した条件を満たしたときに有効になるのは「ステートメントブロック」です。
つまり effect
が allow
の場合は、condition
で指定した条件を満たしたときに限り、スイッチが許可 (allow
) されます。
一方で effect
が deny
の場合は、condition
で指定した条件を満たしたときに、スイッチが禁止 (deny
) されます。たとえば、allow
で指定した条件の中で、特定の条件を満たした場合にスイッチを禁止する場合に使います。
JSON を入力する画面について
信頼ポリシー構文に従った JSON は、以下の画面で入力します。
- SAM ユーザーの ユーザーにスイッチを許可する (信頼ポリシーの登録) を参照してください。 。詳しくは、
条件を指定する
condition
には、IP アドレスやスイッチした時刻などを使用して、ステートメントブロックが有効になる条件を指定できます。
演算子、変数、関数の 3 つを組み合わせて、条件を指定できます。
項目 | 説明 |
---|---|
演算子 | 比較演算子、論理演算子を利用できます。 |
変数 | currentDate 、currentDateTime などを利用できます。 |
関数 | currentDate や currentDateTime と比較するための 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 / == | 等しい
|
ne / != | 等しくない
|
lt / < | より小さい (*1)
|
le / <= | より小さいか等しい (*1)
|
gt / > | より大きい (*1)
|
ge / >= | より大きいか等しい (*1)
|
matches | 文字列が正規表現と一致する
|
- (*1) 文字列の比較には利用しないでください。
論理演算子
and
、or
、not
を利用すると、複雑な条件を指定できます。
例:
"condition": "(currentDate < date(2023,7,20)) or (date(2023,8,31) < currentDate)"
演算子 | 説明 |
---|---|
and | 演算子の前後の条件の、両方を満たす
|
or | 演算子の前後の条件の、両方もしくは一方を満たす
|
not / ! | 演算子の後の条件を満たさない
|
変数
ステートメントブロックを有効化する条件として、以下の変数を利用できます。
変数 | 説明 |
---|---|
currentDate | 現在の日付 (UTC) を表すオブジェクト。date(yyyy, MM, dd) で取得したオブジェクトと比較します。 |
currentDateTime | 現在の日時 (UTC) を表すオブジェクト。dateTime(yyyy, MM, dd, HH, mm, ss) で取得したオブジェクトと比較します。 |
sourceIp | クライアントの IP アドレスを表す文字列。例: 10.0.0.1 、198.51.100.1 。より柔軟に指定する場合は、この sourceIp ではなく ipAddress(CIDR...) を使用してください。 |
変数が currentDate
または currentDateTime
の場合は、演算子 matches
は利用できません。
変数と関数の使用例については、使用例 を参照してください。
関数
ステートメントブロックを有効化する条件として、以下の関数を利用できます。
変数と関数の使用例については、使用例 を参照してください。
date(yyyy, MM, dd)
日付 (UTC) を表すオブジェクトを取得します。
引数:
引数 | 型 | 説明 |
---|---|---|
yyyy | Integer | 年 |
MM | Integer | 月 (*1) |
dd | Integer | 日 (*1) |
- (*1) 数字が 1 桁の場合は、先頭の
0
は省略できます。
戻り値:
日付 (UTC) を表すオブジェクトを返します。
例:
date(2023, 01, 27)
dateTime(yyyy, MM, dd, HH, mm, ss)
日時 (UTC) を表すオブジェクトを取得します。
引数:
引数 | 型 | 説明 |
---|---|---|
yyyy | Integer | 年 |
MM | Integer | 月 (*1) |
dd | Integer | 日 (*1) |
HH | Integer | 時 (*1) |
mm | Integer | 分 (*1) |
ss | Integer | 秒 (*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 に指定した範囲に含まれているかどうかを判定します。
引数:
引数 | 型 | 説明 |
---|---|---|
CIDR | String (*1) | API クライアントの IP アドレスの範囲。CIDR 表記で指定します。 |
- (*1) 複数指定できます。
戻り値:
以下のいずれかの値を返します。
true
: API クライアントの IP アドレスが、CIDR に指定した範囲のいずれかに含まれています。false
: API クライアントの IP アドレスが、CIDR に指定したどの範囲にも含まれていません。
例:
API クライアントの IP アドレスが 10.0.1.0
~ 10.0.1.255
の範囲に含まれる場合に、true
を返します。
ipAddress('10.0.1.0/24')
API クライアントの IP アドレスが 10.0.1.0
~ 10.0.1.255
または 10.0.2.0
~ 10.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')"