inspec-core 2.1.67

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 (412) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3136 -0
  3. data/Gemfile +56 -0
  4. data/LICENSE +14 -0
  5. data/MAINTAINERS.md +33 -0
  6. data/MAINTAINERS.toml +52 -0
  7. data/README.md +453 -0
  8. data/bin/inspec +12 -0
  9. data/docs/.gitignore +2 -0
  10. data/docs/README.md +40 -0
  11. data/docs/dev/control-eval.md +62 -0
  12. data/docs/dsl_inspec.md +258 -0
  13. data/docs/dsl_resource.md +100 -0
  14. data/docs/glossary.md +99 -0
  15. data/docs/habitat.md +192 -0
  16. data/docs/inspec_and_friends.md +114 -0
  17. data/docs/matchers.md +169 -0
  18. data/docs/migration.md +293 -0
  19. data/docs/platforms.md +119 -0
  20. data/docs/plugin_kitchen_inspec.md +50 -0
  21. data/docs/profiles.md +378 -0
  22. data/docs/reporters.md +105 -0
  23. data/docs/resources/aide_conf.md.erb +76 -0
  24. data/docs/resources/apache.md.erb +67 -0
  25. data/docs/resources/apache_conf.md.erb +68 -0
  26. data/docs/resources/apt.md.erb +71 -0
  27. data/docs/resources/audit_policy.md.erb +47 -0
  28. data/docs/resources/auditd.md.erb +79 -0
  29. data/docs/resources/auditd_conf.md.erb +68 -0
  30. data/docs/resources/bash.md.erb +75 -0
  31. data/docs/resources/bond.md.erb +90 -0
  32. data/docs/resources/bridge.md.erb +57 -0
  33. data/docs/resources/bsd_service.md.erb +67 -0
  34. data/docs/resources/chocolatey_package.md.erb +58 -0
  35. data/docs/resources/command.md.erb +138 -0
  36. data/docs/resources/cpan.md.erb +79 -0
  37. data/docs/resources/cran.md.erb +64 -0
  38. data/docs/resources/crontab.md.erb +89 -0
  39. data/docs/resources/csv.md.erb +54 -0
  40. data/docs/resources/dh_params.md.erb +205 -0
  41. data/docs/resources/directory.md.erb +30 -0
  42. data/docs/resources/docker.md.erb +219 -0
  43. data/docs/resources/docker_container.md.erb +103 -0
  44. data/docs/resources/docker_image.md.erb +94 -0
  45. data/docs/resources/docker_service.md.erb +114 -0
  46. data/docs/resources/elasticsearch.md.erb +242 -0
  47. data/docs/resources/etc_fstab.md.erb +125 -0
  48. data/docs/resources/etc_group.md.erb +75 -0
  49. data/docs/resources/etc_hosts.md.erb +78 -0
  50. data/docs/resources/etc_hosts_allow.md.erb +74 -0
  51. data/docs/resources/etc_hosts_deny.md.erb +74 -0
  52. data/docs/resources/file.md.erb +526 -0
  53. data/docs/resources/filesystem.md.erb +41 -0
  54. data/docs/resources/firewalld.md.erb +107 -0
  55. data/docs/resources/gem.md.erb +79 -0
  56. data/docs/resources/group.md.erb +61 -0
  57. data/docs/resources/grub_conf.md.erb +101 -0
  58. data/docs/resources/host.md.erb +86 -0
  59. data/docs/resources/http.md.erb +197 -0
  60. data/docs/resources/iis_app.md.erb +122 -0
  61. data/docs/resources/iis_site.md.erb +135 -0
  62. data/docs/resources/inetd_conf.md.erb +94 -0
  63. data/docs/resources/ini.md.erb +76 -0
  64. data/docs/resources/interface.md.erb +58 -0
  65. data/docs/resources/iptables.md.erb +64 -0
  66. data/docs/resources/json.md.erb +63 -0
  67. data/docs/resources/kernel_module.md.erb +120 -0
  68. data/docs/resources/kernel_parameter.md.erb +53 -0
  69. data/docs/resources/key_rsa.md.erb +85 -0
  70. data/docs/resources/launchd_service.md.erb +57 -0
  71. data/docs/resources/limits_conf.md.erb +75 -0
  72. data/docs/resources/login_defs.md.erb +71 -0
  73. data/docs/resources/mount.md.erb +69 -0
  74. data/docs/resources/mssql_session.md.erb +60 -0
  75. data/docs/resources/mysql_conf.md.erb +99 -0
  76. data/docs/resources/mysql_session.md.erb +74 -0
  77. data/docs/resources/nginx.md.erb +79 -0
  78. data/docs/resources/nginx_conf.md.erb +138 -0
  79. data/docs/resources/npm.md.erb +60 -0
  80. data/docs/resources/ntp_conf.md.erb +60 -0
  81. data/docs/resources/oneget.md.erb +53 -0
  82. data/docs/resources/oracledb_session.md.erb +52 -0
  83. data/docs/resources/os.md.erb +141 -0
  84. data/docs/resources/os_env.md.erb +91 -0
  85. data/docs/resources/package.md.erb +120 -0
  86. data/docs/resources/packages.md.erb +67 -0
  87. data/docs/resources/parse_config.md.erb +103 -0
  88. data/docs/resources/parse_config_file.md.erb +138 -0
  89. data/docs/resources/passwd.md.erb +141 -0
  90. data/docs/resources/pip.md.erb +67 -0
  91. data/docs/resources/port.md.erb +137 -0
  92. data/docs/resources/postgres_conf.md.erb +79 -0
  93. data/docs/resources/postgres_hba_conf.md.erb +93 -0
  94. data/docs/resources/postgres_ident_conf.md.erb +76 -0
  95. data/docs/resources/postgres_session.md.erb +69 -0
  96. data/docs/resources/powershell.md.erb +102 -0
  97. data/docs/resources/processes.md.erb +109 -0
  98. data/docs/resources/rabbitmq_config.md.erb +41 -0
  99. data/docs/resources/registry_key.md.erb +158 -0
  100. data/docs/resources/runit_service.md.erb +57 -0
  101. data/docs/resources/security_policy.md.erb +47 -0
  102. data/docs/resources/service.md.erb +121 -0
  103. data/docs/resources/shadow.md.erb +146 -0
  104. data/docs/resources/ssh_config.md.erb +73 -0
  105. data/docs/resources/sshd_config.md.erb +83 -0
  106. data/docs/resources/ssl.md.erb +119 -0
  107. data/docs/resources/sys_info.md.erb +42 -0
  108. data/docs/resources/systemd_service.md.erb +57 -0
  109. data/docs/resources/sysv_service.md.erb +57 -0
  110. data/docs/resources/upstart_service.md.erb +57 -0
  111. data/docs/resources/user.md.erb +140 -0
  112. data/docs/resources/users.md.erb +127 -0
  113. data/docs/resources/vbscript.md.erb +55 -0
  114. data/docs/resources/virtualization.md.erb +57 -0
  115. data/docs/resources/windows_feature.md.erb +47 -0
  116. data/docs/resources/windows_hotfix.md.erb +53 -0
  117. data/docs/resources/windows_task.md.erb +95 -0
  118. data/docs/resources/wmi.md.erb +81 -0
  119. data/docs/resources/x509_certificate.md.erb +151 -0
  120. data/docs/resources/xinetd_conf.md.erb +156 -0
  121. data/docs/resources/xml.md.erb +85 -0
  122. data/docs/resources/yaml.md.erb +69 -0
  123. data/docs/resources/yum.md.erb +98 -0
  124. data/docs/resources/zfs_dataset.md.erb +53 -0
  125. data/docs/resources/zfs_pool.md.erb +47 -0
  126. data/docs/ruby_usage.md +203 -0
  127. data/docs/shared/matcher_be.md.erb +1 -0
  128. data/docs/shared/matcher_cmp.md.erb +43 -0
  129. data/docs/shared/matcher_eq.md.erb +3 -0
  130. data/docs/shared/matcher_include.md.erb +1 -0
  131. data/docs/shared/matcher_match.md.erb +1 -0
  132. data/docs/shell.md +217 -0
  133. data/examples/README.md +8 -0
  134. data/examples/inheritance/README.md +65 -0
  135. data/examples/inheritance/controls/example.rb +14 -0
  136. data/examples/inheritance/inspec.yml +15 -0
  137. data/examples/kitchen-ansible/.kitchen.yml +25 -0
  138. data/examples/kitchen-ansible/Gemfile +19 -0
  139. data/examples/kitchen-ansible/README.md +53 -0
  140. data/examples/kitchen-ansible/files/nginx.repo +6 -0
  141. data/examples/kitchen-ansible/tasks/main.yml +16 -0
  142. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -0
  143. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -0
  144. data/examples/kitchen-chef/.kitchen.yml +20 -0
  145. data/examples/kitchen-chef/Berksfile +3 -0
  146. data/examples/kitchen-chef/Gemfile +19 -0
  147. data/examples/kitchen-chef/README.md +27 -0
  148. data/examples/kitchen-chef/metadata.rb +7 -0
  149. data/examples/kitchen-chef/recipes/default.rb +6 -0
  150. data/examples/kitchen-chef/recipes/nginx.rb +30 -0
  151. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -0
  152. data/examples/kitchen-puppet/.kitchen.yml +23 -0
  153. data/examples/kitchen-puppet/Gemfile +20 -0
  154. data/examples/kitchen-puppet/Puppetfile +25 -0
  155. data/examples/kitchen-puppet/README.md +53 -0
  156. data/examples/kitchen-puppet/manifests/site.pp +33 -0
  157. data/examples/kitchen-puppet/metadata.json +11 -0
  158. data/examples/kitchen-puppet/modules/.gitkeep +0 -0
  159. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -0
  160. data/examples/meta-profile/README.md +37 -0
  161. data/examples/meta-profile/controls/example.rb +13 -0
  162. data/examples/meta-profile/inspec.yml +13 -0
  163. data/examples/profile-attribute.yml +2 -0
  164. data/examples/profile-attribute/README.md +14 -0
  165. data/examples/profile-attribute/controls/example.rb +11 -0
  166. data/examples/profile-attribute/inspec.yml +8 -0
  167. data/examples/profile-sensitive/README.md +29 -0
  168. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
  169. data/examples/profile-sensitive/controls/sensitive.rb +9 -0
  170. data/examples/profile-sensitive/inspec.yml +8 -0
  171. data/examples/profile/README.md +48 -0
  172. data/examples/profile/controls/example.rb +23 -0
  173. data/examples/profile/controls/gordon.rb +36 -0
  174. data/examples/profile/controls/meta.rb +34 -0
  175. data/examples/profile/inspec.yml +10 -0
  176. data/examples/profile/libraries/gordon_config.rb +59 -0
  177. data/inspec-core.gemspec +43 -0
  178. data/lib/bundles/README.md +3 -0
  179. data/lib/bundles/inspec-artifact.rb +7 -0
  180. data/lib/bundles/inspec-artifact/README.md +1 -0
  181. data/lib/bundles/inspec-artifact/cli.rb +277 -0
  182. data/lib/bundles/inspec-compliance.rb +16 -0
  183. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -0
  184. data/lib/bundles/inspec-compliance/README.md +193 -0
  185. data/lib/bundles/inspec-compliance/api.rb +360 -0
  186. data/lib/bundles/inspec-compliance/api/login.rb +193 -0
  187. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -0
  188. data/lib/bundles/inspec-compliance/cli.rb +260 -0
  189. data/lib/bundles/inspec-compliance/configuration.rb +103 -0
  190. data/lib/bundles/inspec-compliance/http.rb +125 -0
  191. data/lib/bundles/inspec-compliance/images/cc-token.png +0 -0
  192. data/lib/bundles/inspec-compliance/support.rb +36 -0
  193. data/lib/bundles/inspec-compliance/target.rb +106 -0
  194. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -0
  195. data/lib/bundles/inspec-habitat.rb +12 -0
  196. data/lib/bundles/inspec-habitat/cli.rb +36 -0
  197. data/lib/bundles/inspec-habitat/log.rb +10 -0
  198. data/lib/bundles/inspec-habitat/profile.rb +391 -0
  199. data/lib/bundles/inspec-init.rb +8 -0
  200. data/lib/bundles/inspec-init/README.md +31 -0
  201. data/lib/bundles/inspec-init/cli.rb +97 -0
  202. data/lib/bundles/inspec-init/templates/profile/README.md +3 -0
  203. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -0
  204. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -0
  205. data/lib/bundles/inspec-init/templates/profile/libraries/.gitkeep +0 -0
  206. data/lib/bundles/inspec-supermarket.rb +13 -0
  207. data/lib/bundles/inspec-supermarket/README.md +45 -0
  208. data/lib/bundles/inspec-supermarket/api.rb +84 -0
  209. data/lib/bundles/inspec-supermarket/cli.rb +73 -0
  210. data/lib/bundles/inspec-supermarket/target.rb +34 -0
  211. data/lib/fetchers/git.rb +163 -0
  212. data/lib/fetchers/local.rb +74 -0
  213. data/lib/fetchers/mock.rb +35 -0
  214. data/lib/fetchers/url.rb +247 -0
  215. data/lib/inspec.rb +24 -0
  216. data/lib/inspec/archive/tar.rb +29 -0
  217. data/lib/inspec/archive/zip.rb +19 -0
  218. data/lib/inspec/backend.rb +93 -0
  219. data/lib/inspec/base_cli.rb +368 -0
  220. data/lib/inspec/cached_fetcher.rb +66 -0
  221. data/lib/inspec/cli.rb +292 -0
  222. data/lib/inspec/completions/bash.sh.erb +45 -0
  223. data/lib/inspec/completions/fish.sh.erb +34 -0
  224. data/lib/inspec/completions/zsh.sh.erb +61 -0
  225. data/lib/inspec/control_eval_context.rb +179 -0
  226. data/lib/inspec/dependencies/cache.rb +72 -0
  227. data/lib/inspec/dependencies/dependency_set.rb +92 -0
  228. data/lib/inspec/dependencies/lockfile.rb +115 -0
  229. data/lib/inspec/dependencies/requirement.rb +123 -0
  230. data/lib/inspec/dependencies/resolver.rb +86 -0
  231. data/lib/inspec/describe.rb +27 -0
  232. data/lib/inspec/dsl.rb +66 -0
  233. data/lib/inspec/dsl_shared.rb +33 -0
  234. data/lib/inspec/env_printer.rb +157 -0
  235. data/lib/inspec/errors.rb +14 -0
  236. data/lib/inspec/exceptions.rb +12 -0
  237. data/lib/inspec/expect.rb +45 -0
  238. data/lib/inspec/fetcher.rb +45 -0
  239. data/lib/inspec/file_provider.rb +275 -0
  240. data/lib/inspec/formatters.rb +3 -0
  241. data/lib/inspec/formatters/base.rb +259 -0
  242. data/lib/inspec/formatters/json_rspec.rb +20 -0
  243. data/lib/inspec/formatters/show_progress.rb +12 -0
  244. data/lib/inspec/library_eval_context.rb +58 -0
  245. data/lib/inspec/log.rb +11 -0
  246. data/lib/inspec/metadata.rb +247 -0
  247. data/lib/inspec/method_source.rb +24 -0
  248. data/lib/inspec/objects.rb +14 -0
  249. data/lib/inspec/objects/attribute.rb +75 -0
  250. data/lib/inspec/objects/control.rb +61 -0
  251. data/lib/inspec/objects/describe.rb +92 -0
  252. data/lib/inspec/objects/each_loop.rb +36 -0
  253. data/lib/inspec/objects/list.rb +15 -0
  254. data/lib/inspec/objects/or_test.rb +40 -0
  255. data/lib/inspec/objects/ruby_helper.rb +15 -0
  256. data/lib/inspec/objects/tag.rb +27 -0
  257. data/lib/inspec/objects/test.rb +87 -0
  258. data/lib/inspec/objects/value.rb +27 -0
  259. data/lib/inspec/plugins.rb +60 -0
  260. data/lib/inspec/plugins/cli.rb +24 -0
  261. data/lib/inspec/plugins/fetcher.rb +86 -0
  262. data/lib/inspec/plugins/resource.rb +135 -0
  263. data/lib/inspec/plugins/secret.rb +15 -0
  264. data/lib/inspec/plugins/source_reader.rb +40 -0
  265. data/lib/inspec/polyfill.rb +12 -0
  266. data/lib/inspec/profile.rb +513 -0
  267. data/lib/inspec/profile_context.rb +208 -0
  268. data/lib/inspec/profile_vendor.rb +66 -0
  269. data/lib/inspec/reporters.rb +60 -0
  270. data/lib/inspec/reporters/automate.rb +76 -0
  271. data/lib/inspec/reporters/base.rb +25 -0
  272. data/lib/inspec/reporters/cli.rb +356 -0
  273. data/lib/inspec/reporters/json.rb +116 -0
  274. data/lib/inspec/reporters/json_min.rb +48 -0
  275. data/lib/inspec/reporters/junit.rb +78 -0
  276. data/lib/inspec/require_loader.rb +33 -0
  277. data/lib/inspec/resource.rb +190 -0
  278. data/lib/inspec/rule.rb +280 -0
  279. data/lib/inspec/runner.rb +345 -0
  280. data/lib/inspec/runner_mock.rb +41 -0
  281. data/lib/inspec/runner_rspec.rb +175 -0
  282. data/lib/inspec/runtime_profile.rb +26 -0
  283. data/lib/inspec/schema.rb +213 -0
  284. data/lib/inspec/secrets.rb +19 -0
  285. data/lib/inspec/secrets/yaml.rb +30 -0
  286. data/lib/inspec/shell.rb +220 -0
  287. data/lib/inspec/shell_detector.rb +90 -0
  288. data/lib/inspec/source_reader.rb +29 -0
  289. data/lib/inspec/version.rb +8 -0
  290. data/lib/matchers/matchers.rb +339 -0
  291. data/lib/resources/aide_conf.rb +151 -0
  292. data/lib/resources/apache.rb +48 -0
  293. data/lib/resources/apache_conf.rb +149 -0
  294. data/lib/resources/apt.rb +149 -0
  295. data/lib/resources/audit_policy.rb +63 -0
  296. data/lib/resources/auditd.rb +231 -0
  297. data/lib/resources/auditd_conf.rb +46 -0
  298. data/lib/resources/bash.rb +35 -0
  299. data/lib/resources/bond.rb +69 -0
  300. data/lib/resources/bridge.rb +122 -0
  301. data/lib/resources/chocolatey_package.rb +78 -0
  302. data/lib/resources/command.rb +73 -0
  303. data/lib/resources/cpan.rb +58 -0
  304. data/lib/resources/cran.rb +64 -0
  305. data/lib/resources/crontab.rb +169 -0
  306. data/lib/resources/csv.rb +56 -0
  307. data/lib/resources/dh_params.rb +77 -0
  308. data/lib/resources/directory.rb +25 -0
  309. data/lib/resources/docker.rb +236 -0
  310. data/lib/resources/docker_container.rb +89 -0
  311. data/lib/resources/docker_image.rb +83 -0
  312. data/lib/resources/docker_object.rb +57 -0
  313. data/lib/resources/docker_service.rb +90 -0
  314. data/lib/resources/elasticsearch.rb +169 -0
  315. data/lib/resources/etc_fstab.rb +94 -0
  316. data/lib/resources/etc_group.rb +154 -0
  317. data/lib/resources/etc_hosts.rb +66 -0
  318. data/lib/resources/etc_hosts_allow_deny.rb +112 -0
  319. data/lib/resources/file.rb +298 -0
  320. data/lib/resources/filesystem.rb +31 -0
  321. data/lib/resources/firewalld.rb +143 -0
  322. data/lib/resources/gem.rb +70 -0
  323. data/lib/resources/groups.rb +215 -0
  324. data/lib/resources/grub_conf.rb +227 -0
  325. data/lib/resources/host.rb +306 -0
  326. data/lib/resources/http.rb +253 -0
  327. data/lib/resources/iis_app.rb +101 -0
  328. data/lib/resources/iis_site.rb +148 -0
  329. data/lib/resources/inetd_conf.rb +54 -0
  330. data/lib/resources/ini.rb +29 -0
  331. data/lib/resources/interface.rb +129 -0
  332. data/lib/resources/iptables.rb +80 -0
  333. data/lib/resources/json.rb +111 -0
  334. data/lib/resources/kernel_module.rb +107 -0
  335. data/lib/resources/kernel_parameter.rb +58 -0
  336. data/lib/resources/key_rsa.rb +63 -0
  337. data/lib/resources/limits_conf.rb +46 -0
  338. data/lib/resources/login_def.rb +57 -0
  339. data/lib/resources/mount.rb +88 -0
  340. data/lib/resources/mssql_session.rb +101 -0
  341. data/lib/resources/mysql.rb +82 -0
  342. data/lib/resources/mysql_conf.rb +127 -0
  343. data/lib/resources/mysql_session.rb +85 -0
  344. data/lib/resources/nginx.rb +96 -0
  345. data/lib/resources/nginx_conf.rb +226 -0
  346. data/lib/resources/npm.rb +48 -0
  347. data/lib/resources/ntp_conf.rb +51 -0
  348. data/lib/resources/oneget.rb +71 -0
  349. data/lib/resources/oracledb_session.rb +139 -0
  350. data/lib/resources/os.rb +36 -0
  351. data/lib/resources/os_env.rb +86 -0
  352. data/lib/resources/package.rb +370 -0
  353. data/lib/resources/packages.rb +111 -0
  354. data/lib/resources/parse_config.rb +112 -0
  355. data/lib/resources/passwd.rb +76 -0
  356. data/lib/resources/pip.rb +130 -0
  357. data/lib/resources/platform.rb +109 -0
  358. data/lib/resources/port.rb +771 -0
  359. data/lib/resources/postgres.rb +131 -0
  360. data/lib/resources/postgres_conf.rb +114 -0
  361. data/lib/resources/postgres_hba_conf.rb +90 -0
  362. data/lib/resources/postgres_ident_conf.rb +79 -0
  363. data/lib/resources/postgres_session.rb +71 -0
  364. data/lib/resources/powershell.rb +67 -0
  365. data/lib/resources/processes.rb +204 -0
  366. data/lib/resources/rabbitmq_conf.rb +51 -0
  367. data/lib/resources/registry_key.rb +297 -0
  368. data/lib/resources/security_policy.rb +180 -0
  369. data/lib/resources/service.rb +794 -0
  370. data/lib/resources/shadow.rb +159 -0
  371. data/lib/resources/ssh_conf.rb +97 -0
  372. data/lib/resources/ssl.rb +99 -0
  373. data/lib/resources/sys_info.rb +28 -0
  374. data/lib/resources/toml.rb +32 -0
  375. data/lib/resources/users.rb +654 -0
  376. data/lib/resources/vbscript.rb +68 -0
  377. data/lib/resources/virtualization.rb +247 -0
  378. data/lib/resources/windows_feature.rb +84 -0
  379. data/lib/resources/windows_hotfix.rb +35 -0
  380. data/lib/resources/windows_task.rb +102 -0
  381. data/lib/resources/wmi.rb +110 -0
  382. data/lib/resources/x509_certificate.rb +137 -0
  383. data/lib/resources/xinetd.rb +106 -0
  384. data/lib/resources/xml.rb +46 -0
  385. data/lib/resources/yaml.rb +43 -0
  386. data/lib/resources/yum.rb +180 -0
  387. data/lib/resources/zfs_dataset.rb +60 -0
  388. data/lib/resources/zfs_pool.rb +49 -0
  389. data/lib/source_readers/flat.rb +39 -0
  390. data/lib/source_readers/inspec.rb +75 -0
  391. data/lib/utils/command_wrapper.rb +27 -0
  392. data/lib/utils/convert.rb +12 -0
  393. data/lib/utils/database_helpers.rb +77 -0
  394. data/lib/utils/enumerable_delegation.rb +9 -0
  395. data/lib/utils/erlang_parser.rb +192 -0
  396. data/lib/utils/file_reader.rb +25 -0
  397. data/lib/utils/filter.rb +273 -0
  398. data/lib/utils/filter_array.rb +27 -0
  399. data/lib/utils/find_files.rb +47 -0
  400. data/lib/utils/hash.rb +41 -0
  401. data/lib/utils/json_log.rb +18 -0
  402. data/lib/utils/latest_version.rb +22 -0
  403. data/lib/utils/modulator.rb +12 -0
  404. data/lib/utils/nginx_parser.rb +105 -0
  405. data/lib/utils/object_traversal.rb +49 -0
  406. data/lib/utils/parser.rb +274 -0
  407. data/lib/utils/pkey_reader.rb +15 -0
  408. data/lib/utils/plugin_registry.rb +93 -0
  409. data/lib/utils/simpleconfig.rb +120 -0
  410. data/lib/utils/spdx.rb +13 -0
  411. data/lib/utils/spdx.txt +344 -0
  412. metadata +713 -0
