ServiceNowのREST API Access Policyを試す

Version:Washingtondc

ServiceNowのREST API Access Policyを試します

# Adaptive Authentication(適応認証)

ServiceNowにはAdaptive Authenticationという機能がありIPアドレス(IP)、ユーザーロール(Role)、ユーザーグループ(Group)などの基準(Criteria)で認証を許可/制限出来る機能があるようなのですが

https://www.servicenow.com/docs/ja-JP/bundle/washingtondc-platform-security/page/integrate/authentication/concept/adaptive-authentication.html

設定できる対象はログイン画面を利用した通常のユーザーのログインに限られるようで…RESTに関してはREST API Access Policyという機能を使うようです

> > REST API アクセスポリシー
>
> 適応認証フレームワークのフィルター基準を使用して、受信した ServiceNow REST API へのアクセスを制限できます。詳細については、「REST API アクセスポリシー」を参照してください。

# REST API Access Policy

特定のIPからのアクセスだけ許容するように設定します IP Filter Criteriaに許可したいIPの情報を設定して以下の設定を作ります IPv4しか試していません

:::note warn
REST API Access PolicyはAllowの設定しかできないようなので許可した設定以外からのアクセスは不許可になります 複数の条件を設定する際はConditionを工夫する必要がありそうです Adaptive AuthenticationはAllowとDenyの設定が使えそうです
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/6038da63-0fbe-e678-7bcb-4ee4f2ed70d1.png)

:::note info
RESTに限らず全てのアクセスの許可/制限を設定するのであればIP Address Access Controlという機能を利用する方が良いと思います
:::

# 手順

## REST API Access Policyのアクティブ化

以下手順でREST API Access Policyをアクティブ化出来るようですが自分のPDIだと最初からアクティブ化されていたようなので不要かも知れません

https://www.servicenow.com/docs/ja-JP/bundle/washingtondc-platform-security/page/integrate/authentication/task/activate-rest-api-access-policy.html

Adaptive Authenticationも最初からアクティブ化されていた気がしているのですがもし以降の手順で表示されているメニューが見当たらないといったようなことがありましたら以下手順でインストール/アクティブ化してみてください

https://www.servicenow.com/docs/ja-JP/bundle/washingtondc-platform-security/page/integrate/authentication/task/adaptive-authentication-plugin.html

## IP Filter Criteria

最初にCriteriaを準備します CriteriaはIP, Role, Groupを設定できるようですが今回はIP Filter Criteriaを使います

Filter navigatorにadaptive authenなどと入力してメニューを絞り込み Adaptive Authentication - Filter Criteria - IP Filter Criteria を選択します

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f0bc0016-d08a-f601-2dc6-3bc38e812831.png" width="240">

IP Filter Criteriaの一覧が表示されるので画面右上の[New]ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/736ec872-0e00-ae06-2b0c-751cea1dbde6.png)

IP Filter Criteriaの編集画面が表示されるのでNameに適当な名前とIP Rangeの関連リストに許可したいIPのRangeのStart IPとEnd IPを設定します IPの設定は複数行で設定することもできます Subnet(CICR)ではSubnet Maskで設定することもできます 設定できたら[Submit]などで設定を保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/d385485a-6dbc-e8fb-612a-7bd7c1aabe4e.png)

## REST API Access Policies

Filter navigatorにrest api accなどと入力してメニューを絞り込み System Web Services - API Access Poliies - REST API Access Policies を選択します

<img width="240" border="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c0607ed2-5bab-c62e-8812-49222bf6dd64.png">

選択するとREST API Access Policiesの一覧が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/37caac6b-183a-9a95-e243-d4f5d2c61549.png)

情報を投稿するPOST Methodを試したいのでPOST API Access Policyを選択します 情報を取得するGET Methodを試す場合はGET API Acceess Policyを使うと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/70a27172-09fe-b72d-a778-56af8e7ef8f0.png)

:::note warn
Activeがfalseになっていますが設定したいCriteriaがない状態で有効にするとアクセスできなくなる可能性があるので一通り設定が終わってからtrueにしてみます
:::

