本記事は、Qiita ServiceNow アドベントカレンダーの参加記事14日目です。
ServiceNowのカレンダー | Advent Calendar 2023 - Qiita
はじめに
ServiceNowでIPベースでのアクセス制御を行う場合、標準機能を利用する際にはインスタンス全体でのアクセス制御を行う機能が存在しますが、今回はユーザやロールベースでのアクセス制御を行う必要がありGlideSession - getClientIP()
を利用しログインの際のアクセス元IPを取得したAccess Controlを行う方法を実装しました。
IPとロールを管理するテーブルを作成
対象の情報を管理するためのテーブルを新規で作成します。
IP Address : IPアドレス
Target Group : 対象のグループ
Target Role : 対象のロール
Discription : 説明
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();
}
ログインに失敗するとセッションを切断
対象の場合強制的にセッションが切断されるため、以下のような画面表示になります。
まとめ
今回はSPEntryPageのScriptを編集してIPアドレスによるアクセス制御の実装を行いました。一方でこちらの方法ではアクセス時のIPのみチェックを行うことが出来ますが、ログイン後のセッションのIP制御は行う事が出来ないため、次回は別の方法を試したいと思います。
参考
IP アドレスのアクセス制御
特定の IP 範囲にアクセスを制限する (インスタンスセキュリティ強化)
GlideSession - スコープ対象