cloud-mu 1.9.0.pre.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. checksums.yaml +7 -0
  2. data/Berksfile +56 -0
  3. data/Berksfile.lock +250 -0
  4. data/Jenkinsfile +184 -0
  5. data/LICENSE.md +37 -0
  6. data/README.md +26 -0
  7. data/bin/mu-aws-setup +376 -0
  8. data/bin/mu-cleanup +68 -0
  9. data/bin/mu-configure +1133 -0
  10. data/bin/mu-deploy +166 -0
  11. data/bin/mu-firewall-allow-clients +30 -0
  12. data/bin/mu-gcp-setup +200 -0
  13. data/bin/mu-gen-docs +34 -0
  14. data/bin/mu-gen-env +42 -0
  15. data/bin/mu-load-config.rb +158 -0
  16. data/bin/mu-node-manage +683 -0
  17. data/bin/mu-self-update +228 -0
  18. data/bin/mu-ssh +23 -0
  19. data/bin/mu-tunnel-nagios +144 -0
  20. data/bin/mu-upload-chef-artifacts +757 -0
  21. data/bin/mu-user-manage +275 -0
  22. data/cookbooks/awscli/LICENSE +37 -0
  23. data/cookbooks/awscli/README.md +58 -0
  24. data/cookbooks/awscli/attributes/default.rb +1 -0
  25. data/cookbooks/awscli/libraries/instance_metadata.rb +21 -0
  26. data/cookbooks/awscli/metadata.rb +20 -0
  27. data/cookbooks/awscli/recipes/default.rb +56 -0
  28. data/cookbooks/awscli/templates/default/config.erb +18 -0
  29. data/cookbooks/mu-activedirectory/CHANGELOG.md +13 -0
  30. data/cookbooks/mu-activedirectory/LICENSE +37 -0
  31. data/cookbooks/mu-activedirectory/README.md +6 -0
  32. data/cookbooks/mu-activedirectory/attributes/default.rb +98 -0
  33. data/cookbooks/mu-activedirectory/files/default/password-auth +32 -0
  34. data/cookbooks/mu-activedirectory/files/default/sshd_pol.pp +0 -0
  35. data/cookbooks/mu-activedirectory/files/default/sshd_pol.te +32 -0
  36. data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.pp +0 -0
  37. data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.te +10 -0
  38. data/cookbooks/mu-activedirectory/files/default/system-auth +34 -0
  39. data/cookbooks/mu-activedirectory/files/default/winbindpol.pp +0 -0
  40. data/cookbooks/mu-activedirectory/files/default/winbindpol.te +37 -0
  41. data/cookbooks/mu-activedirectory/libraries/config.rb +106 -0
  42. data/cookbooks/mu-activedirectory/libraries/helper.rb +86 -0
  43. data/cookbooks/mu-activedirectory/metadata.rb +17 -0
  44. data/cookbooks/mu-activedirectory/providers/domain.rb +152 -0
  45. data/cookbooks/mu-activedirectory/providers/domain_controller.rb +89 -0
  46. data/cookbooks/mu-activedirectory/providers/domain_node.rb +275 -0
  47. data/cookbooks/mu-activedirectory/recipes/default.rb +8 -0
  48. data/cookbooks/mu-activedirectory/recipes/domain-controller.rb +44 -0
  49. data/cookbooks/mu-activedirectory/recipes/domain-node.rb +50 -0
  50. data/cookbooks/mu-activedirectory/recipes/domain.rb +43 -0
  51. data/cookbooks/mu-activedirectory/recipes/sssd.rb +185 -0
  52. data/cookbooks/mu-activedirectory/resources/domain.rb +25 -0
  53. data/cookbooks/mu-activedirectory/resources/domain_controller.rb +25 -0
  54. data/cookbooks/mu-activedirectory/resources/domain_node.rb +20 -0
  55. data/cookbooks/mu-activedirectory/templates/default/dhclient-eth0.conf.erb +4 -0
  56. data/cookbooks/mu-activedirectory/templates/default/interface +0 -0
  57. data/cookbooks/mu-activedirectory/templates/default/krb5.conf.erb +23 -0
  58. data/cookbooks/mu-activedirectory/templates/default/ntp.conf.erb +56 -0
  59. data/cookbooks/mu-activedirectory/templates/default/smb.conf.erb +33 -0
  60. data/cookbooks/mu-activedirectory/templates/default/sssd.conf.erb +60 -0
  61. data/cookbooks/mu-activedirectory/templates/windows/Backup.xml.erb +20 -0
  62. data/cookbooks/mu-activedirectory/templates/windows/bkupInfo.xml.erb +1 -0
  63. data/cookbooks/mu-activedirectory/templates/windows/gpreprt.xml.erb +198 -0
  64. data/cookbooks/mu-activedirectory/templates/windows/gptmpl.inf.erb +12 -0
  65. data/cookbooks/mu-activedirectory/templates/windows/manifest.xml.erb +1 -0
  66. data/cookbooks/mu-firewall/CHANGELOG.md +11 -0
  67. data/cookbooks/mu-firewall/LICENSE +37 -0
  68. data/cookbooks/mu-firewall/README.md +5 -0
  69. data/cookbooks/mu-firewall/attributes/default.rb +3 -0
  70. data/cookbooks/mu-firewall/metadata.rb +16 -0
  71. data/cookbooks/mu-firewall/recipes/default.rb +10 -0
  72. data/cookbooks/mu-glusterfs/CHANGELOG.md +13 -0
  73. data/cookbooks/mu-glusterfs/LICENSE +37 -0
  74. data/cookbooks/mu-glusterfs/README.md +5 -0
  75. data/cookbooks/mu-glusterfs/attributes/default.rb +34 -0
  76. data/cookbooks/mu-glusterfs/metadata.rb +17 -0
  77. data/cookbooks/mu-glusterfs/recipes/client.rb +62 -0
  78. data/cookbooks/mu-glusterfs/recipes/default.rb +16 -0
  79. data/cookbooks/mu-glusterfs/recipes/samba.rb +57 -0
  80. data/cookbooks/mu-glusterfs/recipes/server.rb +200 -0
  81. data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +71 -0
  82. data/cookbooks/mu-glusterfs/templates/default/smb.conf.erb +14 -0
  83. data/cookbooks/mu-jenkins/CHANGELOG.md +13 -0
  84. data/cookbooks/mu-jenkins/LICENSE +37 -0
  85. data/cookbooks/mu-jenkins/README.md +105 -0
  86. data/cookbooks/mu-jenkins/attributes/default.rb +42 -0
  87. data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +73 -0
  88. data/cookbooks/mu-jenkins/files/default/deploy_config.xml +44 -0
  89. data/cookbooks/mu-jenkins/metadata.rb +21 -0
  90. data/cookbooks/mu-jenkins/recipes/default.rb +195 -0
  91. data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +54 -0
  92. data/cookbooks/mu-jenkins/recipes/public_key.rb +24 -0
  93. data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +24 -0
  94. data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +14 -0
  95. data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +6 -0
  96. data/cookbooks/mu-master/CHANGELOG.md +13 -0
  97. data/cookbooks/mu-master/LICENSE +37 -0
  98. data/cookbooks/mu-master/README.md +6 -0
  99. data/cookbooks/mu-master/attributes/default.rb +95 -0
  100. data/cookbooks/mu-master/files/default/0-mu-log-server.conf +19 -0
  101. data/cookbooks/mu-master/files/default/addRSA.ldif +8 -0
  102. data/cookbooks/mu-master/files/default/check_mem.pl +197 -0
  103. data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
  104. data/cookbooks/mu-master/files/default/dirsrv_admin.pp +0 -0
  105. data/cookbooks/mu-master/files/default/dirsrv_admin.te +13 -0
  106. data/cookbooks/mu-master/files/default/nagios_selinux.pp +0 -0
  107. data/cookbooks/mu-master/files/default/nagios_selinux.te +51 -0
  108. data/cookbooks/mu-master/files/default/nagios_selinux_7.pp +0 -0
  109. data/cookbooks/mu-master/files/default/nagios_selinux_7.te +17 -0
  110. data/cookbooks/mu-master/files/default/pam_sshd +18 -0
  111. data/cookbooks/mu-master/files/default/ssl_enable.ldif +18 -0
  112. data/cookbooks/mu-master/files/default/syslogd_oddjobd.pp +0 -0
  113. data/cookbooks/mu-master/files/default/syslogd_oddjobd.te +10 -0
  114. data/cookbooks/mu-master/files/default/vimrc +19 -0
  115. data/cookbooks/mu-master/libraries/mu.rb +29 -0
  116. data/cookbooks/mu-master/metadata.rb +30 -0
  117. data/cookbooks/mu-master/providers/user.rb +41 -0
  118. data/cookbooks/mu-master/recipes/389ds.rb +164 -0
  119. data/cookbooks/mu-master/recipes/basepackages.rb +58 -0
  120. data/cookbooks/mu-master/recipes/caching_nameserver.rb +37 -0
  121. data/cookbooks/mu-master/recipes/default.rb +451 -0
  122. data/cookbooks/mu-master/recipes/eks-kubectl.rb +41 -0
  123. data/cookbooks/mu-master/recipes/firewall-holes.rb +70 -0
  124. data/cookbooks/mu-master/recipes/init.rb +542 -0
  125. data/cookbooks/mu-master/recipes/ssl-certs.rb +109 -0
  126. data/cookbooks/mu-master/recipes/sssd.rb +89 -0
  127. data/cookbooks/mu-master/recipes/update_nagios_only.rb +242 -0
  128. data/cookbooks/mu-master/recipes/vault.rb +111 -0
  129. data/cookbooks/mu-master/resources/user.rb +19 -0
  130. data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +28 -0
  131. data/cookbooks/mu-master/templates/default/chef-server.rb.erb +18 -0
  132. data/cookbooks/mu-master/templates/default/dhclient-eth0.conf.erb +9 -0
  133. data/cookbooks/mu-master/templates/default/mu-momma-cat.erb +149 -0
  134. data/cookbooks/mu-master/templates/default/mu.rc.erb +9 -0
  135. data/cookbooks/mu-master/templates/default/openssl.cnf.erb +354 -0
  136. data/cookbooks/mu-master/templates/default/sssd.conf.erb +44 -0
  137. data/cookbooks/mu-master/templates/default/web_app.conf.erb +90 -0
  138. data/cookbooks/mu-mongo/CHANGELOG.md +13 -0
  139. data/cookbooks/mu-mongo/LICENSE +37 -0
  140. data/cookbooks/mu-mongo/README.md +5 -0
  141. data/cookbooks/mu-mongo/attributes/default.rb +22 -0
  142. data/cookbooks/mu-mongo/files/default/keyfile +16 -0
  143. data/cookbooks/mu-mongo/files/default/remove_nodes.js +5 -0
  144. data/cookbooks/mu-mongo/metadata.rb +17 -0
  145. data/cookbooks/mu-mongo/recipes/default.rb +149 -0
  146. data/cookbooks/mu-mongo/recipes/yum-update-rule.rb +18 -0
  147. data/cookbooks/mu-mongo/templates/default/mongo_create_openfema_db.js.erb +2 -0
  148. data/cookbooks/mu-mongo/templates/default/mongo_init.js.erb +1 -0
  149. data/cookbooks/mu-mongo/templates/default/mongo_logrotate.erb +14 -0
  150. data/cookbooks/mu-mongo/templates/default/mongo_replset_addnodes.js.erb +6 -0
  151. data/cookbooks/mu-mongo/templates/default/replset_init.js.erb +2 -0
  152. data/cookbooks/mu-openvpn/CHANGELOG.md +13 -0
  153. data/cookbooks/mu-openvpn/LICENSE +37 -0
  154. data/cookbooks/mu-openvpn/README.md +6 -0
  155. data/cookbooks/mu-openvpn/attributes/default.rb +119 -0
  156. data/cookbooks/mu-openvpn/metadata.rb +18 -0
  157. data/cookbooks/mu-openvpn/recipes/default.rb +108 -0
  158. data/cookbooks/mu-openvpn/templates/default/users.json.erb +42 -0
  159. data/cookbooks/mu-php54/CHANGELOG.md +12 -0
  160. data/cookbooks/mu-php54/LICENSE +37 -0
  161. data/cookbooks/mu-php54/README.md +0 -0
  162. data/cookbooks/mu-php54/files/centos/php.ini +1802 -0
  163. data/cookbooks/mu-php54/files/ubuntu/php.ini +1870 -0
  164. data/cookbooks/mu-php54/metadata.rb +21 -0
  165. data/cookbooks/mu-php54/recipes/default.rb +97 -0
  166. data/cookbooks/mu-splunk/CHANGELOG.md +37 -0
  167. data/cookbooks/mu-splunk/LICENSE +37 -0
  168. data/cookbooks/mu-splunk/README.md +451 -0
  169. data/cookbooks/mu-splunk/attributes/default.rb +95 -0
  170. data/cookbooks/mu-splunk/attributes/upgrade.rb +49 -0
  171. data/cookbooks/mu-splunk/definitions/splunk_installer.rb +103 -0
  172. data/cookbooks/mu-splunk/files/default/splunk-nocheck +10 -0
  173. data/cookbooks/mu-splunk/libraries/helpers.rb +72 -0
  174. data/cookbooks/mu-splunk/libraries/splunk_app_provider.rb +156 -0
  175. data/cookbooks/mu-splunk/libraries/splunk_app_resource.rb +43 -0
  176. data/cookbooks/mu-splunk/metadata.json +30 -0
  177. data/cookbooks/mu-splunk/metadata.rb +17 -0
  178. data/cookbooks/mu-splunk/recipes/client.rb +143 -0
  179. data/cookbooks/mu-splunk/recipes/default.rb +31 -0
  180. data/cookbooks/mu-splunk/recipes/disabled.rb +41 -0
  181. data/cookbooks/mu-splunk/recipes/install_forwarder.rb +23 -0
  182. data/cookbooks/mu-splunk/recipes/install_server.rb +23 -0
  183. data/cookbooks/mu-splunk/recipes/server.rb +53 -0
  184. data/cookbooks/mu-splunk/recipes/service.rb +95 -0
  185. data/cookbooks/mu-splunk/recipes/setup_auth.rb +49 -0
  186. data/cookbooks/mu-splunk/recipes/setup_ssl.rb +63 -0
  187. data/cookbooks/mu-splunk/recipes/upgrade.rb +94 -0
  188. data/cookbooks/mu-splunk/recipes/user.rb +34 -0
  189. data/cookbooks/mu-splunk/templates/default/base_logs_unix_inputs.conf.erb +26 -0
  190. data/cookbooks/mu-splunk/templates/default/inputs.conf.erb +13 -0
  191. data/cookbooks/mu-splunk/templates/default/outputs.conf.erb +9 -0
  192. data/cookbooks/mu-splunk/templates/default/splunk-init.erb +74 -0
  193. data/cookbooks/mu-splunk/templates/default/system-web.conf.erb +7 -0
  194. data/cookbooks/mu-tools/CHANGELOG.md +12 -0
  195. data/cookbooks/mu-tools/LICENSE +37 -0
  196. data/cookbooks/mu-tools/README.md +188 -0
  197. data/cookbooks/mu-tools/attributes/default.rb +142 -0
  198. data/cookbooks/mu-tools/attributes/ebs_rolling_snapshots.rb +3 -0
  199. data/cookbooks/mu-tools/files/amazon/etc/freshclam.conf +235 -0
  200. data/cookbooks/mu-tools/files/centos/CentOS-Base.repo +52 -0
  201. data/cookbooks/mu-tools/files/centos/etc/bashrc +93 -0
  202. data/cookbooks/mu-tools/files/centos/etc/freshclam.conf +235 -0
  203. data/cookbooks/mu-tools/files/centos/etc/login.defs +72 -0
  204. data/cookbooks/mu-tools/files/centos/etc/profile +77 -0
  205. data/cookbooks/mu-tools/files/centos/etc/security/limits.conf +57 -0
  206. data/cookbooks/mu-tools/files/centos/etc/sysconfig/init +19 -0
  207. data/cookbooks/mu-tools/files/centos/etc/sysctl.conf +82 -0
  208. data/cookbooks/mu-tools/files/centos-6/README_MU +0 -0
  209. data/cookbooks/mu-tools/files/centos-6/etc/audit/stig.rules +173 -0
  210. data/cookbooks/mu-tools/files/centos-6/etc/bashrc +90 -0
  211. data/cookbooks/mu-tools/files/centos-6/etc/login.defs +70 -0
  212. data/cookbooks/mu-tools/files/centos-6/etc/pam.d/su +12 -0
  213. data/cookbooks/mu-tools/files/centos-6/etc/profile +83 -0
  214. data/cookbooks/mu-tools/files/centos-6/etc/securetty +12 -0
  215. data/cookbooks/mu-tools/files/centos-6/etc/sysconfig/init +30 -0
  216. data/cookbooks/mu-tools/files/centos-6/etc/sysctl.conf +40 -0
  217. data/cookbooks/mu-tools/files/default/Mu_CA.pem +34 -0
  218. data/cookbooks/mu-tools/files/default/PSWindowsUpdate.zip +0 -0
  219. data/cookbooks/mu-tools/files/default/ebs_snapshots.py +123 -0
  220. data/cookbooks/mu-tools/files/default/etc/BANNER +0 -0
  221. data/cookbooks/mu-tools/files/default/etc/BANNER-FEDERAL +19 -0
  222. data/cookbooks/mu-tools/files/default/gpo_no_uac.zip +0 -0
  223. data/cookbooks/mu-tools/files/default/mypol.pp +0 -0
  224. data/cookbooks/mu-tools/files/default/mypol.te +37 -0
  225. data/cookbooks/mu-tools/files/default/nrpe_c7.pp +0 -0
  226. data/cookbooks/mu-tools/files/default/nrpe_c7.te +31 -0
  227. data/cookbooks/mu-tools/files/default/nrpe_check_disk.pp +0 -0
  228. data/cookbooks/mu-tools/files/default/nrpe_check_disk.te +11 -0
  229. data/cookbooks/mu-tools/files/default/nrpe_disk.pp +0 -0
  230. data/cookbooks/mu-tools/files/default/nrpe_disk.te +10 -0
  231. data/cookbooks/mu-tools/files/default/nrpe_file.pp +0 -0
  232. data/cookbooks/mu-tools/files/default/nrpe_file.te +31 -0
  233. data/cookbooks/mu-tools/files/default/ntrights +0 -0
  234. data/cookbooks/mu-tools/files/default/serverclass.conf +18 -0
  235. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/app.conf +1 -0
  236. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/inputs.conf +13 -0
  237. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/app.conf +1 -0
  238. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/inputs.conf +8 -0
  239. data/cookbooks/mu-tools/files/default/sshd_pol.pp +0 -0
  240. data/cookbooks/mu-tools/files/default/sshd_pol.te +32 -0
  241. data/cookbooks/mu-tools/files/redhat/etc/bashrc +93 -0
  242. data/cookbooks/mu-tools/files/redhat/etc/freshclam.conf +235 -0
  243. data/cookbooks/mu-tools/files/redhat/etc/login.defs +72 -0
  244. data/cookbooks/mu-tools/files/redhat/etc/profile +77 -0
  245. data/cookbooks/mu-tools/files/redhat/etc/security/limits.conf +57 -0
  246. data/cookbooks/mu-tools/files/redhat/etc/sysconfig/init +19 -0
  247. data/cookbooks/mu-tools/files/redhat/etc/sysctl.conf +82 -0
  248. data/cookbooks/mu-tools/files/redhat-6/README_MU +0 -0
  249. data/cookbooks/mu-tools/files/redhat-6/etc/audit/stig.rules +173 -0
  250. data/cookbooks/mu-tools/files/redhat-6/etc/bashrc +90 -0
  251. data/cookbooks/mu-tools/files/redhat-6/etc/login.defs +70 -0
  252. data/cookbooks/mu-tools/files/redhat-6/etc/pam.d/su +12 -0
  253. data/cookbooks/mu-tools/files/redhat-6/etc/profile +83 -0
  254. data/cookbooks/mu-tools/files/redhat-6/etc/securetty +12 -0
  255. data/cookbooks/mu-tools/files/redhat-6/etc/sysconfig/init +30 -0
  256. data/cookbooks/mu-tools/files/redhat-6/etc/sysctl.conf +40 -0
  257. data/cookbooks/mu-tools/files/redhat-7.1/etc/freshclam.conf +235 -0
  258. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/bash.bashrc +64 -0
  259. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/common-session +30 -0
  260. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/login.defs +338 -0
  261. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/profile +30 -0
  262. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/security/limits.conf +56 -0
  263. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/sysctl.conf +60 -0
  264. data/cookbooks/mu-tools/libraries/helper.rb +292 -0
  265. data/cookbooks/mu-tools/metadata.rb +28 -0
  266. data/cookbooks/mu-tools/recipes/add_admin_ssh_keys.rb +35 -0
  267. data/cookbooks/mu-tools/recipes/apply_security.rb +440 -0
  268. data/cookbooks/mu-tools/recipes/aws_api.rb +23 -0
  269. data/cookbooks/mu-tools/recipes/base_repositories.rb +31 -0
  270. data/cookbooks/mu-tools/recipes/cisbenchmark.rb +59 -0
  271. data/cookbooks/mu-tools/recipes/clamav.rb +53 -0
  272. data/cookbooks/mu-tools/recipes/cloudinit.rb +58 -0
  273. data/cookbooks/mu-tools/recipes/configure_oracle_tools.rb +81 -0
  274. data/cookbooks/mu-tools/recipes/disable-requiretty.rb +22 -0
  275. data/cookbooks/mu-tools/recipes/ebs_rolling_snapshots.rb +75 -0
  276. data/cookbooks/mu-tools/recipes/efs.rb +70 -0
  277. data/cookbooks/mu-tools/recipes/eks.rb +160 -0
  278. data/cookbooks/mu-tools/recipes/gcloud.rb +98 -0
  279. data/cookbooks/mu-tools/recipes/google_api.rb +25 -0
  280. data/cookbooks/mu-tools/recipes/maldet.rb +67 -0
  281. data/cookbooks/mu-tools/recipes/nagios.rb +19 -0
  282. data/cookbooks/mu-tools/recipes/newclient.rb +23 -0
  283. data/cookbooks/mu-tools/recipes/nrpe.rb +115 -0
  284. data/cookbooks/mu-tools/recipes/python_pip.rb +35 -0
  285. data/cookbooks/mu-tools/recipes/retrieve_application.rb +51 -0
  286. data/cookbooks/mu-tools/recipes/rsyslog.rb +65 -0
  287. data/cookbooks/mu-tools/recipes/set_local_fw.rb +57 -0
  288. data/cookbooks/mu-tools/recipes/set_mu_hostname.rb +81 -0
  289. data/cookbooks/mu-tools/recipes/split_var_partitions.rb +86 -0
  290. data/cookbooks/mu-tools/recipes/splunk-client.rb +69 -0
  291. data/cookbooks/mu-tools/recipes/splunk-server.rb +104 -0
  292. data/cookbooks/mu-tools/recipes/store_inspec_attr.rb +8 -0
  293. data/cookbooks/mu-tools/recipes/updates.rb +96 -0
  294. data/cookbooks/mu-tools/recipes/windows-client.rb +202 -0
  295. data/cookbooks/mu-tools/resources/aws_windows.rb +33 -0
  296. data/cookbooks/mu-tools/resources/disk.rb +88 -0
  297. data/cookbooks/mu-tools/resources/mommacat_request.rb +11 -0
  298. data/cookbooks/mu-tools/resources/scheduled_tasks.rb +29 -0
  299. data/cookbooks/mu-tools/resources/sshd_service.rb +45 -0
  300. data/cookbooks/mu-tools/resources/windows_users.rb +242 -0
  301. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +168 -0
  302. data/cookbooks/mu-tools/templates/centos-6/sshd_config.erb +212 -0
  303. data/cookbooks/mu-tools/templates/centos-7/sshd_config.erb +215 -0
  304. data/cookbooks/mu-tools/templates/default/0-mu-log-client.conf.erb +13 -0
  305. data/cookbooks/mu-tools/templates/default/conf.maldet.erb +137 -0
  306. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +30 -0
  307. data/cookbooks/mu-tools/templates/default/etc_pamd_password-auth.erb +14 -0
  308. data/cookbooks/mu-tools/templates/default/etc_pamd_system-auth.erb +14 -0
  309. data/cookbooks/mu-tools/templates/default/etc_sysconfig_network.erb +12 -0
  310. data/cookbooks/mu-tools/templates/default/kubeconfig.erb +29 -0
  311. data/cookbooks/mu-tools/templates/default/kubelet.service.erb +35 -0
  312. data/cookbooks/mu-tools/templates/default/maldet_scanall.sh.erb +15 -0
  313. data/cookbooks/mu-tools/templates/default/nrpe.cfg.erb +233 -0
  314. data/cookbooks/mu-tools/templates/redhat-6/sshd_config.erb +213 -0
  315. data/cookbooks/mu-tools/templates/redhat-7/sshd_config.erb +215 -0
  316. data/cookbooks/mu-tools/templates/ubuntu-12.04/sshd_config.erb +146 -0
  317. data/cookbooks/mu-tools/templates/ubuntu-14.04/sshd_config.erb +145 -0
  318. data/cookbooks/mu-tools/templates/windows/Backup.xml.erb +20 -0
  319. data/cookbooks/mu-tools/templates/windows/bkupInfo.xml.erb +1 -0
  320. data/cookbooks/mu-tools/templates/windows/gpreprt.xml.erb +214 -0
  321. data/cookbooks/mu-tools/templates/windows/gptmpl.inf.erb +12 -0
  322. data/cookbooks/mu-tools/templates/windows/manifest.xml.erb +1 -0
  323. data/cookbooks/mu-tools/templates/windows/set_ad_dns_scheduled_task.ps1.erb +6 -0
  324. data/cookbooks/mu-tools/templates/windows/sshd_config.erb +136 -0
  325. data/cookbooks/mu-utility/CHANGELOG.md +12 -0
  326. data/cookbooks/mu-utility/LICENSE +37 -0
  327. data/cookbooks/mu-utility/README.md +6 -0
  328. data/cookbooks/mu-utility/attributes/default.rb +1 -0
  329. data/cookbooks/mu-utility/libraries/matchers.rb +21 -0
  330. data/cookbooks/mu-utility/metadata.rb +16 -0
  331. data/cookbooks/mu-utility/recipes/apt.rb +23 -0
  332. data/cookbooks/mu-utility/recipes/cleanup_image_helper.rb +118 -0
  333. data/cookbooks/mu-utility/recipes/iptables.rb +26 -0
  334. data/cookbooks/mu-utility/recipes/luks.rb +18 -0
  335. data/cookbooks/mu-utility/recipes/nat.rb +104 -0
  336. data/cookbooks/mu-utility/recipes/php.rb +33 -0
  337. data/cookbooks/mu-utility/recipes/rdp_gateway.rb +83 -0
  338. data/cookbooks/mu-utility/recipes/remi.rb +44 -0
  339. data/cookbooks/mu-utility/recipes/vim.rb +26 -0
  340. data/cookbooks/mu-utility/recipes/windows_basics.rb +37 -0
  341. data/cookbooks/mu-utility/recipes/zip.rb +26 -0
  342. data/cookbooks/mu-utility/templates/default/BundleConfig.xml.erb +34 -0
  343. data/cookbooks/mu-utility/templates/default/config.xml.erb +60 -0
  344. data/cookbooks/nagios/Berksfile +8 -0
  345. data/cookbooks/nagios/CHANGELOG.md +589 -0
  346. data/cookbooks/nagios/CONTRIBUTING.md +11 -0
  347. data/cookbooks/nagios/LICENSE +37 -0
  348. data/cookbooks/nagios/README.md +328 -0
  349. data/cookbooks/nagios/TESTING.md +2 -0
  350. data/cookbooks/nagios/attributes/config.rb +171 -0
  351. data/cookbooks/nagios/attributes/default.rb +228 -0
  352. data/cookbooks/nagios/chefignore +102 -0
  353. data/cookbooks/nagios/definitions/command.rb +33 -0
  354. data/cookbooks/nagios/definitions/contact.rb +33 -0
  355. data/cookbooks/nagios/definitions/contactgroup.rb +33 -0
  356. data/cookbooks/nagios/definitions/host.rb +33 -0
  357. data/cookbooks/nagios/definitions/hostdependency.rb +33 -0
  358. data/cookbooks/nagios/definitions/hostescalation.rb +34 -0
  359. data/cookbooks/nagios/definitions/hostgroup.rb +33 -0
  360. data/cookbooks/nagios/definitions/nagios_conf.rb +38 -0
  361. data/cookbooks/nagios/definitions/resource.rb +33 -0
  362. data/cookbooks/nagios/definitions/service.rb +33 -0
  363. data/cookbooks/nagios/definitions/servicedependency.rb +33 -0
  364. data/cookbooks/nagios/definitions/serviceescalation.rb +34 -0
  365. data/cookbooks/nagios/definitions/servicegroup.rb +33 -0
  366. data/cookbooks/nagios/definitions/timeperiod.rb +33 -0
  367. data/cookbooks/nagios/libraries/base.rb +314 -0
  368. data/cookbooks/nagios/libraries/command.rb +91 -0
  369. data/cookbooks/nagios/libraries/contact.rb +230 -0
  370. data/cookbooks/nagios/libraries/contactgroup.rb +112 -0
  371. data/cookbooks/nagios/libraries/custom_option.rb +36 -0
  372. data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
  373. data/cookbooks/nagios/libraries/default.rb +90 -0
  374. data/cookbooks/nagios/libraries/host.rb +412 -0
  375. data/cookbooks/nagios/libraries/hostdependency.rb +181 -0
  376. data/cookbooks/nagios/libraries/hostescalation.rb +173 -0
  377. data/cookbooks/nagios/libraries/hostgroup.rb +119 -0
  378. data/cookbooks/nagios/libraries/nagios.rb +282 -0
  379. data/cookbooks/nagios/libraries/resource.rb +59 -0
  380. data/cookbooks/nagios/libraries/service.rb +455 -0
  381. data/cookbooks/nagios/libraries/servicedependency.rb +215 -0
  382. data/cookbooks/nagios/libraries/serviceescalation.rb +195 -0
  383. data/cookbooks/nagios/libraries/servicegroup.rb +144 -0
  384. data/cookbooks/nagios/libraries/timeperiod.rb +160 -0
  385. data/cookbooks/nagios/libraries/users_helper.rb +54 -0
  386. data/cookbooks/nagios/metadata.rb +25 -0
  387. data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
  388. data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
  389. data/cookbooks/nagios/recipes/apache.rb +48 -0
  390. data/cookbooks/nagios/recipes/default.rb +204 -0
  391. data/cookbooks/nagios/recipes/nginx.rb +82 -0
  392. data/cookbooks/nagios/recipes/pagerduty.rb +143 -0
  393. data/cookbooks/nagios/recipes/server_package.rb +40 -0
  394. data/cookbooks/nagios/recipes/server_source.rb +164 -0
  395. data/cookbooks/nagios/templates/default/apache2.conf.erb +96 -0
  396. data/cookbooks/nagios/templates/default/cgi.cfg.erb +266 -0
  397. data/cookbooks/nagios/templates/default/commands.cfg.erb +13 -0
  398. data/cookbooks/nagios/templates/default/contacts.cfg.erb +37 -0
  399. data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +25 -0
  400. data/cookbooks/nagios/templates/default/hosts.cfg.erb +15 -0
  401. data/cookbooks/nagios/templates/default/htpasswd.users.erb +6 -0
  402. data/cookbooks/nagios/templates/default/nagios.cfg.erb +22 -0
  403. data/cookbooks/nagios/templates/default/nginx.conf.erb +62 -0
  404. data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +185 -0
  405. data/cookbooks/nagios/templates/default/resource.cfg.erb +27 -0
  406. data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +15 -0
  407. data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +14 -0
  408. data/cookbooks/nagios/templates/default/services.cfg.erb +14 -0
  409. data/cookbooks/nagios/templates/default/templates.cfg.erb +31 -0
  410. data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +13 -0
  411. data/cookbooks/s3fs/CHANGELOG.md +13 -0
  412. data/cookbooks/s3fs/LICENSE +37 -0
  413. data/cookbooks/s3fs/README.md +6 -0
  414. data/cookbooks/s3fs/attributes/default.rb +15 -0
  415. data/cookbooks/s3fs/files/default/fuse-2.9.3.zip +0 -0
  416. data/cookbooks/s3fs/metadata.rb +16 -0
  417. data/cookbooks/s3fs/recipes/default.rb +91 -0
  418. data/data_bags/demo/app.json +7 -0
  419. data/data_bags/nagios_services/chef.json +6 -0
  420. data/data_bags/nagios_services/linux_diskspace.json +5 -0
  421. data/data_bags/nagios_services/momma_cat.json +6 -0
  422. data/data_bags/nagios_services/mu-master-memory.json +5 -0
  423. data/data_bags/nagios_services/nagios_ui.json +6 -0
  424. data/data_bags/nagios_services/node_ssh.json +6 -0
  425. data/data_bags/nagios_services/ssh.json +6 -0
  426. data/demo/lambda_test.yaml +29 -0
  427. data/environments/DEV.json +8 -0
  428. data/environments/PROD.json +8 -0
  429. data/environments/dev.json +8 -0
  430. data/environments/development.json +8 -0
  431. data/environments/prod.json +8 -0
  432. data/extras/README.md +1 -0
  433. data/extras/admin-role-binding.yaml +16 -0
  434. data/extras/admin-user.yaml +6 -0
  435. data/extras/aws-auth-cm.yaml.erb +12 -0
  436. data/extras/clean-stock-amis +48 -0
  437. data/extras/git-fix-permissions-hook +12 -0
  438. data/extras/gitlab-eks-helper.sh.erb +20 -0
  439. data/extras/image-generators/README.md +2 -0
  440. data/extras/image-generators/aws/centos6.yaml +18 -0
  441. data/extras/image-generators/aws/centos7-govcloud.yaml +24 -0
  442. data/extras/image-generators/aws/centos7.yaml +17 -0
  443. data/extras/image-generators/aws/rhel7.yaml +17 -0
  444. data/extras/image-generators/aws/win2k12.yaml +16 -0
  445. data/extras/image-generators/aws/win2k16.yaml +16 -0
  446. data/extras/image-generators/aws/windows.yaml +18 -0
  447. data/extras/image-generators/gcp/centos6.yaml +17 -0
  448. data/extras/lambda_waf_domain_blacklist.py +103 -0
  449. data/extras/platform_berksfile_base +50 -0
  450. data/extras/ruby_rpm/build.sh +17 -0
  451. data/extras/ruby_rpm/muby.spec +44 -0
  452. data/extras/vault_tools/README.md +6 -0
  453. data/extras/vault_tools/export_vaults.sh +3 -0
  454. data/extras/vault_tools/recreate_vaults.sh +5 -0
  455. data/extras/vault_tools/test_vaults.sh +5 -0
  456. data/install/README.md +8 -0
  457. data/install/cfn_create_mu_master.json +1034 -0
  458. data/install/chef-server.rb.erb +19 -0
  459. data/install/deprecated-bash-library.sh +1891 -0
  460. data/install/images/Usage.png +0 -0
  461. data/install/installer +71 -0
  462. data/install/jenkinskeys.rb +8 -0
  463. data/install/user-dot-murc.erb +14 -0
  464. data/modules/html.erb +19 -0
  465. data/modules/mommacat.ru +426 -0
  466. data/modules/mu/cleanup.rb +339 -0
  467. data/modules/mu/cloud.rb +1446 -0
  468. data/modules/mu/clouds/README.md +201 -0
  469. data/modules/mu/clouds/aws/alarm.rb +319 -0
  470. data/modules/mu/clouds/aws/cache_cluster.rb +1010 -0
  471. data/modules/mu/clouds/aws/collection.rb +373 -0
  472. data/modules/mu/clouds/aws/container_cluster.rb +667 -0
  473. data/modules/mu/clouds/aws/database.rb +1836 -0
  474. data/modules/mu/clouds/aws/dnszone.rb +911 -0
  475. data/modules/mu/clouds/aws/firewall_rule.rb +641 -0
  476. data/modules/mu/clouds/aws/folder.rb +92 -0
  477. data/modules/mu/clouds/aws/function.rb +349 -0
  478. data/modules/mu/clouds/aws/group.rb +251 -0
  479. data/modules/mu/clouds/aws/loadbalancer.rb +888 -0
  480. data/modules/mu/clouds/aws/log.rb +363 -0
  481. data/modules/mu/clouds/aws/msg_queue.rb +480 -0
  482. data/modules/mu/clouds/aws/notification.rb +139 -0
  483. data/modules/mu/clouds/aws/role.rb +656 -0
  484. data/modules/mu/clouds/aws/search_domain.rb +646 -0
  485. data/modules/mu/clouds/aws/server.rb +2294 -0
  486. data/modules/mu/clouds/aws/server_pool.rb +1388 -0
  487. data/modules/mu/clouds/aws/storage_pool.rb +495 -0
  488. data/modules/mu/clouds/aws/user.rb +382 -0
  489. data/modules/mu/clouds/aws/userdata/README.md +4 -0
  490. data/modules/mu/clouds/aws/userdata/linux.erb +179 -0
  491. data/modules/mu/clouds/aws/userdata/windows.erb +278 -0
  492. data/modules/mu/clouds/aws/vpc.rb +1943 -0
  493. data/modules/mu/clouds/aws.rb +1009 -0
  494. data/modules/mu/clouds/cloudformation/alarm.rb +146 -0
  495. data/modules/mu/clouds/cloudformation/cache_cluster.rb +167 -0
  496. data/modules/mu/clouds/cloudformation/collection.rb +117 -0
  497. data/modules/mu/clouds/cloudformation/database.rb +278 -0
  498. data/modules/mu/clouds/cloudformation/dnszone.rb +274 -0
  499. data/modules/mu/clouds/cloudformation/firewall_rule.rb +308 -0
  500. data/modules/mu/clouds/cloudformation/loadbalancer.rb +193 -0
  501. data/modules/mu/clouds/cloudformation/log.rb +170 -0
  502. data/modules/mu/clouds/cloudformation/server.rb +370 -0
  503. data/modules/mu/clouds/cloudformation/server_pool.rb +279 -0
  504. data/modules/mu/clouds/cloudformation/vpc.rb +322 -0
  505. data/modules/mu/clouds/cloudformation.rb +733 -0
  506. data/modules/mu/clouds/docker.rb +30 -0
  507. data/modules/mu/clouds/google/container_cluster.rb +290 -0
  508. data/modules/mu/clouds/google/database.rb +152 -0
  509. data/modules/mu/clouds/google/firewall_rule.rb +267 -0
  510. data/modules/mu/clouds/google/group.rb +164 -0
  511. data/modules/mu/clouds/google/loadbalancer.rb +479 -0
  512. data/modules/mu/clouds/google/server.rb +1510 -0
  513. data/modules/mu/clouds/google/server_pool.rb +274 -0
  514. data/modules/mu/clouds/google/user.rb +266 -0
  515. data/modules/mu/clouds/google/userdata/README.md +4 -0
  516. data/modules/mu/clouds/google/userdata/linux.erb +137 -0
  517. data/modules/mu/clouds/google/userdata/windows.erb +275 -0
  518. data/modules/mu/clouds/google/vpc.rb +890 -0
  519. data/modules/mu/clouds/google.rb +811 -0
  520. data/modules/mu/config/README.md +11 -0
  521. data/modules/mu/config/alarm.rb +271 -0
  522. data/modules/mu/config/cache_cluster.rb +172 -0
  523. data/modules/mu/config/collection.rb +87 -0
  524. data/modules/mu/config/container_cluster.rb +103 -0
  525. data/modules/mu/config/container_cluster.yml +36 -0
  526. data/modules/mu/config/database.rb +458 -0
  527. data/modules/mu/config/database.yml +26 -0
  528. data/modules/mu/config/dnszone.rb +327 -0
  529. data/modules/mu/config/firewall_rule.rb +118 -0
  530. data/modules/mu/config/folder.rb +70 -0
  531. data/modules/mu/config/function.rb +140 -0
  532. data/modules/mu/config/group.rb +64 -0
  533. data/modules/mu/config/loadbalancer.rb +482 -0
  534. data/modules/mu/config/log.rb +47 -0
  535. data/modules/mu/config/log.yml +6 -0
  536. data/modules/mu/config/msg_queue.rb +47 -0
  537. data/modules/mu/config/msg_queue.yml +9 -0
  538. data/modules/mu/config/notification.rb +44 -0
  539. data/modules/mu/config/project.rb +71 -0
  540. data/modules/mu/config/role.rb +102 -0
  541. data/modules/mu/config/search_domain.rb +61 -0
  542. data/modules/mu/config/search_domain.yml +25 -0
  543. data/modules/mu/config/server.rb +587 -0
  544. data/modules/mu/config/server.yml +8 -0
  545. data/modules/mu/config/server_pool.rb +216 -0
  546. data/modules/mu/config/server_pool.yml +71 -0
  547. data/modules/mu/config/storage_pool.rb +145 -0
  548. data/modules/mu/config/user.rb +78 -0
  549. data/modules/mu/config/vpc.rb +743 -0
  550. data/modules/mu/config/vpc.yml +6 -0
  551. data/modules/mu/config.rb +2000 -0
  552. data/modules/mu/defaults/README.md +2 -0
  553. data/modules/mu/defaults/amazon_images.yaml +121 -0
  554. data/modules/mu/defaults/google_images.yaml +16 -0
  555. data/modules/mu/deploy.rb +686 -0
  556. data/modules/mu/groomer.rb +123 -0
  557. data/modules/mu/groomers/README.md +58 -0
  558. data/modules/mu/groomers/chef.rb +1024 -0
  559. data/modules/mu/kittens.rb +11319 -0
  560. data/modules/mu/logger.rb +208 -0
  561. data/modules/mu/master/README.md +27 -0
  562. data/modules/mu/master/chef.rb +471 -0
  563. data/modules/mu/master/ldap.rb +1005 -0
  564. data/modules/mu/master.rb +415 -0
  565. data/modules/mu/mommacat.rb +2703 -0
  566. data/modules/mu-load-config.rb +1 -0
  567. data/modules/mu.rb +724 -0
  568. data/modules/scratchpad.erb +1 -0
  569. data/modules/tests/super_complex_bok.yml +41 -0
  570. data/modules/tests/super_simple_bok.yml +40 -0
  571. data/mu.gemspec +62 -0
  572. data/roles/demo-dbservice-configure.json +19 -0
  573. data/roles/demo-portal-configure.json +19 -0
  574. data/roles/mu-master-jenkins.json +24 -0
  575. data/roles/mu-master-nagios-only.json +13 -0
  576. data/roles/mu-master.json +12 -0
  577. data/roles/mu-node.json +19 -0
  578. data/roles/mu-splunk-server.json +13 -0
  579. data/roles/mu-splunk.json +13 -0
  580. data/test/clean_up.py +25 -0
  581. data/test/demo-test-profile/README.md +3 -0
  582. data/test/demo-test-profile/controls/flask.rb +84 -0
  583. data/test/demo-test-profile/inspec.lock +7 -0
  584. data/test/demo-test-profile/inspec.yml +11 -0
  585. data/test/etco-test-profile/README.md +3 -0
  586. data/test/etco-test-profile/controls/all-in-one.rb +182 -0
  587. data/test/etco-test-profile/inspec.lock +7 -0
  588. data/test/etco-test-profile/inspec.yml +11 -0
  589. data/test/exec_inspec.py +246 -0
  590. data/test/exec_mu_install.py +241 -0
  591. data/test/exec_retry.py +44 -0
  592. data/test/mu-master-test/README.md +3 -0
  593. data/test/mu-master-test/controls/all_in_one.rb +557 -0
  594. data/test/mu-master-test/inspec.lock +3 -0
  595. data/test/mu-master-test/inspec.yml +11 -0
  596. data/test/mu-tools-test/README.md +3 -0
  597. data/test/mu-tools-test/controls/base.rb +265 -0
  598. data/test/mu-tools-test/inspec.lock +3 -0
  599. data/test/mu-tools-test/inspec.yml +8 -0
  600. data/test/simple-server-php-test/README.md +3 -0
  601. data/test/simple-server-php-test/controls/apachephp.rb +25 -0
  602. data/test/simple-server-php-test/controls/example.rb +19 -0
  603. data/test/simple-server-php-test/inspec.lock +7 -0
  604. data/test/simple-server-php-test/inspec.yml +12 -0
  605. data/test/simple-server-rails-test/README.md +3 -0
  606. data/test/simple-server-rails-test/controls/rails.rb +188 -0
  607. data/test/simple-server-rails-test/inspec.lock +7 -0
  608. data/test/simple-server-rails-test/inspec.yml +11 -0
  609. data/test/simple-windows-test/README.md +3 -0
  610. data/test/simple-windows-test/controls/windows.rb +20 -0
  611. data/test/simple-windows-test/inspec.lock +7 -0
  612. data/test/simple-windows-test/inspec.yml +11 -0
  613. data/test/smoke_test.rb +75 -0
  614. data/test/wordpress-test/README.md +3 -0
  615. data/test/wordpress-test/controls/wordpress.rb +97 -0
  616. data/test/wordpress-test/inspec.lock +7 -0
  617. data/test/wordpress-test/inspec.yml +11 -0
  618. metadata +979 -0
