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,54 @@
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ require 'utils/simpleconfig'
5
+ require 'utils/file_reader'
6
+
7
+ module Inspec::Resources
8
+ class InetdConf < Inspec.resource(1)
9
+ name 'inetd_conf'
10
+ supports platform: 'unix'
11
+ desc 'Use the inetd_conf InSpec audit resource to test if a service is enabled in the inetd.conf file on Linux and UNIX platforms. inetd---the Internet service daemon---listens on dedicated ports, and then loads the appropriate program based on a request. The inetd.conf file is typically located at /etc/inetd.conf and contains a list of Internet services associated to the ports on which that service will listen. Only enabled services may handle a request; only services that are required by the system should be enabled.'
12
+ example "
13
+ describe inetd_conf do
14
+ its('shell') { should eq nil }
15
+ its('login') { should eq nil }
16
+ its('exec') { should eq nil }
17
+ end
18
+ "
19
+
20
+ include FileReader
21
+
22
+ def initialize(path = nil)
23
+ @conf_path = path || '/etc/inetd.conf'
24
+ @content = read_file_content(@conf_path)
25
+ end
26
+
27
+ # overwrite exec to ensure it works with its
28
+ # TODO: this needs to be fixed in RSpec
29
+ def exec
30
+ read_params['exec']
31
+ end
32
+
33
+ def method_missing(name)
34
+ read_params[name.to_s]
35
+ end
36
+
37
+ def read_params
38
+ return @params if defined?(@params)
39
+
40
+ # parse the file
41
+ conf = SimpleConfig.new(
42
+ @content,
43
+ assignment_regex: /^\s*(\S+?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s*$/,
44
+ key_values: 6,
45
+ multiple_values: false,
46
+ )
47
+ @params = conf.params
48
+ end
49
+
50
+ def to_s
51
+ 'inetd.conf'
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/simpleconfig'
4
+
5
+ module Inspec::Resources
6
+ class IniConfig < JsonConfig
7
+ name 'ini'
8
+ supports platform: 'unix'
9
+ supports platform: 'windows'
10
+ desc 'Use the ini InSpec audit resource to test data in a INI file.'
11
+ example "
12
+ descibe ini do
13
+ its('auth_protocol') { should eq 'https' }
14
+ end
15
+ "
16
+ # override file load and parse hash with simple config
17
+ def parse(content)
18
+ SimpleConfig.new(content).params
19
+ end
20
+
21
+ private
22
+
23
+ # used by JsonConfig to build up a full to_s method
24
+ # based on whether a file path, content, or command was supplied.
25
+ def resource_base_name
26
+ 'INI'
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,129 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/convert'
4
+
5
+ module Inspec::Resources
6
+ class NetworkInterface < Inspec.resource(1)
7
+ name 'interface'
8
+ supports platform: 'unix'
9
+ supports platform: 'windows'
10
+ desc 'Use the interface InSpec audit resource to test basic network adapter properties, such as name, status, and link speed (in MB/sec).'
11
+ example "
12
+ describe interface('eth0') do
13
+ it { should exist }
14
+ it { should be_up }
15
+ its('speed') { should eq 1000 }
16
+ end
17
+ "
18
+ def initialize(iface)
19
+ @iface = iface
20
+
21
+ @interface_provider = nil
22
+ if inspec.os.linux?
23
+ @interface_provider = LinuxInterface.new(inspec)
24
+ elsif inspec.os.windows?
25
+ @interface_provider = WindowsInterface.new(inspec)
26
+ else
27
+ return skip_resource 'The `interface` resource is not supported on your OS yet.'
28
+ end
29
+ end
30
+
31
+ def exists?
32
+ !interface_info.nil? && !interface_info[:name].nil?
33
+ end
34
+
35
+ def up?
36
+ interface_info.nil? ? false : interface_info[:up]
37
+ end
38
+
39
+ # returns link speed in Mbits/sec
40
+ def speed
41
+ interface_info.nil? ? nil : interface_info[:speed]
42
+ end
43
+
44
+ def to_s
45
+ "Interface #{@iface}"
46
+ end
47
+
48
+ private
49
+
50
+ def interface_info
51
+ return @cache if defined?(@cache)
52
+ @cache = @interface_provider.interface_info(@iface) if !@interface_provider.nil?
53
+ end
54
+ end
55
+
56
+ class InterfaceInfo
57
+ include Converter
58
+ attr_reader :inspec
59
+ def initialize(inspec)
60
+ @inspec = inspec
61
+ end
62
+ end
63
+
64
+ class LinuxInterface < InterfaceInfo
65
+ def interface_info(iface)
66
+ # will return "[mtu]\n1500\n[type]\n1"
67
+ cmd = inspec.command("find /sys/class/net/#{iface}/ -maxdepth 1 -type f -exec sh -c 'echo \"[$(basename {})]\"; cat {} || echo -n' \\;")
68
+ return nil if cmd.exit_status.to_i != 0
69
+
70
+ # parse values, we only recieve values, therefore we threat them as keys
71
+ params = SimpleConfig.new(cmd.stdout.chomp).params
72
+
73
+ # abort if we got an empty result-set
74
+ return nil if params.empty?
75
+
76
+ # parse state
77
+ state = false
78
+ if params.key?('operstate')
79
+ operstate, _value = params['operstate'].first
80
+ state = operstate == 'up'
81
+ end
82
+
83
+ # parse speed
84
+ speed = nil
85
+ if params.key?('speed')
86
+ speed, _value = params['speed'].first
87
+ speed = convert_to_i(speed)
88
+ end
89
+
90
+ {
91
+ name: iface,
92
+ up: state,
93
+ speed: speed,
94
+ }
95
+ end
96
+ end
97
+
98
+ class WindowsInterface < InterfaceInfo
99
+ def interface_info(iface)
100
+ # gather all network interfaces
101
+ cmd = inspec.command('Get-NetAdapter | Select-Object -Property Name, InterfaceDescription, Status, State, MacAddress, LinkSpeed, ReceiveLinkSpeed, TransmitLinkSpeed, Virtual | ConvertTo-Json')
102
+
103
+ # filter network interface
104
+ begin
105
+ net_adapter = JSON.parse(cmd.stdout)
106
+ rescue JSON::ParserError => _e
107
+ return nil
108
+ end
109
+
110
+ # ensure we have an array of groups
111
+ net_adapter = [net_adapter] if !net_adapter.is_a?(Array)
112
+
113
+ # select the requested interface
114
+ adapters = net_adapter.each_with_object([]) do |adapter, adapter_collection|
115
+ # map object
116
+ info = {
117
+ name: adapter['Name'],
118
+ up: adapter['State'] == 2,
119
+ speed: adapter['ReceiveLinkSpeed'] / 1000,
120
+ }
121
+ adapter_collection.push(info) if info[:name].casecmp(iface) == 0
122
+ end
123
+
124
+ return nil if adapters.empty?
125
+ warn "[Possible Error] detected multiple network interfaces with the name #{iface}" if adapters.size > 1
126
+ adapters[0]
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,80 @@
1
+ # encoding: utf-8
2
+
3
+ # Usage:
4
+ # describe iptables do
5
+ # it { should have_rule('-P INPUT ACCEPT') }
6
+ # end
7
+ #
8
+ # The following serverspec sytax is not implemented:
9
+ # describe iptables do
10
+ # it { should have_rule('-P INPUT ACCEPT').with_table('mangle').with_chain('INPUT') }
11
+ # end
12
+ # Please use the new sytax:
13
+ # describe iptables(table:'mangle', chain: 'input') do
14
+ # it { should have_rule('-P INPUT ACCEPT') }
15
+ # end
16
+ #
17
+ # Note: Docker containers normally do not have iptables installed
18
+ #
19
+ # @see http://ipset.netfilter.org/iptables.man.html
20
+ # @see http://ipset.netfilter.org/iptables.man.html
21
+ # @see https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
22
+ module Inspec::Resources
23
+ class IpTables < Inspec.resource(1)
24
+ name 'iptables'
25
+ supports platform: 'linux'
26
+ desc 'Use the iptables InSpec audit resource to test rules that are defined in iptables, which maintains tables of IP packet filtering rules. There may be more than one table. Each table contains one (or more) chains (both built-in and custom). A chain is a list of rules that match packets. When the rule matches, the rule defines what target to assign to the packet.'
27
+ example "
28
+ describe iptables do
29
+ it { should have_rule('-P INPUT ACCEPT') }
30
+ end
31
+ "
32
+
33
+ def initialize(params = {})
34
+ @table = params[:table]
35
+ @chain = params[:chain]
36
+
37
+ # we're done if we are on linux
38
+ return if inspec.os.linux?
39
+
40
+ # ensures, all calls are aborted for non-supported os
41
+ @iptables_cache = []
42
+ skip_resource 'The `iptables` resource is not supported on your OS yet.'
43
+ end
44
+
45
+ def has_rule?(rule = nil, _table = nil, _chain = nil)
46
+ # checks if the rule is part of the ruleset
47
+ # for now, we expect an exact match
48
+ retrieve_rules.any? { |line| line.casecmp(rule) == 0 }
49
+ end
50
+
51
+ def retrieve_rules
52
+ return @iptables_cache if defined?(@iptables_cache)
53
+
54
+ # construct iptables command to read all rules
55
+ bin = find_iptables_or_error
56
+ table_cmd = "-t #{@table}" if @table
57
+ iptables_cmd = format('%s %s -S %s', bin, table_cmd, @chain).strip
58
+
59
+ cmd = inspec.command(iptables_cmd)
60
+ return [] if cmd.exit_status.to_i != 0
61
+
62
+ # split rules, returns array or rules
63
+ @iptables_cache = cmd.stdout.split("\n").map(&:strip)
64
+ end
65
+
66
+ def to_s
67
+ format('Iptables %s %s', @table && "table: #{@table}", @chain && "chain: #{@chain}").strip
68
+ end
69
+
70
+ private
71
+
72
+ def find_iptables_or_error
73
+ %w{/usr/sbin/iptables /sbin/iptables iptables}.each do |cmd|
74
+ return cmd if inspec.command(cmd).exist?
75
+ end
76
+
77
+ raise Inspec::Exceptions::ResourceFailed, 'Could not find `iptables`'
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,111 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/object_traversal'
4
+ require 'utils/enumerable_delegation'
5
+ require 'utils/file_reader'
6
+
7
+ module Inspec::Resources
8
+ class JsonConfig < Inspec.resource(1)
9
+ name 'json'
10
+ desc 'Use the json InSpec audit resource to test data in a JSON file.'
11
+ example "
12
+ describe json('policyfile.lock.json') do
13
+ its(['cookbook_locks','omnibus','version']) { should eq('2.2.0') }
14
+ end
15
+
16
+ describe json({ command: 'retrieve_data.py --json' }) do
17
+ its('state') { should eq('open') }
18
+ end
19
+
20
+ describe json({ content: '{\"item1\": { \"status\": \"available\" } }' }) do
21
+ its(['item1', 'status']) { should cmp 'available' }
22
+ end
23
+
24
+ "
25
+
26
+ include ObjectTraverser
27
+ include FileReader
28
+
29
+ # make params readable
30
+ attr_reader :params, :raw_content
31
+
32
+ def initialize(opts)
33
+ # pre-initialize @params to an empty hash. In the event that reading/parsing the data
34
+ # throws an exception, this allows the resource to still be called outside of a
35
+ # describe/test and not throw errors when a caller attempts to fetch a value from the params.
36
+ @params = {}
37
+
38
+ # load the raw content from the source, and then parse it
39
+ @raw_content = load_raw_content(opts)
40
+ @params = parse(@raw_content)
41
+
42
+ # If the JSON content is enumerable, make this object enumerable too
43
+ extend EnumerableDelegation if @params.respond_to?(:each)
44
+ end
45
+
46
+ # Shorthand to retrieve a parameter name via `#its`.
47
+ # Example: describe json('file') { its('paramX') { should eq 'Y' } }
48
+ #
49
+ # @param [String] name name of the field to retrieve
50
+ # @return [Object] the value stored at this position
51
+ def method_missing(*keys)
52
+ # catch bahavior of rspec its implementation
53
+ # @see https://github.com/rspec/rspec-its/blob/master/lib/rspec/its.rb#L110
54
+ keys.shift if keys.is_a?(Array) && keys[0] == :[]
55
+ value(keys)
56
+ end
57
+
58
+ def value(key)
59
+ # uses ObjectTraverser.extract_value to walk the hash looking for the key,
60
+ # which may be an Array of keys for a nested Hash.
61
+ extract_value(key, params)
62
+ end
63
+
64
+ def to_s
65
+ "#{resource_base_name} #{@resource_name_supplement || 'content'}"
66
+ end
67
+
68
+ private
69
+
70
+ def parse(content)
71
+ require 'json'
72
+ JSON.parse(content)
73
+ rescue => e
74
+ raise Inspec::Exceptions::ResourceFailed, "Unable to parse JSON: #{e.message}"
75
+ end
76
+
77
+ def load_raw_content(opts)
78
+ # if the opts isn't a hash, we assume it's a path to a file
79
+ unless opts.is_a?(Hash)
80
+ @resource_name_supplement = opts
81
+ return load_raw_from_file(opts)
82
+ end
83
+
84
+ if opts.key?(:command)
85
+ @resource_name_supplement = "from command: #{opts[:command]}"
86
+ load_raw_from_command(opts[:command])
87
+ elsif opts.key?(:content)
88
+ opts[:content]
89
+ else
90
+ raise Inspec::Exceptions::ResourceFailed, 'No JSON content; must specify a file, command, or raw JSON content'
91
+ end
92
+ end
93
+
94
+ def load_raw_from_file(path)
95
+ read_file_content(path)
96
+ end
97
+
98
+ def load_raw_from_command(command)
99
+ command_output = inspec.command(command).stdout
100
+ raise Inspec::Exceptions::ResourceSkipped, "No output from command: #{command}" if command_output.nil? || command_output.empty?
101
+
102
+ command_output
103
+ end
104
+
105
+ # for resources the subclass JsonConfig, this allows specification of the resource
106
+ # base name in each subclass so we can build a good to_s method
107
+ def resource_base_name
108
+ 'JSON'
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+
3
+ module Inspec::Resources
4
+ class KernelModule < Inspec.resource(1)
5
+ name 'kernel_module'
6
+ supports platform: 'unix'
7
+ desc 'Use the kernel_module InSpec audit resource to test kernel modules on
8
+ Linux platforms. These parameters are located under /lib/modules. Any submodule
9
+ may be tested using this resource.
10
+
11
+ The `kernel_module` resource can also verify if a kernel module is `blacklisted`
12
+ or if a module is disabled via a fake install using the `bin_true` or `bin_false`
13
+ method.'
14
+
15
+ example "
16
+
17
+ describe kernel_module('video') do
18
+ it { should be_loaded }
19
+ it { should_not be_disabled }
20
+ it { should_not be_blacklisted }
21
+ end
22
+
23
+ describe kernel_module('sstfb') do
24
+ it { should_not be_loaded }
25
+ it { should be_disabled }
26
+ end
27
+
28
+ describe kernel_module('floppy') do
29
+ it { should be_blacklisted }
30
+ end
31
+
32
+ describe kernel_module('dhcp') do
33
+ it { should_not be_loaded }
34
+ end
35
+ "
36
+
37
+ def initialize(modulename = nil)
38
+ @module = modulename
39
+ # this resource is only supported on Linux
40
+ return skip_resource 'The `kernel_parameter` resource is not supported on your OS.' if !inspec.os.linux?
41
+ end
42
+
43
+ def loaded?
44
+ if inspec.os.redhat? || inspec.os.name == 'fedora'
45
+ lsmod_cmd = '/sbin/lsmod'
46
+ else
47
+ lsmod_cmd = 'lsmod'
48
+ end
49
+
50
+ # get list of all modules
51
+ cmd = inspec.command(lsmod_cmd)
52
+ return false if cmd.exit_status != 0
53
+
54
+ # check if module is loaded
55
+ re = Regexp.new('^'+Regexp.quote(@module)+'\s')
56
+ found = cmd.stdout.match(re)
57
+ !found.nil?
58
+ end
59
+
60
+ def disabled?
61
+ !modprobe_output.match(%r{^install\s+#{@module}\s+/(s?)bin/(true|false)}).nil?
62
+ end
63
+
64
+ def blacklisted?
65
+ !modprobe_output.match(/^blacklist\s+#{@module}/).nil? || disabled_via_bin_true? || disabled_via_bin_false?
66
+ end
67
+
68
+ def version
69
+ cmd = inspec.command("#{modinfo_cmd_for_os} -F version #{@module}")
70
+ cmd.exit_status.zero? ? cmd.stdout.delete("\n") : nil
71
+ end
72
+
73
+ def to_s
74
+ "Kernel Module #{@module}"
75
+ end
76
+
77
+ private
78
+
79
+ def modprobe_output
80
+ @modprobe_output ||= inspec.command("#{modprobe_cmd_for_os} --showconfig").stdout
81
+ end
82
+
83
+ def modinfo_cmd_for_os
84
+ if inspec.os.redhat? || inspec.os.name == 'fedora'
85
+ '/sbin/modinfo'
86
+ else
87
+ 'modinfo'
88
+ end
89
+ end
90
+
91
+ def modprobe_cmd_for_os
92
+ if inspec.os.redhat? || inspec.os.name == 'fedora'
93
+ '/sbin/modprobe'
94
+ else
95
+ 'modprobe'
96
+ end
97
+ end
98
+
99
+ def disabled_via_bin_true?
100
+ !modprobe_output.match(%r{^install\s+#{@module}\s+/(s?)bin/true}).nil?
101
+ end
102
+
103
+ def disabled_via_bin_false?
104
+ !modprobe_output.match(%r{^install\s+#{@module}\s+/(s?)bin/false}).nil?
105
+ end
106
+ end
107
+ end