画面下部のInbound authentication profilesからAuthentication profileのInsert a new row...をクリックすると虫眼鏡のアイコンが表示されるのでクリックします

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/8843afc0-eb08-4b1b-24ab-9d62a68883b6.png" width="320">

## Authentication profile

Authentication Profileを選択出来る一覧が表示されますが既存の設定を変更するのも怖いので画面右上の[New]ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/6c798b0b-e914-30ce-872d-3e9d5b9c7331.png)

どんな種類のauthentication profileを作成するか聞かれるので標準的な設定を試したいと思い一番上のCreate Standard http authentication profilesをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/105c68dc-13fe-e501-7f20-03c9c4f1431e.png)

Standard Authentication Profileの編集画面が表示されるのでNameに適当な名前を入力して画面上部の灰色の箇所を右クリックして表示されるメニューで一旦Saveを選択するなどして設定を保存してから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/5ae6c5df-21c0-2a4e-57ff-9f788d0651c3.png)

画面下部のAuthentication PoliciesのAuthentication PolicyのInsert a new row...をクリックすると虫眼鏡のアイコンが表示されるのでクリックします

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/0c8518bd-51e6-ba4b-ca54-e9b642f8d503.png" width="320">

## Authentication Policy

Authentication Policyを選択出来る一覧が表示されますが既存の設定を変更するのも怖いので既存の設定がよくわからないので画面右上の[New]ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/bab0b933-28a0-d534-74c3-b0b9f3390d61.png)

Authentication Policyの編集画面が表示されるのでNameに適当な名前を入力して画面上部の灰色の箇所を右クリックして表示されるメニューで一旦Saveを選択するなどして設定を保存してから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/09939d90-b91c-e466-04d3-0e314ff3eb03.png)

画面下部にPolicy InputsとPolicy Conditionsの設定項目が表示されるので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c3ed9d42-4089-ecd8-bea2-8a092814c615.png)

Policy Inputsのタブを選択して[Edit]をクリックします

### Policy Inputs

Criteriaを選択する画面が表示されるのでCollectionから利用したいCriteriaを選択して[>]をクリックして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/3574f85d-31ea-530b-fe85-7bf792abf413.png)

Policy Inputs Listに加えて[Save]します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/7ea45059-a675-7f77-ef5f-7589f910ff97.png)

### Policy Conditions

Authentication Policyの編集画面に戻ったらPolicy Conditonのタブを選択して[New]をクリックします


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/4ea18652-2b4e-2e07-31a4-1d6625cdc661.png)

Conditonの編集画面が表示されるのでLabelに任意の値を入力してConditionでPolicy Inputsで選択したCriteriaを選択してis trueをを選択して[Submit]などで保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f178beea-a604-cc83-bba4-5dbda569ca0e.png)

## 作成した設定をすべて繋ぎ合わせてActiveに

### REST API Access Policyの設定

ここまでの手順をそのまま進めているとREST API Access PolicyのInbound authenticatipn profilesが画面遷移先で保存しただけで設定されていないのでREST API Access Policyの編集画面に戻りAuthentication profileをクリックして作成したAuthentication profileを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/0acde2b0-2f7e-f646-d457-416574c65f38.png)

ActiveをtrueにしてAuthentication profileを設定したら[Save]などで保存します

### Authentication profileの設定

Authentication profileも同様に設定されていないと思われますので設定画面に戻りAuthentication Policyを設定して保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/33e7c9a7-f0be-88cc-8263-41b8fbdb5cdf.png)

### REST API Access PolicyをActiveに

最後にREST API Access PolicyのActiveをtrueに設定して保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/24bb13a5-8535-ed40-5ef1-3456f6139a4c.png)

# 動作確認

許可されていないIPからPOSTすると401エラーになると思います

```
*** Script: {"error":{"message":"User Not Authenticated","detail":"Required to provide Auth information"},"status":"failure"}
*** Script: 401
```

設定したIPアドレスの範囲がうっかり重なってしまっていた場合などJavaの例外が発生していたような気がします 無効にしているConditionの設定が重なっているだけで例外になったような気がしていますが一旦全て消してしまって再現しなくなったのでよく分からずです