# import urllib.parse
from datetime import datetime
from datetime import date
from dateutil.parser import parse
import boto3
from utils.Config import Config
from utils.Policy import Policy
from services.Evaluator import Evaluator
class IamCommon(Evaluator):
def getAgeInDay(self, dateTime):
return self.getAge(dateTime, 60*60*24)
def getAge(self, dateTime, div=60*60*24):
if dateTime == 'N/A':
return 999
datediff = datetime.today() - parse(dateTime).replace(tzinfo=None)
return datediff.days
def evaluateManagePolicy(self, policies):
cachePrefix = 'iam::mpolicy::'
policyWithFullAccess = []
if policies:
hasFullAccess = -1 # instead of false/true, easier handling on cache checking using !empty
for policy in policies:
if policy['PolicyName'] == 'AdministratorAccess':
self.results['FullAdminAccess'] = [-1, 'AdministratorAccess']
continue
cache = Config.get(cachePrefix + policy['PolicyArn'], "")
if cache == 1:
hasFullAccess = 1
policyWithFullAccess.append(policy['PolicyName'])
continue
else:
versInfo = self.iamClient.get_policy(PolicyArn=policy['PolicyArn'])
vers = versInfo.get('Policy')
verId = vers['DefaultVersionId']
detail = self.iamClient.get_policy_version(
PolicyArn=policy['PolicyArn'],
VersionId=verId
)
doc = detail.get('PolicyVersion')
# doc = urllib.parse.unquote(doc['Document'])
pObj = Policy(doc)
if pObj.hasFullAccessToOneResource() == True:
hasFullAccess = 1
policyWithFullAccess.append(policy['PolicyName'])
Config.set(cachePrefix + policy['PolicyArn'], hasFullAccess)
if policyWithFullAccess:
self.results['ManagedPolicyFullAccessOneServ'] = [-1, '
'.join(policyWithFullAccess)]
def evaluateInlinePolicy(self, inlinePolicies, identifier, entityType):
if inlinePolicies is None:
return
self.results['InlinePolicy'] = [-1, '
'.join(inlinePolicies)]
inlinePoliciesWithAdminAccess = []
inlinePoliciesWithFullAccess = []
for policy in inlinePolicies:
if entityType == 'user':
resp = self.iamClient.get_user_policy(PolicyName=policy, UserName=identifier)
elif entityType == 'group':
resp = self.iamClient.get_group_policy(PolicyName=policy, GroupName=identifier)
else:
resp = self.iamClient.get_role_policy(PolicyName=policy, RoleName=identifier)
doc = resp.get('PolicyDocument')
# print(doc)
# doc = urllib.parse.unquote(doc)
pObj = Policy(doc)
pObj.inspectAccess()
if pObj.hasFullAccessToOneResource() == True:
inlinePoliciesWithFullAccess.append(policy)
if pObj.hasFullAccessAdmin() == True:
inlinePoliciesWithAdminAccess.append(policy)
if inlinePoliciesWithFullAccess:
self.results['InlinePolicyFullAccessOneServ'] = [-1, '
'.join(inlinePoliciesWithFullAccess)]
if inlinePoliciesWithAdminAccess:
self.results['InlinePolicyFullAdminAccess'] = [-1, '
'.join(inlinePoliciesWithAdminAccess)]