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,16 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ libdir = File.dirname(__FILE__)
6
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
7
+
8
+ module Compliance
9
+ autoload :Configuration, 'inspec-compliance/configuration'
10
+ autoload :HTTP, 'inspec-compliance/http'
11
+ autoload :Support, 'inspec-compliance/support'
12
+ autoload :API, 'inspec-compliance/api'
13
+ end
14
+
15
+ require 'inspec-compliance/cli'
16
+ require 'inspec-compliance/target'
@@ -0,0 +1,20 @@
1
+ ---
2
+ driver:
3
+ name: vagrant
4
+ synced_folders:
5
+ - ['../../../', '/inspec']
6
+ network:
7
+ - ['private_network', {ip: '192.168.251.2'}]
8
+
9
+ provisioner:
10
+ name: shell
11
+
12
+ verifier:
13
+ name: inspec
14
+
15
+ platforms:
16
+ - name: ubuntu-14.04
17
+ suites:
18
+ - name: default
19
+ run_list:
20
+ attributes:
@@ -0,0 +1,193 @@
1
+ # InSpec Extension for Chef Compliance
2
+
3
+ This extensions offers the following features:
4
+
5
+ - list available profiles in Chef Automate/Chef Compliance
6
+ - execute profiles directly from Chef Automate/Chef Compliance locally
7
+ - upload a local profile to Chef Automate/Chef Compliance
8
+
9
+ To use the CLI, this InSpec add-on adds the following commands:
10
+
11
+ * `$ inspec compliance login` - authentication of the API token against Chef Automate/Chef Compliance
12
+ * `$ inspec compliance profiles` - list all available Compliance profiles
13
+ * `$ inspec exec compliance://profile` - runs a Compliance profile
14
+ * `$ inspec compliance upload path/to/local/profile` - uploads a local profile to Chef Automate/Chef Compliance
15
+ * `$ inspec compliance logout` - logout of Chef Automate/Chef Compliance
16
+
17
+ Compliance profiles can be executed in two ways:
18
+
19
+ - via compliance exec: `inspec compliance exec profile`
20
+ - via compliance scheme: `inspec exec compliance://profile`
21
+
22
+
23
+ ## Usage
24
+
25
+ ### Command options
26
+
27
+ ```
28
+ $ inspec compliance
29
+ Commands:
30
+ inspec compliance download PROFILE # downloads a profile from Chef Compliance
31
+ inspec compliance exec PROFILE # executes a Chef Compliance profile
32
+ inspec compliance help [COMMAND] # Describe subcommands or one specific subcommand
33
+ inspec compliance login SERVER # Log in to a Chef Automate/Chef Compliance SERVER
34
+ inspec compliance logout # user logout from Chef Compliance
35
+ inspec compliance profiles # list all available profiles in Chef Compliance
36
+ inspec compliance upload PATH # uploads a local profile to Chef Compliance
37
+ inspec compliance version # displays the version of the Chef Compliance server
38
+ ```
39
+
40
+ ### Login with Chef Automate2
41
+
42
+ You will need an API token for authentication. You can retrieve one via the admin section of your A2 web gui.
43
+
44
+ ```
45
+ $ inspec compliance login https://automate2.compliance.test --insecure --user 'admin' --token 'zuop..._KzE'
46
+ ```
47
+
48
+ ### Login with Chef Automate
49
+
50
+ You will need an access token for authentication. You can retrieve one via [UI](https://docs.chef.io/api_delivery.html) or [CLI](https://docs.chef.io/ctl_delivery.html#delivery-token).
51
+
52
+ ```
53
+ $ inspec compliance login https://automate.compliance.test --insecure --user 'admin' --ent 'brewinc' --token 'zuop..._KzE'
54
+ ```
55
+
56
+ ### Login with Chef Compliance
57
+
58
+ You will need an access token for authentication. You can retrieve one via:
59
+
60
+ ![Chef Compliance Token](images/cc-token.png)
61
+
62
+ You can choose the access token (`--token`) or the refresh token (`--refresh_token`)
63
+
64
+ ```
65
+ $ inspec compliance login https://compliance.test --user admin --insecure --token '...'
66
+ ```
67
+
68
+ ### List available profiles via Chef Compliance / Automate
69
+
70
+ ```
71
+ $ inspec compliance profiles
72
+ Available profiles:
73
+ -------------------
74
+ * base/apache
75
+ * base/linux
76
+ * base/mysql
77
+ * base/postgres
78
+ * base/ssh
79
+ * base/windows
80
+ * cis/cis-centos6-level1
81
+ * cis/cis-centos6-level2
82
+ * cis/cis-centos7-level1
83
+ * cis/cis-centos7-level2
84
+ * cis/cis-rhel7-level1
85
+ * cis/cis-rhel7-level2
86
+ * cis/cis-ubuntu12.04lts-level1
87
+ * cis/cis-ubuntu12.04lts-level2
88
+ * cis/cis-ubuntu14.04lts-level1
89
+ * cis/cis-ubuntu14.04lts-level2
90
+ ```
91
+
92
+ ### Upload a profile to Chef Compliance / Automate
93
+
94
+ ```
95
+ $ inspec compliance version
96
+ Chef Compliance version: 1.0.11
97
+ ➜ inspec git:(chris-rock/cc-error-not-loggedin) ✗ b inspec compliance upload examples/profile
98
+ I, [2016-05-06T14:27:20.907547 #37592] INFO -- : Checking profile in examples/profile
99
+ I, [2016-05-06T14:27:20.907668 #37592] INFO -- : Metadata OK.
100
+ I, [2016-05-06T14:27:20.968584 #37592] INFO -- : Found 4 controls.
101
+ I, [2016-05-06T14:27:20.968638 #37592] INFO -- : Control definitions OK.
102
+ Profile is valid
103
+ Generate temporary profile archive at /var/folders/jy/2bnrfb4s36jbjtzllvhhyqhw0000gn/T/profile20160506-37592-1tf326f.tar.gz
104
+ I, [2016-05-06T14:27:21.020017 #37592] INFO -- : Generate archive /var/folders/jy/2bnrfb4s36jbjtzllvhhyqhw0000gn/T/profile20160506-37592-1tf326f.tar.gz.
105
+ I, [2016-05-06T14:27:21.024837 #37592] INFO -- : Finished archive generation.
106
+ Start upload to admin/profile
107
+ Uploading to Chef Compliance
108
+ Successfully uploaded profile
109
+
110
+ # display all profiles
111
+ $ inspec compliance profiles
112
+ Available profiles:
113
+ -------------------
114
+ * admin/profile
115
+ * base/apache
116
+ * base/linux
117
+ * base/mysql
118
+ * base/postgres
119
+ * base/ssh
120
+ * base/windows
121
+ * cis/cis-centos6-level1
122
+ * cis/cis-centos6-level2
123
+ * cis/cis-centos7-level1
124
+ * cis/cis-centos7-level2
125
+ * cis/cis-rhel7-level1
126
+ * cis/cis-rhel7-level2
127
+ * cis/cis-ubuntu12.04lts-level1
128
+ * cis/cis-ubuntu12.04lts-level2
129
+ * cis/cis-ubuntu14.04lts-level1
130
+ * cis/cis-ubuntu14.04lts-level2
131
+ ```
132
+
133
+ ### Run a profile from Chef Compliance / Chef Automate on Workstation
134
+
135
+ ```
136
+ $ inspec exec compliance://admin/profile
137
+ .*...
138
+
139
+ Pending: (Failures listed here are expected and do not affect your suite's status)
140
+
141
+ 1) gordon_config Can't find file "/tmp/gordon/config.yaml"
142
+ # Not yet implemented
143
+ # ./lib/inspec/runner.rb:157
144
+
145
+
146
+ Finished in 0.02862 seconds (files took 0.62628 seconds to load)
147
+ 5 examples, 0 failures, 1 pending
148
+ ```
149
+
150
+ Exec a specific version(2.0.1) of a profile when logged in with Automate:
151
+
152
+ ```
153
+ $ inspec exec compliance://admin/apache-baseline#2.0.1
154
+ ```
155
+
156
+ Download a specific version(2.0.2) of a profile when logged in with Automate:
157
+ ```
158
+ $ inspec compliance download compliance://admin/apache-baseline#2.0.2
159
+ ```
160
+
161
+ ### To Logout from Chef Compliance
162
+
163
+ ```
164
+ $ inspec compliance logout
165
+ Successfully logged out
166
+ ```
167
+
168
+ ## Integration Tests
169
+
170
+ At this point of time, InSpec is not able to pick up the token directly, therefore the integration test is semi-automatic at this point of time:
171
+
172
+ * run `kitchen converge`
173
+ * open https://192.168.251.2 and log in with user `admin` and password `admin`
174
+ * click on user->about and obtain the access token and the refresh token
175
+ * run `kitchen verify` with the required env variables:
176
+
177
+ ```
178
+ # both token need to be set, since the test suite runs for each token type
179
+ export COMPLIANCE_ACCESSTOKEN='mycompliancetoken'
180
+ export COMPLIANCE_REFRESHTOKEN='myrefreshtoken'
181
+ kitchen verify
182
+ -----> Starting Kitchen (v1.7.3)
183
+ -----> Verifying <default-ubuntu-1404>...
184
+ Search `/Users/chartmann/Development/compliance/inspec/lib/bundles/inspec-compliance/test/integration/default` for tests
185
+ ..................................
186
+
187
+ Finished in 6.35 seconds (files took 0.40949 seconds to load)
188
+ 34 examples, 0 failures
189
+
190
+ Finished verifying <default-ubuntu-1404> (0m6.62s).
191
+ -----> Kitchen is finished. (0m7.02s)
192
+ zlib(finalizer): the stream was freed prematurely.
193
+ ```
@@ -0,0 +1,360 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ require 'net/http'
6
+ require 'uri'
7
+ require 'json'
8
+
9
+ require_relative 'api/login'
10
+
11
+ module Compliance
12
+ class ServerConfigurationMissing < StandardError; end
13
+
14
+ # API Implementation does not hold any state by itself,
15
+ # everything will be stored in local Configuration store
16
+ class API
17
+ extend Compliance::API::Login
18
+
19
+ # return all compliance profiles available for the user
20
+ # the user is either specified in the options hash or by default
21
+ # the username of the account is used that is logged in
22
+ def self.profiles(config) # rubocop:disable PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
23
+ owner = config['owner'] || config['user']
24
+
25
+ # Chef Compliance
26
+ if is_compliance_server?(config)
27
+ url = "#{config['server']}/user/compliance"
28
+ # Chef Automate2
29
+ elsif is_automate2_server?(config)
30
+ url = "#{config['server']}/compliance/profiles/search"
31
+ # Chef Automate
32
+ elsif is_automate_server?(config)
33
+ url = "#{config['server']}/profiles/#{owner}"
34
+ else
35
+ raise ServerConfigurationMissing
36
+ end
37
+
38
+ headers = get_headers(config)
39
+
40
+ if is_automate2_server?(config)
41
+ body = { owner: owner }.to_json
42
+ response = Compliance::HTTP.post_with_headers(url, headers, body, config['insecure'])
43
+ else
44
+ response = Compliance::HTTP.get(url, headers, config['insecure'])
45
+ end
46
+ data = response.body
47
+ response_code = response.code
48
+ case response_code
49
+ when '200'
50
+ msg = 'success'
51
+ profiles = JSON.parse(data)
52
+ # iterate over profiles
53
+ if is_compliance_server?(config)
54
+ mapped_profiles = []
55
+ profiles.values.each { |org|
56
+ mapped_profiles += org.values
57
+ }
58
+ # Chef Automate pre 0.8.0
59
+ elsif is_automate_server_pre_080?(config)
60
+ mapped_profiles = profiles.values.flatten
61
+ elsif is_automate2_server?(config)
62
+ mapped_profiles = []
63
+ profiles['profiles'].each { |p|
64
+ mapped_profiles << p
65
+ }
66
+ else
67
+ mapped_profiles = profiles.map { |e|
68
+ e['owner_id'] = owner
69
+ e
70
+ }
71
+ end
72
+ return msg, mapped_profiles
73
+ when '401'
74
+ msg = '401 Unauthorized. Please check your token.'
75
+ return msg, []
76
+ else
77
+ msg = "An unexpected error occurred (HTTP #{response_code}): #{response.message}"
78
+ return msg, []
79
+ end
80
+ end
81
+
82
+ # return the server api version
83
+ # NB this method does not use Compliance::Configuration to allow for using
84
+ # it before we know the version (e.g. oidc or not)
85
+ def self.version(config)
86
+ url = config['server']
87
+ insecure = config['insecure']
88
+
89
+ raise ServerConfigurationMissing if url.nil?
90
+
91
+ headers = get_headers(config)
92
+ response = Compliance::HTTP.get(url+'/version', headers, insecure)
93
+ return {} if response.code == '404'
94
+
95
+ data = response.body
96
+ return {} if data.nil? || data.empty?
97
+
98
+ parsed = JSON.parse(data)
99
+ return {} unless parsed.key?('version') && !parsed['version'].empty?
100
+
101
+ parsed
102
+ end
103
+
104
+ # verifies that a profile
105
+ def self.exist?(config, profile)
106
+ owner, id, ver = profile_split(profile)
107
+
108
+ # ensure that we do not manipulate the configuration object
109
+ user_config = config.dup
110
+ user_config['owner'] = owner
111
+ _msg, profiles = Compliance::API.profiles(user_config)
112
+
113
+ if !profiles.empty?
114
+ profiles.any? do |p|
115
+ profile_owner = p['owner_id'] || p['owner']
116
+ profile_owner == owner &&
117
+ p['name'] == id &&
118
+ (ver.nil? || p['version'] == ver)
119
+ end
120
+ else
121
+ false
122
+ end
123
+ end
124
+
125
+ def self.upload(config, owner, profile_name, archive_path)
126
+ # Chef Compliance
127
+ if is_compliance_server?(config)
128
+ url = "#{config['server']}/owners/#{owner}/compliance/#{profile_name}/tar"
129
+ # Chef Automate pre 0.8.0
130
+ elsif is_automate_server_pre_080?(config)
131
+ url = "#{config['server']}/#{owner}"
132
+ elsif is_automate2_server?(config)
133
+ url = "#{config['server']}/compliance/profiles?owner=#{owner}"
134
+ # Chef Automate
135
+ else
136
+ url = "#{config['server']}/profiles/#{owner}"
137
+ end
138
+
139
+ headers = get_headers(config)
140
+ if is_automate2_server?(config)
141
+ res = Compliance::HTTP.post_multipart_file(url, headers, archive_path, config['insecure'])
142
+ else
143
+ res = Compliance::HTTP.post_file(url, headers, archive_path, config['insecure'])
144
+ end
145
+
146
+ [res.is_a?(Net::HTTPSuccess), res.body]
147
+ end
148
+
149
+ # Use username and refresh_token to get an API access token
150
+ def self.get_token_via_refresh_token(url, refresh_token, insecure)
151
+ uri = URI.parse("#{url}/login")
152
+ req = Net::HTTP::Post.new(uri.path)
153
+ req.body = { token: refresh_token }.to_json
154
+ access_token = nil
155
+ response = Compliance::HTTP.send_request(uri, req, insecure)
156
+ data = response.body
157
+ if response.code == '200'
158
+ begin
159
+ tokendata = JSON.parse(data)
160
+ access_token = tokendata['access_token']
161
+ msg = 'Successfully fetched API access token'
162
+ success = true
163
+ rescue JSON::ParserError => e
164
+ success = false
165
+ msg = e.message
166
+ end
167
+ else
168
+ success = false
169
+ msg = "Failed to authenticate to #{url} \n\
170
+ Response code: #{response.code}\n Body: #{response.body}"
171
+ end
172
+
173
+ [success, msg, access_token]
174
+ end
175
+
176
+ # Use username and password to get an API access token
177
+ def self.get_token_via_password(url, username, password, insecure)
178
+ uri = URI.parse("#{url}/login")
179
+ req = Net::HTTP::Post.new(uri.path)
180
+ req.body = { userid: username, password: password }.to_json
181
+ access_token = nil
182
+ response = Compliance::HTTP.send_request(uri, req, insecure)
183
+ data = response.body
184
+ if response.code == '200'
185
+ access_token = data
186
+ msg = 'Successfully fetched an API access token valid for 12 hours'
187
+ success = true
188
+ else
189
+ success = false
190
+ msg = "Failed to authenticate to #{url} \n\
191
+ Response code: #{response.code}\n Body: #{response.body}"
192
+ end
193
+
194
+ [success, msg, access_token]
195
+ end
196
+
197
+ def self.get_headers(config)
198
+ token = get_token(config)
199
+ if is_automate_server?(config) || is_automate2_server?(config)
200
+ headers = { 'chef-delivery-enterprise' => config['automate']['ent'] }
201
+ if config['automate']['token_type'] == 'dctoken'
202
+ headers['x-data-collector-token'] = token
203
+ else
204
+ headers['chef-delivery-user'] = config['user']
205
+ headers['chef-delivery-token'] = token
206
+ end
207
+ else
208
+ headers = { 'Authorization' => "Bearer #{token}" }
209
+ end
210
+ headers
211
+ end
212
+
213
+ def self.get_token(config)
214
+ return config['token'] unless config['refresh_token']
215
+ _success, _msg, token = get_token_via_refresh_token(config['server'], config['refresh_token'], config['insecure'])
216
+ token
217
+ end
218
+
219
+ def self.target_url(config, profile)
220
+ owner, id, ver = profile_split(profile)
221
+
222
+ return "#{config['server']}/compliance/profiles/tar" if is_automate2_server?(config)
223
+ return "#{config['server']}/owners/#{owner}/compliance/#{id}/tar" unless is_automate_server?(config)
224
+
225
+ if ver.nil?
226
+ "#{config['server']}/profiles/#{owner}/#{id}/tar"
227
+ else
228
+ "#{config['server']}/profiles/#{owner}/#{id}/version/#{ver}/tar"
229
+ end
230
+ end
231
+
232
+ def self.profile_split(profile)
233
+ owner, id = profile.split('/')
234
+ id, version = id.split('#')
235
+ [owner, id, version]
236
+ end
237
+
238
+ # returns a parsed url for `admin/profile` or `compliance://admin/profile`
239
+ def self.sanitize_profile_name(profile)
240
+ if URI(profile).scheme == 'compliance'
241
+ uri = URI(profile)
242
+ else
243
+ uri = URI("compliance://#{profile}")
244
+ end
245
+ uri.to_s.sub(%r{^compliance:\/\/}, '')
246
+ end
247
+
248
+ def self.is_compliance_server?(config)
249
+ config['server_type'] == 'compliance'
250
+ end
251
+
252
+ def self.is_automate_server_pre_080?(config)
253
+ # Automate versions before 0.8.x do not have a valid version in the config
254
+ return false unless config['server_type'] == 'automate'
255
+ server_version_from_config(config).nil?
256
+ end
257
+
258
+ def self.is_automate_server_080_and_later?(config)
259
+ # Automate versions 0.8.x and later will have a "version" key in the config
260
+ # that is properly parsed out via server_version_from_config below
261
+ return false unless config['server_type'] == 'automate'
262
+ !server_version_from_config(config).nil?
263
+ end
264
+
265
+ def self.is_automate2_server?(config)
266
+ config['server_type'] == 'automate2'
267
+ end
268
+
269
+ def self.is_automate_server?(config)
270
+ config['server_type'] == 'automate'
271
+ end
272
+
273
+ def self.server_version_from_config(config)
274
+ # Automate versions 0.8.x and later will have a "version" key in the config
275
+ # that looks like: "version":{"api":"compliance","version":"0.8.24"}
276
+ return nil unless config.key?('version')
277
+ return nil unless config['version'].is_a?(Hash)
278
+ config['version']['version']
279
+ end
280
+
281
+ def self.determine_server_type(url, insecure)
282
+ if target_is_automate2_server?(url, insecure)
283
+ :automate2
284
+ elsif target_is_automate_server?(url, insecure)
285
+ :automate
286
+ elsif target_is_compliance_server?(url, insecure)
287
+ :compliance
288
+ else
289
+ Inspec::Log.debug('Could not determine server type using known endpoints')
290
+ nil
291
+ end
292
+ end
293
+
294
+ def self.target_is_automate2_server?(url, insecure)
295
+ automate_endpoint = '/dex/auth'
296
+ response = Compliance::HTTP.get(url + automate_endpoint, nil, insecure)
297
+ if response.code == '400'
298
+ Inspec::Log.debug(
299
+ "Received 400 from #{url}#{automate_endpoint} - " \
300
+ 'assuming target is a Chef Automate2 instance',
301
+ )
302
+ true
303
+ else
304
+ false
305
+ end
306
+ end
307
+
308
+ def self.target_is_automate_server?(url, insecure)
309
+ automate_endpoint = '/compliance/version'
310
+ response = Compliance::HTTP.get(url + automate_endpoint, nil, insecure)
311
+ case response.code
312
+ when '401'
313
+ Inspec::Log.debug(
314
+ "Received 401 from #{url}#{automate_endpoint} - " \
315
+ 'assuming target is a Chef Automate instance',
316
+ )
317
+ true
318
+ when '200'
319
+ # Chef Automate currently returns 401 for `/compliance/version` but some
320
+ # versions of OpsWorks Chef Automate return 200 and a Chef Manage page
321
+ # when unauthenticated requests are received.
322
+ if response.body.include?('Are You Looking For the Chef Server?')
323
+ Inspec::Log.debug(
324
+ "Received 200 from #{url}#{automate_endpoint} - " \
325
+ 'assuming target is an OpsWorks Chef Automate instance',
326
+ )
327
+ true
328
+ else
329
+ Inspec::Log.debug(
330
+ "Received 200 from #{url}#{automate_endpoint} " \
331
+ 'but did not receive the Chef Manage page - ' \
332
+ 'assuming target is not a Chef Automate instance',
333
+ )
334
+ false
335
+ end
336
+ else
337
+ Inspec::Log.debug(
338
+ "Received unexpected status code #{response.code} " \
339
+ "from #{url}#{automate_endpoint} - " \
340
+ 'assuming target is not a Chef Automate instance',
341
+ )
342
+ false
343
+ end
344
+ end
345
+
346
+ def self.target_is_compliance_server?(url, insecure)
347
+ # All versions of Chef Compliance return 200 for `/api/version`
348
+ compliance_endpoint = '/api/version'
349
+
350
+ response = Compliance::HTTP.get(url + compliance_endpoint, nil, insecure)
351
+ return false unless response.code == '200'
352
+
353
+ Inspec::Log.debug(
354
+ "Received 200 from #{url}#{compliance_endpoint} - " \
355
+ 'assuming target is a Compliance server',
356
+ )
357
+ true
358
+ end
359
+ end
360
+ end