inspec 1.51.15 → 1.51.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (404) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +101 -101
  3. data/CHANGELOG.md +2922 -2915
  4. data/Gemfile +53 -53
  5. data/LICENSE +14 -14
  6. data/MAINTAINERS.md +31 -31
  7. data/MAINTAINERS.toml +47 -47
  8. data/README.md +419 -419
  9. data/Rakefile +167 -167
  10. data/bin/inspec +12 -12
  11. data/docs/.gitignore +2 -2
  12. data/docs/README.md +40 -40
  13. data/docs/dsl_inspec.md +258 -258
  14. data/docs/dsl_resource.md +93 -93
  15. data/docs/glossary.md +99 -99
  16. data/docs/habitat.md +191 -191
  17. data/docs/inspec_and_friends.md +107 -107
  18. data/docs/matchers.md +165 -165
  19. data/docs/migration.md +293 -293
  20. data/docs/plugin_kitchen_inspec.md +49 -49
  21. data/docs/profiles.md +370 -370
  22. data/docs/resources/aide_conf.md.erb +78 -78
  23. data/docs/resources/apache.md.erb +66 -66
  24. data/docs/resources/apache_conf.md.erb +67 -67
  25. data/docs/resources/apt.md.erb +70 -70
  26. data/docs/resources/audit_policy.md.erb +46 -46
  27. data/docs/resources/auditd.md.erb +78 -78
  28. data/docs/resources/auditd_conf.md.erb +68 -68
  29. data/docs/resources/auditd_rules.md.erb +116 -116
  30. data/docs/resources/bash.md.erb +74 -74
  31. data/docs/resources/bond.md.erb +89 -89
  32. data/docs/resources/bridge.md.erb +54 -54
  33. data/docs/resources/bsd_service.md.erb +65 -65
  34. data/docs/resources/command.md.erb +137 -137
  35. data/docs/resources/cpan.md.erb +77 -77
  36. data/docs/resources/cran.md.erb +63 -63
  37. data/docs/resources/crontab.md.erb +87 -87
  38. data/docs/resources/csv.md.erb +53 -53
  39. data/docs/resources/dh_params.md.erb +216 -216
  40. data/docs/resources/directory.md.erb +28 -28
  41. data/docs/resources/docker.md.erb +163 -163
  42. data/docs/resources/docker_container.md.erb +99 -99
  43. data/docs/resources/docker_image.md.erb +93 -93
  44. data/docs/resources/docker_service.md.erb +113 -113
  45. data/docs/resources/elasticsearch.md.erb +230 -230
  46. data/docs/resources/etc_fstab.md.erb +124 -124
  47. data/docs/resources/etc_group.md.erb +74 -74
  48. data/docs/resources/etc_hosts.md.erb +75 -75
  49. data/docs/resources/etc_hosts_allow.md.erb +73 -73
  50. data/docs/resources/etc_hosts_deny.md.erb +73 -73
  51. data/docs/resources/file.md.erb +512 -512
  52. data/docs/resources/filesystem.md.erb +40 -40
  53. data/docs/resources/firewalld.md.erb +105 -105
  54. data/docs/resources/gem.md.erb +78 -78
  55. data/docs/resources/group.md.erb +60 -60
  56. data/docs/resources/grub_conf.md.erb +101 -101
  57. data/docs/resources/host.md.erb +77 -77
  58. data/docs/resources/http.md.erb +104 -104
  59. data/docs/resources/iis_app.md.erb +120 -120
  60. data/docs/resources/iis_site.md.erb +132 -132
  61. data/docs/resources/inetd_conf.md.erb +95 -95
  62. data/docs/resources/ini.md.erb +72 -72
  63. data/docs/resources/interface.md.erb +55 -55
  64. data/docs/resources/iptables.md.erb +63 -63
  65. data/docs/resources/json.md.erb +61 -61
  66. data/docs/resources/kernel_module.md.erb +106 -106
  67. data/docs/resources/kernel_parameter.md.erb +58 -58
  68. data/docs/resources/key_rsa.md.erb +73 -73
  69. data/docs/resources/launchd_service.md.erb +56 -56
  70. data/docs/resources/limits_conf.md.erb +66 -66
  71. data/docs/resources/login_def.md.erb +62 -62
  72. data/docs/resources/mount.md.erb +68 -68
  73. data/docs/resources/mssql_session.md.erb +59 -59
  74. data/docs/resources/mysql_conf.md.erb +98 -98
  75. data/docs/resources/mysql_session.md.erb +73 -73
  76. data/docs/resources/nginx.md.erb +78 -78
  77. data/docs/resources/nginx_conf.md.erb +127 -127
  78. data/docs/resources/npm.md.erb +59 -59
  79. data/docs/resources/ntp_conf.md.erb +59 -59
  80. data/docs/resources/oneget.md.erb +52 -52
  81. data/docs/resources/oracledb_session.md.erb +51 -51
  82. data/docs/resources/os.md.erb +140 -140
  83. data/docs/resources/os_env.md.erb +77 -77
  84. data/docs/resources/package.md.erb +119 -119
  85. data/docs/resources/packages.md.erb +66 -66
  86. data/docs/resources/parse_config.md.erb +102 -102
  87. data/docs/resources/parse_config_file.md.erb +137 -137
  88. data/docs/resources/passwd.md.erb +140 -140
  89. data/docs/resources/pip.md.erb +66 -66
  90. data/docs/resources/port.md.erb +136 -136
  91. data/docs/resources/postgres_conf.md.erb +78 -78
  92. data/docs/resources/postgres_hba_conf.md.erb +92 -92
  93. data/docs/resources/postgres_ident_conf.md.erb +75 -75
  94. data/docs/resources/postgres_session.md.erb +68 -68
  95. data/docs/resources/powershell.md.erb +101 -101
  96. data/docs/resources/processes.md.erb +107 -107
  97. data/docs/resources/rabbitmq_config.md.erb +40 -40
  98. data/docs/resources/registry_key.md.erb +157 -157
  99. data/docs/resources/runit_service.md.erb +56 -56
  100. data/docs/resources/security_policy.md.erb +46 -46
  101. data/docs/resources/service.md.erb +120 -120
  102. data/docs/resources/shadow.md.erb +143 -143
  103. data/docs/resources/ssh_config.md.erb +79 -79
  104. data/docs/resources/sshd_config.md.erb +82 -82
  105. data/docs/resources/ssl.md.erb +118 -118
  106. data/docs/resources/sys_info.md.erb +41 -41
  107. data/docs/resources/systemd_service.md.erb +56 -56
  108. data/docs/resources/sysv_service.md.erb +56 -56
  109. data/docs/resources/upstart_service.md.erb +56 -56
  110. data/docs/resources/user.md.erb +139 -139
  111. data/docs/resources/users.md.erb +126 -126
  112. data/docs/resources/vbscript.md.erb +54 -54
  113. data/docs/resources/virtualization.md.erb +56 -56
  114. data/docs/resources/windows_feature.md.erb +46 -46
  115. data/docs/resources/windows_hotfix.md.erb +52 -52
  116. data/docs/resources/windows_task.md.erb +89 -89
  117. data/docs/resources/wmi.md.erb +80 -80
  118. data/docs/resources/x509_certificate.md.erb +150 -150
  119. data/docs/resources/xinetd_conf.md.erb +155 -155
  120. data/docs/resources/xml.md.erb +84 -84
  121. data/docs/resources/yaml.md.erb +68 -68
  122. data/docs/resources/yum.md.erb +97 -97
  123. data/docs/resources/zfs_dataset.md.erb +52 -52
  124. data/docs/resources/zfs_pool.md.erb +46 -46
  125. data/docs/ruby_usage.md +203 -203
  126. data/docs/shared/matcher_be.md.erb +1 -1
  127. data/docs/shared/matcher_cmp.md.erb +43 -43
  128. data/docs/shared/matcher_eq.md.erb +3 -3
  129. data/docs/shared/matcher_include.md.erb +1 -1
  130. data/docs/shared/matcher_match.md.erb +1 -1
  131. data/docs/shell.md +172 -172
  132. data/examples/README.md +8 -8
  133. data/examples/inheritance/README.md +65 -65
  134. data/examples/inheritance/controls/example.rb +14 -14
  135. data/examples/inheritance/inspec.yml +15 -15
  136. data/examples/kitchen-ansible/.kitchen.yml +25 -25
  137. data/examples/kitchen-ansible/Gemfile +19 -19
  138. data/examples/kitchen-ansible/README.md +53 -53
  139. data/examples/kitchen-ansible/files/nginx.repo +6 -6
  140. data/examples/kitchen-ansible/tasks/main.yml +16 -16
  141. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
  142. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
  143. data/examples/kitchen-chef/.kitchen.yml +20 -20
  144. data/examples/kitchen-chef/Berksfile +3 -3
  145. data/examples/kitchen-chef/Gemfile +19 -19
  146. data/examples/kitchen-chef/README.md +27 -27
  147. data/examples/kitchen-chef/metadata.rb +7 -7
  148. data/examples/kitchen-chef/recipes/default.rb +6 -6
  149. data/examples/kitchen-chef/recipes/nginx.rb +30 -30
  150. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
  151. data/examples/kitchen-puppet/.kitchen.yml +22 -22
  152. data/examples/kitchen-puppet/Gemfile +20 -20
  153. data/examples/kitchen-puppet/Puppetfile +25 -25
  154. data/examples/kitchen-puppet/README.md +53 -53
  155. data/examples/kitchen-puppet/manifests/site.pp +33 -33
  156. data/examples/kitchen-puppet/metadata.json +11 -11
  157. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
  158. data/examples/meta-profile/README.md +37 -37
  159. data/examples/meta-profile/controls/example.rb +13 -13
  160. data/examples/meta-profile/inspec.yml +13 -13
  161. data/examples/profile-attribute.yml +2 -2
  162. data/examples/profile-attribute/README.md +14 -14
  163. data/examples/profile-attribute/controls/example.rb +11 -11
  164. data/examples/profile-attribute/inspec.yml +8 -8
  165. data/examples/profile-sensitive/README.md +29 -29
  166. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
  167. data/examples/profile-sensitive/controls/sensitive.rb +9 -9
  168. data/examples/profile-sensitive/inspec.yml +8 -8
  169. data/examples/profile/README.md +48 -48
  170. data/examples/profile/controls/example.rb +23 -23
  171. data/examples/profile/controls/gordon.rb +36 -36
  172. data/examples/profile/controls/meta.rb +34 -34
  173. data/examples/profile/inspec.yml +10 -10
  174. data/examples/profile/libraries/gordon_config.rb +53 -53
  175. data/inspec.gemspec +47 -47
  176. data/lib/bundles/README.md +3 -3
  177. data/lib/bundles/inspec-artifact.rb +7 -7
  178. data/lib/bundles/inspec-artifact/README.md +1 -1
  179. data/lib/bundles/inspec-artifact/cli.rb +277 -277
  180. data/lib/bundles/inspec-compliance.rb +16 -16
  181. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
  182. data/lib/bundles/inspec-compliance/README.md +185 -185
  183. data/lib/bundles/inspec-compliance/api.rb +316 -316
  184. data/lib/bundles/inspec-compliance/api/login.rb +152 -152
  185. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
  186. data/lib/bundles/inspec-compliance/cli.rb +277 -277
  187. data/lib/bundles/inspec-compliance/configuration.rb +103 -103
  188. data/lib/bundles/inspec-compliance/http.rb +86 -86
  189. data/lib/bundles/inspec-compliance/support.rb +36 -36
  190. data/lib/bundles/inspec-compliance/target.rb +98 -98
  191. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
  192. data/lib/bundles/inspec-habitat.rb +12 -12
  193. data/lib/bundles/inspec-habitat/cli.rb +36 -36
  194. data/lib/bundles/inspec-habitat/log.rb +10 -10
  195. data/lib/bundles/inspec-habitat/profile.rb +390 -390
  196. data/lib/bundles/inspec-init.rb +8 -8
  197. data/lib/bundles/inspec-init/README.md +31 -31
  198. data/lib/bundles/inspec-init/cli.rb +97 -97
  199. data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
  200. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
  201. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
  202. data/lib/bundles/inspec-supermarket.rb +13 -13
  203. data/lib/bundles/inspec-supermarket/README.md +45 -45
  204. data/lib/bundles/inspec-supermarket/api.rb +84 -84
  205. data/lib/bundles/inspec-supermarket/cli.rb +65 -65
  206. data/lib/bundles/inspec-supermarket/target.rb +34 -34
  207. data/lib/fetchers/git.rb +163 -163
  208. data/lib/fetchers/local.rb +74 -74
  209. data/lib/fetchers/mock.rb +35 -35
  210. data/lib/fetchers/url.rb +204 -204
  211. data/lib/inspec.rb +24 -24
  212. data/lib/inspec/archive/tar.rb +29 -29
  213. data/lib/inspec/archive/zip.rb +19 -19
  214. data/lib/inspec/backend.rb +92 -92
  215. data/lib/inspec/base_cli.rb +327 -324
  216. data/lib/inspec/cached_fetcher.rb +66 -66
  217. data/lib/inspec/cli.rb +298 -298
  218. data/lib/inspec/completions/bash.sh.erb +45 -45
  219. data/lib/inspec/completions/fish.sh.erb +34 -34
  220. data/lib/inspec/completions/zsh.sh.erb +61 -61
  221. data/lib/inspec/control_eval_context.rb +179 -179
  222. data/lib/inspec/dependencies/cache.rb +72 -72
  223. data/lib/inspec/dependencies/dependency_set.rb +92 -92
  224. data/lib/inspec/dependencies/lockfile.rb +115 -115
  225. data/lib/inspec/dependencies/requirement.rb +123 -123
  226. data/lib/inspec/dependencies/resolver.rb +86 -86
  227. data/lib/inspec/describe.rb +27 -27
  228. data/lib/inspec/dsl.rb +66 -66
  229. data/lib/inspec/dsl_shared.rb +33 -33
  230. data/lib/inspec/env_printer.rb +157 -157
  231. data/lib/inspec/errors.rb +13 -13
  232. data/lib/inspec/exceptions.rb +12 -12
  233. data/lib/inspec/expect.rb +45 -45
  234. data/lib/inspec/fetcher.rb +45 -45
  235. data/lib/inspec/file_provider.rb +275 -275
  236. data/lib/inspec/formatters.rb +3 -3
  237. data/lib/inspec/formatters/base.rb +208 -208
  238. data/lib/inspec/formatters/json_rspec.rb +20 -20
  239. data/lib/inspec/formatters/show_progress.rb +12 -12
  240. data/lib/inspec/library_eval_context.rb +58 -58
  241. data/lib/inspec/log.rb +11 -11
  242. data/lib/inspec/metadata.rb +253 -253
  243. data/lib/inspec/method_source.rb +24 -24
  244. data/lib/inspec/objects.rb +14 -14
  245. data/lib/inspec/objects/attribute.rb +65 -65
  246. data/lib/inspec/objects/control.rb +61 -61
  247. data/lib/inspec/objects/describe.rb +92 -92
  248. data/lib/inspec/objects/each_loop.rb +36 -36
  249. data/lib/inspec/objects/list.rb +15 -15
  250. data/lib/inspec/objects/or_test.rb +40 -40
  251. data/lib/inspec/objects/ruby_helper.rb +15 -15
  252. data/lib/inspec/objects/tag.rb +27 -27
  253. data/lib/inspec/objects/test.rb +87 -87
  254. data/lib/inspec/objects/value.rb +27 -27
  255. data/lib/inspec/plugins.rb +60 -60
  256. data/lib/inspec/plugins/cli.rb +24 -24
  257. data/lib/inspec/plugins/fetcher.rb +86 -86
  258. data/lib/inspec/plugins/resource.rb +132 -132
  259. data/lib/inspec/plugins/secret.rb +15 -15
  260. data/lib/inspec/plugins/source_reader.rb +40 -40
  261. data/lib/inspec/polyfill.rb +12 -12
  262. data/lib/inspec/profile.rb +510 -510
  263. data/lib/inspec/profile_context.rb +207 -207
  264. data/lib/inspec/profile_vendor.rb +66 -66
  265. data/lib/inspec/reporters.rb +50 -50
  266. data/lib/inspec/reporters/base.rb +24 -24
  267. data/lib/inspec/reporters/cli.rb +395 -395
  268. data/lib/inspec/reporters/json.rb +138 -134
  269. data/lib/inspec/reporters/json_min.rb +48 -48
  270. data/lib/inspec/reporters/junit.rb +77 -77
  271. data/lib/inspec/require_loader.rb +33 -33
  272. data/lib/inspec/resource.rb +176 -176
  273. data/lib/inspec/rule.rb +266 -266
  274. data/lib/inspec/runner.rb +342 -340
  275. data/lib/inspec/runner_mock.rb +41 -41
  276. data/lib/inspec/runner_rspec.rb +163 -163
  277. data/lib/inspec/runtime_profile.rb +26 -26
  278. data/lib/inspec/schema.rb +192 -186
  279. data/lib/inspec/secrets.rb +19 -19
  280. data/lib/inspec/secrets/yaml.rb +30 -30
  281. data/lib/inspec/shell.rb +223 -223
  282. data/lib/inspec/shell_detector.rb +90 -90
  283. data/lib/inspec/source_reader.rb +29 -29
  284. data/lib/inspec/version.rb +8 -8
  285. data/lib/matchers/matchers.rb +397 -397
  286. data/lib/resources/aide_conf.rb +160 -160
  287. data/lib/resources/apache.rb +49 -49
  288. data/lib/resources/apache_conf.rb +158 -158
  289. data/lib/resources/apt.rb +150 -150
  290. data/lib/resources/audit_policy.rb +64 -64
  291. data/lib/resources/auditd.rb +233 -233
  292. data/lib/resources/auditd_conf.rb +56 -56
  293. data/lib/resources/auditd_rules.rb +205 -205
  294. data/lib/resources/bash.rb +36 -36
  295. data/lib/resources/bond.rb +69 -69
  296. data/lib/resources/bridge.rb +123 -123
  297. data/lib/resources/command.rb +69 -69
  298. data/lib/resources/cpan.rb +60 -60
  299. data/lib/resources/cran.rb +66 -66
  300. data/lib/resources/crontab.rb +169 -169
  301. data/lib/resources/csv.rb +58 -58
  302. data/lib/resources/dh_params.rb +83 -83
  303. data/lib/resources/directory.rb +25 -25
  304. data/lib/resources/docker.rb +239 -239
  305. data/lib/resources/docker_container.rb +92 -92
  306. data/lib/resources/docker_image.rb +86 -86
  307. data/lib/resources/docker_object.rb +57 -57
  308. data/lib/resources/docker_service.rb +94 -94
  309. data/lib/resources/elasticsearch.rb +168 -168
  310. data/lib/resources/etc_fstab.rb +102 -102
  311. data/lib/resources/etc_group.rb +157 -157
  312. data/lib/resources/etc_hosts.rb +81 -81
  313. data/lib/resources/etc_hosts_allow_deny.rb +122 -122
  314. data/lib/resources/file.rb +298 -298
  315. data/lib/resources/filesystem.rb +31 -31
  316. data/lib/resources/firewalld.rb +144 -144
  317. data/lib/resources/gem.rb +71 -71
  318. data/lib/resources/groups.rb +213 -213
  319. data/lib/resources/grub_conf.rb +237 -237
  320. data/lib/resources/host.rb +300 -300
  321. data/lib/resources/http.rb +252 -252
  322. data/lib/resources/iis_app.rb +103 -103
  323. data/lib/resources/iis_site.rb +147 -147
  324. data/lib/resources/inetd_conf.rb +63 -63
  325. data/lib/resources/ini.rb +29 -29
  326. data/lib/resources/interface.rb +130 -130
  327. data/lib/resources/iptables.rb +70 -70
  328. data/lib/resources/json.rb +115 -115
  329. data/lib/resources/kernel_module.rb +110 -110
  330. data/lib/resources/kernel_parameter.rb +58 -58
  331. data/lib/resources/key_rsa.rb +67 -67
  332. data/lib/resources/limits_conf.rb +56 -56
  333. data/lib/resources/login_def.rb +67 -67
  334. data/lib/resources/mount.rb +90 -90
  335. data/lib/resources/mssql_session.rb +103 -103
  336. data/lib/resources/mysql.rb +82 -82
  337. data/lib/resources/mysql_conf.rb +133 -133
  338. data/lib/resources/mysql_session.rb +72 -72
  339. data/lib/resources/nginx.rb +97 -97
  340. data/lib/resources/nginx_conf.rb +228 -228
  341. data/lib/resources/npm.rb +48 -48
  342. data/lib/resources/ntp_conf.rb +59 -59
  343. data/lib/resources/oneget.rb +72 -72
  344. data/lib/resources/oracledb_session.rb +140 -140
  345. data/lib/resources/os.rb +46 -46
  346. data/lib/resources/os_env.rb +76 -76
  347. data/lib/resources/package.rb +357 -357
  348. data/lib/resources/packages.rb +112 -112
  349. data/lib/resources/parse_config.rb +116 -116
  350. data/lib/resources/passwd.rb +96 -96
  351. data/lib/resources/pip.rb +89 -89
  352. data/lib/resources/platform.rb +112 -112
  353. data/lib/resources/port.rb +771 -771
  354. data/lib/resources/postgres.rb +132 -132
  355. data/lib/resources/postgres_conf.rb +122 -122
  356. data/lib/resources/postgres_hba_conf.rb +101 -101
  357. data/lib/resources/postgres_ident_conf.rb +79 -79
  358. data/lib/resources/postgres_session.rb +72 -72
  359. data/lib/resources/powershell.rb +58 -58
  360. data/lib/resources/processes.rb +204 -204
  361. data/lib/resources/rabbitmq_conf.rb +53 -53
  362. data/lib/resources/registry_key.rb +296 -296
  363. data/lib/resources/security_policy.rb +181 -181
  364. data/lib/resources/service.rb +784 -784
  365. data/lib/resources/shadow.rb +141 -141
  366. data/lib/resources/ssh_conf.rb +102 -102
  367. data/lib/resources/ssl.rb +99 -99
  368. data/lib/resources/sys_info.rb +26 -26
  369. data/lib/resources/toml.rb +32 -32
  370. data/lib/resources/users.rb +652 -652
  371. data/lib/resources/vbscript.rb +70 -70
  372. data/lib/resources/virtualization.rb +251 -251
  373. data/lib/resources/windows_feature.rb +85 -85
  374. data/lib/resources/windows_hotfix.rb +35 -35
  375. data/lib/resources/windows_task.rb +106 -106
  376. data/lib/resources/wmi.rb +114 -114
  377. data/lib/resources/x509_certificate.rb +143 -143
  378. data/lib/resources/xinetd.rb +112 -112
  379. data/lib/resources/xml.rb +45 -45
  380. data/lib/resources/yaml.rb +45 -45
  381. data/lib/resources/yum.rb +181 -181
  382. data/lib/resources/zfs_dataset.rb +60 -60
  383. data/lib/resources/zfs_pool.rb +49 -49
  384. data/lib/source_readers/flat.rb +39 -39
  385. data/lib/source_readers/inspec.rb +75 -75
  386. data/lib/utils/command_wrapper.rb +27 -27
  387. data/lib/utils/convert.rb +12 -12
  388. data/lib/utils/database_helpers.rb +77 -77
  389. data/lib/utils/erlang_parser.rb +192 -192
  390. data/lib/utils/filter.rb +272 -272
  391. data/lib/utils/filter_array.rb +27 -27
  392. data/lib/utils/find_files.rb +44 -44
  393. data/lib/utils/hash.rb +41 -41
  394. data/lib/utils/json_log.rb +18 -18
  395. data/lib/utils/latest_version.rb +22 -22
  396. data/lib/utils/modulator.rb +12 -12
  397. data/lib/utils/nginx_parser.rb +85 -85
  398. data/lib/utils/object_traversal.rb +49 -49
  399. data/lib/utils/parser.rb +274 -274
  400. data/lib/utils/plugin_registry.rb +93 -93
  401. data/lib/utils/simpleconfig.rb +132 -132
  402. data/lib/utils/spdx.rb +13 -13
  403. data/lib/utils/spdx.txt +343 -343
  404. metadata +2 -2
