o
    PgJS                     @   s  d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ d dlmZmZ dZede G dd deZej !dddZ"dd Z#dd Z$dd Z%dd Z&dd Z'e
eG dd de(Z)G d d! d!e)Z*G d"d# d#e)Z+G d$d% d%e)Z,G d&d' d'e)Z-G d(d) d)e-Z.G d*d+ d+e-Z/d,d- Z0d.d/ Z1d0d Z2d1d2 Z3dS )3    )print_functionN)ABCMeta)add_metaclass)Template)Enum)CRITICAL)	getLogger)Policy)parse_argumentsget_regions)	query_awsget_parameter_file)AccountRegionCreate IAM reportpolicyuniversec                   @   s   e Zd ZdZdZdS )OutputFormatjsonhtmlN)__name__
__module____qualname__r   r    r   r   5/var/www/html/post/cloudmapper/commands/iam_report.pyr      s    r   webaccount-data
iam_reportc                 C   s   | S Nr   )sr   r   r   tolink   s   r   c                  C   s  g } t tjdt}|d d}|d |D ]u}|d}i d|d d|d d	|d
 d|d d|d d|d d|d d|d d|d d|d d|d d|d d|d d|d  d!|d" d#|d$ d%|d& |d' |d( |d) |d* |d+ d,}| j|  q| S )-Nziam-get-credential-reportContent
r   ,userarn   user_creation_time   password_enabled   password_last_used   password_last_changed   password_next_rotation   
mfa_active   access_key_1_active   access_key_1_last_rotated	   access_key_1_last_used_date
   access_key_1_last_used_region   access_key_1_last_used_service   access_key_2_active   access_key_2_last_rotated   access_key_2_last_used_date   access_key_2_last_used_region                  )access_key_2_last_used_servicecert_1_activecert_1_last_rotatedcert_2_activecert_2_last_rotated)r   regionaccountsplitpopappend)users	json_blob	csv_lineslinepartsr#   r   r   r   load_credential_report#   sb   
	
	
rX   c                 C   s   g |d |d D ]a}i }||d< t | dd|d d }t | dd|}||d	< d
|d< tj|d dd d}|d D ]'}	d|	v rdtj|	d dd d}
||
 j|	d< |	d |jk rdd|d<  nq=|||d < q
d S )NUserDetailListRoleDetailListauthiamz&generate-service-last-accessed-detailsArnJobIdz!get-service-last-accessed-detailslast_accessTis_inactiveJobCompletionDater   r7   %Y-%m-%dServicesLastAccessedLastAuthenticateddays_since_last_useF)r   datetimestrptimedaysmax_age)rN   principal_statsjson_account_auth_detailsargsprincipal_authstatsjob_idjson_last_access_detailsjob_completion_dateservicelast_access_dater   r   r   get_access_advisorQ   sJ   rt   c                 C   s8   d}d}| D ]}|d7 }|d dkr|d7 }q||dS )Nr   r%   TotalAuthenticatedEntities)service_countservice_used_countr   )service_last_accessedrv   rw   service_last_accessr   r   r   get_service_count_and_usedx   s   
rz   c                 C   s   d|  }d ||||| S )NserviceChartz<div style="width:30%"><canvas id="{}" width="100" height="15"></canvas></div><script>makeServiceUnusedChart("{}", {}, {});</script>)format)	principalservices_usedservices_grantedchartidr   r   r   html_service_chart   s   r   c                   @   s   e Zd ZdZdZdZdZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )
graph_node Nc                 C   s    d|   |  |  di}|S )Ndata)idnametype)keyr   get_type)selfresponser   r   r   cytoscape_data   s   zgraph_node.cytoscape_datac                 C      | j S r   _graph_node__keyr   r   r   r   r         zgraph_node.keyc                 C   
   || _ d S r   r   )r   r   r   r   r   set_key      
zgraph_node.set_keyc                 C   r   r   )_graph_node__name)r   r   r   r   r   set_name   r   zgraph_node.set_namec                 C   s   | j dkr	|  S | j S )Nr   )r   r   r   r   r   r   r      s   
zgraph_node.namec                 C      d S r   r   r   r   r   r   is_principal      zgraph_node.is_principalc                 C   r   r   r   r   r   r   r   r      r   zgraph_node.get_typec                 C      | j | d S r   )_graph_node__childrenrR   r   noder   r   r   	add_child      zgraph_node.add_childc                 C   r   r   )_graph_node__parentsrR   r   r   r   r   
add_parent   r   zgraph_node.add_parentc                 C   r   r   )r   r   r   r   r   children   r   zgraph_node.childrenc                 C   r   r   )r   r   r   r   r   parents   r   zgraph_node.parentsc              	   C   s|   i }|   D ]5}|  D ],\}}||g }|  r|}ng }|D ]}|d|  | q#|| |||< qq|S )Nz{}.{})	r   get_services_alloweditemsgetr   rR   r|   r   extend)r   serviceschildrr   sourcesource_listsource_pathr   r   r   r   r      s   


