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,127 @@
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ require 'utils/simpleconfig'
5
+ require 'utils/find_files'
6
+ require 'utils/file_reader'
7
+ require 'utils/hash'
8
+ require 'resources/mysql'
9
+
10
+ module Inspec::Resources
11
+ class MysqlConfEntry
12
+ def initialize(path, params)
13
+ @params = params
14
+ @path = path
15
+ end
16
+
17
+ def method_missing(name, *_)
18
+ k = name.to_s
19
+ res = @params[k]
20
+ return true if res.nil? && @params.key?(k)
21
+ @params[k]
22
+ end
23
+
24
+ def to_s
25
+ "MySQL Config entry [#{@path.join(' ')}]"
26
+ end
27
+ end
28
+
29
+ class MysqlConf < Inspec.resource(1)
30
+ name 'mysql_conf'
31
+ supports platform: 'unix'
32
+ supports platform: 'windows'
33
+ desc 'Use the mysql_conf InSpec audit resource to test the contents of the configuration file for MySQL, typically located at /etc/mysql/my.cnf or /etc/my.cnf.'
34
+ example "
35
+ describe mysql_conf('path') do
36
+ its('setting') { should eq 'value' }
37
+ end
38
+
39
+ # Test a parameter set within the [mysqld] section
40
+ describe mysql_conf do
41
+ its('mysqld.port') { should cmp 3306 }
42
+ end
43
+
44
+ # Test a parameter set within the [mariadb] section using array notation
45
+ describe mysql_conf do
46
+ its(['mariadb', 'max-connections']) { should_not be_nil }
47
+ end
48
+ "
49
+
50
+ include FindFiles
51
+ include FileReader
52
+
53
+ def initialize(conf_path = nil)
54
+ @conf_path = conf_path || inspec.mysql.conf_path
55
+ @files_contents = {}
56
+ @content = nil
57
+ @params = nil
58
+ read_content
59
+ end
60
+
61
+ def content
62
+ @content ||= read_content
63
+ end
64
+
65
+ def params(*opts)
66
+ @params || read_content
67
+ res = @params
68
+ opts.each do |opt|
69
+ res = res[opt] unless res.nil?
70
+ end
71
+ MysqlConfEntry.new(opts, res)
72
+ end
73
+
74
+ def method_missing(name)
75
+ @params || read_content
76
+ @params[name.to_s]
77
+ end
78
+
79
+ def read_content
80
+ @content = ''
81
+ @params = {}
82
+
83
+ to_read = [@conf_path]
84
+ until to_read.empty?
85
+ cur_file = to_read[0]
86
+ raw_conf = read_file(cur_file)
87
+ @content += raw_conf
88
+
89
+ params = SimpleConfig.new(raw_conf).params
90
+ @params = @params.deep_merge(params)
91
+
92
+ to_read = to_read.drop(1)
93
+ # see if there is more stuff to include
94
+
95
+ dir = File.dirname(cur_file)
96
+ to_read += include_files(dir, raw_conf).find_all do |fp|
97
+ not @files_contents.key? fp
98
+ end
99
+ end
100
+ #
101
+ @content
102
+ end
103
+
104
+ def include_files(reldir, conf)
105
+ files = conf.scan(/^!include\s+(.*)\s*/).flatten.compact.map { |x| abs_path(reldir, x) }
106
+ dirs = conf.scan(/^!includedir\s+(.*)\s*/).flatten.compact.map { |x| abs_path(reldir, x) }
107
+ dirs.map do |dir|
108
+ # @TODO: non local glob
109
+ files += find_files(dir, depth: 1, type: 'file')
110
+ end
111
+ files
112
+ end
113
+
114
+ def abs_path(dir, f)
115
+ return f if f.start_with? '/'
116
+ File.join(dir, f)
117
+ end
118
+
119
+ def read_file(path)
120
+ @files_contents[path] ||= read_file_content(path)
121
+ end
122
+
123
+ def to_s
124
+ 'MySQL Configuration'
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ require 'shellwords'
5
+
6
+ module Inspec::Resources
7
+ class MysqlSession < Inspec.resource(1)
8
+ name 'mysql_session'
9
+ supports platform: 'unix'
10
+ supports platform: 'windows'
11
+ desc 'Use the mysql_session InSpec audit resource to test SQL commands run against a MySQL database.'
12
+ example "
13
+ sql = mysql_session('my_user','password','host')
14
+ describe sql.query('show databases like \'test\';') do
15
+ its('stdout') { should_not match(/test/) }
16
+ end
17
+ "
18
+
19
+ def initialize(user = nil, pass = nil, host = 'localhost', port = nil, socket = nil)
20
+ @user = user
21
+ @pass = pass
22
+ @host = host
23
+ @port = port
24
+ @socket = socket
25
+ init_fallback if user.nil? or pass.nil?
26
+ skip_resource("Can't run MySQL SQL checks without authentication") if @user.nil? or @pass.nil?
27
+ end
28
+
29
+ def query(q, db = '')
30
+ mysql_cmd = create_mysql_cmd(q, db)
31
+ cmd = inspec.command(mysql_cmd)
32
+ out = cmd.stdout + "\n" + cmd.stderr
33
+ if out =~ /Can't connect to .* MySQL server/ || out.downcase =~ /^error/
34
+ # skip this test if the server can't run the query
35
+ warn("Can't connect to MySQL instance for SQL checks.")
36
+ end
37
+
38
+ # return the raw command output
39
+ cmd
40
+ end
41
+
42
+ def to_s
43
+ 'MySQL Session'
44
+ end
45
+
46
+ private
47
+
48
+ def escape_string(query)
49
+ Shellwords.escape(query)
50
+ end
51
+
52
+ def create_mysql_cmd(q, db = '')
53
+ # TODO: simple escape, must be handled by a library
54
+ # that does this securely
55
+ escaped_query = q.gsub(/\\/, '\\\\').gsub(/"/, '\\"').gsub(/\$/, '\\$')
56
+
57
+ # construct the query
58
+ command = 'mysql'
59
+ command += " -u#{escape_string(@user)}" unless @user.nil?
60
+ command += " -p#{escape_string(@pass)}" unless @pass.nil?
61
+
62
+ if !@socket.nil?
63
+ command += " -S #{@socket}"
64
+ else
65
+ command += " -h #{@host}"
66
+ end
67
+ command += " --port #{@port}" unless @port.nil?
68
+ command += " #{db}" unless db.empty?
69
+ command += %{ -s -e "#{escaped_query}"}
70
+ command
71
+ end
72
+
73
+ def init_fallback
74
+ # support debian mysql administration login
75
+ debian = inspec.command('test -f /etc/mysql/debian.cnf && cat /etc/mysql/debian.cnf').stdout
76
+ return if debian.empty?
77
+
78
+ user = debian.match(/^\s*user\s*=\s*([^ ]*)\s*$/)
79
+ pass = debian.match(/^\s*password\s*=\s*([^ ]*)\s*$/)
80
+ return if user.nil? or pass.nil?
81
+ @user = user[1]
82
+ @pass = pass[1]
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pathname'
4
+ require 'hashie/mash'
5
+
6
+ module Inspec::Resources
7
+ class Nginx < Inspec.resource(1)
8
+ name 'nginx'
9
+ supports platform: 'unix'
10
+ desc 'Use the nginx InSpec audit resource to test information about your NGINX instance.'
11
+ example "
12
+ describe nginx do
13
+ its('conf_path') { should cmp '/etc/nginx/nginx.conf' }
14
+ end
15
+ describe nginx('/etc/sbin/') do
16
+ its('version') { should be >= '1.0.0' }
17
+ end
18
+ describe nginx do
19
+ its('modules') { should include 'my_module' }
20
+ end
21
+ "
22
+ attr_reader :params, :bin_dir
23
+
24
+ def initialize(nginx_path = '/usr/sbin/nginx')
25
+ return skip_resource 'The `nginx` resource is not yet available on your OS.' if inspec.os.windows?
26
+ return skip_resource 'The `nginx` binary not found in the path provided.' unless inspec.command(nginx_path).exist?
27
+
28
+ cmd = inspec.command("#{nginx_path} -V 2>&1")
29
+ if !cmd.exit_status.zero?
30
+ return skip_resource 'Error using the command nginx -V'
31
+ end
32
+ @data = cmd.stdout
33
+ @params = {}
34
+ read_content
35
+ end
36
+
37
+ %w{error_log_path http_client_body_temp_path http_fastcgi_temp_path http_log_path http_proxy_temp_path http_scgi_temp_path http_uwsgi_temp_path lock_path modules_path prefix sbin_path service version}.each do |property|
38
+ define_method(property.to_sym) do
39
+ @params[property.to_sym]
40
+ end
41
+ end
42
+
43
+ def openssl_version
44
+ result = @data.scan(/built with OpenSSL\s(\S+)\s(\d+\s\S+\s\d{4})/).flatten
45
+ Hashie::Mash.new({ 'version' => result[0], 'date' => result[1] })
46
+ end
47
+
48
+ def compiler_info
49
+ result = @data.scan(/built by (\S+)\s(\S+)\s(\S+)/).flatten
50
+ Hashie::Mash.new({ 'compiler' => result[0], 'version' => result[1], 'date' => result[2] })
51
+ end
52
+
53
+ def support_info
54
+ support_info = @data.scan(/(.*\S+) support enabled/).flatten
55
+ support_info.empty? ? nil : support_info.join(' ')
56
+ end
57
+
58
+ def modules
59
+ @data.scan(/--with-(\S+)_module/).flatten
60
+ end
61
+
62
+ def to_s
63
+ 'Nginx Environment'
64
+ end
65
+
66
+ private
67
+
68
+ def read_content
69
+ parse_config
70
+ parse_path
71
+ parse_http_path
72
+ end
73
+
74
+ def parse_config
75
+ @params[:prefix] = @data.scan(/--prefix=(\S+)\s/).flatten.first
76
+ @params[:service] = 'nginx'
77
+ @params[:version] = @data.scan(%r{nginx version: nginx\/(\S+)\s}).flatten.first
78
+ end
79
+
80
+ def parse_path
81
+ @params[:sbin_path] = @data.scan(/--sbin-path=(\S+)\s/).flatten.first
82
+ @params[:modules_path] = @data.scan(/--modules-path=(\S+)\s/).flatten.first
83
+ @params[:error_log_path] = @data.scan(/--error-log-path=(\S+)\s/).flatten.first
84
+ @params[:http_log_path] = @data.scan(/--http-log-path=(\S+)\s/).flatten.first
85
+ @params[:lock_path] = @data.scan(/--lock-path=(\S+)\s/).flatten.first
86
+ end
87
+
88
+ def parse_http_path
89
+ @params[:http_client_body_temp_path] = @data.scan(/--http-client-body-temp-path=(\S+)\s/).flatten.first
90
+ @params[:http_proxy_temp_path] = @data.scan(/--http-proxy-temp-path=(\S+)\s/).flatten.first
91
+ @params[:http_fastcgi_temp_path] = @data.scan(/--http-fastcgi-temp-path=(\S+)\s/).flatten.first
92
+ @params[:http_uwsgi_temp_path] = @data.scan(/--http-uwsgi-temp-path=(\S+)\s/).flatten.first
93
+ @params[:http_scgi_temp_path] = @data.scan(/--http-scgi-temp-path=(\S+)\s/).flatten.first
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,226 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/nginx_parser'
4
+ require 'utils/find_files'
5
+ require 'utils/file_reader'
6
+ require 'forwardable'
7
+
8
+ # STABILITY: Experimental
9
+ # This resouce needs a proper interace to the underlying data, which is currently missing.
10
+ # Until it is added, we will keep it experimental.
11
+ #
12
+ # TODO: Support it on Windows. To do so, we need to recognize the base os and how
13
+ # it combines the file path. Calling `File.join` or similar methods may lead to errors
14
+ # when running remotely.
15
+ module Inspec::Resources
16
+ class NginxConf < Inspec.resource(1)
17
+ name 'nginx_conf'
18
+ supports platform: 'unix'
19
+ desc 'Use the nginx_conf InSpec resource to test configuration data '\
20
+ 'for the NginX web server located in /etc/nginx/nginx.conf on '\
21
+ 'Linux and UNIX platforms.'
22
+ example "
23
+ describe nginx_conf.params ...
24
+ describe nginx_conf('/path/to/my/nginx.conf').params ...
25
+ "
26
+
27
+ extend Forwardable
28
+
29
+ include FindFiles
30
+ include FileReader
31
+
32
+ attr_reader :contents
33
+
34
+ def initialize(conf_path = nil)
35
+ @conf_path = conf_path || '/etc/nginx/nginx.conf'
36
+ @contents = {}
37
+ return skip_resource 'The `nginx_conf` resource is currently not supported on Windows.' if inspec.os.windows?
38
+ read_content(@conf_path)
39
+ end
40
+
41
+ def params
42
+ @params ||= parse_nginx(@conf_path)
43
+ rescue StandardError => e
44
+ skip_resource e.message
45
+ @params = {}
46
+ end
47
+
48
+ def http
49
+ NginxConfHttp.new(params['http'], self)
50
+ end
51
+
52
+ def_delegators :http, :servers, :locations
53
+
54
+ def to_s
55
+ "nginx_conf #{@conf_path}"
56
+ end
57
+
58
+ private
59
+
60
+ def read_content(path)
61
+ return @contents[path] if @contents.key?(path)
62
+ @contents[path] = read_file_content(path, allow_empty: true)
63
+ end
64
+
65
+ def parse_nginx(path)
66
+ return nil if inspec.os.windows?
67
+ content = read_content(path)
68
+ data = NginxConfig.parse(content)
69
+ resolve_references(data, File.dirname(path))
70
+ rescue StandardError => _
71
+ raise "Cannot parse NginX config in #{path}."
72
+ end
73
+
74
+ # Cycle through the complete parsed data structure and try to find any
75
+ # calls to `include`. In NginX, this is used to embed data from other
76
+ # files into the current data structure.
77
+ #
78
+ # The method steps through the object structure that is passed in to
79
+ # find any calls to 'include' and returns the object structure with the
80
+ # included data merged in.
81
+ #
82
+ # @param data [Hash] data structure from NginxConfig.parse
83
+ # @param rel_path [String] the relative path from which this config is read
84
+ # @return [Hash] data structure with references included
85
+ def resolve_references(data, rel_path)
86
+ # Walk through all array entries to find more references
87
+ return data.map { |x| resolve_references(x, rel_path) } if data.is_a?(Array)
88
+
89
+ # Return any data that we cannot step into to find more `include` calls
90
+ return data unless data.is_a?(Hash)
91
+
92
+ # Any call to `include` gets its data read, parsed, and merged back
93
+ # into the current data structure
94
+ if data.key?('include')
95
+ data.delete('include').flatten
96
+ .map { |x| File.expand_path(x, rel_path) }
97
+ .map { |x| find_files(x) }.flatten
98
+ .map { |path| parse_nginx(path) }
99
+ .each { |conf| merge_config!(data, conf) }
100
+ end
101
+
102
+ # Walk through the remaining hash fields to find more references
103
+ Hash[data.map { |k, v| [k, resolve_references(v, rel_path)] }]
104
+ end
105
+
106
+ # Deep merge fields from NginxConfig.parse.
107
+ # A regular merge would overwrite values so a deep merge is needed.
108
+ # @param data [Hash] data structure from NginxConfig.parse
109
+ # @param conf [Hash] data structure to be deep merged into data
110
+ # @return [Hash] data structure with conf and data deep merged
111
+ def merge_config!(data, conf)
112
+ # Catch edge-cases
113
+ return if data.nil? || conf.nil?
114
+ # Step through all conf items and create combined return value
115
+ data.merge!(conf) do |_, v1, v2|
116
+ if v1.is_a?(Array) && v2.is_a?(Array)
117
+ # If both the data field and the conf field are arrays, then combine them
118
+ v1 + v2
119
+ elsif v1.is_a?(Hash) && v2.is_a?(Hash)
120
+ # If both the data field and the conf field are maps, then deep merge them
121
+ merge_config!(v1, v2)
122
+ else
123
+ # All other cases, just use the new value (regular merge behavior)
124
+ v2
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ class NginxConfHttp
131
+ attr_reader :entries
132
+ def initialize(params, parent)
133
+ @parent = parent
134
+ @entries = (params || []).map { |x| NginxConfHttpEntry.new(x, parent) }
135
+ end
136
+
137
+ def servers
138
+ @entries.map(&:servers).flatten
139
+ end
140
+
141
+ def locations
142
+ servers.map(&:locations).flatten
143
+ end
144
+
145
+ def to_s
146
+ @parent.to_s + ', http entries'
147
+ end
148
+ alias inspect to_s
149
+ end
150
+
151
+ class NginxConfHttpEntry
152
+ attr_reader :params, :parent
153
+ def initialize(params, parent)
154
+ @params = params || {}
155
+ @parent = parent
156
+ end
157
+
158
+ filter = FilterTable.create
159
+ filter.add_accessor(:where)
160
+ .add(:servers, field: 'server')
161
+ .connect(self, :server_table)
162
+
163
+ def locations
164
+ servers.map(&:locations).flatten
165
+ end
166
+
167
+ def to_s
168
+ @parent.to_s + ', http entry'
169
+ end
170
+ alias inspect to_s
171
+
172
+ private
173
+
174
+ def server_table
175
+ @server_table ||= (params['server'] || []).map { |x| { 'server' => NginxConfServer.new(x, self) } }
176
+ end
177
+ end
178
+
179
+ class NginxConfServer
180
+ attr_reader :params, :parent
181
+ def initialize(params, parent)
182
+ @parent = parent
183
+ @params = params || {}
184
+ end
185
+
186
+ filter = FilterTable.create
187
+ filter.add_accessor(:where)
188
+ .add(:locations, field: 'location')
189
+ .connect(self, :location_table)
190
+
191
+ def to_s
192
+ server = ''
193
+ name = Array(params['server_name']).flatten.first
194
+ unless name.nil?
195
+ server += name
196
+ listen = Array(params['listen']).flatten.first
197
+ server += ":#{listen}" unless listen.nil?
198
+ end
199
+
200
+ # go two levels up: 1. to the http entry and 2. to the root nginx conf
201
+ @parent.parent.to_s + ", server #{server}"
202
+ end
203
+ alias inspect to_s
204
+
205
+ private
206
+
207
+ def location_table
208
+ @location_table ||= (params['location'] || []).map { |x| { 'location' => NginxConfLocation.new(x, self) } }
209
+ end
210
+ end
211
+
212
+ class NginxConfLocation
213
+ attr_reader :params, :parent
214
+ def initialize(params, parent)
215
+ @parent = parent
216
+ @params = params || {}
217
+ end
218
+
219
+ def to_s
220
+ location = Array(params['_']).join(' ')
221
+ # go three levels up: 1. to the server entry, 2. http entry and 3. to the root nginx conf
222
+ @parent.parent.parent.to_s + ", location #{location.inspect}"
223
+ end
224
+ alias inspect to_s
225
+ end
226
+ end