@@ -1,150 +1,150 @@
1
- # encoding: utf-8
2
- # author: Christoph Hartmann
3
- # author: Dominik Richter
4
-
5
- # Verifies apt and ppa repositories
6
- #
7
- # Usage:
8
- # describe apt('ubuntu-wine/ppa') do
9
- # it { should exist }
10
- # it { should be_enabled }
11
- # end
12
- #
13
- # it also understands a ppa url
14
- # describe apt('ppa:ubuntu-wine/ppa') do
15
- # it { should exist }
16
- # it { should be_enabled }
17
- # end
18
- #
19
- # The following ppa formats are supported:
20
- # - ubuntu-wine/ppa
21
- # - ppa:ubuntu-wine/ppa
22
- # - http://ppa.launchpad.net/juju/stable/ubuntu
23
- #
24
- # Install a ppa as following:
25
- # apt-get install python-software-properties
26
- # apt-get install software-properties-common
27
- # add-apt-repository ppa:ubuntu-wine/ppa
28
-
29
- require 'uri'
30
-
31
- module Inspec::Resources
32
- class AptRepository < Inspec.resource(1)
33
- name 'apt'
34
- desc 'Use the apt InSpec audit resource to verify Apt repositories on the Debian and Ubuntu platforms, and also PPA repositories on the Ubuntu platform.'
35
- example "
36
- describe apt('nginx/stable') do
37
- it { should exist }
38
- it { should be_enabled }
39
- end
40
- "
41
-
42
- def initialize(ppa_name)
43
- @deb_url = nil
44
- # check if the os is ubuntu or debian
45
- if inspec.os.debian?
46
- @deb_url = determine_ppa_url(ppa_name)
47
- else
48
- # this resource is only supported on ubuntu and debian
49
- skip_resource 'The `apt` resource is not supported on your OS yet.'
50
- end
51
- end
52
-
53
- def exists?
54
- find_repo.count > 0
55
- end
56
-
57
- def enabled?
58
- return false if find_repo.count == 0
59
- actives = find_repo.map { |repo| repo[:active] }
60
- actives = actives.uniq
61
- actives.size == 1 && actives[0] = true
62
- end
63
-
64
- def to_s
65
- "Apt Repository #{@deb_url}"
66
- end
67
-
68
- private
69
-
70
- def find_repo
71
- read_debs.select { |repo| repo[:url] == @deb_url && repo[:type] == 'deb' }
72
- end
73
-
74
- HTTP_URL_RE = /\A#{URI::DEFAULT_PARSER.make_regexp(%w{http https})}\z/
75
-
76
- # read
77
- def read_debs
78
- return @repo_cache if defined?(@repo_cache)
79
-
80
- # load all lists
81
- cmd = inspec.command("find /etc/apt/ -name \*.list -exec sh -c 'cat {} || echo -n' \\;")
82
-
83
- # @see https://help.ubuntu.com/community/Repositories/CommandLine#Explanation_of_the_Repository_Format
84
- @repo_cache = cmd.stdout.chomp.split("\n").each_with_object([]) do |raw_line, lines|
85
- active = true
86
-
87
- # detect if the repo is commented out
88
- line = raw_line.gsub(/^(#\s*)*/, '')
89
- active = false if raw_line != line
90
-
91
- # eg.: deb http://archive.ubuntu.com/ubuntu/ wily main restricted
92
- # or : deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ wily main restricted
93
- parse_repo = /^\s*(\S+)\s+(?:\[\S+\])?\s*"?([^ "\t\r\n\f]+)"?\s+(\S+)\s+(.*)$/.match(line)
94
-
95
- # check if we got any result and the second param is an url
96
- next if parse_repo.nil? || !parse_repo[2] =~ HTTP_URL_RE
97
-
98
- # map data
99
- repo = {
100
- type: parse_repo[1],
101
- url: parse_repo[2],
102
- distro: parse_repo[3],
103
- components: parse_repo[4].chomp.split(' '),
104
- active: active,
105
- }
106
- next unless ['deb', 'deb-src'].include? repo[:type]
107
-
108
- lines.push(repo)
109
- end
110
- end
111
-
112
- # resolves ppa urls
113
- # @see http://bazaar.launchpad.net/~ubuntu-core-dev/software-properties/main/view/head:/softwareproperties/ppa.py
114
- def determine_ppa_url(ppa_url)
115
- # verify if we have the url already, then just return
116
- return ppa_url if ppa_url =~ HTTP_URL_RE
117
- # otherwise start generating the ppa url
118
-
119
- # special care if the name stats with :
120
- ppa_url = ppa_url.split(':')[1] if ppa_url.start_with?('ppa:')
121
-
122
- # parse ppa owner and repo
123
- ppa_owner, ppa_repo = ppa_url.split('/')
124
- ppa_repo = 'ppa' if ppa_repo.nil?
125
-
126
- # construct new ppa url and return it
127
- format('http://ppa.launchpad.net/%s/%s/ubuntu', ppa_owner, ppa_repo)
128
- end
129
- end
130
-
131
- # for compatability with serverspec
132
- # this is deprecated syntax and will be removed in future versions
133
- class PpaRepository < AptRepository
134
- name 'ppa'
135
-
136
- def exists?
137
- deprecated
138
- super()
139
- end
140
-
141
- def enabled?
142
- deprecated
143
- super()
144
- end
145
-
146
- def deprecated
147
- warn '[DEPRECATION] `ppa(reponame)` is deprecated. Please use `apt(reponame)` instead.'
148
- end
149
- end
150
- end
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ # Verifies apt and ppa repositories
6
+ #
7
+ # Usage:
8
+ # describe apt('ubuntu-wine/ppa') do
9
+ # it { should exist }
10
+ # it { should be_enabled }
11
+ # end
12
+ #
13
+ # it also understands a ppa url
14
+ # describe apt('ppa:ubuntu-wine/ppa') do
15
+ # it { should exist }
16
+ # it { should be_enabled }
17
+ # end
18
+ #
19
+ # The following ppa formats are supported:
20
+ # - ubuntu-wine/ppa
21
+ # - ppa:ubuntu-wine/ppa
22
+ # - http://ppa.launchpad.net/juju/stable/ubuntu
23
+ #
24
+ # Install a ppa as following:
25
+ # apt-get install python-software-properties
26
+ # apt-get install software-properties-common
27
+ # add-apt-repository ppa:ubuntu-wine/ppa
28
+
29
+ require 'uri'
30
+
31
+ module Inspec::Resources
32
+ class AptRepository < Inspec.resource(1)
33
+ name 'apt'
34
+ desc 'Use the apt InSpec audit resource to verify Apt repositories on the Debian and Ubuntu platforms, and also PPA repositories on the Ubuntu platform.'
35
+ example "
36
+ describe apt('nginx/stable') do
37
+ it { should exist }
38
+ it { should be_enabled }
39
+ end
40
+ "
41
+
42
+ def initialize(ppa_name)
43
+ @deb_url = nil
44
+ # check if the os is ubuntu or debian
45
+ if inspec.os.debian?
46
+ @deb_url = determine_ppa_url(ppa_name)
47
+ else
48
+ # this resource is only supported on ubuntu and debian
49
+ skip_resource 'The `apt` resource is not supported on your OS yet.'
50
+ end
51
+ end
52
+
53
+ def exists?
54
+ find_repo.count > 0
55
+ end
56
+
57
+ def enabled?
58
+ return false if find_repo.count == 0
59
+ actives = find_repo.map { |repo| repo[:active] }
60
+ actives = actives.uniq
61
+ actives.size == 1 && actives[0] = true
62
+ end
63
+
64
+ def to_s
65
+ "Apt Repository #{@deb_url}"
66
+ end
67
+
68
+ private
69
+
70
+ def find_repo
71
+ read_debs.select { |repo| repo[:url] == @deb_url && repo[:type] == 'deb' }
72
+ end
73
+
74
+ HTTP_URL_RE = /\A#{URI::DEFAULT_PARSER.make_regexp(%w{http https})}\z/
75
+
76
+ # read
77
+ def read_debs
78
+ return @repo_cache if defined?(@repo_cache)
79
+
80
+ # load all lists
81
+ cmd = inspec.command("find /etc/apt/ -name \*.list -exec sh -c 'cat {} || echo -n' \\;")
82
+
83
+ # @see https://help.ubuntu.com/community/Repositories/CommandLine#Explanation_of_the_Repository_Format
84
+ @repo_cache = cmd.stdout.chomp.split("\n").each_with_object([]) do |raw_line, lines|
85
+ active = true
86
+
87
+ # detect if the repo is commented out
88
+ line = raw_line.gsub(/^(#\s*)*/, '')
89
+ active = false if raw_line != line
90
+
91
+ # eg.: deb http://archive.ubuntu.com/ubuntu/ wily main restricted
92
+ # or : deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ wily main restricted
93
+ parse_repo = /^\s*(\S+)\s+(?:\[\S+\])?\s*"?([^ "\t\r\n\f]+)"?\s+(\S+)\s+(.*)$/.match(line)
94
+
95
+ # check if we got any result and the second param is an url
96
+ next if parse_repo.nil? || !parse_repo[2] =~ HTTP_URL_RE
97
+
98
+ # map data
99
+ repo = {
100
+ type: parse_repo[1],
101
+ url: parse_repo[2],
102
+ distro: parse_repo[3],
103
+ components: parse_repo[4].chomp.split(' '),
104
+ active: active,
105
+ }
106
+ next unless ['deb', 'deb-src'].include? repo[:type]
107
+
108
+ lines.push(repo)
109
+ end
110
+ end
111
+
112
+ # resolves ppa urls
113
+ # @see http://bazaar.launchpad.net/~ubuntu-core-dev/software-properties/main/view/head:/softwareproperties/ppa.py
114
+ def determine_ppa_url(ppa_url)
115
+ # verify if we have the url already, then just return
116
+ return ppa_url if ppa_url =~ HTTP_URL_RE
117
+ # otherwise start generating the ppa url
118
+
119
+ # special care if the name stats with :
120
+ ppa_url = ppa_url.split(':')[1] if ppa_url.start_with?('ppa:')
121
+
122
+ # parse ppa owner and repo
123
+ ppa_owner, ppa_repo = ppa_url.split('/')
124
+ ppa_repo = 'ppa' if ppa_repo.nil?
125
+
126
+ # construct new ppa url and return it
127
+ format('http://ppa.launchpad.net/%s/%s/ubuntu', ppa_owner, ppa_repo)
128
+ end
129
+ end
130
+
131
+ # for compatability with serverspec
132
+ # this is deprecated syntax and will be removed in future versions
133
+ class PpaRepository < AptRepository
134
+ name 'ppa'
135
+
136
+ def exists?
137
+ deprecated
138
+ super()
139
+ end
140
+
141
+ def enabled?
142
+ deprecated
143
+ super()
144
+ end
145
+
146
+ def deprecated
147
+ warn '[DEPRECATION] `ppa(reponame)` is deprecated. Please use `apt(reponame)` instead.'
148
+ end
149
+ end
150
+ end
@@ -1,64 +1,64 @@
1
- # encoding: utf-8
2
- # copyright: 2015, Vulcano Security GmbH
3
- # author: Christoph Hartmann
4
- # author: Dominik Richter
5
-
6
- # Advanced Auditing:
7
- # As soon as you start applying Advanced Audit Configuration Policy, legacy policies will be completely ignored.
8
- # reference: https://technet.microsoft.com/en-us/library/cc753632.aspx
9
- # use:
10
- # - list all categories: Auditpol /list /subcategory:* /r
11
- # - list parameters: Auditpol /get /category:"System" /subcategory:"IPsec Driver"
12
- # - list specific parameter: Auditpol /get /subcategory:"IPsec Driver"
13
- #
14
- # @link: http://blogs.technet.com/b/askds/archive/2011/03/11/getting-the-effective-audit-policy-in-windows-7-and-2008-r2.aspx
15
- #
16
- # Valid values are:
17
- #
18
- # - "No Auditing"
19
- # - "Not Specified"
20
- # - "Success"
21
- # - "Success and Failure"
22
- # - "Failure"
23
- #
24
- # Further information is available at: https://msdn.microsoft.com/en-us/library/dd973859.aspx
25
-
26
- module Inspec::Resources
27
- class AuditPolicy < Inspec.resource(1)
28
- name 'audit_policy'
29
- 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.'
30
- example "
31
- describe audit_policy do
32
- its('parameter') { should eq 'value' }
33
- end
34
- "
35
-
36
- def method_missing(method)
37
- key = method.to_s
38
-
39
- # expected result:
40
- # Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting
41
- # WIN-MB8NINQ388J,System,Kerberos Authentication Service,{0CCE9242-69AE-11D9-BED3-505054503030},No Auditing,
42
- result ||= inspec.command("Auditpol /get /subcategory:'#{key}' /r").stdout
43
-
44
- # find line
45
- target = nil
46
- result.each_line do |s|
47
- target = s.strip if s =~ /\b.*#{key}.*\b/
48
- end
49
-
50
- # extract value
51
- values = nil
52
- unless target.nil?
53
- # split csv values and return value
54
- values = target.split(',')[4]
55
- end
56
-
57
- values
58
- end
59
-
60
- def to_s
61
- 'Audit Policy'
62
- end
63
- end
64
- end
1
+ # encoding: utf-8
2
+ # copyright: 2015, Vulcano Security GmbH
3
+ # author: Christoph Hartmann
4
+ # author: Dominik Richter
5
+
6
+ # Advanced Auditing:
7
+ # As soon as you start applying Advanced Audit Configuration Policy, legacy policies will be completely ignored.
8
+ # reference: https://technet.microsoft.com/en-us/library/cc753632.aspx
9
+ # use:
10
+ # - list all categories: Auditpol /list /subcategory:* /r
11
+ # - list parameters: Auditpol /get /category:"System" /subcategory:"IPsec Driver"
12
+ # - list specific parameter: Auditpol /get /subcategory:"IPsec Driver"
13
+ #
14
+ # @link: http://blogs.technet.com/b/askds/archive/2011/03/11/getting-the-effective-audit-policy-in-windows-7-and-2008-r2.aspx
15
+ #
16
+ # Valid values are:
17
+ #
18
+ # - "No Auditing"
19
+ # - "Not Specified"
20
+ # - "Success"
21
+ # - "Success and Failure"
22
+ # - "Failure"
23
+ #
24
+ # Further information is available at: https://msdn.microsoft.com/en-us/library/dd973859.aspx
25
+
26
+ module Inspec::Resources
27
+ class AuditPolicy < Inspec.resource(1)
28
+ name 'audit_policy'
29
+ 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.'
30
+ example "
31
+ describe audit_policy do
32
+ its('parameter') { should eq 'value' }
33
+ end
34
+ "
35
+
36
+ def method_missing(method)
37
+ key = method.to_s
38
+
39
+ # expected result:
40
+ # Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting
41
+ # WIN-MB8NINQ388J,System,Kerberos Authentication Service,{0CCE9242-69AE-11D9-BED3-505054503030},No Auditing,
42
+ result ||= inspec.command("Auditpol /get /subcategory:'#{key}' /r").stdout
43
+
44
+ # find line
45
+ target = nil
46
+ result.each_line do |s|
47
+ target = s.strip if s =~ /\b.*#{key}.*\b/
48
+ end
49
+
50
+ # extract value
51
+ values = nil
52
+ unless target.nil?
53
+ # split csv values and return value
54
+ values = target.split(',')[4]
55
+ end
56
+
57
+ values
58
+ end
59
+
60
+ def to_s
61
+ 'Audit Policy'
62
+ end
63
+ end
64
+ end
@@ -1,233 +1,233 @@
1
- # encoding: utf-8
2
- # author: Christoph Hartmann
3
- # author: Dominik Richter
4
- # author: Jen Burns
5
-
6
- require 'forwardable'
7
- require 'utils/filter_array'
8
- require 'utils/filter'
9
- require 'utils/parser'
10
-
11
- module Inspec::Resources
12
- class AuditDaemon < Inspec.resource(1)
13
- extend Forwardable
14
- attr_accessor :lines
15
- attr_reader :params
16
-
17
- name 'auditd'
18
- 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.'
19
- example "
20
- describe auditd.syscall('chown').where {arch == 'b32'} do
21
- its('action') { should eq ['always'] }
22
- its('list') { should eq ['exit'] }
23
- end
24
-
25
- describe auditd.where {key == 'privileged'} do
26
- its('permissions') { should include ['x'] }
27
- end
28
-
29
- describe auditd do
30
- its('lines') { should include %r(-w /etc/ssh/sshd_config) }
31
- end
32
- "
33
-
34
- def initialize
35
- @content = inspec.command('/sbin/auditctl -l').stdout.chomp
36
- @params = []
37
-
38
- if @content =~ /^LIST_RULES:/
39
- return skip_resource 'The version of audit is outdated. The `auditd` resource supports versions of audit >= 2.3.'
40
- end
41
- parse_content
42
- end
43
-
44
- filter = FilterTable.create
45
- filter.add_accessor(:where)
46
- .add_accessor(:entries)
47
- .add(:file, field: 'file')
48
- .add(:list, field: 'list')
49
- .add(:action, field: 'action')
50
- .add(:fields, field: 'fields')
51
- .add(:fields_nokey, field: 'fields_nokey')
52
- .add(:syscall, field: 'syscall')
53
- .add(:key, field: 'key')
54
- .add(:arch, field: 'arch')
55
- .add(:path, field: 'path')
56
- .add(:permissions, field: 'permissions')
57
- .add(:exit, field: 'exit')
58
-
59
- filter.connect(self, :params)
60
-
61
- def status(name = nil)
62
- @status_content ||= inspec.command('/sbin/auditctl -s').stdout.chomp
63
- @status_params ||= Hash[@status_content.scan(/^([^ ]+) (.*)$/)]
64
-
65
- return @status_params[name] if name
66
- @status_params
67
- end
68
-
69
- def parse_content
70
- @lines = @content.lines.map(&:chomp)
71
-
72
- lines.each do |line|
73
- if is_file_syscall_syntax?(line)
74
- file_syscall_syntax_rules_for(line)
75
- end
76
-
77
- if is_syscall?(line)
78
- syscall_rules_for(line)
79
-
80
- elsif is_file?(line)
81
- file_rules_for(line)
82
- end
83
- end
84
- end
85
-
86
- def file_syscall_syntax_rules_for(line)
87
- file = file_syscall_syntax_for(line)
88
- action, list = action_list_for(line)
89
- fields = rule_fields_for(line)
90
- key_field, fields_nokey = remove_key_from(fields)
91
- key = key_in(key_field.join(''))
92
- perms = perms_in(fields)
93
-
94
- @params.push(
95
- {
96
- 'file' => file,
97
- 'list' => list,
98
- 'action' => action,
99
- 'fields' => fields,
100
- 'permissions' => perms,
101
- 'key' => key,
102
- 'fields_nokey' => fields_nokey,
103
- },
104
- )
105
- end
106
-
107
- def syscall_rules_for(line)
108
- syscalls = syscalls_for(line)
109
- action, list = action_list_for(line)
110
- fields = rule_fields_for(line)
111
- key_field, fields_nokey = remove_key_from(fields)
112
- key = key_in(key_field.join(''))
113
- arch = arch_in(fields)
114
- path = path_in(fields)
115
- perms = perms_in(fields)
116
- exit_field = exit_in(fields)
117
-
118
- syscalls.each do |s|
119
- @params.push(
120
- {
121
- 'syscall' => s,
122
- 'list' => list,
123
- 'action' => action,
124
- 'fields' => fields,
125
- 'key' => key,
126
- 'arch' => arch,
127
- 'path' => path,
128
- 'permissions' => perms,
129
- 'exit' => exit_field,
130
- 'fields_nokey' => fields_nokey,
131
- },
132
- )
133
- end
134
- end
135
-
136
- def file_rules_for(line)
137
- file = file_for(line)
138
- perms = permissions_for(line)
139
- key = key_for(line)
140
-
141
- @params.push(
142
- {
143
- 'file' => file,
144
- 'key' => key,
145
- 'permissions' => perms,
146
- },
147
- )
148
- end
149
-
150
- def to_s
151
- 'Auditd Rules'
152
- end
153
-
154
- private
155
-
156
- def is_syscall?(line)
157
- line.match(/-S /)
158
- end
159
-
160
- def is_file?(line)
161
- line.match(/-w /)
162
- end
163
-
164
- def is_file_syscall_syntax?(line)
165
- line.match(/-F path=/)
166
- end
167
-
168
- def syscalls_for(line)
169
- line.scan(/-S ([^ ]+)\s?/).flatten.first.split(',')
170
- end
171
-
172
- def action_list_for(line)
173
- line.scan(/-a ([^,]+),([^ ]+)\s?/).flatten
174
- end
175
-
176
- def key_for(line)
177
- line.match(/-k ([^ ]+)\s?/)[1] if line.include?('-k ')
178
- end
179
-
180
- def file_for(line)
181
- line.match(/-w ([^ ]+)\s?/)[1]
182
- end
183
-
184
- def file_syscall_syntax_for(line)
185
- line.match(/-F path=(\S+)\s?/)[1]
186
- end
187
-
188
- def permissions_for(line)
189
- line.match(/-p ([^ ]+)/)[1].scan(/\w/)
190
- end
191
-
192
- def rule_fields_for(line)
193
- line.gsub(/-[aS] [^ ]+ /, '').split('-F ').map { |l| l.split(' ') }.flatten
194
- end
195
-
196
- def arch_in(fields)
197
- fields.each do |field|
198
- return field.match(/arch=(\S+)\s?/)[1] if field.start_with?('arch=')
199
- end
200
- nil
201
- end
202
-
203
- def perms_in(fields)
204
- fields.each do |field|
205
- return field.match(/perm=(\S+)\s?/)[1].scan(/\w/) if field.start_with?('perm=')
206
- end
207
- nil
208
- end
209
-
210
- def path_in(fields)
211
- fields.each do |field|
212
- return field.match(/path=(\S+)\s?/)[1] if field.start_with?('path=')
213
- end
214
- nil
215
- end
216
-
217
- def exit_in(fields)
218
- fields.each do |field|
219
- return field.match(/exit=(\S+)\s?/)[1] if field.start_with?('exit=')
220
- end
221
- nil
222
- end
223
-
224
- def key_in(field)
225
- _, v = field.split('=')
226
- v
227
- end
228
-
229
- def remove_key_from(fields)
230
- fields.partition { |x| x.start_with? 'key' }
231
- end
232
- end
233
- end
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+ # author: Jen Burns
5
+
6
+ require 'forwardable'
7
+ require 'utils/filter_array'
8
+ require 'utils/filter'
9
+ require 'utils/parser'
10
+
11
+ module Inspec::Resources
12
+ class AuditDaemon < Inspec.resource(1)
13
+ extend Forwardable
14
+ attr_accessor :lines
15
+ attr_reader :params
16
+
17
+ name 'auditd'
18
+ 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.'
19
+ example "
20
+ describe auditd.syscall('chown').where {arch == 'b32'} do
21
+ its('action') { should eq ['always'] }
22
+ its('list') { should eq ['exit'] }
23
+ end
24
+
25
+ describe auditd.where {key == 'privileged'} do
26
+ its('permissions') { should include ['x'] }
27
+ end
28
+
29
+ describe auditd do
30
+ its('lines') { should include %r(-w /etc/ssh/sshd_config) }
31
+ end
32
+ "
33
+
34
+ def initialize
35
+ @content = inspec.command('/sbin/auditctl -l').stdout.chomp
36
+ @params = []
37
+
38
+ if @content =~ /^LIST_RULES:/
39
+ return skip_resource 'The version of audit is outdated. The `auditd` resource supports versions of audit >= 2.3.'
40
+ end
41
+ parse_content
42
+ end
43
+
44
+ filter = FilterTable.create
45
+ filter.add_accessor(:where)
46
+ .add_accessor(:entries)
47
+ .add(:file, field: 'file')
48
+ .add(:list, field: 'list')
49
+ .add(:action, field: 'action')
50
+ .add(:fields, field: 'fields')
51
+ .add(:fields_nokey, field: 'fields_nokey')
52
+ .add(:syscall, field: 'syscall')
53
+ .add(:key, field: 'key')
54
+ .add(:arch, field: 'arch')
55
+ .add(:path, field: 'path')
56
+ .add(:permissions, field: 'permissions')
57
+ .add(:exit, field: 'exit')
58
+
59
+ filter.connect(self, :params)
60
+
61
+ def status(name = nil)
62
+ @status_content ||= inspec.command('/sbin/auditctl -s').stdout.chomp
63
+ @status_params ||= Hash[@status_content.scan(/^([^ ]+) (.*)$/)]
64
+
65
+ return @status_params[name] if name
66
+ @status_params
67
+ end
68
+
69
+ def parse_content
70
+ @lines = @content.lines.map(&:chomp)
71
+
72
+ lines.each do |line|
73
+ if is_file_syscall_syntax?(line)
74
+ file_syscall_syntax_rules_for(line)
75
+ end
76
+
77
+ if is_syscall?(line)
78
+ syscall_rules_for(line)
79
+
80
+ elsif is_file?(line)
81
+ file_rules_for(line)
82
+ end
83
+ end
84
+ end
85
+
86
+ def file_syscall_syntax_rules_for(line)
87
+ file = file_syscall_syntax_for(line)
88
+ action, list = action_list_for(line)
89
+ fields = rule_fields_for(line)
90
+ key_field, fields_nokey = remove_key_from(fields)
91
+ key = key_in(key_field.join(''))
92
+ perms = perms_in(fields)
93
+
94
+ @params.push(
95
+ {
96
+ 'file' => file,
97
+ 'list' => list,
98
+ 'action' => action,
99
+ 'fields' => fields,
100
+ 'permissions' => perms,
101
+ 'key' => key,
102
+ 'fields_nokey' => fields_nokey,
103
+ },
104
+ )
105
+ end
106
+
107
+ def syscall_rules_for(line)
108
+ syscalls = syscalls_for(line)
109
+ action, list = action_list_for(line)
110
+ fields = rule_fields_for(line)
111
+ key_field, fields_nokey = remove_key_from(fields)
112
+ key = key_in(key_field.join(''))
113
+ arch = arch_in(fields)
114
+ path = path_in(fields)
115
+ perms = perms_in(fields)
116
+ exit_field = exit_in(fields)
117
+
118
+ syscalls.each do |s|
119
+ @params.push(
120
+ {
121
+ 'syscall' => s,
122
+ 'list' => list,
123
+ 'action' => action,
124
+ 'fields' => fields,
125
+ 'key' => key,
126
+ 'arch' => arch,
127
+ 'path' => path,
128
+ 'permissions' => perms,
129
+ 'exit' => exit_field,
130
+ 'fields_nokey' => fields_nokey,
131
+ },
132
+ )
133
+ end
134
+ end
135
+
136
+ def file_rules_for(line)
137
+ file = file_for(line)
138
+ perms = permissions_for(line)
139
+ key = key_for(line)
140
+
141
+ @params.push(
142
+ {
143
+ 'file' => file,
144
+ 'key' => key,
145
+ 'permissions' => perms,
146
+ },
147
+ )
148
+ end
149
+
150
+ def to_s
151
+ 'Auditd Rules'
152
+ end
153
+
154
+ private
155
+
156
+ def is_syscall?(line)
157
+ line.match(/-S /)
158
+ end
159
+
160
+ def is_file?(line)
161
+ line.match(/-w /)
162
+ end
163
+
164
+ def is_file_syscall_syntax?(line)
165
+ line.match(/-F path=/)
166
+ end
167
+
168
+ def syscalls_for(line)
169
+ line.scan(/-S ([^ ]+)\s?/).flatten.first.split(',')
170
+ end
171
+
172
+ def action_list_for(line)
173
+ line.scan(/-a ([^,]+),([^ ]+)\s?/).flatten
174
+ end
175
+
176
+ def key_for(line)
177
+ line.match(/-k ([^ ]+)\s?/)[1] if line.include?('-k ')
178
+ end
179
+
180
+ def file_for(line)
181
+ line.match(/-w ([^ ]+)\s?/)[1]
182
+ end
183
+
184
+ def file_syscall_syntax_for(line)
185
+ line.match(/-F path=(\S+)\s?/)[1]
186
+ end
187
+
188
+ def permissions_for(line)
189
+ line.match(/-p ([^ ]+)/)[1].scan(/\w/)
190
+ end
191
+
192
+ def rule_fields_for(line)
193
+ line.gsub(/-[aS] [^ ]+ /, '').split('-F ').map { |l| l.split(' ') }.flatten
194
+ end
195
+
196
+ def arch_in(fields)
197
+ fields.each do |field|
198
+ return field.match(/arch=(\S+)\s?/)[1] if field.start_with?('arch=')
199
+ end
200
+ nil
201
+ end
202
+
203
+ def perms_in(fields)
204
+ fields.each do |field|
205
+ return field.match(/perm=(\S+)\s?/)[1].scan(/\w/) if field.start_with?('perm=')
206
+ end
207
+ nil
208
+ end
209
+
210
+ def path_in(fields)
211
+ fields.each do |field|
212
+ return field.match(/path=(\S+)\s?/)[1] if field.start_with?('path=')
213
+ end
214
+ nil
215
+ end
216
+
217
+ def exit_in(fields)
218
+ fields.each do |field|
219
+ return field.match(/exit=(\S+)\s?/)[1] if field.start_with?('exit=')
220
+ end
221
+ nil
222
+ end
223
+
224
+ def key_in(field)
225
+ _, v = field.split('=')
226
+ v
227
+ end
228
+
229
+ def remove_key_from(fields)
230
+ fields.partition { |x| x.start_with? 'key' }
231
+ end
232
+ end
233
+ end