zgraph_node.get_services_allowedc                 C   s   g | _ g | _d S r   )r   r   r   r   r   r   __init__   s   
zgraph_node.__init__)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s$    r   c                       s0   e Zd ZdZdd Zdd Z fddZ  ZS )	user_nodeNc                 C      dS NTr   r   r   r   r   r      r   zuser_node.is_principalc                 C   r   )Nr#   r   r   r   r   r   r      r   zuser_node.get_typec                    s   t    | |d  | |d  || _|d D ]}||d  }| | ||  q|dg D ]}t| |}|||	 < q3|dg D ] }| 	 dd d	 |d
  | }|| }||  | | qGd S )Nr]   UserNameAttachedManagedPolicies	PolicyArnUserPolicyList	GroupListr      groupPath)
superr   r   r   _user_node__authr   r   r   inline_policy_noder   )r   r[   
auth_graphpolicypolicy_node
group_name	group_key
group_node	__class__r   r   r      s"   


 
zuser_node.__init__)r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s
    r   c                       ,   e Zd Zdd Zdd Z fddZ  ZS )	role_nodec                 C   r   r   r   r   r   r   r   r      r   zrole_node.is_principalc                 C   r   )Nroler   r   r   r   r   r      r   zrole_node.get_typec                       t    | |d  | |d  |d D ]}||d  }| | ||  q|dg D ]}t| |}||| < q0d S )Nr]   RoleNamer   r   RolePolicyList	r   r   r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r         


zrole_node.__init__r   r   r   r   r   r   r   r   r   r   r   r          r   c                       r   )r   c                 C   r   NFr   r   r   r   r   r     r   zgroup_node.is_principalc                 C   r   )Nr   r   r   r   r   r   r     r   zgroup_node.get_typec                    r   )Nr]   	GroupNamer   r   GroupPolicyListr   r   r   r   r   r     r   zgroup_node.__init__r   r   r   r   r   r     r   r   c                   @   s,   e Zd Zi ZdZdd Zdd Zdd ZdS )r   Nc                 C   r   r   r   r   r   r   r   r     r   zpolicy_node.is_principalc                 C   s.   i }| j   }|D ]	}|  g||< q|S r   )_policy_node__policy_summaryaction_summarykeysr   )r   r   r   rr   r   r   r   r     s
   z policy_node.get_services_allowedc                 C   s   || _ t|| _d S r   )_policy_node__policy_documentr	   r   )r   docr   r   r   set_policy_document%  s   zpolicy_node.set_policy_document)r   r   r   r   r   r   r   r   r   r   r   r   r     s    r   c                       $   e Zd Zdd Z fddZ  ZS )managed_policy_nodec                 C   r   )Nzmanaged policyr   r   r   r   r   r   +  r   zmanaged_policy_node.get_typec                    sN   t    | |d  | |d  |d D ]}|d r$| |d  qd S )Nr]   
PolicyNamePolicyVersionListIsDefaultVersionDocument)r   r   r   r   r   )r   r[   
policy_docr   r   r   r   .  s   
zmanaged_policy_node.__init__r   r   r   r   r   r   r   r   r   r   r   *      r   c                       r   )r   c                 C   r   )Nzinline policyr   r   r   r   r   r   8  r   zinline_policy_node.get_typec                    sX   t    | | d |d   | |d  ||  | | | |d  d S )Nz/policy/r   PolicyDocument)r   r   r   r   r   r   r   )r   parentr[   r   r   r   r   ;  s   


zinline_policy_node.__init__r   r   r   r   r   r   7  r   r   c                 C   s   i }| d D ] }t |||d < |d D ]}|d r%||d  |d  qq| d D ]}t||||d < q+| d D ]}t||||d < q;| d D ]}t||||d < qK|S )	NPoliciesr]   r   r   r   GroupDetailListrY   rZ   )r   r   r   r   r   )r[   	iam_graphr   policy_versionr   r#   r   r   r   r   get_iam_graphD  s   r   c                 C   s   g }| D ]}| | }t | dkst | dkr#|| |   q| D ]}| | }| D ]}d| | ddi}|| q0q&|S )Nr   r   edge)r   targetr   )lenr   r   rR   r   r   )r   cytoscape_jsonkr   r   r   r   r   r   build_cytoscape_graphY  s    r   c           (   	   C   sP  i }d}t | dkrtd|  }zttjt W n	 ty&   Y nw t	tj
ddd}t| }W d   n1 sBw   Y  i }td|}i }td|j |j|d< |j|d	< tj d
|d< d|d< |jrwd|d< t|D ]}	t||	}
|
jdkrt|
jd|
}t|
||| q{g }g }g }| D ]A\}}d|d v r|d d |d< d|d< |d r|| q|| q|d d |d< d|d< |d r|| q|| qtd t|}t|}t	tj
dddd}tj ||dd W d   n	1 sw   Y  td  g |d!< t!|D ]#}t"|| d" d# }|d! ||| d d |d$ |d% d& qg |d'< t!|D ]#}t"|| d" d# }|d' ||| d d |d$ |d% d& qJg |d(< t!|D ]}d)}|| d dkrd*}|d( |||| d d+ qvg |d,< | D ]M\}}|d rqi }||d-< d|d v rd)|d.< |d d/ |d-< |d d |d0< d|d v rd*|d.< |d d/ |d-< |d d |d0< ||d d/  }|# }tj$|d" d1 d2d3 d
}g |d4< |d" d# D ]H}d5}|%d6d5d5kr(|tj$|d6 d2d3 d
 j&}d}|d5ks4|d7kr6d8}|%|d9 d:g}d;