@@ -0,0 +1,656 @@
1
+ # Copyright:: Copyright (c) 2018 eGlobalTech, Inc., all rights reserved
2
+ #
3
+ # Licensed under the BSD-3 license (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License in the root of the project or at
6
+ #
7
+ # http://egt-labs.com/mu/LICENSE.html
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module MU
16
+ class Cloud
17
+ class AWS
18
+ # A user as configured in {MU::Config::BasketofKittens::roles}
19
+ class Role < MU::Cloud::Role
20
+ @deploy = nil
21
+ @config = nil
22
+ attr_reader :mu_name
23
+ attr_reader :config
24
+ attr_reader :cloud_id
25
+
26
+ # @param mommacat [MU::MommaCat]: A {MU::Mommacat} object containing the deploy of which this resource is/will be a member.
27
+ # @param kitten_cfg [Hash]: The fully parsed and resolved {MU::Config} resource descriptor as defined in {MU::Config::BasketofKittens::roles}
28
+ def initialize(mommacat: nil, kitten_cfg: nil, mu_name: nil, cloud_id: nil)
29
+ @deploy = mommacat
30
+ @config = MU::Config.manxify(kitten_cfg)
31
+ @cloud_id ||= cloud_id
32
+ @mu_name = mu_name
33
+ @mu_name ||= @deploy.getResourceName(@config["name"])
34
+ end
35
+
36
+ # Called automatically by {MU::Deploy#createResources}
37
+ def create
38
+ if @config['iam_policies']
39
+ @config['iam_policies'].each { |policy|
40
+ policy_name = @mu_name+"-"+policy.keys.first.upcase
41
+ MU.log "Creating IAM policy #{policy_name}"
42
+ resp = MU::Cloud::AWS.iam.create_policy(
43
+ policy_name: policy_name,
44
+ path: "/"+@deploy.deploy_id+"/",
45
+ policy_document: JSON.generate(policy.values.first),
46
+ description: "Generated from inline policy document for Mu role #{@mu_name}"
47
+ )
48
+ }
49
+ end
50
+
51
+ if !@config['bare_policies']
52
+ MU.log "Creating IAM role #{@mu_name}"
53
+ resp = MU::Cloud::AWS.iam.create_role(
54
+ path: "/"+@deploy.deploy_id+"/",
55
+ role_name: @mu_name,
56
+ description: "Generated by Mu",
57
+ assume_role_policy_document: gen_role_policy_doc,
58
+ tags: get_tag_params
59
+ )
60
+ end
61
+ end
62
+
63
+ # Called automatically by {MU::Deploy#createResources}
64
+ def groom
65
+
66
+ if @config['policies']
67
+ @config['iam_policies'] ||= []
68
+ @config['iam_policies'].concat(convert_policies_to_iam)
69
+ end
70
+
71
+ if !@config['bare_policies']
72
+ resp = MU::Cloud::AWS.iam.get_role(
73
+ role_name: @mu_name
74
+ ).role
75
+ ext_tags = resp.tags.map { |t| t.to_h }
76
+ tag_param = get_tag_params(true)
77
+ tag_param.reject! { |t| ext_tags.include?(t) }
78
+
79
+ if tag_param.size > 0
80
+ MU.log "Updating tags on IAM role #{@mu_name}", MU::NOTICE, details: tag_param
81
+ MU::Cloud::AWS.iam.tag_role(role_name: @mu_name, tags: tag_param)
82
+ end
83
+ end
84
+
85
+ if @config['iam_policies']
86
+ attached_policies = []
87
+ configured_policies = @config['iam_policies'].map { |p|
88
+ @mu_name+"-"+p.keys.first.upcase
89
+ }
90
+ if @config['import']
91
+ configured_policies.concat(@config['import'].map { |p| p.gsub(/.*?\/([^:\/]+)$/, '\1') })
92
+ end
93
+
94
+ if !@config['bare_policies']
95
+ attached_policies = MU::Cloud::AWS.iam.list_attached_role_policies(
96
+ role_name: @mu_name
97
+ ).attached_policies
98
+ attached_policies.each { |a|
99
+ if !configured_policies.include?(a.policy_name)
100
+ MU.log "Removing IAM policy #{a.policy_name} from role #{@mu_name}", MU::NOTICE
101
+ MU::Cloud::AWS::Role.purgePolicy(a.policy_arn)
102
+ end
103
+ }
104
+ end
105
+
106
+ @config['iam_policies'].each { |policy|
107
+ policy_name = @mu_name+"-"+policy.keys.first.upcase
108
+
109
+ arn = "arn:"+(MU::Cloud::AWS.isGovCloud? ? "aws-us-gov" : "aws")+":iam::"+MU.account_number+":policy/#{@deploy.deploy_id}/#{policy_name}"
110
+ resp = begin
111
+ desc = MU::Cloud::AWS.iam.get_policy(policy_arn: arn)
112
+
113
+ version = MU::Cloud::AWS.iam.get_policy_version(
114
+ policy_arn: arn,
115
+ version_id: desc.policy.default_version_id
116
+ )
117
+ if version.policy_version.document != URI.encode(JSON.generate(policy.values.first), /[^a-z0-9\-]/i)
118
+ MU.log "Updating IAM policy #{policy_name}", MU::NOTICE, details: policy.values.first
119
+ update_policy(arn, policy.values.first)
120
+ MU::Cloud::AWS.iam.get_policy(policy_arn: arn)
121
+ else
122
+ desc
123
+ end
124
+
125
+ rescue Aws::IAM::Errors::NoSuchEntity => e
126
+ MU.log "Creating IAM policy #{policy_name}", details: policy.values.first
127
+ MU::Cloud::AWS.iam.create_policy(
128
+ policy_name: policy_name,
129
+ path: "/"+@deploy.deploy_id+"/",
130
+ policy_document: JSON.generate(policy.values.first),
131
+ description: "Generated from inline policy document for Mu role #{@mu_name}"
132
+ )
133
+ end
134
+
135
+ }
136
+ end
137
+
138
+ if !@config['bare_policies'] and @config['iam_policies']
139
+ bindTo("role", @mu_name)
140
+ end
141
+ end
142
+
143
+
144
+ # Canonical Amazon Resource Number for this resource
145
+ # @return [String]
146
+ def arn
147
+ desc = cloud_desc
148
+ if desc["role"]
149
+ desc["role"].arn
150
+ else
151
+ nil
152
+ end
153
+ end
154
+
155
+ # Return a hash containing a +role+ element and a +policies+ element,
156
+ # populated with one or both depending on what this resource has
157
+ # defined.
158
+ def cloud_desc
159
+ desc = {}
160
+ if @config['bare_policies']
161
+ desc["policies"] = MU::Cloud::AWS.iam.list_policies(
162
+ path_prefix: "/"+MU.deploy_id+"/"
163
+ ).policies
164
+ desc["policies"].reject! { |p|
165
+ !p.policy_name.match(/^#{Regexp.quote(@mu_name)}-/)
166
+ }
167
+ else
168
+ desc["role"] = MU::Cloud::AWS.iam.get_role(
169
+ role_name: @mu_name
170
+ ).role
171
+ if @config['iam_policies']
172
+ desc["policies"] = []
173
+ MU::Cloud::AWS.iam.list_attached_role_policies(
174
+ role_name: @mu_name
175
+ ).attached_policies.each { |p|
176
+ desc["policies"] << MU::Cloud::AWS.iam.get_policy(
177
+ policy_arn: p.policy_arn
178
+ ).policy
179
+ }
180
+ end
181
+
182
+ end
183
+
184
+ desc
185
+ end
186
+
187
+ # Return the metadata for this user cofiguration
188
+ # @return [Hash]
189
+ def notify
190
+ MU.structToHash(cloud_desc)
191
+ end
192
+
193
+ # Insert a new target entity into an existing policy.
194
+ # @param policy [String]: The name of the policy to which we're appending, which must already exist as part of this role resource
195
+ # @param targets [Array<String>]: The target resource. If +target_type+ isn't specified, this should be a fully-resolved ARN.
196
+ # @param mu_type [String]: A valid Mu resource type
197
+ def injectPolicyTargets(policy, targets, mu_type = nil)
198
+ if !policy.match(/^#{@deploy.deploy_id}/)
199
+ policy = @mu_name+"-"+policy.upcase
200
+ end
201
+ my_policies = cloud_desc["policies"]
202
+ my_policies.each { |p|
203
+ if p.policy_name == policy
204
+ old = MU::Cloud::AWS.iam.get_policy_version(
205
+ policy_arn: p.arn,
206
+ version_id: p.default_version_id
207
+ ).policy_version
208
+ doc = JSON.parse(URI.decode(old.document))
209
+ need_update = false
210
+ doc["Statement"].each { |s|
211
+ targets.each { |target|
212
+ # XXX resolve mu_type targets to ARNs
213
+ if !s["Resource"].include?(target)
214
+ s["Resource"] << target
215
+ need_update = true
216
+ end
217
+ }
218
+ }
219
+ if need_update
220
+ MU.log "Updating IAM policy #{policy} to grant permissions on #{targets.to_s}", details: doc
221
+ update_policy(p.arn, doc)
222
+ end
223
+ end
224
+ }
225
+ end
226
+
227
+ # Delete an IAM policy, along with attendant versions and attachments.
228
+ # @param policy_arn [String]: The ARN of the policy to purge
229
+ def self.purgePolicy(policy_arn)
230
+ attachments = MU::Cloud::AWS.iam.list_entities_for_policy(
231
+ policy_arn: policy_arn
232
+ )
233
+ attachments.policy_users.each { |u|
234
+ MU::Cloud::AWS.iam.detach_user_policy(
235
+ user_name: u.user_name,
236
+ policy_arn: policy_arn
237
+ )
238
+ }
239
+ attachments.policy_groups.each { |g|
240
+ MU::Cloud::AWS.iam.detach_group_policy(
241
+ group_name: g.group_name,
242
+ policy_arn: policy_arn
243
+ )
244
+ }
245
+ attachments.policy_roles.each { |r|
246
+ MU::Cloud::AWS.iam.detach_role_policy(
247
+ role_name: r.role_name,
248
+ policy_arn: policy_arn
249
+ )
250
+ }
251
+ versions = MU::Cloud::AWS.iam.list_policy_versions(
252
+ policy_arn: policy_arn,
253
+ ).versions
254
+ versions.each { |v|
255
+ next if v.is_default_version
256
+ MU::Cloud::AWS.iam.delete_policy_version(
257
+ policy_arn: policy_arn,
258
+ version_id: v.version_id
259
+ )
260
+ }
261
+
262
+ # Delete the policy, unless it's one of the global canned ones owned
263
+ # by AWS
264
+ if !policy_arn.match(/^arn:aws:iam::aws:/)
265
+ MU::Cloud::AWS.iam.delete_policy(
266
+ policy_arn: policy_arn
267
+ )
268
+ end
269
+ end
270
+
271
+ # Remove all roles associated with the currently loaded deployment.
272
+ # @param noop [Boolean]: If true, will only print what would be done
273
+ # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
274
+ # @param region [String]: The cloud provider region
275
+ # @return [void]
276
+ def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, flags: {})
277
+
278
+ resp = MU::Cloud::AWS.iam.list_policies(
279
+ path_prefix: "/"+MU.deploy_id+"/"
280
+ )
281
+ if resp and resp.policies
282
+ resp.policies.each { |policy|
283
+ MU.log "Deleting IAM policy /#{MU.deploy_id}/#{policy.policy_name}"
284
+ if !noop
285
+ purgePolicy(policy.arn)
286
+ end
287
+ }
288
+ end
289
+
290
+ resp = MU::Cloud::AWS.iam.list_roles(
291
+ path_prefix: "/"+MU.deploy_id+"/"
292
+ )
293
+ if resp and resp.roles
294
+ resp.roles.each { |r|
295
+ MU.log "Deleting IAM role #{r.role_name}"
296
+ if !noop
297
+
298
+ begin
299
+ MU::Cloud::AWS.iam.remove_role_from_instance_profile(
300
+ instance_profile_name: r.role_name,
301
+ role_name: r.role_name
302
+ )
303
+ MU::Cloud::AWS.iam.delete_instance_profile(instance_profile_name: r.role_name)
304
+ rescue Aws::IAM::Errors::ValidationError => e
305
+ MU.log "Cleaning up IAM role #{r.role_name}: #{e.inspect}", MU::WARN
306
+ rescue Aws::IAM::Errors::NoSuchEntity => e
307
+ end
308
+
309
+ MU::Cloud::AWS.iam.delete_role(
310
+ role_name: r.role_name
311
+ )
312
+ end
313
+ }
314
+ end
315
+
316
+ end
317
+
318
+ # Locate an existing user group.
319
+ # @param cloud_id [String]: The cloud provider's identifier for this resource.
320
+ # @param region [String]: The cloud provider region.
321
+ # @param flags [Hash]: Optional flags
322
+ # @return [OpenStruct]: The cloud provider's complete descriptions of matching user group.
323
+ def self.find(cloud_id: nil, region: MU.curRegion, flags: {})
324
+ found = nil
325
+
326
+ found
327
+ end
328
+
329
+ # Attach this role or group of loose policies to the specified entity.
330
+ # @param entitytype [String]: The type of entity (user, group or role for policies; instance_profile for roles)
331
+ def bindTo(entitytype, entityname)
332
+ if entitytype == "instance_profile"
333
+ begin
334
+ MU::Cloud::AWS.iam.add_role_to_instance_profile(
335
+ instance_profile_name: entityname,
336
+ role_name: @mu_name
337
+ )
338
+ end
339
+ elsif ["user", "group", "role"].include?(entitytype)
340
+ mypolicies = MU::Cloud::AWS.iam.list_policies(
341
+ path_prefix: "/"+@deploy.deploy_id+"/"
342
+ ).policies
343
+ mypolicies.reject! { |p|
344
+ !p.policy_name.match(/^#{Regexp.quote(@mu_name)}-/)
345
+ }
346
+
347
+ if @config['import']
348
+ @config['import'].each { |policy|
349
+ if !policy.match(/^arn:/i)
350
+ policy = "arn:"+(MU::Cloud::AWS.isGovCloud?(@config["region"]) ? "aws-us-gov" : "aws")+":iam::aws:policy/"+policy
351
+ end
352
+ mypolicies << MU::Cloud::AWS.iam.get_policy(
353
+ policy_arn: policy
354
+ ).policy
355
+ }
356
+ end
357
+
358
+ mypolicies.each { |p|
359
+ if entitytype == "user"
360
+ resp = MU::Cloud::AWS.iam.list_attached_user_policies(
361
+ path_prefix: "/"+@deploy.deploy_id+"/",
362
+ user_name: entityname
363
+ )
364
+ if !resp or !resp.attached_policies.map { |p| p.policy_name }.include?(p.policy_name)
365
+ MU.log "Attaching IAM policy #{p.policy_name} to user #{entityname}", MU::NOTICE
366
+ MU::Cloud::AWS.iam.attach_user_policy(
367
+ policy_arn: p.arn,
368
+ user_name: entityname
369
+ )
370
+ end
371
+ elsif entitytype == "group"
372
+ resp = MU::Cloud::AWS.iam.list_attached_group_policies(
373
+ path_prefix: "/"+@deploy.deploy_id+"/",
374
+ group_name: entityname
375
+ )
376
+ if !resp or !resp.attached_policies.map { |p| p.policy_name }.include?(p.policy_name)
377
+ MU.log "Attaching policy #{p.policy_name} to group #{entityname}", MU::NOTICE
378
+ MU::Cloud::AWS.iam.attach_group_policy(
379
+ policy_arn: p.arn,
380
+ group_name: entityname
381
+ )
382
+ end
383
+ elsif entitytype == "role"
384
+ resp = MU::Cloud::AWS.iam.list_attached_role_policies(
385
+ role_name: entityname
386
+ )
387
+
388
+ if !resp or !resp.attached_policies.map { |p| p.policy_name }.include?(p.policy_name)
389
+ MU.log "Attaching policy #{p.policy_name} to role #{entityname}", MU::NOTICE
390
+ MU::Cloud::AWS.iam.attach_role_policy(
391
+ policy_arn: p.arn,
392
+ role_name: entityname
393
+ )
394
+ end
395
+ end
396
+ }
397
+ else
398
+ raise MuError, "Invalid entitytype '#{entitytype}' passed to MU::Cloud::AWS::Role.bindTo. Must be be one of: user, group, role, instance_profile"
399
+ end
400
+ end
401
+
402
+ # Create an instance profile for EC2 instances, named identically and
403
+ # bound to this role.
404
+ def createInstanceProfile
405
+ if @config['bare_policies']
406
+ raise MuError, "#{self} has 'bare_policies' set, cannot create an instance profile without a role to bind"
407
+ end
408
+
409
+ resp = begin
410
+ MU::Cloud::AWS.iam.create_instance_profile(
411
+ instance_profile_name: @mu_name
412
+ )
413
+ rescue Aws::IAM::Errors::EntityAlreadyExists => e
414
+ MU::Cloud::AWS.iam.get_instance_profile(
415
+ instance_profile_name: @mu_name
416
+ )
417
+ end
418
+
419
+ # make sure it's really there before moving on
420
+ begin
421
+ MU::Cloud::AWS.iam.get_instance_profile(instance_profile_name: @mu_name)
422
+ rescue Aws::IAM::Errors::NoSuchEntity => e
423
+ MU.log e.inspect, MU::WARN
424
+ sleep 10
425
+ retry
426
+ end
427
+
428
+ bindTo("instance_profile", @mu_name)
429
+
430
+ resp.instance_profile.arn
431
+ end
432
+
433
+ # Cloud-specific configuration properties.
434
+ # @param config [MU::Config]: The calling MU::Config object
435
+ # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
436
+ def self.schema(config)
437
+ toplevel_required = []
438
+ aws_resource_types = MU::Cloud.resource_types.keys.reject { |t|
439
+ begin
440
+ MU::Cloud.loadCloudType("AWS", t)
441
+ false
442
+ rescue MuCloudResourceNotImplemented
443
+ true
444
+ end
445
+ }.map { |t| MU::Cloud.resource_types[t][:cfg_name] }.sort
446
+
447
+ schema = {
448
+ "tags" => MU::Config.tags_primitive,
449
+ "optional_tags" => MU::Config.optional_tags_primitive,
450
+ "import" => {
451
+ "items" => {
452
+ "description" => "Can be a shorthand reference to a canned IAM policy like +AdministratorAccess+, or a full ARN like +arn:aws:iam::aws:policy/AmazonESCognitoAccess+"
453
+ }
454
+ },
455
+ "bare_policies" => {
456
+ "type" => "boolean",
457
+ "default" => false,
458
+ "description" => "Do not create a role, but simply create the policies specified in +policies+ and/or +iam_policies+ for direct attachment to other entities."
459
+ },
460
+ "can_assume" => {
461
+ "type" => "array",
462
+ "items" => {
463
+ "type" => "object",
464
+ "description" => "Entities which are permitted to assume this role. Can be services, IAM objects, or other Mu resources.",
465
+ "required" => ["entity_type", "entity_id"],
466
+ "properties" => {
467
+ "entity_type" => {
468
+ "type" => "string",
469
+ "description" => "Type of entity which will be permitted to assume this role. See +entity_id+ for details.",
470
+ "enum" => ["service", "aws", "federated"]+aws_resource_types
471
+ },
472
+ "entity_id" => {
473
+ "type" => "string",
474
+ "description" => "An identifier appropriate for the +entity_type+ which is allowed to assume this role- see details for valid formats.\n
475
+ **service**: The name of a service which is allowed to assume this role, such as +ec2.amazonaws.com+. See also https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-api. For an unofficial list of service names, see https://gist.github.com/shortjared/4c1e3fe52bdfa47522cfe5b41e5d6f22\n
476
+ **#{aws_resource_types.join(", ")}**: A resource of one of these Mu types, declared elsewhere in this stack with a name specified in +entity_id+, for which Mu will attempt to resolve the appropriate *aws* or *service* identifier.\n
477
+ **aws**: An ARN which should be permitted to assume this role, often another role like +arn:aws:iam::AWS-account-ID:role/role-name+ or a specific user session such as +arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name+. See also https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying\n
478
+ **federated**: A federated identity provider, such as +accounts.google.com+ or +arn:aws:iam::AWS-account-ID:saml-provider/provider-name+. See also https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying"
479
+ }
480
+ # XXX it's possible that 'role' is the only Mu resource type that maps to something that can assume another role in AWS IAM, so maybe that aws_resource_types.join should be something simpler
481
+ }
482
+ }
483
+ },
484
+ "iam_policies" => {
485
+ "type" => "array",
486
+ "items" => {
487
+ "type" => "object",
488
+ "description" => "A key (name) with a value that is a raw Amazon-compatible policy document. This is not the recommended method for granting permissions- we suggest listing +roles+ for the user instead. See https://docs.aws.amazon.com/IAM/latest/RoleGuide/access_policies_examples.html for example policies.",
489
+ }
490
+ }
491
+ }
492
+ [toplevel_required, schema]
493
+ end
494
+
495
+ # Cloud-specific pre-processing of {MU::Config::BasketofKittens::roles}, bare and unvalidated.
496
+ # @param role [Hash]: The resource to process and validate
497
+ # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
498
+ # @return [Boolean]: True if validation succeeded, False otherwise
499
+ def self.validateConfig(role, configurator)
500
+ ok = true
501
+
502
+ if role['import']
503
+ role['import'].each { |policy|
504
+ if !policy.match(/^arn:/i)
505
+ policy = "arn:"+(MU::Cloud::AWS.isGovCloud?(role["region"]) ? "aws-us-gov" : "aws")+":iam::aws:policy/"+policy
506
+ end
507
+ begin
508
+ MU::Cloud::AWS.iam.get_policy(policy_arn: policy)
509
+ rescue Aws::IAM::Errors::NoSuchEntity => e
510
+ MU.log "No such canned AWS IAM policy '#{policy}'", MU::ERR
511
+ ok = false
512
+ end
513
+ }
514
+ end
515
+
516
+ if role["bare_policies"] and (!role["iam_policies"] or role["iam_policies"].empty?)
517
+ MU.log "IAM role #{role['name']} has bare_policies set, but no iam_policies specified", MU::ERR
518
+ ok = false
519
+ end
520
+
521
+ if (!role['can_assume'] or role['can_assume'].empty?) and
522
+ !role["bare_policies"]
523
+ MU.log "IAM role #{role['name']} must specify at least one can_assume entry", MU::ERR
524
+ ok = false
525
+ end
526
+
527
+
528
+ ok
529
+ end
530
+
531
+ private
532
+
533
+ # Convert entries from the cloud-neutral @config['policies'] list into
534
+ # AWS syntax.
535
+ def convert_policies_to_iam
536
+ iam_policies = []
537
+ if @config['policies']
538
+ @config['policies'].each { |policy|
539
+ doc = {
540
+ "Version" => "2012-10-17",
541
+ "Statement" => [
542
+ {
543
+ "Sid" => policy["name"],
544
+ "Effect" => policy['flag'].capitalize,
545
+ "Action" => [],
546
+ "Resource" => []
547
+ }
548
+ ]
549
+ }
550
+ policy["permissions"].each { |perm|
551
+ doc["Statement"].first["Action"] << perm
552
+ }
553
+ if policy["targets"]
554
+ policy["targets"].each { |target|
555
+ if target["type"]
556
+ sibling = @deploy.findLitterMate(
557
+ name: target["identifier"],
558
+ type: target["type"]
559
+ )
560
+ if sibling
561
+ doc["Statement"].first["Resource"] << sibling.cloudobj.arn
562
+ else
563
+ raise MuError, "Couldn't find a #{target["entity_type"]} named #{target["identifier"]} when generating IAM policy in role #{@mu_name}"
564
+ end
565
+ else
566
+ doc["Statement"].first["Resource"] << target["identifier"]
567
+ end
568
+ }
569
+ end
570
+ iam_policies << { policy["name"] => doc }
571
+ }
572
+ end
573
+
574
+ iam_policies
575
+ end
576
+
577
+ def get_tag_params(strip_std = false)
578
+ @config['tags'] ||= []
579
+
580
+ if !strip_std
581
+ MU::MommaCat.listStandardTags.each_pair { |key, value|
582
+ @config['tags'] << { "key" => key, "value" => value }
583
+ }
584
+
585
+ if @config['optional_tags']
586
+ MU::MommaCat.listOptionalTags.each { |key, value|
587
+ @config['tags'] << { "key" => key, "value" => value }
588
+ }
589
+ end
590
+ end
591
+
592
+ @config['tags'].map { |t|
593
+ { :key => t["key"], :value => t["value"] }
594
+ }
595
+ end
596
+
597
+ def gen_role_policy_doc
598
+ role_policy_doc = {
599
+ "Version" => "2012-10-17",
600
+ }
601
+ # XXX support AssumeRole, AssumeRoleWithSAML, and AssumeRoleWithWebIdentity
602
+ statements = []
603
+ if @config['can_assume']
604
+ @config['can_assume'].each { |svc|
605
+ statement = {
606
+ "Effect" => "Allow",
607
+ "Action" => "sts:AssumeRole",
608
+ "Principal" => {}
609
+ }
610
+ if ["service", "iam", "federated"].include?(svc["entity_type"])
611
+ statement["Principal"][svc["entity_type"].capitalize] = svc["entity_id"]
612
+ else
613
+ sibling = @deploy.findLitterMate(
614
+ name: svc["entity_id"],
615
+ type: svc["entity_type"]
616
+ )
617
+ if sibling
618
+ statement["Principal"][svc["entity_type"].capitalize] = sibling.cloudobj.arn
619
+ else
620
+ raise MuError, "Couldn't find a #{svc["entity_type"]} named #{svc["entity_id"]} when generating IAM policy in role #{@mu_name}"
621
+ end
622
+ end
623
+ statements << statement
624
+ }
625
+ end
626
+
627
+ role_policy_doc["Statement"] = statements
628
+
629
+ JSON.generate(role_policy_doc)
630
+ end
631
+
632
+ # Update a policy, handling deletion of old versions as needed
633
+ def update_policy(arn, doc)
634
+ begin
635
+ MU::Cloud::AWS.iam.create_policy_version(
636
+ policy_arn: arn,
637
+ set_as_default: true,
638
+ policy_document: JSON.generate(doc)
639
+ )
640
+ rescue Aws::IAM::Errors::LimitExceeded => e
641
+ delete_version = MU::Cloud::AWS.iam.list_policy_versions(
642
+ policy_arn: arn,
643
+ ).versions.last.version_id
644
+ MU.log "Purging oldest version (#{delete_version}) of IAM policy #{arn}", MU::NOTICE
645
+ MU::Cloud::AWS.iam.delete_policy_version(
646
+ policy_arn: arn,
647
+ version_id: delete_version
648
+ )
649
+ retry
650
+ end
651
+ end
652
+
653
+ end
654
+ end
655
+ end
656
+ end