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,57 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright 2017, Christoph Hartmann
4
+ #
5
+ # author: Christoph Hartmann
6
+ # author: Patrick Muench
7
+ # author: Dominik Richter
8
+ # author: Matt Kulka
9
+
10
+ module Inspec::Resources::DockerObject
11
+ def exist?
12
+ object_info.exists?
13
+ end
14
+
15
+ def id
16
+ object_info.ids[0] if object_info.entries.size == 1
17
+ end
18
+
19
+ private
20
+
21
+ def parse_components_from_image(image_string)
22
+ # if the user did not supply an image string, they likely supplied individual
23
+ # option parameters, such as repo and tag. Return empty data back to the caller.
24
+ return {} if image_string.nil?
25
+
26
+ first_colon = image_string.index(':') || -1
27
+ first_slash = image_string.index('/') || -1
28
+
29
+ if image_string.count(':') == 2
30
+ # If there are two colons in the image string, it contains a repo-with-port and a tag.
31
+ # example: localhost:5000/chef/inspec:1.46.3
32
+ partitioned_string = image_string.rpartition(':')
33
+ repo = partitioned_string.first
34
+ tag = partitioned_string.last
35
+ image_name = repo.split('/')[1..-1].join
36
+ elsif image_string.count(':') == 1 && first_colon < first_slash
37
+ # If there's one colon in the image string, and it comes before a forward-slash,
38
+ # it contains a repo-with-port but no tag.
39
+ # example: localhost:5000/ubuntu
40
+ repo = image_string
41
+ tag = nil
42
+ image_name = repo.split('/')[1..-1].join
43
+ else
44
+ # If there's one colon in the image string and it doesn't preceed a slash, or if
45
+ # there is no colon at all, then it separates the repo from the tag, if there is a tag.
46
+ # example: chef/inspec:1.46.3
47
+ # example: chef/inspec
48
+ # example: ubuntu:14.04
49
+ repo, tag = image_string.split(':')
50
+ image_name = repo
51
+ end
52
+
53
+ # return the repo, image_name and tag parsed from the string, which can be merged into
54
+ # the rest of the user-supplied options
55
+ { repo: repo, image_name: image_name, tag: tag }
56
+ end
57
+ end
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright 2017, Christoph Hartmann
4
+
5
+ require_relative 'docker_object'
6
+
7
+ module Inspec::Resources
8
+ class DockerService < Inspec.resource(1)
9
+ include Inspec::Resources::DockerObject
10
+
11
+ name 'docker_service'
12
+ supports platform: 'unix'
13
+ desc 'Swarm-mode service'
14
+ example "
15
+ describe docker_service('service1') do
16
+ it { should exist }
17
+ its('id') { should_not eq '' }
18
+ its('image') { should eq 'alpine:latest' }
19
+ its('repo') { should eq 'alpine' }
20
+ its('tag') { should eq 'latest' }
21
+ end
22
+
23
+ describe docker_service(id: '4a415e366388') do
24
+ it { should exist }
25
+ end
26
+
27
+ describe docker_service(image: 'alpine:latest') do
28
+ it { should exist }
29
+ end
30
+ "
31
+
32
+ def initialize(opts = {})
33
+ # do sanitizion of input values
34
+ o = opts.dup
35
+ o = { name: opts } if opts.is_a?(String)
36
+ @opts = sanitize_options(o)
37
+ end
38
+
39
+ def name
40
+ object_info.names[0] if object_info.entries.size == 1
41
+ end
42
+
43
+ def image
44
+ object_info.images[0] if object_info.entries.size == 1
45
+ end
46
+
47
+ def image_name
48
+ parse_components_from_image(image)[:image_name] if object_info.entries.size == 1
49
+ end
50
+
51
+ def repo
52
+ parse_components_from_image(image)[:repo] if object_info.entries.size == 1
53
+ end
54
+
55
+ def tag
56
+ parse_components_from_image(image)[:tag] if object_info.entries.size == 1
57
+ end
58
+
59
+ def mode
60
+ object_info.modes[0] if object_info.entries.size == 1
61
+ end
62
+
63
+ def replicas
64
+ object_info.replicas[0] if object_info.entries.size == 1
65
+ end
66
+
67
+ def ports
68
+ object_info.ports[0] if object_info.entries.size == 1
69
+ end
70
+
71
+ def to_s
72
+ service = @opts[:name] || @opts[:id]
73
+ "Docker Service #{service}"
74
+ end
75
+
76
+ private
77
+
78
+ def sanitize_options(opts)
79
+ opts.merge(parse_components_from_image(opts[:image]))
80
+ end
81
+
82
+ def object_info
83
+ return @info if defined?(@info)
84
+ opts = @opts
85
+ @info = inspec.docker.services.where {
86
+ name == opts[:name] || image == opts[:image] || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id])))
87
+ }
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,169 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/filter'
4
+ require 'hashie/mash'
5
+ require 'resources/package'
6
+
7
+ module Inspec::Resources
8
+ class Elasticsearch < Inspec.resource(1)
9
+ name 'elasticsearch'
10
+ supports platform: 'unix'
11
+ desc "Use the Elasticsearch InSpec audit resource to test the status of nodes in
12
+ an Elasticsearch cluster."
13
+
14
+ example "
15
+ describe elasticsearch('http://eshost.mycompany.biz:9200/', username: 'elastic', password: 'changeme', ssl_verify: false) do
16
+ its('node_count') { should >= 3 }
17
+ end
18
+
19
+ describe elasticsearch do
20
+ its('node_name') { should include 'node1' }
21
+ its('os') { should_not include 'MacOS' }
22
+ its('version') { should cmp > 1.2.0 }
23
+ end
24
+ "
25
+
26
+ filter = FilterTable.create
27
+ filter.add_accessor(:where)
28
+ .add_accessor(:entries)
29
+ .add(:cluster_name, field: 'cluster_name')
30
+ .add(:node_name, field: 'name')
31
+ .add(:transport_address, field: 'transport_address')
32
+ .add(:host, field: 'host')
33
+ .add(:ip, field: 'ip')
34
+ .add(:version, field: 'version')
35
+ .add(:build_hash, field: 'build_hash')
36
+ .add(:total_indexing_buffer, field: 'total_indexing_buffer')
37
+ .add(:roles, field: 'roles')
38
+ .add(:settings, field: 'settings')
39
+ .add(:os, field: 'os')
40
+ .add(:process, field: 'process')
41
+ .add(:jvm, field: 'jvm')
42
+ .add(:transport, field: 'transport')
43
+ .add(:http, field: 'http')
44
+ .add(:plugins, field: 'plugins')
45
+ .add(:plugin_list, field: 'plugin_list')
46
+ .add(:modules, field: 'modules')
47
+ .add(:module_list, field: 'module_list')
48
+ .add(:node_id, field: 'node_id')
49
+ .add(:ingest, field: 'ingest')
50
+ .add(:exists?) { |x| !x.entries.empty? }
51
+ .add(:node_count) { |t, _|
52
+ t.entries.length
53
+ }
54
+
55
+ filter.connect(self, :nodes)
56
+
57
+ attr_reader :nodes, :url
58
+
59
+ def initialize(opts = {})
60
+ return skip_resource 'Package `curl` not avaiable on the host' unless inspec.command('curl').exist?
61
+
62
+ @url = opts.fetch(:url, 'http://localhost:9200')
63
+
64
+ username = opts.fetch(:username, nil)
65
+ password = opts.fetch(:password, nil)
66
+ ssl_verify = opts.fetch(:ssl_verify, true)
67
+
68
+ cmd = inspec.command(curl_command_string(username, password, ssl_verify))
69
+
70
+ # after implementation of PR #2235, this begin..rescue won't be necessary.
71
+ # The checks in verify_curl_success! can raise their own skip message exception.
72
+ begin
73
+ verify_curl_success!(cmd)
74
+ rescue => e
75
+ return skip_resource e.message
76
+ end
77
+
78
+ begin
79
+ content = JSON.parse(cmd.stdout)
80
+ # after implementation of PR #2235, this can be broken out of the begin..rescue
81
+ # clause. The checks in verify_json_payload! can raise their own skip message exception.
82
+ verify_json_payload!(content)
83
+ rescue JSON::ParserError => e
84
+ return skip_resource "Couldn't parse the Elasticsearch response: #{e.message}"
85
+ rescue => e
86
+ return skip_resource e.message
87
+ end
88
+
89
+ @nodes = parse_cluster(content)
90
+ end
91
+
92
+ def to_s
93
+ "Elasticsearch Cluster #{url}"
94
+ end
95
+
96
+ private
97
+
98
+ def parse_cluster(content)
99
+ return [] unless content['nodes']
100
+
101
+ nodes = []
102
+
103
+ content['nodes'].each do |node_id, node_data|
104
+ node_data = fix_mash_key_collision(node_data)
105
+
106
+ node = Hashie::Mash.new(node_data)
107
+ node.node_id = node_id
108
+ node.plugin_list = node.plugins.map(&:name)
109
+ node.module_list = node.modules.map(&:name)
110
+ node.cluster_name = node.settings.cluster.name
111
+ nodes << node
112
+ end
113
+
114
+ nodes
115
+ end
116
+
117
+ #
118
+ # Hashie::Mash will throw warnings if the Mash contains a key that is the same as a built-in
119
+ # method on a Hashie::Mash instance. This is a crude way of avoiding those warnings without
120
+ # hard-coding a bunch of key renames.
121
+ #
122
+ # Any key that is in conflict will be renamed "es_ORIGINALKEY"
123
+ #
124
+ def fix_mash_key_collision(data)
125
+ test_mash = Hashie::Mash.new
126
+
127
+ new_data = {}
128
+ data.each do |key, value|
129
+ new_key = test_mash.respond_to?(key.to_sym) ? "es_#{key}" : key
130
+ new_value = value.is_a?(Hash) ? fix_mash_key_collision(value) : value
131
+
132
+ new_data[new_key] = new_value
133
+ end
134
+
135
+ new_data
136
+ end
137
+
138
+ def curl_command_string(username, password, ssl_verify)
139
+ cmd_string = ['curl']
140
+ cmd_string << '-k' unless ssl_verify
141
+ cmd_string << "-H 'Content-Type: application/json'"
142
+ cmd_string << " -u #{username}:#{password}" unless username.nil? || password.nil?
143
+ cmd_string << URI.join(url, '_nodes')
144
+
145
+ cmd_string.join(' ')
146
+ end
147
+
148
+ def verify_curl_success!(cmd)
149
+ # the following lines captures known possible curl command errors and provides compact skip resource messeges
150
+ if cmd.stderr =~ /Failed to connect/
151
+ raise "Connection refused - please check the URL #{url} for accuracy"
152
+ end
153
+
154
+ if cmd.stderr =~ /Peer's Certificate issuer is not recognized/
155
+ raise 'Connection refused - peer certificate issuer is not recognized'
156
+ end
157
+
158
+ raise "Error fetching Elastcsearch data from curl #{url}: #{cmd.stderr}" unless cmd.exit_status.zero?
159
+ end
160
+
161
+ def verify_json_payload!(content)
162
+ unless content['error'].nil?
163
+ raise "#{content['error']['type']}: #{content['error']['reason']}"
164
+ end
165
+
166
+ raise 'No successful nodes available in cluster' if content['_nodes']['successful'].zero?
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,94 @@
1
+ # encoding: utf-8
2
+ # copyright:
3
+
4
+ require 'utils/parser'
5
+ require 'utils/file_reader'
6
+
7
+ module Inspec::Resources
8
+ class EtcFstab < Inspec.resource(1)
9
+ name 'etc_fstab'
10
+ supports platform: 'unix'
11
+ desc 'Use the etc_fstab InSpec audit resource to check the configuration of the etc/fstab file.'
12
+ example "
13
+ nfs_systems = etc_fstab.nfs_file_systems.entries
14
+ nfs_systems.each do |file_system|
15
+ describe file_system do
16
+ its ('mount_options') { should include 'nosuid' }
17
+ its ('mount_options') { should include 'noexec' }
18
+ its ('mount_options') { should include 'sec=krb5:krb5i:krb5p }
19
+ end
20
+ end
21
+
22
+ describe etc_fstab do
23
+ its ('home_mount_options') { should include 'nosuid' }
24
+ end
25
+ "
26
+
27
+ attr_reader :params
28
+
29
+ include CommentParser
30
+ include FileReader
31
+
32
+ def initialize(fstab_path = nil)
33
+ @conf_path = fstab_path || '/etc/fstab'
34
+ @files_contents = {}
35
+ @content = nil
36
+ @params = nil
37
+ read_content
38
+ end
39
+
40
+ filter = FilterTable.create
41
+ filter.add_accessor(:where)
42
+ .add_accessor(:entries)
43
+ .add(:device_name, field: 'device_name')
44
+ .add(:mount_point, field: 'mount_point')
45
+ .add(:file_system_type, field: 'file_system_type')
46
+ .add(:mount_options, field: 'mount_options')
47
+ .add(:dump_options, field: 'dump_options')
48
+ .add(:file_system_options, field: 'file_system_options')
49
+ .add(:configured?) { |x| x.entries.any? }
50
+
51
+ filter.connect(self, :params)
52
+
53
+ def nfs_file_systems
54
+ where { file_system_type.match(/nfs/) }
55
+ end
56
+
57
+ def home_mount_options
58
+ return nil unless where { mount_point == '/home' }.configured?
59
+ where { mount_point == '/home' }.entries[0].mount_options
60
+ end
61
+
62
+ private
63
+
64
+ def read_content
65
+ @content = ''
66
+ @params = {}
67
+ @content = read_file(@conf_path)
68
+ @params = parse_conf(@content)
69
+ end
70
+
71
+ def parse_conf(content)
72
+ content.map do |line|
73
+ data, = parse_comment_line(line, comment_char: '#', standalone_comments: false)
74
+ parse_line(data) unless data == ''
75
+ end.compact
76
+ end
77
+
78
+ def parse_line(line)
79
+ attributes = line.split
80
+ {
81
+ 'device_name' => attributes[0],
82
+ 'mount_point' => attributes[1],
83
+ 'file_system_type' => attributes[2],
84
+ 'mount_options' => attributes[3].split(','),
85
+ 'dump_options' => attributes[4].to_i,
86
+ 'file_system_options' => attributes[5].to_i,
87
+ }
88
+ end
89
+
90
+ def read_file(conf_path = @conf_path)
91
+ read_file_content(conf_path).lines
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,154 @@
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ # The file format consists of
5
+ # - group name
6
+ # - password - group's encrypted password
7
+ # - gid - group's decimal ID
8
+ # - member list - group members, comma seperated list
9
+ #
10
+ # Usage:
11
+ # describe etc_group do
12
+ # its('gids') { should_not contain_duplicates }
13
+ # its('groups') { should include 'my_user' }
14
+ # its('users') { should include 'my_user' }
15
+ # end
16
+ #
17
+ # describe etc_group.where(name: 'my_group') do
18
+ # its('users') { should include 'my_user' }
19
+ # end
20
+
21
+ require 'utils/convert'
22
+ require 'utils/parser'
23
+ require 'utils/file_reader'
24
+
25
+ module Inspec::Resources
26
+ class EtcGroup < Inspec.resource(1)
27
+ include Converter
28
+ include CommentParser
29
+
30
+ name 'etc_group'
31
+ supports platform: 'unix'
32
+ desc 'Use the etc_group InSpec audit resource to test groups that are defined on Linux and UNIX platforms. The /etc/group file stores details about each group---group name, password, group identifier, along with a comma-separate list of users that belong to the group.'
33
+ example "
34
+ describe etc_group do
35
+ its('gids') { should_not contain_duplicates }
36
+ its('groups') { should include 'my_user' }
37
+ its('users') { should include 'my_user' }
38
+ end
39
+ "
40
+
41
+ include FileReader
42
+
43
+ attr_accessor :gid, :entries
44
+ def initialize(path = nil)
45
+ @path = path || '/etc/group'
46
+ @entries = parse_group(@path)
47
+ end
48
+
49
+ def groups(filter = nil)
50
+ (filter || @entries)&.map { |x| x['name'] }
51
+ end
52
+
53
+ def gids(filter = nil)
54
+ (filter || @entries)&.map { |x| x['gid'] }
55
+ end
56
+
57
+ def users(filter = nil)
58
+ entries = filter || @entries
59
+ return nil if entries.nil?
60
+ # filter the user entry
61
+ res = entries.map { |x|
62
+ x['members'].split(',') if !x.nil? && !x['members'].nil?
63
+ }.flatten
64
+ # filter nil elements
65
+ res.reject { |x| x.nil? || x.empty? }
66
+ end
67
+
68
+ def where(conditions = {})
69
+ return if conditions.empty?
70
+ fields = {
71
+ name: 'name',
72
+ group_name: 'name',
73
+ password: 'password',
74
+ gid: 'gid',
75
+ group_id: 'gid',
76
+ users: 'members',
77
+ members: 'members',
78
+ }
79
+ res = entries
80
+
81
+ unless res.nil?
82
+ conditions.each do |k, v|
83
+ idx = fields[k.to_sym]
84
+ next if idx.nil?
85
+ res = res.select { |x| x[idx].to_s == v.to_s }
86
+ end
87
+ end
88
+
89
+ EtcGroupView.new(self, res)
90
+ end
91
+
92
+ def to_s
93
+ '/etc/group'
94
+ end
95
+
96
+ private
97
+
98
+ def parse_group(path)
99
+ @content = read_file_content(path, allow_empty: true)
100
+
101
+ # iterate over each line and filter comments
102
+ @content.split("\n").each_with_object([]) do |line, lines|
103
+ grp_info = parse_group_line(line)
104
+ lines.push(grp_info) if !grp_info.nil? && !grp_info.empty?
105
+ end
106
+ end
107
+
108
+ def parse_group_line(line)
109
+ opts = {
110
+ comment_char: '#',
111
+ standalone_comments: false,
112
+ }
113
+ line, _idx_nl = parse_comment_line(line, opts)
114
+ x = line.split(':')
115
+ # abort if we have an empty or comment line
116
+ return nil if x.empty?
117
+ # map data
118
+ {
119
+ 'name' => x.at(0), # Name of the group.
120
+ 'password' => x.at(1), # Group's encrypted password.
121
+ 'gid' => convert_to_i(x.at(2)), # The group's decimal ID.
122
+ 'members' => x.at(3), # Group members.
123
+ }
124
+ end
125
+ end
126
+
127
+ # object that hold a specifc view on etc group
128
+ class EtcGroupView
129
+ def initialize(parent, filter)
130
+ @parent = parent
131
+ @filter = filter
132
+ end
133
+
134
+ # returns the group object
135
+ def entries
136
+ @filter
137
+ end
138
+
139
+ # only returns group name
140
+ def groups
141
+ @parent.groups(@filter)
142
+ end
143
+
144
+ # only return gids
145
+ def gids
146
+ @parent.gids(@filter)
147
+ end
148
+
149
+ # only returns users
150
+ def users
151
+ @parent.users(@filter)
152
+ end
153
+ end
154
+ end