7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ServiceNowAdvent Calendar 2023

Day 14

【ServiceNow】ユーザ毎にログイン時のIP制御を行う

Last updated at Posted at 2023-12-13

本記事は、Qiita ServiceNow アドベントカレンダーの参加記事14日目です。
ServiceNowのカレンダー | Advent Calendar 2023 - Qiita

はじめに

ServiceNowでIPベースでのアクセス制御を行う場合、標準機能を利用する際にはインスタンス全体でのアクセス制御を行う機能が存在しますが、今回はユーザやロールベースでのアクセス制御を行う必要がありGlideSession - getClientIP()を利用しログインの際のアクセス元IPを取得したAccess Controlを行う方法を実装しました。

IPとロールを管理するテーブルを作成

対象の情報を管理するためのテーブルを新規で作成します。

IP Address : IPアドレス
Target Group : 対象のグループ
Target Role : 対象のロール
Discription : 説明

mosaic_20231214040429.png

SPEntryPageのScript Includeを編集

getFirstPageURL: function() {
		
		var roles;
		var checkTargetCount = 0;
		var ngCount = 0;
		var logOutFlg = false;
		roles = gs.getSession().getRoles().split(',');
		
		var gr = new GlideRecord("IPの管理テーブル");
		gr.query();

		while(gr.next()){

			var ipCheckFlg = false;
			var roleCheckListList =0;

			roleCheckListList = roles.filter(function(value) {
				return value == gr.u_target_role.name;
			});

			if(gr.u_target_group != "" && gr.u_target_role == ""){
			
				if(gs.getUser().isMemberOf(gr.u_target_group)){
					ipCheckFlg = true;
					checkTargetCount = checkTargetCount + 1;

				}
			}else if(gr.u_target_group == "" && gr.u_target_role != ""){

				if(roleCheckListList != 0){
					ipCheckFlg = true;
					checkTargetCount = checkTargetCount + 1;

				}
			}else if(gr.u_target_group != "" && gr.u_target_role != ""){

				if(gs.getUser().isMemberOf(gr.u_target_group) && roleCheckListList != 0){
					ipCheckFlg = true;
					checkTargetCount = checkTargetCount + 1;

				}
			}

			if(ipCheckFlg){

				if(gr.u_ip_address.toString() != gs.getSession().getClientIP().toString()){
					ngCount = ngCount + 1;
					logOutFlg = true;

				}
			}
		}

		if(logOutFlg && ngCount == checkTargetCount){
				var gr = new GlideRecord('v_user_session');
				gr.get('session_id',gs.getSession().sessionID);
				gr.locked = true;
				gr.update();
		}

ログインに失敗するとセッションを切断

対象の場合強制的にセッションが切断されるため、以下のような画面表示になります。
スクリーンショット 2023-12-14 3.52.05.png

まとめ

今回はSPEntryPageのScriptを編集してIPアドレスによるアクセス制御の実装を行いました。一方でこちらの方法ではアクセス時のIPのみチェックを行うことが出来ますが、ログイン後のセッションのIP制御は行う事が出来ないため、次回は別の方法を試したいと思います。

参考

IP アドレスのアクセス制御

特定の IP 範囲にアクセスを制限する (インスタンスセキュリティ強化)

GlideSession - スコープ対象

7
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?