|}|d4 ||d< ||d= q|d %d>g }g |d?< |d d/ d2d@ }|D ]}|d? t'|dA | |dB ql|d dC } g |dD< | D ]}!|dD t'|!dE |!dF dB q|d %dGg } | (|d %dHg  g |dI< | D ]}!|dI |!dF tj)|!dJ dddK qd|d v rtj)|d dL dd|dM< |d, | qg |d?< |dN D ]r}t'|d/ |dO dB}"||d/  }#g |"dP< |#* D ]}$|"dP t'|$+ |$ dB qg |"dD< |dC D ]}!|"dD t'|!dE |!dF dB q,g |"dI< |dQ D ]}!|"dI |!dF tj)|!dJ dddK qH|d? |" qg |dR< |dS D ][}!t'|!d/ |!dF ddT}dU|!d/ v rdV|dW< ||!d/  }%g |dX< |%* D ]}$|dX t'|$+ |$ dB q|!dY D ]}&|&dZ rtj)|&d[ dd|d\< q|dR | qp|j,t-j.krt	d]td}'|'/|j0|d^ W d   n	1 sw   Y  n&|j,t-jkrt	d_td}'t ||' W d   n	1 sw   Y  td`t|j,j1 dS )ar   Nr%   z2This command only works with one account at a time	templatesziam_report.htmlrzCreating IAM report for: {}account_name
account_idrb   report_generated_timer   graphz;<br><iframe width=700 height=700 src="./map.html"></iframe>z	us-east-1z%iam-get-account-authorization-detailsr   r[   
short_namer   r   r`   r   r#   z* Generating IAM graphr   r   z	data.jsonwr+   )indentz#* Generating the rest of the reportrS   r_   rc   rw   rv   )r$   r   r~   r   rolesinactive_principalsz%<i class="fas fa-user-astronaut"></i>z<i class="fas fa-user"></i>)r$   iconr   
principalsr$   r   r]   r   ra   r   r7   r   -rd   Z   badServiceNamespaceunknown;ServiceName)styler   last_user   r   groupsr   zgroup/)link_idr   r   managed_policiesr   r   r   r   inline_policiesr   )r   documentAssumeRolePolicyDocumentassume_roler   r   membersr   policiesr   )r  r   managedzarn:aws:iam::aws:policyz3<i class="fab fa-amazon"></i>AWS managed policy<br>r  attachmentsr   r   r   r	  z{}.html)tz{}.jsonzReport written to {}.{})2r   	ExceptionrQ   osmkdirpathdirnameREPORT_OUTPUT_FILEOSErroropenjoinr   readr   printr|   r   local_idrf   nowstrftime
show_graphr   r   r   rO   rt   r   rR   r   r   r   dumpsortedrz   r   rg   r   rh   r   r   dumpsr   r   requested_outputr   r   writerendervalue)(accountsconfigrl   rj   rk   rO   report_templatetemplater  region_jsonrN   rS   r   r   r}   rn   r   r   outfileservice_countsr   pprincipal_nodeprivilege_sourcesreport_daterr   r  r  r   r  
arn_prefixr   r  r   gr   r   r   versionfr   r   r   r   k  s  






		






c                 C   sn   t  }|jdddtd |jddddd	 |jd
dtjtdd |jdd t| |\}}}t||| d S )Nz	--max-agezSNumber of days a user or role hasn't been used before it's marked dead. Default: 90r   )helpdefaultr   z--graphzDisplay a graph. Default: Falser  
store_true)r6  destactionz--outputz@Set the output type for the report. [json | html]. Default: htmlr#  )r6  r7  r   r9  F)r  )	argparseArgumentParseradd_argumentintr   r   set_defaultsr
   r   )	argumentsparserrl   r'  r(  r   r   r   run  s.   rB  )4
__future__r   r;  r   rf   os.pathr  abcr   sixr   jinja2r   enumr   loggingr   r   policyuniverse.policyr	   shared.commonr
   r   shared.queryr   r   shared.nodesr   r   __description__setLevelr   r  r  r  r   rX   rt   rz   r   objectr   r   r   r   r   r   r   r   r   r   rB  r   r   r   r   <module>   sL    .'
A  