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,110 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/object_traversal'
4
+
5
+ module Inspec::Resources
6
+ # This resource simplifies the access to wmi
7
+ # on CLI you would use:
8
+ # WMIC /NAMESPACE:\\root\rsop\computer PATH RSOP_SecuritySettingNumeric WHERE "KeyName = 'MinimumPasswordAge' And precedence=1" GET Setting
9
+ # We use Get-WmiObject via Powershell to retrieve all values.
10
+ class WMI < Inspec.resource(1)
11
+ name 'wmi'
12
+ supports platform: 'windows'
13
+ desc 'request wmi information'
14
+ example "
15
+ describe wmi({
16
+ class: 'RSOP_SecuritySettingNumeric',
17
+ namespace: 'root\\rsop\\computer',
18
+ filter: 'KeyName = \'MinimumPasswordAge\' And precedence=1'
19
+ }) do
20
+ its('Setting') { should eq true }
21
+ end
22
+ "
23
+
24
+ include ObjectTraverser
25
+ attr_accessor :content
26
+
27
+ def initialize(wmiclass = nil, opts = nil)
28
+ @options = opts || {}
29
+ # if wmiclass is not a hash, we have to handle deprecation behavior
30
+ if wmiclass.is_a?(Hash)
31
+ @options.merge!(wmiclass)
32
+ else
33
+ warn '[DEPRECATION] `wmi(\'wmiclass\')` is deprecated. Please use `wmi({class: \'wmiclass\'})` instead.'
34
+ @options[:class] = wmiclass
35
+ end
36
+ end
37
+
38
+ # returns nil, if not existant or value
39
+ def method_missing(*keys)
40
+ # catch behavior of rspec its implementation
41
+ # @see https://github.com/rspec/rspec-its/blob/master/lib/rspec/its.rb#L110
42
+ keys.shift if keys.is_a?(Array) && keys[0] == :[]
43
+
44
+ # map all symbols to strings
45
+ keys = keys.map { |x| x.to_s.downcase } if keys.is_a?(Array)
46
+
47
+ value(keys)
48
+ end
49
+
50
+ def value(key)
51
+ extract_value(key, params)
52
+ end
53
+
54
+ def params
55
+ return @content if defined?(@content)
56
+ @content = {}
57
+
58
+ # abort if no options are available
59
+ return @content unless defined?(@options)
60
+
61
+ # filter for supported options
62
+ args = @options.select { |key, _value| [:class, :namespace, :query, :filter].include?(key) }
63
+
64
+ # convert to Get-WmiObject arguments
65
+ params = ''
66
+ args.each { |key, value| params += " -#{key} \"#{value.gsub('"', '`"')}\"" }
67
+
68
+ # run wmi command and filter empty wmi
69
+ script = <<-EOH
70
+ Filter Aggregate
71
+ {
72
+ $arr = @{}
73
+ $_.properties | % {
74
+ $arr.Add($_.name, $_.value)
75
+ }
76
+ $arr
77
+ }
78
+ Get-WmiObject #{params} | Aggregate | ConvertTo-Json
79
+ EOH
80
+
81
+ # run wmi command
82
+ cmd = inspec.powershell(script)
83
+ @content = JSON.parse(cmd.stdout)
84
+
85
+ # make all keys case-insensitive
86
+ @content = lowercase_keys(@content)
87
+ rescue JSON::ParserError => _e
88
+ @content
89
+ end
90
+
91
+ def to_s
92
+ "WMI with #{@options}"
93
+ end
94
+
95
+ private
96
+
97
+ def lowercase_keys(content)
98
+ if content.is_a?(Hash)
99
+ content.keys.each do |key|
100
+ new_key = key.to_s.downcase
101
+ content[new_key] = content.delete(key)
102
+ lowercase_keys(content[new_key])
103
+ end
104
+ elsif content.respond_to?(:each)
105
+ content.each { |item| lowercase_keys(item) }
106
+ end
107
+ content
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,137 @@
1
+ # encoding: utf-8
2
+
3
+ require 'openssl'
4
+ require 'hashie/mash'
5
+ require 'utils/file_reader'
6
+
7
+ module Inspec::Resources
8
+ class X509CertificateResource < Inspec.resource(1)
9
+ name 'x509_certificate'
10
+ supports platform: 'unix'
11
+ supports platform: 'windows'
12
+ desc 'Used to test x.509 certificates'
13
+ example "
14
+ describe x509_certificate('/etc/pki/www.mywebsite.com.pem') do
15
+ its('subject') { should match /CN=My Website/ }
16
+ its('validity_in_days') { should be > 30 }
17
+ end
18
+
19
+ describe x509_certificate('trials/x509/cert.pem') do
20
+ it { should be_certificate }
21
+ it { should be_valid }
22
+ its('fingerprint') { should eq '62b137bdf427e7273dc2e487877b3033e4c8ce17' }
23
+ its('signature_algorithm') { should eq 'sha1WithRSAEncryption' }
24
+ its('validity_in_days') { should_not be < 100 }
25
+ its('validity_in_days') { should be >= 100 }
26
+ its('subject_dn') { should eq '/C=DE/ST=Berlin/L=Berlin/O=InSpec/OU=Chef Software, Inc/CN=inspec.io/emailAddress=support@chef.io' }
27
+ its('subject.C') { should eq 'DE' }
28
+ its('subject.emailAddress') { should_not be_empty }
29
+ its('subject.emailAddress') { should eq 'support@chef.io' }
30
+ its('issuer_dn') { should eq '/C=DE/ST=Berlin/L=Berlin/O=InSpec/OU=Chef Software, Inc/CN=inspec.io/emailAddress=support@chef.io' }
31
+ its('key_length') { should be >= 2048 }
32
+ its('extensions.subjectKeyIdentifier') { should cmp 'A5:16:0B:12:F4:48:0F:06:6C:32:29:67:98:12:DF:3D:0D:75:9D:5C' }
33
+ end
34
+ "
35
+
36
+ include FileReader
37
+
38
+ # @see https://tools.ietf.org/html/rfc5280#page-23
39
+ def initialize(filename)
40
+ @certpath = filename
41
+ @issuer = nil
42
+ @parsed_subject = nil
43
+ @parsed_issuer = nil
44
+ @extensions = nil
45
+ @cert = OpenSSL::X509::Certificate.new read_file_content(@certpath)
46
+ end
47
+
48
+ # Forward these methods directly to OpenSSL::X509::Certificate instance
49
+ %w{version not_before not_after signature_algorithm public_key}.each do |m|
50
+ define_method m.to_sym do |*args|
51
+ @cert.method(m.to_sym).call(*args)
52
+ end
53
+ end
54
+
55
+ def certificate?
56
+ !@cert.nil?
57
+ end
58
+
59
+ def fingerprint
60
+ return if @cert.nil?
61
+ OpenSSL::Digest::SHA1.new(@cert.to_der).to_s
62
+ end
63
+
64
+ def serial
65
+ return if @cert.nil?
66
+ @cert.serial.to_i
67
+ end
68
+
69
+ def subject_dn
70
+ return if @cert.nil?
71
+ @cert.subject.to_s
72
+ end
73
+
74
+ def subject
75
+ return if @cert.nil?
76
+ # Return cached subject if we have already parsed it
77
+ return @parsed_subject if @parsed_subject
78
+ # Use a Mash to make it easier to access hash elements in "its('subject') {should ...}"
79
+ @parsed_subject = Hashie::Mash.new(Hash[@cert.subject.to_a.map { |k, v, _| [k, v] }])
80
+ end
81
+
82
+ def issuer_dn
83
+ return if @cert.nil?
84
+ @cert.issuer.to_s
85
+ end
86
+
87
+ def issuer
88
+ return if @cert.nil?
89
+ # Return cached subject if we have already parsed it
90
+ return @parsed_issuer if @parsed_issuer
91
+ # Use a Mash to make it easier to access hash elements in "its('issuer') {should ...}"
92
+ @parsed_issuer = Hashie::Mash.new(Hash[@cert.issuer.to_a.map { |k, v, _| [k, v] }])
93
+ end
94
+
95
+ def key_length
96
+ return if @cert.nil?
97
+ @cert.public_key.n.num_bytes * 8
98
+ end
99
+
100
+ def validity_in_days
101
+ (not_after - Time.now.utc) / 86400
102
+ end
103
+
104
+ def valid?
105
+ now = Time.now
106
+ certificate? && (now >= not_before && now <= not_after)
107
+ end
108
+
109
+ def extensions
110
+ # Return cached Mash if we already parsed the certificate extensions
111
+ return @extensions if @extensions
112
+ # Return the exception class if we failed to instantiate a Cert from file
113
+ return @cert unless @cert.respond_to? :extensions
114
+ # Use a Mash to make it easier to access hash elements in "its('entensions') {should ...}"
115
+ @extensions = Hashie::Mash.new({})
116
+ # Make sure standard extensions exist so we don't get nil for nil:NilClass
117
+ # when the user tests for extensions which aren't present
118
+ %w{
119
+ keyUsage extendedKeyUsage basicConstraints subjectKeyIdentifier
120
+ authorityKeyIdentifier subjectAltName issuerAltName authorityInfoAccess
121
+ crlDistributionPoints issuingDistributionPoint certificatePolicies
122
+ policyConstraints nameConstraints noCheck tlsfeature nsComment
123
+ }.each { |extension| @extensions[extension] ||= [] }
124
+ # Now parse the extensions into the Mash
125
+ extension_array = @cert.extensions.map(&:to_s)
126
+ extension_array.each do |extension|
127
+ kv = extension.split(/ *= */, 2)
128
+ @extensions[kv.first] = kv.last.split(/ *, */)
129
+ end
130
+ @extensions
131
+ end
132
+
133
+ def to_s
134
+ "x509_certificate #{@certpath}"
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/parser'
4
+ require 'utils/filter'
5
+ require 'utils/file_reader'
6
+
7
+ module Inspec::Resources
8
+ class XinetdConf < Inspec.resource(1)
9
+ name 'xinetd_conf'
10
+ supports platform: 'unix'
11
+ desc 'Xinetd services configuration.'
12
+ example "
13
+ describe xinetd_conf.services('chargen') do
14
+ its('socket_types') { should include 'dgram' }
15
+ end
16
+
17
+ describe xinetd_conf.services('chargen').socket_types('dgram') do
18
+ it { should be_disabled }
19
+ end
20
+ "
21
+
22
+ include XinetdParser
23
+ include FileReader
24
+
25
+ def initialize(conf_path = '/etc/xinetd.conf')
26
+ @conf_path = conf_path
27
+ @contents = {}
28
+ read_content(@conf_path)
29
+ end
30
+
31
+ def to_s
32
+ "Xinetd config #{@conf_path}#{@filters}"
33
+ end
34
+
35
+ def params
36
+ @params ||= read_params
37
+ end
38
+
39
+ filter = FilterTable.create
40
+ filter.add_accessor(:where)
41
+ .add_accessor(:entries)
42
+ .add(:services, field: 'service')
43
+ .add(:ids, field: 'id')
44
+ .add(:socket_types, field: 'socket_type')
45
+ .add(:types, field: 'type')
46
+ .add(:protocols, field: 'protocol')
47
+ .add(:wait, field: 'wait')
48
+ .add(:disabled?) { |x| x.where('disable' => 'no').services.empty? }
49
+ .add(:enabled?) { |x| x.where('disable' => 'yes').services.empty? }
50
+ .connect(self, :service_lines)
51
+
52
+ private
53
+
54
+ def read_content(path = @conf_path)
55
+ return @contents[path] if @contents.key?(path)
56
+
57
+ @contents[path] = read_file_content(path)
58
+ end
59
+
60
+ def read_params
61
+ return {} if read_content.nil?
62
+ flat_params = parse_xinetd(read_content)
63
+ # we need to map service data in order to use it with filtertable
64
+ params = { 'services' => {} }
65
+ # map services that were defined and map it to the service hash
66
+ flat_params.each do |k, v|
67
+ name = k[/^service (.+)$/, 1]
68
+ # its not a service, no change required
69
+ if name.nil?
70
+ params[k] = v
71
+ # handle service entries
72
+ else
73
+ # store service
74
+ params['services'][name] = v
75
+
76
+ # add the service identifier to its parameters
77
+ if v.is_a?(Array)
78
+ v.each { |service| service.params['service'] = name }
79
+ else
80
+ v.params['service'] = name
81
+ end
82
+ end
83
+ end
84
+ params
85
+ end
86
+
87
+ # Method used to derive the default protocol used from the socket_type
88
+ def default_protocol(type)
89
+ case type
90
+ when 'stream'
91
+ 'tcp'
92
+ when 'dgram'
93
+ 'udp'
94
+ else
95
+ 'unknown'
96
+ end
97
+ end
98
+
99
+ def service_lines
100
+ @services ||= params['services'].values.flatten.map { |service|
101
+ service.params['protocol'] ||= default_protocol(service.params['socket_type'])
102
+ service.params
103
+ }
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec::Resources
4
+ class XmlConfig < JsonConfig
5
+ name 'xml'
6
+ supports platform: 'unix'
7
+ supports platform: 'windows'
8
+ desc 'Use the xml InSpec resource to test configuration data in an XML file'
9
+ example "
10
+ describe xml('default.xml') do
11
+ its('key/sub_key') { should eq(['value']) }
12
+ its(['root/name.with.a.period']) { should cmp 'so_many_dots' }
13
+ end
14
+ "
15
+
16
+ def parse(content)
17
+ require 'rexml/document'
18
+ REXML::Document.new(content)
19
+ rescue => e
20
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse XML: #{e.message}"
21
+ end
22
+
23
+ def value(key)
24
+ output = []
25
+ REXML::XPath.each(@params, key.first.to_s) do |element|
26
+ if element.is_a?(REXML::Attribute)
27
+ output.push(element.to_s)
28
+ elsif element.is_a?(REXML::Element)
29
+ output.push(element.text)
30
+ else
31
+ raise Inspec::Exceptions::ResourceFailed, "Unknown XML object received (#{element.class}): #{element}"
32
+ end
33
+ end
34
+
35
+ output
36
+ end
37
+
38
+ private
39
+
40
+ # used by JsonConfig to build up a full to_s method
41
+ # based on whether a file path, content, or command was supplied.
42
+ def resource_base_name
43
+ 'XML'
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ require 'yaml'
4
+
5
+ # Parses a yaml document
6
+ # Usage:
7
+ # describe yaml('.kitchen.yaml') do
8
+ # its('driver.name') { should eq('vagrant') }
9
+ # end
10
+ module Inspec::Resources
11
+ class YamlConfig < JsonConfig
12
+ name 'yaml'
13
+ desc 'Use the yaml InSpec audit resource to test configuration data in a YAML file.'
14
+ example "
15
+ describe yaml('config.yaml') do
16
+ its(['driver', 'name']) { should eq 'vagrant' }
17
+ end
18
+
19
+ describe yaml({ command: 'retrieve_data.py --yaml' }) do
20
+ its('state') { should eq 'open' }
21
+ end
22
+
23
+ describe yaml({ content: \"key1: value1\nkey2: value2\" }) do
24
+ its('key2') { should cmp 'value2' }
25
+ end
26
+ "
27
+
28
+ # override file load and parse hash from yaml
29
+ def parse(content)
30
+ YAML.load(content)
31
+ rescue => e
32
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse YAML: #{e.message}"
33
+ end
34
+
35
+ private
36
+
37
+ # used by JsonConfig to build up a full to_s method
38
+ # based on whether a file path, content, or command was supplied.
39
+ def resource_base_name
40
+ 'YAML'
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,180 @@
1
+ # encoding: utf-8
2
+
3
+ # Usage:
4
+ # describe yum do
5
+ # its('repos') { should exist }
6
+ # end
7
+ #
8
+ # describe yum do
9
+ # its('repos') { should include 'base/7/x86_64' }
10
+ # its('epel') { should exist }
11
+ # its('epel') { should be_enabled }
12
+ # end
13
+ #
14
+ # Filter for a specific repo by name
15
+ # - use full identifier e.g. 'updates/7/x86_64'
16
+ # - use short identifier e.g. 'updates'
17
+ #
18
+ # describe yum.repo('epel') do
19
+ # it { should exist }
20
+ # it { should be_enabled }
21
+ # its('baseurl') { should include 'mycompany.biz' }
22
+ # end
23
+ #
24
+ # deprecated:
25
+ # describe yumrepo('epel') do
26
+ # it { should exist }
27
+ # it { should be_enabled }
28
+ # end
29
+
30
+ module Inspec::Resources
31
+ class Yum < Inspec.resource(1)
32
+ name 'yum'
33
+ supports platform: 'unix'
34
+ desc 'Use the yum InSpec audit resource to test the configuration of Yum repositories.'
35
+ example "
36
+ describe yum.repo('name') do
37
+ it { should exist }
38
+ it { should be_enabled }
39
+ end
40
+ "
41
+
42
+ # returns all repositories
43
+ # works as following:
44
+ # search for Repo-id
45
+ # parse data in hashmap
46
+ # store data in object
47
+ # until \n
48
+ def repositories
49
+ return @cache if defined?(@cache)
50
+ # parse the repository data from yum
51
+ # we cannot use -C, because this is not reliable and may lead to errors
52
+ @command_result = inspec.command('yum -v repolist all')
53
+ @content = @command_result.stdout
54
+ @cache = []
55
+ repo = {}
56
+ in_repo = false
57
+ @content.each_line do |line|
58
+ # detect repo start
59
+ in_repo = true if line =~ /^\s*Repo-id\s*:\s*(.*)\b/
60
+ # detect repo end
61
+ if line == "\n" && in_repo
62
+ in_repo = false
63
+ @cache.push(repo)
64
+ repo = {}
65
+ end
66
+ # parse repo content
67
+ if in_repo == true
68
+ val = /^\s*([^:]*?)\s*:\s*(.*?)\s*$/.match(line)
69
+ repo[repo_key(strip(val[1]))] = strip(val[2])
70
+ end
71
+ end
72
+ @cache
73
+ end
74
+
75
+ def repos
76
+ repositories.map { |repo| repo['id'] }
77
+ end
78
+
79
+ def repo(repo)
80
+ YumRepo.new(self, repo)
81
+ end
82
+
83
+ # alias for yum.repo('reponame')
84
+ def method_missing(name)
85
+ repo(name.to_s) if !name.nil?
86
+ end
87
+
88
+ def to_s
89
+ 'Yum Repository'
90
+ end
91
+
92
+ private
93
+
94
+ # Removes lefthand and righthand whitespace
95
+ def strip(value)
96
+ value&.strip
97
+ end
98
+
99
+ # Optimize the key value
100
+ def repo_key(key)
101
+ return key if key.nil?
102
+ key.gsub('Repo-', '').downcase
103
+ end
104
+ end
105
+
106
+ class YumRepo
107
+ def initialize(yum, reponame)
108
+ @yum = yum
109
+ @reponame = reponame
110
+ end
111
+
112
+ # extracts the shortname from a repo id
113
+ # e.g. extras/7/x86_64 -> extras
114
+ def shortname(id)
115
+ val = %r{^\s*([^/]*?)/(.*?)\s*$}.match(id)
116
+ val.nil? ? nil : val[1]
117
+ end
118
+
119
+ def info
120
+ return @cache if defined?(@cache)
121
+ selection = @yum.repositories.select { |e| e['id'] == @reponame || shortname(e['id']) == @reponame }
122
+ @cache = selection.empty? ? {} : selection.first
123
+ @cache
124
+ end
125
+
126
+ def exist?
127
+ !info.empty?
128
+ end
129
+
130
+ def enabled?
131
+ return false unless exist?
132
+ info['status'] == 'enabled'
133
+ end
134
+
135
+ # provide a method for each of the repo metadata items we know about
136
+ [
137
+ :baseurl,
138
+ :expire,
139
+ :filename,
140
+ :mirrors,
141
+ :pkgs,
142
+ :size,
143
+ :status,
144
+ :updated,
145
+ ].each do |key|
146
+ define_method key do
147
+ info[key.to_s]
148
+ end
149
+ end
150
+
151
+ def to_s
152
+ "YumRepo #{@reponame}"
153
+ end
154
+ end
155
+
156
+ # for compatability with serverspec
157
+ # this is deprecated syntax and will be removed in future versions
158
+ class YumRepoLegacy < Yum
159
+ name 'yumrepo'
160
+
161
+ def initialize(name)
162
+ super()
163
+ @repository = repo(name)
164
+ end
165
+
166
+ def exists?
167
+ deprecated
168
+ @repository.exist?
169
+ end
170
+
171
+ def enabled?
172
+ deprecated
173
+ @repository.enabled?
174
+ end
175
+
176
+ def deprecated
177
+ warn '[DEPRECATION] `yumrepo(reponame)` is deprecated. Please use `yum.repo(reponame)` instead.'
178
+ end
179
+ end
180
+ end