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,63 @@
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+
4
+ # Advanced Auditing:
5
+ # As soon as you start applying Advanced Audit Configuration Policy, legacy policies will be completely ignored.
6
+ # reference: https://technet.microsoft.com/en-us/library/cc753632.aspx
7
+ # use:
8
+ # - list all categories: Auditpol /list /subcategory:* /r
9
+ # - list parameters: Auditpol /get /category:"System" /subcategory:"IPsec Driver"
10
+ # - list specific parameter: Auditpol /get /subcategory:"IPsec Driver"
11
+ #
12
+ # @link: http://blogs.technet.com/b/askds/archive/2011/03/11/getting-the-effective-audit-policy-in-windows-7-and-2008-r2.aspx
13
+ #
14
+ # Valid values are:
15
+ #
16
+ # - "No Auditing"
17
+ # - "Not Specified"
18
+ # - "Success"
19
+ # - "Success and Failure"
20
+ # - "Failure"
21
+ #
22
+ # Further information is available at: https://msdn.microsoft.com/en-us/library/dd973859.aspx
23
+
24
+ module Inspec::Resources
25
+ class AuditPolicy < Inspec.resource(1)
26
+ name 'audit_policy'
27
+ supports platform: 'windows'
28
+ desc 'Use the audit_policy InSpec audit resource to test auditing policies on the Microsoft Windows platform. An auditing policy is a category of security-related events to be audited. Auditing is disabled by default and may be enabled for categories like account management, logon events, policy changes, process tracking, privilege use, system events, or object access. For each enabled auditing category property, the auditing level may be set to No Auditing, Not Specified, Success, Success and Failure, or Failure.'
29
+ example "
30
+ describe audit_policy do
31
+ its('parameter') { should eq 'value' }
32
+ end
33
+ "
34
+
35
+ def method_missing(method)
36
+ key = method.to_s
37
+
38
+ # expected result:
39
+ # Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting
40
+ # WIN-MB8NINQ388J,System,Kerberos Authentication Service,{0CCE9242-69AE-11D9-BED3-505054503030},No Auditing,
41
+ result ||= inspec.command("Auditpol /get /subcategory:'#{key}' /r").stdout
42
+
43
+ # find line
44
+ target = nil
45
+ result.each_line do |s|
46
+ target = s.strip if s =~ /\b.*#{key}.*\b/
47
+ end
48
+
49
+ # extract value
50
+ values = nil
51
+ unless target.nil?
52
+ # split csv values and return value
53
+ values = target.split(',')[4]
54
+ end
55
+
56
+ values
57
+ end
58
+
59
+ def to_s
60
+ 'Audit Policy'
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,231 @@
1
+ # encoding: utf-8
2
+
3
+ require 'forwardable'
4
+ require 'utils/filter_array'
5
+ require 'utils/filter'
6
+ require 'utils/parser'
7
+
8
+ module Inspec::Resources
9
+ class AuditDaemon < Inspec.resource(1)
10
+ extend Forwardable
11
+ attr_accessor :lines
12
+ attr_reader :params
13
+
14
+ name 'auditd'
15
+ supports platform: 'unix'
16
+ desc 'Use the auditd InSpec audit resource to test the rules for logging that exist on the system. The audit.rules file is typically located under /etc/audit/ and contains the list of rules that define what is captured in log files. These rules are output using the auditcl -l command.'
17
+ example "
18
+ describe auditd.syscall('chown').where {arch == 'b32'} do
19
+ its('action') { should eq ['always'] }
20
+ its('list') { should eq ['exit'] }
21
+ end
22
+
23
+ describe auditd.where {key == 'privileged'} do
24
+ its('permissions') { should include ['x'] }
25
+ end
26
+
27
+ describe auditd do
28
+ its('lines') { should include %r(-w /etc/ssh/sshd_config) }
29
+ end
30
+ "
31
+
32
+ def initialize
33
+ @content = inspec.command('/sbin/auditctl -l').stdout.chomp
34
+ @params = []
35
+
36
+ if @content =~ /^LIST_RULES:/
37
+ return skip_resource 'The version of audit is outdated. The `auditd` resource supports versions of audit >= 2.3.'
38
+ end
39
+ parse_content
40
+ end
41
+
42
+ filter = FilterTable.create
43
+ filter.add_accessor(:where)
44
+ .add_accessor(:entries)
45
+ .add(:file, field: 'file')
46
+ .add(:list, field: 'list')
47
+ .add(:action, field: 'action')
48
+ .add(:fields, field: 'fields')
49
+ .add(:fields_nokey, field: 'fields_nokey')
50
+ .add(:syscall, field: 'syscall')
51
+ .add(:key, field: 'key')
52
+ .add(:arch, field: 'arch')
53
+ .add(:path, field: 'path')
54
+ .add(:permissions, field: 'permissions')
55
+ .add(:exit, field: 'exit')
56
+
57
+ filter.connect(self, :params)
58
+
59
+ def status(name = nil)
60
+ @status_content ||= inspec.command('/sbin/auditctl -s').stdout.chomp
61
+ @status_params ||= Hash[@status_content.scan(/^([^ ]+) (.*)$/)]
62
+
63
+ return @status_params[name] if name
64
+ @status_params
65
+ end
66
+
67
+ def parse_content
68
+ @lines = @content.lines.map(&:chomp)
69
+
70
+ lines.each do |line|
71
+ if is_file_syscall_syntax?(line)
72
+ file_syscall_syntax_rules_for(line)
73
+ end
74
+
75
+ if is_syscall?(line)
76
+ syscall_rules_for(line)
77
+
78
+ elsif is_file?(line)
79
+ file_rules_for(line)
80
+ end
81
+ end
82
+ end
83
+
84
+ def file_syscall_syntax_rules_for(line)
85
+ file = file_syscall_syntax_for(line)
86
+ action, list = action_list_for(line)
87
+ fields = rule_fields_for(line)
88
+ key_field, fields_nokey = remove_key_from(fields)
89
+ key = key_in(key_field.join(''))
90
+ perms = perms_in(fields)
91
+
92
+ @params.push(
93
+ {
94
+ 'file' => file,
95
+ 'list' => list,
96
+ 'action' => action,
97
+ 'fields' => fields,
98
+ 'permissions' => perms,
99
+ 'key' => key,
100
+ 'fields_nokey' => fields_nokey,
101
+ },
102
+ )
103
+ end
104
+
105
+ def syscall_rules_for(line)
106
+ syscalls = syscalls_for(line)
107
+ action, list = action_list_for(line)
108
+ fields = rule_fields_for(line)
109
+ key_field, fields_nokey = remove_key_from(fields)
110
+ key = key_in(key_field.join(''))
111
+ arch = arch_in(fields)
112
+ path = path_in(fields)
113
+ perms = perms_in(fields)
114
+ exit_field = exit_in(fields)
115
+
116
+ syscalls.each do |s|
117
+ @params.push(
118
+ {
119
+ 'syscall' => s,
120
+ 'list' => list,
121
+ 'action' => action,
122
+ 'fields' => fields,
123
+ 'key' => key,
124
+ 'arch' => arch,
125
+ 'path' => path,
126
+ 'permissions' => perms,
127
+ 'exit' => exit_field,
128
+ 'fields_nokey' => fields_nokey,
129
+ },
130
+ )
131
+ end
132
+ end
133
+
134
+ def file_rules_for(line)
135
+ file = file_for(line)
136
+ perms = permissions_for(line)
137
+ key = key_for(line)
138
+
139
+ @params.push(
140
+ {
141
+ 'file' => file,
142
+ 'key' => key,
143
+ 'permissions' => perms,
144
+ },
145
+ )
146
+ end
147
+
148
+ def to_s
149
+ 'Auditd Rules'
150
+ end
151
+
152
+ private
153
+
154
+ def is_syscall?(line)
155
+ line.match(/-S /)
156
+ end
157
+
158
+ def is_file?(line)
159
+ line.match(/-w /)
160
+ end
161
+
162
+ def is_file_syscall_syntax?(line)
163
+ line.match(/-F path=/)
164
+ end
165
+
166
+ def syscalls_for(line)
167
+ line.scan(/-S ([^ ]+)\s?/).flatten.first.split(',')
168
+ end
169
+
170
+ def action_list_for(line)
171
+ line.scan(/-a ([^,]+),([^ ]+)\s?/).flatten
172
+ end
173
+
174
+ def key_for(line)
175
+ line.match(/-k ([^ ]+)\s?/)[1] if line.include?('-k ')
176
+ end
177
+
178
+ def file_for(line)
179
+ line.match(/-w ([^ ]+)\s?/)[1]
180
+ end
181
+
182
+ def file_syscall_syntax_for(line)
183
+ line.match(/-F path=(\S+)\s?/)[1]
184
+ end
185
+
186
+ def permissions_for(line)
187
+ line.match(/-p ([^ ]+)/)[1].scan(/\w/)
188
+ end
189
+
190
+ def rule_fields_for(line)
191
+ line.gsub(/-[aS] [^ ]+ /, '').split('-F ').map { |l| l.split(' ') }.flatten
192
+ end
193
+
194
+ def arch_in(fields)
195
+ fields.each do |field|
196
+ return field.match(/arch=(\S+)\s?/)[1] if field.start_with?('arch=')
197
+ end
198
+ nil
199
+ end
200
+
201
+ def perms_in(fields)
202
+ fields.each do |field|
203
+ return field.match(/perm=(\S+)\s?/)[1].scan(/\w/) if field.start_with?('perm=')
204
+ end
205
+ nil
206
+ end
207
+
208
+ def path_in(fields)
209
+ fields.each do |field|
210
+ return field.match(/path=(\S+)\s?/)[1] if field.start_with?('path=')
211
+ end
212
+ nil
213
+ end
214
+
215
+ def exit_in(fields)
216
+ fields.each do |field|
217
+ return field.match(/exit=(\S+)\s?/)[1] if field.start_with?('exit=')
218
+ end
219
+ nil
220
+ end
221
+
222
+ def key_in(field)
223
+ _, v = field.split('=')
224
+ v
225
+ end
226
+
227
+ def remove_key_from(fields)
228
+ fields.partition { |x| x.start_with? 'key' }
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,46 @@
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 AuditDaemonConf < Inspec.resource(1)
9
+ name 'auditd_conf'
10
+ supports platform: 'unix'
11
+ desc "Use the auditd_conf InSpec audit resource to test the configuration settings for the audit daemon. This file is typically located under /etc/audit/auditd.conf' on UNIX and Linux platforms."
12
+ example "
13
+ describe auditd_conf do
14
+ its('space_left_action') { should eq 'email' }
15
+ end
16
+ "
17
+
18
+ include FileReader
19
+
20
+ def initialize(path = nil)
21
+ @conf_path = path || '/etc/audit/auditd.conf'
22
+ @content = read_file_content(@conf_path)
23
+ end
24
+
25
+ def method_missing(name)
26
+ read_params[name.to_s]
27
+ end
28
+
29
+ def to_s
30
+ 'Audit Daemon Config'
31
+ end
32
+
33
+ private
34
+
35
+ def read_params
36
+ return @params if defined?(@params)
37
+
38
+ # parse the file
39
+ conf = SimpleConfig.new(
40
+ @content,
41
+ multiple_values: false,
42
+ )
43
+ @params = conf.params
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ require 'utils/command_wrapper'
4
+ require 'resources/command'
5
+
6
+ module Inspec::Resources
7
+ class Bash < Cmd
8
+ name 'bash'
9
+ supports platform: 'unix'
10
+ desc 'Run a command or script in BASH.'
11
+ example "
12
+ describe bash('ls -al /') do
13
+ its('stdout') { should match /bin/ }
14
+ its('stderr') { should eq '' }
15
+ its('exit_status') { should eq 0 }
16
+ end
17
+
18
+ # Specify the path of the executable:
19
+ bash('...', path: '/bin/bash')
20
+
21
+ # Specify arguments (defaults to -c)
22
+ bash('...', args: '-x -c')
23
+ "
24
+
25
+ def initialize(command, options = {})
26
+ @raw_command = command
27
+ options[:shell] = 'bash' if options.is_a?(Hash)
28
+ super(CommandWrapper.wrap(command, options))
29
+ end
30
+
31
+ def to_s
32
+ "Bash command #{@raw_command}"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ require 'resources/file'
4
+ require 'utils/file_reader'
5
+
6
+ module Inspec::Resources
7
+ class Bond < FileResource
8
+ name 'bond'
9
+ supports platform: 'unix'
10
+ desc 'Use the bond InSpec audit resource to test a logical, bonded network interface (i.e. "two or more network interfaces aggregated into a single, logical network interface"). On Linux platforms, any value in the /proc/net/bonding directory may be tested.'
11
+ example "
12
+ describe bond('bond0') do
13
+ it { should exist }
14
+ end
15
+ "
16
+
17
+ include FileReader
18
+
19
+ def initialize(bond)
20
+ @bond = bond
21
+ @path = "/proc/net/bonding/#{bond}"
22
+ @file = inspec.file(@path)
23
+ @content = read_file_content(@path, allow_empty: true)
24
+ @params = {}
25
+ @loaded = false
26
+ end
27
+
28
+ def read_content
29
+ @params = SimpleConfig.new(
30
+ @content,
31
+ assignment_regex: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/,
32
+ multiple_values: true,
33
+ ).params if @file.exist?
34
+ @loaded = true
35
+ @content
36
+ end
37
+
38
+ # ensures the content is loaded before we return the params
39
+ def params
40
+ read_content if @loaded == false
41
+ @params
42
+ end
43
+
44
+ def content
45
+ read_content if @loaded == false
46
+ @content
47
+ end
48
+
49
+ def exist?
50
+ @file.exist?
51
+ end
52
+
53
+ def has_interface?(interface)
54
+ params['Slave Interface'].include?(interface)
55
+ end
56
+
57
+ def interfaces
58
+ params['Slave Interface']
59
+ end
60
+
61
+ def mode
62
+ params['Bonding Mode'].first
63
+ end
64
+
65
+ def to_s
66
+ "Bond #{@bond}"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,122 @@
1
+ # encoding: utf-8
2
+
3
+ # Usage:
4
+ # describe bridge('br0') do
5
+ # it { should exist }
6
+ # it { should have_interface 'eth0' }
7
+ # end
8
+
9
+ module Inspec::Resources
10
+ class Bridge < Inspec.resource(1)
11
+ name 'bridge'
12
+ supports platform: 'unix'
13
+ desc 'Use the bridge InSpec audit resource to test basic network bridge properties, such as name, if an interface is defined, and the associations for any defined interface.'
14
+ example "
15
+ describe bridge 'br0' do
16
+ it { should exist }
17
+ it { should have_interface 'eth0' }
18
+ end
19
+ "
20
+
21
+ def initialize(bridge_name)
22
+ @bridge_name = bridge_name
23
+
24
+ @bridge_provider = nil
25
+ if inspec.os.linux?
26
+ @bridge_provider = LinuxBridge.new(inspec)
27
+ elsif inspec.os.windows?
28
+ @bridge_provider = WindowsBridge.new(inspec)
29
+ else
30
+ return skip_resource 'The `bridge` resource is not supported on your OS yet.'
31
+ end
32
+ end
33
+
34
+ def exists?
35
+ !bridge_info.nil? && !bridge_info[:name].nil?
36
+ end
37
+
38
+ def has_interface?(interface)
39
+ return skip_resource 'The `bridge` resource does not provide interface detection for Windows yet' if inspec.os.windows?
40
+ bridge_info.nil? ? false : bridge_info[:interfaces].include?(interface)
41
+ end
42
+
43
+ def interfaces
44
+ bridge_info.nil? ? nil : bridge_info[:interfaces]
45
+ end
46
+
47
+ def to_s
48
+ "Bridge #{@bridge_name}"
49
+ end
50
+
51
+ private
52
+
53
+ def bridge_info
54
+ return @cache if defined?(@cache)
55
+ @cache = @bridge_provider.bridge_info(@bridge_name) if !@bridge_provider.nil?
56
+ end
57
+ end
58
+
59
+ class BridgeDetection
60
+ attr_reader :inspec
61
+ def initialize(inspec)
62
+ @inspec = inspec
63
+ end
64
+ end
65
+
66
+ # Linux Bridge
67
+ # If /sys/class/net/{interface}/bridge exists then it must be a bridge
68
+ # /sys/class/net/{interface}/brif contains the network interfaces
69
+ # @see http://www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge.html
70
+ # @see http://unix.stackexchange.com/questions/40560/how-to-know-if-a-network-interface-is-tap-tun-bridge-or-physical
71
+ class LinuxBridge < BridgeDetection
72
+ def bridge_info(bridge_name)
73
+ # read bridge information
74
+ bridge = inspec.file("/sys/class/net/#{bridge_name}/bridge").directory?
75
+ return nil unless bridge
76
+
77
+ # load interface names
78
+ interfaces = inspec.command("ls -1 /sys/class/net/#{bridge_name}/brif/")
79
+ interfaces = interfaces.stdout.chomp.split("\n")
80
+ {
81
+ name: bridge_name,
82
+ interfaces: interfaces,
83
+ }
84
+ end
85
+ end
86
+
87
+ # Windows Bridge
88
+ # select netadapter by adapter binding for windows
89
+ # Get-NetAdapterBinding -ComponentID ms_bridge | Get-NetAdapter
90
+ # @see https://technet.microsoft.com/en-us/library/jj130921(v=wps.630).aspx
91
+ # RegKeys: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}
92
+ class WindowsBridge < BridgeDetection
93
+ def bridge_info(bridge_name)
94
+ # find all bridge adapters
95
+ cmd = inspec.command('Get-NetAdapterBinding -ComponentID ms_bridge | Get-NetAdapter | Select-Object -Property Name, InterfaceDescription | ConvertTo-Json')
96
+
97
+ # filter network interface
98
+ begin
99
+ bridges = JSON.parse(cmd.stdout)
100
+ rescue JSON::ParserError => _e
101
+ return nil
102
+ end
103
+
104
+ # ensure we have an array of groups
105
+ bridges = [bridges] if !bridges.is_a?(Array)
106
+
107
+ # select the requested interface
108
+ bridges = bridges.each_with_object([]) do |adapter, adapter_collection|
109
+ # map object
110
+ info = {
111
+ name: adapter['Name'],
112
+ interfaces: nil,
113
+ }
114
+ adapter_collection.push(info) if info[:name].casecmp(bridge_name) == 0
115
+ end
116
+
117
+ return nil if bridges.empty?
118
+ warn "[Possible Error] detected multiple bridges interfaces with the name #{bridge_name}" if bridges.size > 1
119
+ bridges[0]
120
+ end
121
+ end
122
+ end