122 lines
3.4 KiB
Plaintext
122 lines
3.4 KiB
Plaintext
|
|
// Time-Based Access Control Policy
|
||
|
|
// Restricts access based on time of day, day of week, and business hours
|
||
|
|
// Compliance: Least Privilege, Temporal Security Controls
|
||
|
|
|
||
|
|
// Standard business hours access
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
// Business hours: Monday-Friday 8 AM to 6 PM
|
||
|
|
context.time.hour >= 8 &&
|
||
|
|
context.time.hour < 18 &&
|
||
|
|
context.time.day_of_week >= 1 &&
|
||
|
|
context.time.day_of_week <= 5 &&
|
||
|
|
principal has role &&
|
||
|
|
principal.role in ["Employee", "Contractor", "Manager", "Developer"]
|
||
|
|
};
|
||
|
|
|
||
|
|
// Extended access for IT operations team
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
// Extended hours: Monday-Friday 6 AM to 10 PM
|
||
|
|
context.time.hour >= 6 &&
|
||
|
|
context.time.hour < 22 &&
|
||
|
|
context.time.day_of_week >= 1 &&
|
||
|
|
context.time.day_of_week <= 5 &&
|
||
|
|
principal has role &&
|
||
|
|
principal.role in ["ITOps", "SRE", "SystemAdmin", "SecurityAnalyst"]
|
||
|
|
};
|
||
|
|
|
||
|
|
// 24/7 access for critical support roles
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
principal has role &&
|
||
|
|
principal.role in ["OnCallEngineer", "IncidentManager", "SecurityOfficer", "MonitoringService"] &&
|
||
|
|
principal has on_call_status &&
|
||
|
|
principal.on_call_status.active == true
|
||
|
|
};
|
||
|
|
|
||
|
|
// Weekend access with approval
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
(context.time.day_of_week == 0 || context.time.day_of_week == 6) && // Saturday or Sunday
|
||
|
|
principal has weekend_access &&
|
||
|
|
principal.weekend_access.approved == true &&
|
||
|
|
principal.weekend_access.expires_at > context.time.timestamp &&
|
||
|
|
principal.weekend_access.justification != ""
|
||
|
|
};
|
||
|
|
|
||
|
|
// Holiday access restrictions
|
||
|
|
forbid(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
context has holiday &&
|
||
|
|
context.holiday.is_company_holiday == true &&
|
||
|
|
resource has criticality &&
|
||
|
|
resource.criticality in ["low", "medium"] &&
|
||
|
|
!(principal has holiday_override) &&
|
||
|
|
!(principal has role && principal.role in ["OnCallEngineer", "SecurityOfficer"])
|
||
|
|
};
|
||
|
|
|
||
|
|
// After-hours sensitive resource access
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
resource has sensitivity &&
|
||
|
|
resource.sensitivity == "high" &&
|
||
|
|
(
|
||
|
|
context.time.hour < 8 ||
|
||
|
|
context.time.hour >= 18 ||
|
||
|
|
context.time.day_of_week == 0 ||
|
||
|
|
context.time.day_of_week == 6
|
||
|
|
) &&
|
||
|
|
principal has after_hours_approval &&
|
||
|
|
principal.after_hours_approval.granted == true &&
|
||
|
|
principal.after_hours_approval.expires_at > context.time.timestamp &&
|
||
|
|
principal.after_hours_approval.supervisor_approval == true
|
||
|
|
};
|
||
|
|
|
||
|
|
// Time zone considerations for global teams
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
principal has time_zone &&
|
||
|
|
context has user_local_time &&
|
||
|
|
// Allow access during user's local business hours
|
||
|
|
context.user_local_time.hour >= 8 &&
|
||
|
|
context.user_local_time.hour < 18 &&
|
||
|
|
context.user_local_time.day_of_week >= 1 &&
|
||
|
|
context.user_local_time.day_of_week <= 5 &&
|
||
|
|
principal has global_access &&
|
||
|
|
principal.global_access.authorized == true
|
||
|
|
};
|
||
|
|
|
||
|
|
// Emergency access time override
|
||
|
|
permit(
|
||
|
|
principal,
|
||
|
|
action,
|
||
|
|
resource
|
||
|
|
) when {
|
||
|
|
principal has emergency_access &&
|
||
|
|
principal.emergency_access.active == true &&
|
||
|
|
principal.emergency_access.expires_at > context.time.timestamp &&
|
||
|
|
principal.emergency_access.incident_level in ["critical", "high"] &&
|
||
|
|
principal.emergency_access.authorized_by in ["IncidentCommander", "CISO", "CTO"]
|
||
|
|
};
|