관계없는 명시적 역할 액세스 제어 조건 검토[Security Center 1.5의 새로운 기능]Review extraneneous explicate role access control conditions [New in Security Center 1.5]
Explicit Roles 플러그인은 모든 사용자에게 내부 자원에 액세스할 수 있는 snc_internal 역할 또는 외부 자원에 액세스할 수 있는 snc_external 역할을 부여하도록 의무화하는 것이 좋습니다.
이 플러그인을 설치하면 기존의 모든 사용자에게 snc_internal 역할이 할당되고 기존 접근 제어 목록(ACL)이 역할 조건으로 채워집니다. 자동화 논리 또는 인스턴스 관리자의 개입으로 인해 snc_internal 또는 snc_external 역할이 이미 더 엄격한 역할 요구 사항을 포함하는 ACL에 잘못 추가될 수 있습니다. ACL에 매핑된 역할을 포함하는 모든 사용자에 대해 ACL 역할 평가를 통과하므로 snc_internal 또는 snc_external 추가하는 것은 ACL의 의도된 목적에 비해 너무 광범위할 수 있습니다. 권한이 낮은 사용자에게 ACL을 통해 액세스 권한이 부여되는 경우 데이터 유출이 발생할 수 있습니다.
예를 들어 snc_internal 역할과 관리자 역할을 모두 테이블 내의 동일한 ACL에 매핑할 필요가 없습니다. ACL은 관리자에게 액세스 권한을 부여하기 위한 것이며, 이 경우 snc_internal 역할은 실수입니다. 또는 ACL은 모든 snc_internal 사용자에게 액세스 권한을 부여하기 위한 것이므로 관리자 역할이 필요하지 않습니다. Explicit Roles 플러그인이 설치되면 다른 역할에 대한 조건도 포함하면서 snc_internal 또는 snc_external에 대한 역할 조건을 포함하는 ACL을 검토합니다. 역할이 특정 사용 사례에 대해 작동할 수 있는 경우 발견 사항을 주기적으로 검토해야 합니다.
다음 백그라운드 스크립트를 실행하여 이미 다른 역할에 매핑된 ACL에 snc_internal되거나 snc_external 추가된 ACL 목록을 캡처합니다. ACL이 snc_internal 또는 snc_external 역할을 가진 사용자에게 액세스 권한을 부여해야 하는지 여부를 확인합니다. 권한이 낮은 사용자가 ACL을 통해 액세스할 수 없는 경우 snc_internal 또는 snc_external 역할을 제거합니다. 이러한 역할을 제거하면 사용자에게 남은 역할이 없는 경우 ACL로 보호되는 자원에 액세스하지 못할 수 있습니다.
var ExplicitRolesEnabled = new GlidePluginManager().isActive('com.glide.explicit_roles');
// Only check if Explicit Roles is enabled
if (ExplicitRolesEnabled) {
var counterBadInternalACLs = 0;
var counterBadExternalACLs = 0;
var sysIdSncInternal = '7fcaa702933002009c8579b4f47ffbde';
var sysIdSncExternal = '940ba702933002009c8579b4f47ffbe2';
var api = new SNC.RoleManagementAPI();
var gr = new GlideRecord('sys_security_acl_role');
gr.addQuery('sys_user_role', sysIdSncInternal);
gr.query();
while (gr.next()) {
var aclSysId = gr.sys_security_acl;
var gr2 = new GlideRecord('sys_security_acl_role');
gr2.addQuery('sys_security_acl', aclSysId);
gr2.addQuery('sys_user_role', '!=', sysIdSncInternal);
gr2.addQuery('sys_user_role', '!=', sysIdSncExternal);
gr2.query();
while (gr2.next()) {
// exclude the roles if that contain snc_external
var role = gr2.sys_user_role;
var containedRoles = api.findAllContainedRolesForRole(role);
if (containedRoles.contains(sysIdSncExternal))
continue;
gs.print('Found an ACL with snc_internal and yet another role=' + role + '; ACL sys_id=' + aclSysId);
counterBadInternalACLs++;
break;
}
}
var gr = new GlideRecord('sys_security_acl_role');
gr.addQuery('sys_user_role', sysIdSncExternal);
gr.query();
while (gr.next()) {
var aclSysId = gr.sys_security_acl;
var gr2 = new GlideRecord('sys_security_acl_role');
gr2.addQuery('sys_security_acl', aclSysId);
gr2.addQuery('sys_user_role', '!=', sysIdSncInternal);
gr2.addQuery('sys_user_role', '!=', sysIdSncExternal);
gr2.query();
while (gr2.next()) {
// exclude the roles if that contain snc_internal
var role = gr2.sys_user_role;
var containedRoles = api.findAllContainedRolesForRole(role);
if (containedRoles.contains(sysIdSncInternal))
continue;
gs.print('Found an ACL with snc_external and yet another role=' + role + '; ACL sys_id=' + aclSysId);
counterBadExternalACLs++;
break;
}
}
gs.print('Total number of ACLs with snc_internal and other roles: ' + counterBadInternalACLs);
gs.print('Total number of ACLs with snc_external and other roles: ' + counterBadExternalACLs);
}추가 정보
| 속성 | 설명 |
|---|---|
| 구성 이름 | com.glide.explicit_roles, sys_security_acl및sys_security_acl_role |
| 구성 유형 | 시스템 속성(/sys_properties_list.do) |
| 데이터 유형 | 데이터 유형 없음 |
| 권장 값 | 권장 값 없음 |
| 기본값 | 기본값 없음 |
| 범주 | 접근 통제 |
| 보안 위험 |
|
| 참조 | 명시적 역할 |