@@ -0,0 +1,193 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Ricter
4
+ # author: Jerry Aldrich
5
+
6
+ module Compliance
7
+ class API
8
+ module Login
9
+ class CannotDetermineServerType < StandardError; end
10
+
11
+ def login(options)
12
+ raise ArgumentError, 'Please specify a server using `inspec compliance login https://SERVER`' unless options['server']
13
+
14
+ options['server'] = URI("https://#{options['server']}").to_s if URI(options['server']).scheme.nil?
15
+
16
+ options['server_type'] = Compliance::API.determine_server_type(options['server'], options['insecure'])
17
+
18
+ case options['server_type']
19
+ when :automate2
20
+ Login::Automate2Server.login(options)
21
+ when :automate
22
+ Login::AutomateServer.login(options)
23
+ when :compliance
24
+ Login::ComplianceServer.login(options)
25
+ else
26
+ raise CannotDetermineServerType, "Unable to determine if #{options['server']} is a Chef Automate or Chef Compliance server"
27
+ end
28
+ end
29
+
30
+ module Automate2Server
31
+ def self.login(options)
32
+ verify_thor_options(options)
33
+
34
+ options['url'] = options['server'] + '/api/v0'
35
+ token = options['dctoken'] || options['token']
36
+ store_access_token(options, token)
37
+ end
38
+
39
+ def self.store_access_token(options, token)
40
+ config = Compliance::Configuration.new
41
+ config.clean
42
+
43
+ config['automate'] = {}
44
+ config['automate']['ent'] = 'automate'
45
+ config['automate']['token_type'] = 'dctoken'
46
+ config['server'] = options['url']
47
+ config['user'] = options['user']
48
+ config['owner'] = options['user']
49
+ config['insecure'] = options['insecure'] || false
50
+ config['server_type'] = options['server_type'].to_s
51
+ config['token'] = token
52
+ config['version'] = '0'
53
+
54
+ config.store
55
+ config
56
+ end
57
+
58
+ def self.verify_thor_options(o)
59
+ error_msg = []
60
+
61
+ error_msg.push('Please specify a user using `--user=\'USER\'`') if o['user'].nil?
62
+
63
+ if o['token'].nil? && o['dctoken'].nil?
64
+ error_msg.push('Please specify a token using `--token=\'APITOKEN\'`')
65
+ end
66
+
67
+ raise ArgumentError, error_msg.join("\n") unless error_msg.empty?
68
+ end
69
+ end
70
+
71
+ module AutomateServer
72
+ def self.login(options)
73
+ verify_thor_options(options)
74
+
75
+ options['url'] = options['server'] + '/compliance'
76
+ token = options['dctoken'] || options['token']
77
+ store_access_token(options, token)
78
+ end
79
+
80
+ def self.store_access_token(options, token)
81
+ token_type = if options['token']
82
+ 'usertoken'
83
+ else
84
+ 'dctoken'
85
+ end
86
+
87
+ config = Compliance::Configuration.new
88
+
89
+ config.clean
90
+
91
+ config['automate'] = {}
92
+ config['automate']['ent'] = options['ent']
93
+ config['automate']['token_type'] = token_type
94
+ config['server'] = options['url']
95
+ config['user'] = options['user']
96
+ config['insecure'] = options['insecure'] || false
97
+ config['server_type'] = options['server_type'].to_s
98
+ config['token'] = token
99
+ config['version'] = Compliance::API.version(config)
100
+
101
+ config.store
102
+ config
103
+ end
104
+
105
+ # Automate login requires `--ent`, `--user`, and either `--token` or `--dctoken`
106
+ def self.verify_thor_options(o)
107
+ error_msg = []
108
+
109
+ error_msg.push('Please specify a user using `--user=\'USER\'`') if o['user'].nil?
110
+ error_msg.push('Please specify an enterprise using `--ent=\'automate\'`') if o['ent'].nil?
111
+
112
+ if o['token'].nil? && o['dctoken'].nil?
113
+ error_msg.push('Please specify a token using `--token=\'AUTOMATE_TOKEN\'` or `--dctoken=\'DATA_COLLECTOR_TOKEN\'`')
114
+ end
115
+
116
+ raise ArgumentError, error_msg.join("\n") unless error_msg.empty?
117
+ end
118
+ end
119
+
120
+ module ComplianceServer
121
+ def self.login(options)
122
+ compliance_verify_thor_options(options)
123
+
124
+ options['url'] = options['server'] + '/api'
125
+
126
+ if options['user'] && options['token']
127
+ compliance_store_access_token(options, options['token'])
128
+ elsif options['user'] && options['password']
129
+ compliance_login_user_pass(options)
130
+ elsif options['refresh_token']
131
+ compliance_login_refresh_token(options)
132
+ end
133
+ end
134
+
135
+ def self.compliance_login_user_pass(options)
136
+ success, msg, token = Compliance::API.get_token_via_password(
137
+ options['url'],
138
+ options['user'],
139
+ options['password'],
140
+ options['insecure'],
141
+ )
142
+
143
+ raise msg unless success
144
+ compliance_store_access_token(options, token)
145
+ end
146
+
147
+ def self.compliance_login_refresh_token(options)
148
+ success, msg, token = Compliance::API.get_token_via_refresh_token(
149
+ options['url'],
150
+ options['refresh_token'],
151
+ options['insecure'],
152
+ )
153
+
154
+ raise msg unless success
155
+ compliance_store_access_token(options, token)
156
+ end
157
+
158
+ def self.compliance_store_access_token(options, token)
159
+ config = Compliance::Configuration.new
160
+ config.clean
161
+
162
+ config['user'] = options['user'] if options['user']
163
+ config['server'] = options['url']
164
+ config['insecure'] = options['insecure'] || false
165
+ config['server_type'] = options['server_type'].to_s
166
+ config['token'] = token
167
+ config['version'] = Compliance::API.version(config)
168
+
169
+ config.store
170
+ config
171
+ end
172
+
173
+ # Compliance login requires `--user` or `--refresh_token`
174
+ # If `--user` then either `--password`, `--token`, or `--refresh-token`, is required
175
+ def self.compliance_verify_thor_options(o)
176
+ error_msg = []
177
+
178
+ error_msg.push('Please specify a server using `inspec compliance login https://SERVER`') if o['server'].nil?
179
+
180
+ if o['user'].nil? && o['refresh_token'].nil?
181
+ error_msg.push('Please specify a `--user=\'USER\'` or a `--refresh-token=\'TOKEN\'`')
182
+ end
183
+
184
+ if o['user'] && o['password'].nil? && o['token'].nil? && o['refresh_token'].nil?
185
+ error_msg.push('Please specify either a `--password`, `--token`, or `--refresh-token`')
186
+ end
187
+
188
+ raise ArgumentError, error_msg.join("\n") unless error_msg.empty?
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,41 @@
1
+ #!/bin/bash
2
+
3
+ echo "Installing Chef Compliance $deb"
4
+ # select latest package from cache directory
5
+ # deb=$(find /inspec/.cache -name '*.deb' | tail -1)
6
+ # sudo dpkg -i $deb
7
+
8
+ # use chef compliance package repository
9
+ sudo apt-get install -y apt-transport-https
10
+ sudo apt-get install wget
11
+ wget -qO - https://downloads.chef.io/packages-chef-io-public.key | sudo apt-key add -
12
+ CHANNEL=${CHANNEL:-stable}
13
+ DISTRIBUTION=$(lsb_release --codename | cut -f2)
14
+ echo "found $DISTRIBUTION"
15
+ echo "use $CHANNEL channel"
16
+ echo "deb https://packages.chef.io/$CHANNEL-apt $DISTRIBUTION main" > /etc/apt/sources.list.d/chef-$CHANNEL.list
17
+ sudo apt-get update
18
+ sudo apt-get install chef-compliance
19
+
20
+ sudo chef-compliance-ctl reconfigure --accept-license
21
+ sudo chef-compliance-ctl restart
22
+
23
+ # finalize setup
24
+ cd /
25
+ /opt/chef-compliance/embedded/service/core/bin/core setup --endpoint "http://127.0.0.1:10500/setup" --login "admin" --password "admin" --name "John Doe" --accept-eula
26
+
27
+ # wget --no-check-certificate http://127.0.0.1/api/version
28
+ # cat version
29
+
30
+ # install ruby 2.3
31
+ sudo apt-get install -y software-properties-common
32
+ sudo apt-add-repository -y ppa:brightbox/ruby-ng
33
+ sudo apt-get update
34
+ sudo apt-get install -y ruby2.3 ruby2.3-dev
35
+ ruby2.3 -v
36
+
37
+ # prepare the usage of bundler
38
+ sudo gem install bundler
39
+ cd /inspec
40
+ bundle install
41
+ BUNDLE_GEMFILE=/inspec/Gemfile bundle exec inspec version
@@ -0,0 +1,260 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ require 'thor'
6
+ require 'erb'
7
+
8
+ module Compliance
9
+ class ComplianceCLI < Inspec::BaseCLI
10
+ namespace 'compliance'
11
+
12
+ # TODO: find another solution, once https://github.com/erikhuda/thor/issues/261 is fixed
13
+ def self.banner(command, _namespace = nil, _subcommand = false)
14
+ "#{basename} #{subcommand_prefix} #{command.usage}"
15
+ end
16
+
17
+ def self.subcommand_prefix
18
+ namespace
19
+ end
20
+
21
+ desc "login https://SERVER --insecure --user='USER' --ent='ENTERPRISE' --token='TOKEN'", 'Log in to a Chef Compliance/Chef Automate SERVER'
22
+ long_desc <<-LONGDESC
23
+ `login` allows you to use InSpec with Chef Automate or a Chef Compliance Server
24
+
25
+ You need to a token for communication. More information about token retrieval
26
+ is available at:
27
+ https://docs.chef.io/api_automate.html#authentication-methods
28
+ https://docs.chef.io/api_compliance.html#obtaining-an-api-token
29
+ LONGDESC
30
+ option :insecure, aliases: :k, type: :boolean,
31
+ desc: 'Explicitly allows InSpec to perform "insecure" SSL connections and transfers'
32
+ option :user, type: :string, required: false,
33
+ desc: 'Username'
34
+ option :password, type: :string, required: false,
35
+ desc: 'Password (Chef Compliance Only)'
36
+ option :token, type: :string, required: false,
37
+ desc: 'Access token'
38
+ option :refresh_token, type: :string, required: false,
39
+ desc: 'Chef Compliance refresh token (Chef Compliance Only)'
40
+ option :dctoken, type: :string, required: false,
41
+ desc: 'Data Collector token (Chef Automate Only)'
42
+ option :ent, type: :string, required: false,
43
+ desc: 'Enterprise for Chef Automate reporting (Chef Automate Only)'
44
+ def login(server)
45
+ options['server'] = server
46
+ Compliance::API.login(options)
47
+ config = Compliance::Configuration.new
48
+ puts "Stored configuration for Chef #{config['server_type'].capitalize}: #{config['server']}' with user: '#{config['user']}'"
49
+ end
50
+
51
+ desc 'profiles', 'list all available profiles in Chef Compliance'
52
+ option :owner, type: :string, required: false,
53
+ desc: 'owner whose profiles to list'
54
+ def profiles
55
+ config = Compliance::Configuration.new
56
+ return if !loggedin(config)
57
+
58
+ # set owner to config
59
+ config['owner'] = options['owner'] || config['user']
60
+
61
+ msg, profiles = Compliance::API.profiles(config)
62
+ profiles.sort_by! { |hsh| hsh['title'] }
63
+ if !profiles.empty?
64
+ # iterate over profiles
65
+ headline('Available profiles:')
66
+ profiles.each { |profile|
67
+ owner = profile['owner_id'] || profile['owner']
68
+ li("#{profile['title']} v#{profile['version']} (#{mark_text(owner + '/' + profile['name'])})")
69
+ }
70
+ else
71
+ puts msg, 'Could not find any profiles'
72
+ exit 1
73
+ end
74
+ rescue Compliance::ServerConfigurationMissing
75
+ STDERR.puts "\nServer configuration information is missing. Please login using `inspec compliance login`"
76
+ exit 1
77
+ end
78
+
79
+ desc 'exec PROFILE', 'executes a Chef Compliance profile'
80
+ exec_options
81
+ def exec(*tests)
82
+ config = Compliance::Configuration.new
83
+ return if !loggedin(config)
84
+ o = opts(:exec).dup
85
+ diagnose(o)
86
+ configure_logger(o)
87
+
88
+ # iterate over tests and add compliance scheme
89
+ tests = tests.map { |t| 'compliance://' + Compliance::API.sanitize_profile_name(t) }
90
+
91
+ runner = Inspec::Runner.new(o)
92
+ tests.each { |target| runner.add_target(target) }
93
+
94
+ exit runner.run
95
+ rescue ArgumentError, RuntimeError, Train::UserError => e
96
+ $stderr.puts e.message
97
+ exit 1
98
+ end
99
+
100
+ desc 'download PROFILE', 'downloads a profile from Chef Compliance'
101
+ option :name, type: :string,
102
+ desc: 'Name of the archive filename (file type will be added)'
103
+ def download(profile_name)
104
+ o = options.dup
105
+ configure_logger(o)
106
+
107
+ config = Compliance::Configuration.new
108
+ return if !loggedin(config)
109
+
110
+ profile_name = Compliance::API.sanitize_profile_name(profile_name)
111
+ if Compliance::API.exist?(config, profile_name)
112
+ puts "Downloading `#{profile_name}`"
113
+
114
+ fetcher = Compliance::Fetcher.resolve(
115
+ {
116
+ compliance: profile_name,
117
+ },
118
+ )
119
+
120
+ # we provide a name, the fetcher adds the extension
121
+ _owner, id = profile_name.split('/')
122
+ file_name = fetcher.fetch(o.name || id)
123
+ puts "Profile stored to #{file_name}"
124
+ else
125
+ puts "Profile #{profile_name} is not available in Chef Compliance."
126
+ exit 1
127
+ end
128
+ end
129
+
130
+ desc 'upload PATH', 'uploads a local profile to Chef Compliance'
131
+ option :overwrite, type: :boolean, default: false,
132
+ desc: 'Overwrite existing profile on Server.'
133
+ option :owner, type: :string, required: false,
134
+ desc: 'Owner that should own the profile'
135
+ def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, PerceivedComplexity, Metrics/CyclomaticComplexity
136
+ config = Compliance::Configuration.new
137
+ return if !loggedin(config)
138
+
139
+ # set owner to config
140
+ config['owner'] = options['owner'] || config['user']
141
+
142
+ unless File.exist?(path)
143
+ puts "Directory #{path} does not exist."
144
+ exit 1
145
+ end
146
+
147
+ vendor_deps(path, options) if File.directory?(path)
148
+
149
+ o = options.dup
150
+ configure_logger(o)
151
+ # check the profile, we only allow to upload valid profiles
152
+ profile = Inspec::Profile.for_target(path, o)
153
+
154
+ # start verification process
155
+ error_count = 0
156
+ error = lambda { |msg|
157
+ error_count += 1
158
+ puts msg
159
+ }
160
+
161
+ result = profile.check
162
+ unless result[:summary][:valid]
163
+ error.call('Profile check failed. Please fix the profile before upload.')
164
+ else
165
+ puts('Profile is valid')
166
+ end
167
+
168
+ # determine user information
169
+ if (config['token'].nil? && config['refresh_token'].nil?) || config['user'].nil?
170
+ error.call('Please login via `inspec compliance login`')
171
+ end
172
+
173
+ # read profile name from inspec.yml
174
+ profile_name = profile.params[:name]
175
+
176
+ # check that the profile is not uploaded already,
177
+ # confirm upload to the user (overwrite with --force)
178
+ if Compliance::API.exist?(config, "#{config['owner']}/#{profile_name}") && !options['overwrite']
179
+ error.call('Profile exists on the server, use --overwrite')
180
+ end
181
+
182
+ # abort if we found an error
183
+ if error_count > 0
184
+ puts "Found #{error_count} error(s)"
185
+ exit 1
186
+ end
187
+
188
+ # if it is a directory, tar it to tmp directory
189
+ if File.directory?(path)
190
+ archive_path = Dir::Tmpname.create([profile_name, '.tar.gz']) {}
191
+ puts "Generate temporary profile archive at #{archive_path}"
192
+ profile.archive({ output: archive_path, ignore_errors: false, overwrite: true })
193
+ else
194
+ archive_path = path
195
+ end
196
+
197
+ puts "Start upload to #{config['owner']}/#{profile_name}"
198
+ pname = ERB::Util.url_encode(profile_name)
199
+
200
+ if Compliance::API.is_automate_server?(config) || Compliance::API.is_automate2_server?(config)
201
+ puts 'Uploading to Chef Automate'
202
+ else
203
+ puts 'Uploading to Chef Compliance'
204
+ end
205
+ success, msg = Compliance::API.upload(config, config['owner'], pname, archive_path)
206
+
207
+ if success
208
+ puts 'Successfully uploaded profile'
209
+ else
210
+ puts 'Error during profile upload:'
211
+ puts msg
212
+ exit 1
213
+ end
214
+ end
215
+
216
+ desc 'version', 'displays the version of the Chef Compliance server'
217
+ def version
218
+ config = Compliance::Configuration.new
219
+ info = Compliance::API.version(config)
220
+ if !info.nil? && info['version']
221
+ puts "Name: #{info['api']}"
222
+ puts "Version: #{info['version']}"
223
+ else
224
+ puts 'Could not determine server version.'
225
+ exit 1
226
+ end
227
+ rescue Compliance::ServerConfigurationMissing
228
+ puts "\nServer configuration information is missing. Please login using `inspec compliance login`"
229
+ exit 1
230
+ end
231
+
232
+ desc 'logout', 'user logout from Chef Compliance'
233
+ def logout
234
+ config = Compliance::Configuration.new
235
+ unless config.supported?(:oidc) || config['token'].nil? || config['server_type'] == 'automate'
236
+ config = Compliance::Configuration.new
237
+ url = "#{config['server']}/logout"
238
+ Compliance::HTTP.post(url, config['token'], config['insecure'], !config.supported?(:oidc))
239
+ end
240
+ success = config.destroy
241
+
242
+ if success
243
+ puts 'Successfully logged out'
244
+ else
245
+ puts 'Could not log out'
246
+ end
247
+ end
248
+
249
+ private
250
+
251
+ def loggedin(config)
252
+ serverknown = !config['server'].nil?
253
+ puts 'You need to login first with `inspec compliance login`' if !serverknown
254
+ serverknown
255
+ end
256
+ end
257
+
258
+ # register the subcommand to Inspec CLI registry
259
+ Inspec::Plugins::CLI.add_subcommand(ComplianceCLI, 'compliance', 'compliance SUBCOMMAND ...', 'Chef Compliance commands', {})
260
+ end