inspec 2.1.0 → 2.1.10

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 (489) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +101 -101
  3. data/CHANGELOG.md +3024 -3004
  4. data/Gemfile +55 -55
  5. data/LICENSE +14 -14
  6. data/MAINTAINERS.md +33 -33
  7. data/MAINTAINERS.toml +52 -52
  8. data/README.md +447 -446
  9. data/Rakefile +322 -322
  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 +100 -93
  15. data/docs/glossary.md +99 -99
  16. data/docs/habitat.md +191 -191
  17. data/docs/inspec_and_friends.md +114 -114
  18. data/docs/matchers.md +169 -169
  19. data/docs/migration.md +293 -293
  20. data/docs/platforms.md +118 -118
  21. data/docs/plugin_kitchen_inspec.md +50 -50
  22. data/docs/profiles.md +376 -376
  23. data/docs/reporters.md +105 -105
  24. data/docs/resources/aide_conf.md.erb +75 -75
  25. data/docs/resources/apache.md.erb +67 -67
  26. data/docs/resources/apache_conf.md.erb +68 -68
  27. data/docs/resources/apt.md.erb +71 -71
  28. data/docs/resources/audit_policy.md.erb +47 -47
  29. data/docs/resources/auditd.md.erb +79 -79
  30. data/docs/resources/auditd_conf.md.erb +68 -68
  31. data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
  32. data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
  33. data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
  34. data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
  35. data/docs/resources/aws_config_recorder.md.erb +71 -71
  36. data/docs/resources/aws_ec2_instance.md.erb +106 -106
  37. data/docs/resources/aws_iam_access_key.md.erb +123 -123
  38. data/docs/resources/aws_iam_access_keys.md.erb +198 -198
  39. data/docs/resources/aws_iam_group.md.erb +46 -46
  40. data/docs/resources/aws_iam_groups.md.erb +43 -43
  41. data/docs/resources/aws_iam_password_policy.md.erb +76 -76
  42. data/docs/resources/aws_iam_policies.md.erb +82 -82
  43. data/docs/resources/aws_iam_policy.md.erb +144 -144
  44. data/docs/resources/aws_iam_role.md.erb +63 -63
  45. data/docs/resources/aws_iam_root_user.md.erb +58 -58
  46. data/docs/resources/aws_iam_user.md.erb +64 -64
  47. data/docs/resources/aws_iam_users.md.erb +89 -89
  48. data/docs/resources/aws_kms_keys.md.erb +84 -84
  49. data/docs/resources/aws_route_table.md.erb +47 -47
  50. data/docs/resources/aws_s3_bucket.md.erb +134 -134
  51. data/docs/resources/aws_s3_bucket_object.md.erb +83 -0
  52. data/docs/resources/aws_security_group.md.erb +151 -151
  53. data/docs/resources/aws_security_groups.md.erb +91 -91
  54. data/docs/resources/aws_sns_subscription.md.erb +125 -0
  55. data/docs/resources/aws_sns_topic.md.erb +63 -63
  56. data/docs/resources/aws_sns_topics.md.erb +52 -0
  57. data/docs/resources/aws_subnet.md.erb +134 -134
  58. data/docs/resources/aws_subnets.md.erb +126 -126
  59. data/docs/resources/aws_vpc.md.erb +120 -120
  60. data/docs/resources/aws_vpcs.md.erb +48 -48
  61. data/docs/resources/azure_generic_resource.md.erb +171 -171
  62. data/docs/resources/azure_resource_group.md.erb +284 -284
  63. data/docs/resources/azure_virtual_machine.md.erb +347 -347
  64. data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
  65. data/docs/resources/bash.md.erb +75 -75
  66. data/docs/resources/bond.md.erb +90 -90
  67. data/docs/resources/bridge.md.erb +57 -57
  68. data/docs/resources/bsd_service.md.erb +67 -67
  69. data/docs/resources/command.md.erb +138 -138
  70. data/docs/resources/cpan.md.erb +79 -79
  71. data/docs/resources/cran.md.erb +64 -64
  72. data/docs/resources/crontab.md.erb +89 -89
  73. data/docs/resources/csv.md.erb +54 -54
  74. data/docs/resources/dh_params.md.erb +205 -205
  75. data/docs/resources/directory.md.erb +30 -30
  76. data/docs/resources/docker.md.erb +219 -219
  77. data/docs/resources/docker_container.md.erb +103 -103
  78. data/docs/resources/docker_image.md.erb +94 -94
  79. data/docs/resources/docker_service.md.erb +114 -114
  80. data/docs/resources/elasticsearch.md.erb +242 -242
  81. data/docs/resources/etc_fstab.md.erb +125 -125
  82. data/docs/resources/etc_group.md.erb +75 -75
  83. data/docs/resources/etc_hosts.md.erb +78 -78
  84. data/docs/resources/etc_hosts_allow.md.erb +74 -74
  85. data/docs/resources/etc_hosts_deny.md.erb +74 -74
  86. data/docs/resources/file.md.erb +526 -526
  87. data/docs/resources/filesystem.md.erb +41 -41
  88. data/docs/resources/firewalld.md.erb +107 -107
  89. data/docs/resources/gem.md.erb +79 -79
  90. data/docs/resources/group.md.erb +61 -61
  91. data/docs/resources/grub_conf.md.erb +101 -101
  92. data/docs/resources/host.md.erb +86 -86
  93. data/docs/resources/http.md.erb +196 -196
  94. data/docs/resources/iis_app.md.erb +122 -122
  95. data/docs/resources/iis_site.md.erb +135 -135
  96. data/docs/resources/inetd_conf.md.erb +94 -94
  97. data/docs/resources/ini.md.erb +76 -76
  98. data/docs/resources/interface.md.erb +58 -58
  99. data/docs/resources/iptables.md.erb +64 -64
  100. data/docs/resources/json.md.erb +63 -63
  101. data/docs/resources/kernel_module.md.erb +120 -120
  102. data/docs/resources/kernel_parameter.md.erb +53 -53
  103. data/docs/resources/key_rsa.md.erb +85 -85
  104. data/docs/resources/launchd_service.md.erb +57 -57
  105. data/docs/resources/limits_conf.md.erb +75 -75
  106. data/docs/resources/{login_def.md.erb → login_defs.md.erb} +71 -71
  107. data/docs/resources/mount.md.erb +69 -69
  108. data/docs/resources/mssql_session.md.erb +60 -60
  109. data/docs/resources/mysql_conf.md.erb +99 -99
  110. data/docs/resources/mysql_session.md.erb +74 -74
  111. data/docs/resources/nginx.md.erb +79 -79
  112. data/docs/resources/nginx_conf.md.erb +138 -128
  113. data/docs/resources/npm.md.erb +60 -60
  114. data/docs/resources/ntp_conf.md.erb +60 -60
  115. data/docs/resources/oneget.md.erb +53 -53
  116. data/docs/resources/oracledb_session.md.erb +52 -52
  117. data/docs/resources/os.md.erb +141 -141
  118. data/docs/resources/os_env.md.erb +78 -78
  119. data/docs/resources/package.md.erb +120 -120
  120. data/docs/resources/packages.md.erb +67 -67
  121. data/docs/resources/parse_config.md.erb +103 -103
  122. data/docs/resources/parse_config_file.md.erb +138 -138
  123. data/docs/resources/passwd.md.erb +141 -141
  124. data/docs/resources/pip.md.erb +67 -67
  125. data/docs/resources/port.md.erb +137 -137
  126. data/docs/resources/postgres_conf.md.erb +79 -79
  127. data/docs/resources/postgres_hba_conf.md.erb +93 -93
  128. data/docs/resources/postgres_ident_conf.md.erb +76 -76
  129. data/docs/resources/postgres_session.md.erb +69 -69
  130. data/docs/resources/powershell.md.erb +102 -102
  131. data/docs/resources/processes.md.erb +109 -109
  132. data/docs/resources/rabbitmq_config.md.erb +41 -41
  133. data/docs/resources/registry_key.md.erb +158 -158
  134. data/docs/resources/runit_service.md.erb +57 -57
  135. data/docs/resources/security_policy.md.erb +47 -47
  136. data/docs/resources/service.md.erb +121 -121
  137. data/docs/resources/shadow.md.erb +146 -146
  138. data/docs/resources/ssh_config.md.erb +73 -80
  139. data/docs/resources/sshd_config.md.erb +83 -83
  140. data/docs/resources/ssl.md.erb +119 -119
  141. data/docs/resources/sys_info.md.erb +42 -42
  142. data/docs/resources/systemd_service.md.erb +57 -57
  143. data/docs/resources/sysv_service.md.erb +57 -57
  144. data/docs/resources/upstart_service.md.erb +57 -57
  145. data/docs/resources/user.md.erb +140 -140
  146. data/docs/resources/users.md.erb +127 -127
  147. data/docs/resources/vbscript.md.erb +55 -55
  148. data/docs/resources/virtualization.md.erb +57 -57
  149. data/docs/resources/windows_feature.md.erb +47 -47
  150. data/docs/resources/windows_hotfix.md.erb +53 -53
  151. data/docs/resources/windows_task.md.erb +95 -95
  152. data/docs/resources/wmi.md.erb +81 -81
  153. data/docs/resources/x509_certificate.md.erb +151 -151
  154. data/docs/resources/xinetd_conf.md.erb +156 -156
  155. data/docs/resources/xml.md.erb +85 -85
  156. data/docs/resources/yaml.md.erb +69 -69
  157. data/docs/resources/yum.md.erb +98 -98
  158. data/docs/resources/zfs_dataset.md.erb +53 -53
  159. data/docs/resources/zfs_pool.md.erb +47 -47
  160. data/docs/ruby_usage.md +203 -203
  161. data/docs/shared/matcher_be.md.erb +1 -1
  162. data/docs/shared/matcher_cmp.md.erb +43 -43
  163. data/docs/shared/matcher_eq.md.erb +3 -3
  164. data/docs/shared/matcher_include.md.erb +1 -1
  165. data/docs/shared/matcher_match.md.erb +1 -1
  166. data/docs/shell.md +217 -217
  167. data/examples/README.md +8 -8
  168. data/examples/inheritance/README.md +65 -65
  169. data/examples/inheritance/controls/example.rb +14 -14
  170. data/examples/inheritance/inspec.yml +15 -15
  171. data/examples/kitchen-ansible/.kitchen.yml +25 -25
  172. data/examples/kitchen-ansible/Gemfile +19 -19
  173. data/examples/kitchen-ansible/README.md +53 -53
  174. data/examples/kitchen-ansible/files/nginx.repo +6 -6
  175. data/examples/kitchen-ansible/tasks/main.yml +16 -16
  176. data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
  177. data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
  178. data/examples/kitchen-chef/.kitchen.yml +20 -20
  179. data/examples/kitchen-chef/Berksfile +3 -3
  180. data/examples/kitchen-chef/Gemfile +19 -19
  181. data/examples/kitchen-chef/README.md +27 -27
  182. data/examples/kitchen-chef/metadata.rb +7 -7
  183. data/examples/kitchen-chef/recipes/default.rb +6 -6
  184. data/examples/kitchen-chef/recipes/nginx.rb +30 -30
  185. data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
  186. data/examples/kitchen-puppet/.kitchen.yml +22 -22
  187. data/examples/kitchen-puppet/Gemfile +20 -20
  188. data/examples/kitchen-puppet/Puppetfile +25 -25
  189. data/examples/kitchen-puppet/README.md +53 -53
  190. data/examples/kitchen-puppet/manifests/site.pp +33 -33
  191. data/examples/kitchen-puppet/metadata.json +11 -11
  192. data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
  193. data/examples/meta-profile/README.md +37 -37
  194. data/examples/meta-profile/controls/example.rb +13 -13
  195. data/examples/meta-profile/inspec.yml +13 -13
  196. data/examples/profile-attribute.yml +2 -2
  197. data/examples/profile-attribute/README.md +14 -14
  198. data/examples/profile-attribute/controls/example.rb +11 -11
  199. data/examples/profile-attribute/inspec.yml +8 -8
  200. data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
  201. data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
  202. data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
  203. data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
  204. data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
  205. data/examples/profile-aws/inspec.yml +11 -11
  206. data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
  207. data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
  208. data/examples/profile-azure/inspec.yml +11 -11
  209. data/examples/profile-sensitive/README.md +29 -29
  210. data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
  211. data/examples/profile-sensitive/controls/sensitive.rb +9 -9
  212. data/examples/profile-sensitive/inspec.yml +8 -8
  213. data/examples/profile/README.md +48 -48
  214. data/examples/profile/controls/example.rb +23 -23
  215. data/examples/profile/controls/gordon.rb +36 -36
  216. data/examples/profile/controls/meta.rb +34 -34
  217. data/examples/profile/inspec.yml +10 -10
  218. data/examples/profile/libraries/gordon_config.rb +53 -53
  219. data/inspec.gemspec +47 -47
  220. data/lib/bundles/README.md +3 -3
  221. data/lib/bundles/inspec-artifact.rb +7 -7
  222. data/lib/bundles/inspec-artifact/README.md +1 -1
  223. data/lib/bundles/inspec-artifact/cli.rb +277 -277
  224. data/lib/bundles/inspec-compliance.rb +16 -16
  225. data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
  226. data/lib/bundles/inspec-compliance/README.md +185 -185
  227. data/lib/bundles/inspec-compliance/api.rb +316 -316
  228. data/lib/bundles/inspec-compliance/api/login.rb +152 -152
  229. data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
  230. data/lib/bundles/inspec-compliance/cli.rb +254 -254
  231. data/lib/bundles/inspec-compliance/configuration.rb +103 -103
  232. data/lib/bundles/inspec-compliance/http.rb +86 -86
  233. data/lib/bundles/inspec-compliance/support.rb +36 -36
  234. data/lib/bundles/inspec-compliance/target.rb +98 -98
  235. data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
  236. data/lib/bundles/inspec-habitat.rb +12 -12
  237. data/lib/bundles/inspec-habitat/cli.rb +36 -36
  238. data/lib/bundles/inspec-habitat/log.rb +10 -10
  239. data/lib/bundles/inspec-habitat/profile.rb +390 -390
  240. data/lib/bundles/inspec-init.rb +8 -8
  241. data/lib/bundles/inspec-init/README.md +31 -31
  242. data/lib/bundles/inspec-init/cli.rb +97 -97
  243. data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
  244. data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
  245. data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
  246. data/lib/bundles/inspec-supermarket.rb +13 -13
  247. data/lib/bundles/inspec-supermarket/README.md +45 -45
  248. data/lib/bundles/inspec-supermarket/api.rb +84 -84
  249. data/lib/bundles/inspec-supermarket/cli.rb +73 -73
  250. data/lib/bundles/inspec-supermarket/target.rb +34 -34
  251. data/lib/fetchers/git.rb +163 -163
  252. data/lib/fetchers/local.rb +74 -74
  253. data/lib/fetchers/mock.rb +35 -35
  254. data/lib/fetchers/url.rb +204 -204
  255. data/lib/inspec.rb +24 -24
  256. data/lib/inspec/archive/tar.rb +29 -29
  257. data/lib/inspec/archive/zip.rb +19 -19
  258. data/lib/inspec/backend.rb +93 -93
  259. data/lib/inspec/base_cli.rb +357 -355
  260. data/lib/inspec/cached_fetcher.rb +66 -66
  261. data/lib/inspec/cli.rb +292 -292
  262. data/lib/inspec/completions/bash.sh.erb +45 -45
  263. data/lib/inspec/completions/fish.sh.erb +34 -34
  264. data/lib/inspec/completions/zsh.sh.erb +61 -61
  265. data/lib/inspec/control_eval_context.rb +179 -179
  266. data/lib/inspec/dependencies/cache.rb +72 -72
  267. data/lib/inspec/dependencies/dependency_set.rb +92 -92
  268. data/lib/inspec/dependencies/lockfile.rb +115 -115
  269. data/lib/inspec/dependencies/requirement.rb +123 -123
  270. data/lib/inspec/dependencies/resolver.rb +86 -86
  271. data/lib/inspec/describe.rb +27 -27
  272. data/lib/inspec/dsl.rb +66 -66
  273. data/lib/inspec/dsl_shared.rb +33 -33
  274. data/lib/inspec/env_printer.rb +157 -157
  275. data/lib/inspec/errors.rb +13 -13
  276. data/lib/inspec/exceptions.rb +12 -12
  277. data/lib/inspec/expect.rb +45 -45
  278. data/lib/inspec/fetcher.rb +45 -45
  279. data/lib/inspec/file_provider.rb +275 -275
  280. data/lib/inspec/formatters.rb +3 -3
  281. data/lib/inspec/formatters/base.rb +250 -250
  282. data/lib/inspec/formatters/json_rspec.rb +20 -20
  283. data/lib/inspec/formatters/show_progress.rb +12 -12
  284. data/lib/inspec/library_eval_context.rb +58 -58
  285. data/lib/inspec/log.rb +11 -11
  286. data/lib/inspec/metadata.rb +247 -247
  287. data/lib/inspec/method_source.rb +24 -24
  288. data/lib/inspec/objects.rb +14 -14
  289. data/lib/inspec/objects/attribute.rb +65 -65
  290. data/lib/inspec/objects/control.rb +61 -61
  291. data/lib/inspec/objects/describe.rb +92 -92
  292. data/lib/inspec/objects/each_loop.rb +36 -36
  293. data/lib/inspec/objects/list.rb +15 -15
  294. data/lib/inspec/objects/or_test.rb +40 -40
  295. data/lib/inspec/objects/ruby_helper.rb +15 -15
  296. data/lib/inspec/objects/tag.rb +27 -27
  297. data/lib/inspec/objects/test.rb +87 -87
  298. data/lib/inspec/objects/value.rb +27 -27
  299. data/lib/inspec/plugins.rb +60 -60
  300. data/lib/inspec/plugins/cli.rb +24 -24
  301. data/lib/inspec/plugins/fetcher.rb +86 -86
  302. data/lib/inspec/plugins/resource.rb +135 -135
  303. data/lib/inspec/plugins/secret.rb +15 -15
  304. data/lib/inspec/plugins/source_reader.rb +40 -40
  305. data/lib/inspec/polyfill.rb +12 -12
  306. data/lib/inspec/profile.rb +510 -510
  307. data/lib/inspec/profile_context.rb +207 -207
  308. data/lib/inspec/profile_vendor.rb +66 -66
  309. data/lib/inspec/reporters.rb +54 -54
  310. data/lib/inspec/reporters/base.rb +24 -24
  311. data/lib/inspec/reporters/cli.rb +356 -356
  312. data/lib/inspec/reporters/json.rb +116 -116
  313. data/lib/inspec/reporters/json_min.rb +48 -48
  314. data/lib/inspec/reporters/junit.rb +77 -77
  315. data/lib/inspec/require_loader.rb +33 -33
  316. data/lib/inspec/resource.rb +186 -186
  317. data/lib/inspec/rule.rb +266 -266
  318. data/lib/inspec/runner.rb +345 -345
  319. data/lib/inspec/runner_mock.rb +41 -41
  320. data/lib/inspec/runner_rspec.rb +175 -175
  321. data/lib/inspec/runtime_profile.rb +26 -26
  322. data/lib/inspec/schema.rb +213 -213
  323. data/lib/inspec/secrets.rb +19 -19
  324. data/lib/inspec/secrets/yaml.rb +30 -30
  325. data/lib/inspec/shell.rb +220 -220
  326. data/lib/inspec/shell_detector.rb +90 -90
  327. data/lib/inspec/source_reader.rb +29 -29
  328. data/lib/inspec/version.rb +8 -8
  329. data/lib/matchers/matchers.rb +339 -339
  330. data/lib/resource_support/aws.rb +44 -41
  331. data/lib/resource_support/aws/aws_backend_base.rb +12 -12
  332. data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
  333. data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
  334. data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
  335. data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
  336. data/lib/resources/aide_conf.rb +151 -159
  337. data/lib/resources/apache.rb +48 -48
  338. data/lib/resources/apache_conf.rb +149 -156
  339. data/lib/resources/apt.rb +149 -149
  340. data/lib/resources/audit_policy.rb +63 -63
  341. data/lib/resources/auditd.rb +231 -231
  342. data/lib/resources/auditd_conf.rb +46 -55
  343. data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
  344. data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
  345. data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
  346. data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
  347. data/lib/resources/aws/aws_config_recorder.rb +98 -98
  348. data/lib/resources/aws/aws_ec2_instance.rb +157 -157
  349. data/lib/resources/aws/aws_iam_access_key.rb +106 -106
  350. data/lib/resources/aws/aws_iam_access_keys.rb +149 -149
  351. data/lib/resources/aws/aws_iam_group.rb +56 -56
  352. data/lib/resources/aws/aws_iam_groups.rb +52 -52
  353. data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
  354. data/lib/resources/aws/aws_iam_policies.rb +53 -53
  355. data/lib/resources/aws/aws_iam_policy.rb +125 -125
  356. data/lib/resources/aws/aws_iam_role.rb +51 -51
  357. data/lib/resources/aws/aws_iam_root_user.rb +60 -60
  358. data/lib/resources/aws/aws_iam_user.rb +111 -111
  359. data/lib/resources/aws/aws_iam_users.rb +108 -108
  360. data/lib/resources/aws/aws_kms_keys.rb +53 -53
  361. data/lib/resources/aws/aws_route_table.rb +61 -61
  362. data/lib/resources/aws/aws_s3_bucket.rb +115 -115
  363. data/lib/resources/aws/aws_s3_bucket_object.rb +82 -0
  364. data/lib/resources/aws/aws_security_group.rb +93 -93
  365. data/lib/resources/aws/aws_security_groups.rb +68 -68
  366. data/lib/resources/aws/aws_sns_subscription.rb +78 -0
  367. data/lib/resources/aws/aws_sns_topic.rb +53 -53
  368. data/lib/resources/aws/aws_sns_topics.rb +56 -0
  369. data/lib/resources/aws/aws_subnet.rb +88 -88
  370. data/lib/resources/aws/aws_subnets.rb +53 -53
  371. data/lib/resources/aws/aws_vpc.rb +69 -69
  372. data/lib/resources/aws/aws_vpcs.rb +45 -45
  373. data/lib/resources/azure/azure_backend.rb +377 -377
  374. data/lib/resources/azure/azure_generic_resource.rb +59 -59
  375. data/lib/resources/azure/azure_resource_group.rb +152 -152
  376. data/lib/resources/azure/azure_virtual_machine.rb +264 -264
  377. data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
  378. data/lib/resources/bash.rb +35 -35
  379. data/lib/resources/bond.rb +69 -68
  380. data/lib/resources/bridge.rb +122 -122
  381. data/lib/resources/command.rb +73 -73
  382. data/lib/resources/cpan.rb +58 -58
  383. data/lib/resources/cran.rb +64 -64
  384. data/lib/resources/crontab.rb +169 -169
  385. data/lib/resources/csv.rb +56 -60
  386. data/lib/resources/dh_params.rb +77 -82
  387. data/lib/resources/directory.rb +25 -25
  388. data/lib/resources/docker.rb +236 -236
  389. data/lib/resources/docker_container.rb +89 -89
  390. data/lib/resources/docker_image.rb +83 -83
  391. data/lib/resources/docker_object.rb +57 -57
  392. data/lib/resources/docker_service.rb +90 -90
  393. data/lib/resources/elasticsearch.rb +169 -169
  394. data/lib/resources/etc_fstab.rb +94 -101
  395. data/lib/resources/etc_group.rb +152 -152
  396. data/lib/resources/etc_hosts.rb +66 -82
  397. data/lib/resources/etc_hosts_allow_deny.rb +112 -122
  398. data/lib/resources/file.rb +298 -298
  399. data/lib/resources/filesystem.rb +31 -31
  400. data/lib/resources/firewalld.rb +143 -143
  401. data/lib/resources/gem.rb +70 -70
  402. data/lib/resources/groups.rb +215 -215
  403. data/lib/resources/grub_conf.rb +227 -237
  404. data/lib/resources/host.rb +306 -306
  405. data/lib/resources/http.rb +251 -251
  406. data/lib/resources/iis_app.rb +101 -101
  407. data/lib/resources/iis_site.rb +148 -148
  408. data/lib/resources/inetd_conf.rb +54 -62
  409. data/lib/resources/ini.rb +29 -29
  410. data/lib/resources/interface.rb +129 -129
  411. data/lib/resources/iptables.rb +80 -80
  412. data/lib/resources/json.rb +107 -117
  413. data/lib/resources/kernel_module.rb +107 -107
  414. data/lib/resources/kernel_parameter.rb +58 -58
  415. data/lib/resources/key_rsa.rb +61 -67
  416. data/lib/resources/limits_conf.rb +46 -55
  417. data/lib/resources/login_def.rb +57 -66
  418. data/lib/resources/mount.rb +88 -88
  419. data/lib/resources/mssql_session.rb +101 -101
  420. data/lib/resources/mysql.rb +81 -81
  421. data/lib/resources/mysql_conf.rb +127 -134
  422. data/lib/resources/mysql_session.rb +85 -85
  423. data/lib/resources/nginx.rb +96 -96
  424. data/lib/resources/nginx_conf.rb +226 -227
  425. data/lib/resources/npm.rb +48 -48
  426. data/lib/resources/ntp_conf.rb +51 -58
  427. data/lib/resources/oneget.rb +71 -71
  428. data/lib/resources/oracledb_session.rb +139 -139
  429. data/lib/resources/os.rb +36 -36
  430. data/lib/resources/os_env.rb +76 -76
  431. data/lib/resources/package.rb +370 -370
  432. data/lib/resources/packages.rb +111 -111
  433. data/lib/resources/parse_config.rb +112 -116
  434. data/lib/resources/passwd.rb +76 -74
  435. data/lib/resources/pip.rb +89 -89
  436. data/lib/resources/platform.rb +109 -109
  437. data/lib/resources/port.rb +771 -771
  438. data/lib/resources/postgres.rb +130 -130
  439. data/lib/resources/postgres_conf.rb +114 -121
  440. data/lib/resources/postgres_hba_conf.rb +90 -99
  441. data/lib/resources/postgres_ident_conf.rb +79 -76
  442. data/lib/resources/postgres_session.rb +71 -71
  443. data/lib/resources/powershell.rb +53 -53
  444. data/lib/resources/processes.rb +204 -204
  445. data/lib/resources/rabbitmq_conf.rb +51 -52
  446. data/lib/resources/registry_key.rb +296 -296
  447. data/lib/resources/security_policy.rb +180 -180
  448. data/lib/resources/service.rb +790 -789
  449. data/lib/resources/shadow.rb +149 -146
  450. data/lib/resources/ssh_conf.rb +97 -102
  451. data/lib/resources/ssl.rb +99 -99
  452. data/lib/resources/sys_info.rb +28 -28
  453. data/lib/resources/toml.rb +32 -32
  454. data/lib/resources/users.rb +654 -654
  455. data/lib/resources/vbscript.rb +68 -68
  456. data/lib/resources/virtualization.rb +247 -247
  457. data/lib/resources/windows_feature.rb +84 -84
  458. data/lib/resources/windows_hotfix.rb +35 -35
  459. data/lib/resources/windows_task.rb +102 -102
  460. data/lib/resources/wmi.rb +110 -110
  461. data/lib/resources/x509_certificate.rb +137 -143
  462. data/lib/resources/xinetd.rb +106 -111
  463. data/lib/resources/xml.rb +46 -46
  464. data/lib/resources/yaml.rb +43 -47
  465. data/lib/resources/yum.rb +180 -180
  466. data/lib/resources/zfs_dataset.rb +60 -60
  467. data/lib/resources/zfs_pool.rb +49 -49
  468. data/lib/source_readers/flat.rb +39 -39
  469. data/lib/source_readers/inspec.rb +75 -75
  470. data/lib/utils/command_wrapper.rb +27 -27
  471. data/lib/utils/convert.rb +12 -12
  472. data/lib/utils/database_helpers.rb +77 -77
  473. data/lib/utils/erlang_parser.rb +192 -192
  474. data/lib/utils/file_reader.rb +25 -0
  475. data/lib/utils/filter.rb +272 -272
  476. data/lib/utils/filter_array.rb +27 -27
  477. data/lib/utils/find_files.rb +44 -44
  478. data/lib/utils/hash.rb +41 -41
  479. data/lib/utils/json_log.rb +18 -18
  480. data/lib/utils/latest_version.rb +22 -22
  481. data/lib/utils/modulator.rb +12 -12
  482. data/lib/utils/nginx_parser.rb +85 -85
  483. data/lib/utils/object_traversal.rb +49 -49
  484. data/lib/utils/parser.rb +274 -274
  485. data/lib/utils/plugin_registry.rb +93 -93
  486. data/lib/utils/simpleconfig.rb +120 -120
  487. data/lib/utils/spdx.rb +13 -13
  488. data/lib/utils/spdx.txt +343 -343
  489. metadata +12 -5
data/docs/platforms.md CHANGED
@@ -1,119 +1,119 @@
1
- # Using InSpec 2.0 on Cloud Platforms
2
-
3
- We are pleased to announce that with this release of InSpec 2.0, we have expanded our platform support beyond individual machines and now include support for select AWS and Azure resources.
4
-
5
- With InSpec 2.0, you may now use several InSpec resources to audit properties of your cloud infrastructure - for example, an Amazon Web Services S3 bucket.
6
-
7
- <br>
8
-
9
- ## AWS Platform Support in InSpec 2.0
10
-
11
- ### Setting up AWS credentials for InSpec
12
-
13
- InSpec uses the standard AWS authentication mechanisms. Typically, you will create an IAM user specifically for auditing activities.
14
-
15
- * 1 Create an IAM user in the AWS console, with your choice of username. Check the box marked "Programmatic Access."
16
- * 2 On the Permissions screen, choose Direct Attach. Select the AWS-managed IAM Profile named "ReadOnlyAccess." If you wish to restrict the user further, you may do so; see individual InSpec resources to identify which permissions are required.
17
- * 3 After generating the key, record the Access Key ID and Secret Key.
18
-
19
- #### Using Environment Variables to provide credentials
20
-
21
- You may provide the credentials to InSpec by setting the following environment variables: `AWS_REGION`, `AWS_ACCESS_KEY_ID`, and `AWS_SECRET_KEY_ID`. You may also use `AWS_PROFILE`, or if you are using MFA, `AWS_SESSION_TOKEN`. See the [AWS Command Line Interface Docs](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html) for details.
22
-
23
- Once you have your environment variables set, you can verify your credentials by running:
24
-
25
- ```bash
26
- you$ inspec detect -t aws://
27
-
28
- == Platform Details
29
- Name: aws
30
- Families: cloud, api
31
- Release: aws-sdk-v2.10.125
32
- ```
33
-
34
- #### Using the InSpec target option to provide credentials on AWS
35
-
36
- Look for a file in your home directory named `~/.aws/credentials`. If it does not exist, create it. Choose a name for your profile; here, we're using the name 'auditing'. Add your credentials as a new profile, in INI format:
37
-
38
- ```bash
39
- [auditing]
40
- aws_access_key_id = AKIA....
41
- aws_secret_access_key = 1234....abcd
42
- ```
43
-
44
- You may now run InSpec using the `--target` / `-t` option, using the format `-t aws://region/profile`. For example, to connect to the Ohio region using a profile named 'auditing', use `-t aws://us-east-2/auditing`.
45
-
46
- To verify your credentials,
47
-
48
- ```bash
49
- you$ inspec detect -t aws://
50
-
51
- == Platform Details
52
- Name: aws
53
- Families: cloud, api
54
- Release: aws-sdk-v2.10.125
55
- ```
56
-
57
- <br>
58
-
59
- ## Azure Platform Support in InSpec 2.0
60
-
61
- ### Setting up Azure credentials for InSpec
62
-
63
- To use InSpec Azure resources, you will need to create a Service Principal Name (SPN) for auditing an Azure subscription.
64
-
65
- This can be done on the command line or from the Azure Portal:
66
-
67
- * [Azure CLI](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal-cli)
68
- * [PowerShell](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal)
69
- * [Azure Portal](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal)
70
-
71
- The information from the SPN can be specified either in the file `~/.azure/credentials`, as environment variables, or by using InSpec target URIs.
72
-
73
- #### Setting up the Azure Credentials File
74
-
75
- By default InSpec is configured to look at ~/.azure/credentials, and it should contain:
76
-
77
- ```powershell
78
- [<SUBSCRIPTION_ID>]
79
- client_id = "<CLIENT_ID>"
80
- client_secret = "<CLIENT_SECRET>"
81
- tenant_id = "<TENANT_ID>"
82
- ```
83
-
84
- NOTE: In the Azure web portal, these values are labeled differently:
85
- * The client_id is referred to as the 'Application ID'
86
- * The client_secret is referred to as the 'Key (Password Type)'
87
- * The tenant_id is referred to as the 'Directory ID'
88
-
89
- With the credentials are in place you may now execute InSpec:
90
-
91
- ```bash
92
- inspec exec my-inspec-profile -t azure://
93
- ```
94
-
95
- #### Using Environment variables to provide credentials
96
-
97
- You may also set the Azure credentials via environment variables:
98
-
99
- * `AZURE_SUBSCRIPTION_ID`
100
- * `AZURE_CLIENT_ID`
101
- * `AZURE_CLIENT_SECRET`
102
- * `AZURE_TENANT_ID`
103
-
104
- For example:
105
-
106
- ```bash
107
- AZURE_SUBSCRIPTION_ID="2fbdbb02-df2e-11e6-bf01-fe55135034f3" \
108
- AZURE_CLIENT_ID="58dc4f6c-df2e-11e6-bf01-fe55135034f3" \
109
- AZURE_CLIENT_SECRET="Jibr4iwwaaZwBb6W" \
110
- AZURE_TENANT_ID="6ad89b58-df2e-11e6-bf01-fe55135034f3" inspec exec my-profile -t azure://
111
- ```
112
-
113
- #### Using the InSpec target option to provide credentials on Azure
114
-
115
- If you have created a `~/.azure/credentials` file as above, you may also use the InSpec command line `--target` / `-t` option to select a subscription ID. For example:
116
-
117
- ```bash
118
- inspec exec my-profile -t azure://2fbdbb02-df2e-11e6-bf01-fe55135034f3
1
+ # Using InSpec 2.0 on Cloud Platforms
2
+
3
+ We are pleased to announce that with this release of InSpec 2.0, we have expanded our platform support beyond individual machines and now include support for select AWS and Azure resources.
4
+
5
+ With InSpec 2.0, you may now use several InSpec resources to audit properties of your cloud infrastructure - for example, an Amazon Web Services S3 bucket.
6
+
7
+ <br>
8
+
9
+ ## AWS Platform Support in InSpec 2.0
10
+
11
+ ### Setting up AWS credentials for InSpec
12
+
13
+ InSpec uses the standard AWS authentication mechanisms. Typically, you will create an IAM user specifically for auditing activities.
14
+
15
+ * 1 Create an IAM user in the AWS console, with your choice of username. Check the box marked "Programmatic Access."
16
+ * 2 On the Permissions screen, choose Direct Attach. Select the AWS-managed IAM Profile named "ReadOnlyAccess." If you wish to restrict the user further, you may do so; see individual InSpec resources to identify which permissions are required.
17
+ * 3 After generating the key, record the Access Key ID and Secret Key.
18
+
19
+ #### Using Environment Variables to provide credentials
20
+
21
+ You may provide the credentials to InSpec by setting the following environment variables: `AWS_REGION`, `AWS_ACCESS_KEY_ID`, and `AWS_SECRET_KEY_ID`. You may also use `AWS_PROFILE`, or if you are using MFA, `AWS_SESSION_TOKEN`. See the [AWS Command Line Interface Docs](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html) for details.
22
+
23
+ Once you have your environment variables set, you can verify your credentials by running:
24
+
25
+ ```bash
26
+ you$ inspec detect -t aws://
27
+
28
+ == Platform Details
29
+ Name: aws
30
+ Families: cloud, api
31
+ Release: aws-sdk-v2.10.125
32
+ ```
33
+
34
+ #### Using the InSpec target option to provide credentials on AWS
35
+
36
+ Look for a file in your home directory named `~/.aws/credentials`. If it does not exist, create it. Choose a name for your profile; here, we're using the name 'auditing'. Add your credentials as a new profile, in INI format:
37
+
38
+ ```bash
39
+ [auditing]
40
+ aws_access_key_id = AKIA....
41
+ aws_secret_access_key = 1234....abcd
42
+ ```
43
+
44
+ You may now run InSpec using the `--target` / `-t` option, using the format `-t aws://region/profile`. For example, to connect to the Ohio region using a profile named 'auditing', use `-t aws://us-east-2/auditing`.
45
+
46
+ To verify your credentials,
47
+
48
+ ```bash
49
+ you$ inspec detect -t aws://
50
+
51
+ == Platform Details
52
+ Name: aws
53
+ Families: cloud, api
54
+ Release: aws-sdk-v2.10.125
55
+ ```
56
+
57
+ <br>
58
+
59
+ ## Azure Platform Support in InSpec 2.0
60
+
61
+ ### Setting up Azure credentials for InSpec
62
+
63
+ To use InSpec Azure resources, you will need to create a Service Principal Name (SPN) for auditing an Azure subscription.
64
+
65
+ This can be done on the command line or from the Azure Portal:
66
+
67
+ * [Azure CLI](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal-cli)
68
+ * [PowerShell](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal)
69
+ * [Azure Portal](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal)
70
+
71
+ The information from the SPN can be specified either in the file `~/.azure/credentials`, as environment variables, or by using InSpec target URIs.
72
+
73
+ #### Setting up the Azure Credentials File
74
+
75
+ By default InSpec is configured to look at ~/.azure/credentials, and it should contain:
76
+
77
+ ```powershell
78
+ [<SUBSCRIPTION_ID>]
79
+ client_id = "<CLIENT_ID>"
80
+ client_secret = "<CLIENT_SECRET>"
81
+ tenant_id = "<TENANT_ID>"
82
+ ```
83
+
84
+ NOTE: In the Azure web portal, these values are labeled differently:
85
+ * The client_id is referred to as the 'Application ID'
86
+ * The client_secret is referred to as the 'Key (Password Type)'
87
+ * The tenant_id is referred to as the 'Directory ID'
88
+
89
+ With the credentials are in place you may now execute InSpec:
90
+
91
+ ```bash
92
+ inspec exec my-inspec-profile -t azure://
93
+ ```
94
+
95
+ #### Using Environment variables to provide credentials
96
+
97
+ You may also set the Azure credentials via environment variables:
98
+
99
+ * `AZURE_SUBSCRIPTION_ID`
100
+ * `AZURE_CLIENT_ID`
101
+ * `AZURE_CLIENT_SECRET`
102
+ * `AZURE_TENANT_ID`
103
+
104
+ For example:
105
+
106
+ ```bash
107
+ AZURE_SUBSCRIPTION_ID="2fbdbb02-df2e-11e6-bf01-fe55135034f3" \
108
+ AZURE_CLIENT_ID="58dc4f6c-df2e-11e6-bf01-fe55135034f3" \
109
+ AZURE_CLIENT_SECRET="Jibr4iwwaaZwBb6W" \
110
+ AZURE_TENANT_ID="6ad89b58-df2e-11e6-bf01-fe55135034f3" inspec exec my-profile -t azure://
111
+ ```
112
+
113
+ #### Using the InSpec target option to provide credentials on Azure
114
+
115
+ If you have created a `~/.azure/credentials` file as above, you may also use the InSpec command line `--target` / `-t` option to select a subscription ID. For example:
116
+
117
+ ```bash
118
+ inspec exec my-profile -t azure://2fbdbb02-df2e-11e6-bf01-fe55135034f3
119
119
  ```
@@ -1,50 +1,50 @@
1
- ---
2
- title: About kitchen-inspec
3
- ---
4
-
5
- # kitchen-inspec
6
-
7
- Use InSpec as a Kitchen verifier with `kitchen-inspec`.
8
-
9
- Add the InSpec verifier to the `.kitchen.yml` file:
10
-
11
- verifier:
12
- name: inspec
13
-
14
- Use a compliance profile from the Chef Compliance server:
15
-
16
- suites:
17
- - name: compliance
18
- run_list:
19
- - recipe[ssh-hardening::default]
20
- verifier:
21
- inspec_tests:
22
- - compliance://base/ssh
23
-
24
- and then run the following command:
25
-
26
- $ inspec compliance login https://compliance.test --user admin --insecure --token ''
27
-
28
- where `--insecure` is required when using self-signed certificates.
29
-
30
- Use a compliance profile from the Chef Supermarket:
31
-
32
- suites:
33
- - name: supermarket
34
- run_list:
35
- - recipe[ssh-hardening::default]
36
- verifier:
37
- inspec_tests:
38
- - supermarket://dev-sec/ssh-baseline
39
-
40
- Use InSpec tests from the local file system:
41
-
42
- suites:
43
- - name: local
44
- run_list:
45
- - recipe[my_cookbook::default]
46
- verifier:
47
- inspec_tests:
48
- - test/integration/default
49
-
50
- Check out [Detect and correct with Test Kitchen](https://learn.chef.io/modules/detect-correct-kitchen#/) on Learn Chef Rally for a hands-on look at how to use Test Kitchen to run InSpec profiles.
1
+ ---
2
+ title: About kitchen-inspec
3
+ ---
4
+
5
+ # kitchen-inspec
6
+
7
+ Use InSpec as a Kitchen verifier with `kitchen-inspec`.
8
+
9
+ Add the InSpec verifier to the `.kitchen.yml` file:
10
+
11
+ verifier:
12
+ name: inspec
13
+
14
+ Use a compliance profile from the Chef Compliance server:
15
+
16
+ suites:
17
+ - name: compliance
18
+ run_list:
19
+ - recipe[ssh-hardening::default]
20
+ verifier:
21
+ inspec_tests:
22
+ - compliance://base/ssh
23
+
24
+ and then run the following command:
25
+
26
+ $ inspec compliance login https://compliance.test --user admin --insecure --token ''
27
+
28
+ where `--insecure` is required when using self-signed certificates.
29
+
30
+ Use a compliance profile from the Chef Supermarket:
31
+
32
+ suites:
33
+ - name: supermarket
34
+ run_list:
35
+ - recipe[ssh-hardening::default]
36
+ verifier:
37
+ inspec_tests:
38
+ - supermarket://dev-sec/ssh-baseline
39
+
40
+ Use InSpec tests from the local file system:
41
+
42
+ suites:
43
+ - name: local
44
+ run_list:
45
+ - recipe[my_cookbook::default]
46
+ verifier:
47
+ inspec_tests:
48
+ - test/integration/default
49
+
50
+ Check out [Detect and correct with Test Kitchen](https://learn.chef.io/modules/detect-correct-kitchen#/) on Learn Chef Rally for a hands-on look at how to use Test Kitchen to run InSpec profiles.
data/docs/profiles.md CHANGED
@@ -1,376 +1,376 @@
1
- ---
2
- title: About InSpec Profiles
3
- ---
4
-
5
- # InSpec Profiles
6
-
7
- InSpec supports the creation of complex test and compliance profiles, which organize controls to support dependency management and code reuse. Each profile is a standalone structure with its own distribution and execution flow.
8
-
9
- # Profile Structure
10
-
11
- A profile should have the following structure::
12
-
13
- examples/profile
14
- ├── README.md
15
- ├── controls
16
- │ ├── example.rb
17
- │ └── control_etc.rb
18
- ├── libraries
19
- │ └── extension.rb
20
- |── files
21
- │ └── extras.conf
22
- └── inspec.yml
23
-
24
- where:
25
-
26
- * `inspec.yml` includes the profile description (required)
27
- * `controls` is the directory in which all tests are located (required)
28
- * `libraries` is the directory in which all InSpec resource extensions are located (optional)
29
- * `files` is the directory with additional files that a profile can access (optional)
30
- * `README.md` should be used to explain the profile, its scope, and usage
31
-
32
- See a complete example profile in the InSpec open source repository: [https://github.com/chef/inspec/tree/master/examples/profile](https://github.com/chef/inspec/tree/master/examples/profile)
33
-
34
- Also check out [Explore InSpec resources](https://learn.chef.io/modules/explore-inspec-resources#/) on Learn Chef Rally to learn more about how profiles are structured with hands-on examples.
35
-
36
- ## inspec.yml
37
-
38
- Each profile must have an `inspec.yml` file that defines the following information:
39
-
40
- * Use `name` to specify a unique name for the profile. Required.
41
- * Use `title` to specify a human-readable name for the profile.
42
- * Use `maintainer` to specify the profile maintainer.
43
- * Use `copyright` to specify the copyright holder.
44
- * Use `copyright_email` to specify support contact information for the profile, typically an email address.
45
- * Use `license` to specify the license for the profile.
46
- * Use `summary` to specify a one line summary for the profile.
47
- * Use `description` to specify a multiple line description of the profile.
48
- * Use `version` to specify the profile version.
49
- * Use `supports` to specify a list of supported platform targets.
50
- * Use `depends` to define a list of profiles on which this profile depends.
51
-
52
- `name` is required; all other profile settings are optional. For example:
53
-
54
- name: ssh
55
- title: Basic SSH
56
- maintainer: Chef Software, Inc.
57
- copyright: Chef Software, Inc.
58
- copyright_email: support@chef.io
59
- license: Proprietary, All rights reserved
60
- summary: Verify that SSH Server and SSH Client are configured securely
61
- version: 1.0.0
62
- supports:
63
- - os-family: linux
64
- depends:
65
- - name: profile
66
- path: ../path/to/profile
67
-
68
- ## Verify Profiles
69
-
70
- Use the `inspec check` command to verify the implementation of a profile:
71
-
72
- $ inspec check examples/profile
73
-
74
- # Platform Support
75
-
76
- Use the `supports` setting in the `inspec.yml` file to specify one (or more) platforms for which a profile is targeting. The list of supported platforms may contain simple names, names and versions, or detailed flags, and may be combined arbitrarily. For example, to target anything running Debian Linux:
77
-
78
- name: ssh
79
- supports:
80
- - os-name: debian
81
-
82
- and to target only Ubuntu version 14.04
83
-
84
- name: ssh
85
- supports:
86
- - os-name: ubuntu
87
- release: 14.04
88
-
89
- and to target the entire RedHat platform (including CentOS and Oracle Linux):
90
-
91
- name: ssh
92
- supports:
93
- - os-family: redhat
94
-
95
- and to target anything running on Amazon AWS:
96
-
97
- name: ssh
98
- supports:
99
- - platform: aws
100
-
101
- and to target all of these examples in a single `inspec.yml` file:
102
-
103
- name: ssh
104
- supports:
105
- - os-name: debian
106
- - os-name: ubuntu
107
- release: 14.04
108
- - os-family: redhat
109
- - platform: aws
110
-
111
-
112
- # Profile Dependencies
113
-
114
- An InSpec profile can bring in the controls and custom resources from another InSpec profile. Additionally, when inheriting the controls of another profile, a profile can skip or even modify those included controls.
115
-
116
- For hands-on examples, check out [Create a custom InSpec profile](https://learn.chef.io/modules/create-a-custom-profile#/) on Learn Chef Rally.
117
-
118
- ## Defining the Dependencies
119
-
120
- Before a profile can use controls from another profile, the to-be-included profile needs to be specified in the including profile’s `inspec.yml` file in the `depends` section. For each profile to be included, a location for the profile from where to be fetched and a name for the profile should be included. For example:
121
-
122
- depends:
123
- - name: linux-baseline
124
- url: https://github.com/dev-sec/linux-baseline/archive/master.tar.gz
125
- - name: ssh-baseline
126
- url: https://github.com/dev-sec/ssh-baseline/archive/master.tar.gz
127
-
128
- InSpec supports a number of dependency sources.
129
-
130
- ### path
131
-
132
- The `path` setting defines a profile that is located on disk. This setting is typically used during development of profiles and when debugging profiles.
133
-
134
- depends:
135
- - name: my-profile
136
- path: /absolute/path
137
- - name: another
138
- path: ../relative/path
139
-
140
- ### url
141
-
142
- The `url` setting specifies a profile that is located at an HTTP- or HTTPS-based URL. The profile must be accessible via a HTTP GET operation and must be a valid profile archive (zip, tar, or tar.gz format).
143
-
144
- depends:
145
- - name: my-profile
146
- url: https://my.domain/path/to/profile.tgz
147
- - name: profile-via-git
148
- url: https://github.com/myusername/myprofile-repo/archive/master.tar.gz
149
-
150
- ### git
151
-
152
- A `git` setting specifies a profile that is located in a git repository, with optional settings for branch, tag, commit, and version. The source location is translated into a URL upon resolution. This type of dependency supports version constraints via semantic versioning as git tags.
153
-
154
- For example:
155
-
156
- depends:
157
- - name: git-profile
158
- git: http://url/to/repo
159
- branch: desired_branch
160
- tag: desired_version
161
- commit: pinned_commit
162
- version: semver_via_tags
163
-
164
- ### supermarket
165
-
166
- A `supermarket` setting specifies a profile that is located in a cookbook hosted on Chef Supermarket. The source location is translated into a URL upon resolution.
167
-
168
- For example:
169
-
170
- depends:
171
- - name: supermarket-profile
172
- supermarket: supermarket-username/supermarket-profile
173
-
174
- Available Supermarket profiles can be listed with `inspec supermarket profiles`.
175
-
176
- ### compliance
177
-
178
- A `compliance` setting specifies a profile that is located on the Chef Automate or Chef Compliance server.
179
-
180
- For example:
181
-
182
- depends:
183
- - name: linux
184
- compliance: base/linux
185
-
186
- ## Vendoring Dependencies
187
-
188
- When you execute a local profile, the `inspec.yml` file will be read in order to source any profile dependencies. It will then cache the dependencies locally and generate an `inspec.lock` file.
189
-
190
- If you add or update dependencies in `inspec.yml`, dependencies may be re-vendored and the lockfile updated with `inspec vendor --overwrite`
191
-
192
- ## Using Controls from an Included Profile
193
-
194
- Once defined in the `inspec.yml`, controls from the included profiles can be used! Let’s look at some examples.
195
-
196
- ### Including All Controls from a Profile
197
-
198
- With the `include_controls` command in a profile, all controls from the named profile will be executed every time the including profile is executed.
199
-
200
- ![Include Controls](/images/profile_inheritance/include_controls.png)
201
-
202
- In the example above, every time `my-app-profile` is executed, all the controls from `my-baseline` are also executed. Therefore, the following controls would be executed:
203
-
204
- * myapp-1
205
- * myapp-2
206
- * myapp-3
207
- * baseline-1
208
- * baseline-2
209
-
210
- This is a great reminder that having a good naming convention for your controls is helpful to avoid confusion when
211
- including controls from other profiles!
212
-
213
- ### Skipping a Control from a Profile
214
-
215
- What if one of the controls from the included profile does not apply to your environment? Luckily, it is not necessary to maintain a slightly-modified copy of the included profile just to delete a control. The `skip_control` command tells InSpec to not run a particular control.
216
-
217
- ![Include Controls with Skip](/images/profile_inheritance/include_controls_with_skip.png)
218
-
219
- In the above example, all controls from `my-app-profile` and `my-baseline` profile will be executed every time `my-app-profile` is executed **except** for control `baseline-2` from the `my-baseline` profile.
220
-
221
- ### Modifying a Control
222
-
223
- Let's say a particular control from an included profile should still be run, but the impact isn't appropriate? Perhaps the test should still run, but if it fails, it should be treated as low severity instead of high severity?
224
-
225
- When a control is included, it can also be modified!
226
-
227
- ![Include Controls with Modification](/images/profile_inheritance/include_controls_with_mod.png)
228
-
229
- In the above example, all controls from `my-baseline` are executed along with all the controls from the including profile, `my-app-profile`. However, should control `baseline-1` fail, it will be raised with an impact of `0.5` instead of the originally-intended impact of `1.0`.
230
-
231
- ### Selectively Including Controls from a Profile
232
-
233
- If there are only a handful of controls that should be executed from an included profile, it's not necessarily to skip all the unneeded controls, or worse, copy/paste those controls bit-for-bit into your profile. Instead, use the `require_controls` command.
234
-
235
- ![Require Controls](/images/profile_inheritance/require_controls.png)
236
-
237
- Whenever `my-app-profile` is executed, in addition to its own controls, it will run only the controls specified in the `require_controls` block. In the case, the following controls would be executed:
238
-
239
- * myapp-1
240
- * myapp-2
241
- * myapp-3
242
- * baseline-2
243
- * baseline-4
244
-
245
- Controls `baseline-1`, `baseline-3`, and `baseline-5` would not be run, just as if they were manually skipped. This method of including specific controls ensures only the controls specified are executed; if new controls are added to a later version of `my-baseline`, they would not be run.
246
-
247
- And, just the way its possible to modify controls when using `include_controls`, controls can be modified as well.
248
-
249
- ![Require Controls with Modification](/images/profile_inheritance/require_controls_with_mod.png)
250
-
251
- As with the prior example, only `baseline-2` and `baseline-4` are executed, but if `baseline-2` fails, it will report with an impact of `0.5` instead of the originally-intended `1.0` impact.
252
-
253
- ## Using Resources from an Included Profile
254
-
255
- By default, all of the custom resources from a listed dependency are available
256
- for use in your profile. If two of your dependencies provide a resource with
257
- the same name, you can use the `require_resource` DSL function to
258
- disambiguate the two:
259
-
260
- require_resource(profile: 'my_dep', resource: 'my_res',
261
- as: 'my_res2')
262
-
263
- This will allow you to reference the resource `my_res` from the
264
- profile `my_dep` using the name `my_res2`.
265
-
266
- # Profile Attributes
267
-
268
- Attributes may be used in profiles to define secrets, such as user names and passwords, that should not otherwise be stored in plain-text in a cookbook. First specify a variable in the control for each secret, then add the secret to a Yaml file located on the local machine, and then run `inspec exec` and specify the path to that Yaml file using the `--attrs` attribute.
269
-
270
- For example, a control:
271
-
272
- # define these attributes on the top-level of your file and re-use them across all tests!
273
- val_user = attribute('user', default: 'alice', description: 'An identification for the user')
274
- val_password = attribute('password', description: 'A value for the password')
275
-
276
- control 'system-users' do
277
- impact 0.8
278
- desc '
279
- This test assures that the user "Bob" has a user installed on the system, along with a
280
- specified password.
281
- '
282
-
283
- describe val_user do
284
- it { should eq 'bob' }
285
- end
286
-
287
- describe val_password do
288
- it { should eq 'secret' }
289
- end
290
- end
291
-
292
- And a Yaml file named `profile-attribute.yml`:
293
-
294
- user: bob
295
- password: secret
296
-
297
- The following command runs the tests and applies the secrets specified in `profile-attribute.yml`:
298
-
299
- $ inspec exec examples/profile-attribute --attrs examples/profile-attribute.yml
300
-
301
- See the full example in the InSpec open source repository: https://github.com/chef/inspec/tree/master/examples/profile-attribute
302
-
303
- # Profile files
304
-
305
- An InSpec profile may contain additional files that can be accessed during tests. A profile file enables you to separate the logic of your tests from the data your tests check for, for example, the list of ports you require to be open.
306
-
307
- To access these files, they must be stored in the `files` directory at the root of a profile. They are accessed by their name relative to this folder with `inspec.profile.file(...)`.
308
-
309
- Here is an example for reading and testing a list of ports. The folder structure is:
310
-
311
- examples/profile
312
- ├── controls
313
- │ ├── example.rb
314
- |── files
315
- │ └── services.yml
316
- └── inspec.yml
317
-
318
- With `services.yml` containing:
319
-
320
- - service_name: httpd-alpha
321
- port: 80
322
- - service_name: httpd-beta
323
- port: 8080
324
-
325
- The tests in `example.rb` can now access this file:
326
-
327
- my_services = yaml(content: inspec.profile.file('services.yml')).params
328
-
329
- my_services.each do |s|
330
- describe service(s['service_name']) do
331
- it { should be_running }
332
- end
333
-
334
- describe port(s['port']) do
335
- it { should be_listening }
336
- end
337
- end
338
-
339
- For a more complete example that uses a profile file, see [Explore InSpec resources](https://learn.chef.io/modules/explore-inspec-resources#/) on Learn Chef Rally.
340
-
341
- # "should" vs. "expect" syntax
342
-
343
- Users familiar with the RSpec testing framework may know that there are two ways to write test statements: `should` and `expect`. The RSpec community decided that `expect` is the preferred syntax. However, InSpec recommends the `should` syntax as it tends to read more easily to those users who are not as technical.
344
-
345
- InSpec will continue to support both methods of writing tests. Consider this `file` test:
346
-
347
- describe file('/tmp/test.txt') do
348
- it { should be_file }
349
- end
350
-
351
- This can be re-written with `expect` syntax
352
-
353
- describe file('/tmp/test.txt') do
354
- it 'should be a file' do
355
- expect(subject).to(be_file)
356
- end
357
- end
358
-
359
- The output of both of the above examples looks like this:
360
-
361
- File /tmp/test.txt
362
- ✔ should be a file
363
-
364
- In addition, you can make use of the `subject` keyword to further control your output if you choose:
365
-
366
- describe 'test file' do
367
- subject { file('/tmp/test.txt') }
368
- it 'should be a file' do
369
- expect(subject).to(be_file)
370
- end
371
- end
372
-
373
- ... which will render the following output:
374
-
375
- test file
376
- ✔ should be a file
1
+ ---
2
+ title: About InSpec Profiles
3
+ ---
4
+
5
+ # InSpec Profiles
6
+
7
+ InSpec supports the creation of complex test and compliance profiles, which organize controls to support dependency management and code reuse. Each profile is a standalone structure with its own distribution and execution flow.
8
+
9
+ # Profile Structure
10
+
11
+ A profile should have the following structure::
12
+
13
+ examples/profile
14
+ ├── README.md
15
+ ├── controls
16
+ │ ├── example.rb
17
+ │ └── control_etc.rb
18
+ ├── libraries
19
+ │ └── extension.rb
20
+ |── files
21
+ │ └── extras.conf
22
+ └── inspec.yml
23
+
24
+ where:
25
+
26
+ * `inspec.yml` includes the profile description (required)
27
+ * `controls` is the directory in which all tests are located (required)
28
+ * `libraries` is the directory in which all InSpec resource extensions are located (optional)
29
+ * `files` is the directory with additional files that a profile can access (optional)
30
+ * `README.md` should be used to explain the profile, its scope, and usage
31
+
32
+ See a complete example profile in the InSpec open source repository: [https://github.com/chef/inspec/tree/master/examples/profile](https://github.com/chef/inspec/tree/master/examples/profile)
33
+
34
+ Also check out [Explore InSpec resources](https://learn.chef.io/modules/explore-inspec-resources#/) on Learn Chef Rally to learn more about how profiles are structured with hands-on examples.
35
+
36
+ ## inspec.yml
37
+
38
+ Each profile must have an `inspec.yml` file that defines the following information:
39
+
40
+ * Use `name` to specify a unique name for the profile. Required.
41
+ * Use `title` to specify a human-readable name for the profile.
42
+ * Use `maintainer` to specify the profile maintainer.
43
+ * Use `copyright` to specify the copyright holder.
44
+ * Use `copyright_email` to specify support contact information for the profile, typically an email address.
45
+ * Use `license` to specify the license for the profile.
46
+ * Use `summary` to specify a one line summary for the profile.
47
+ * Use `description` to specify a multiple line description of the profile.
48
+ * Use `version` to specify the profile version.
49
+ * Use `supports` to specify a list of supported platform targets.
50
+ * Use `depends` to define a list of profiles on which this profile depends.
51
+
52
+ `name` is required; all other profile settings are optional. For example:
53
+
54
+ name: ssh
55
+ title: Basic SSH
56
+ maintainer: Chef Software, Inc.
57
+ copyright: Chef Software, Inc.
58
+ copyright_email: support@chef.io
59
+ license: Proprietary, All rights reserved
60
+ summary: Verify that SSH Server and SSH Client are configured securely
61
+ version: 1.0.0
62
+ supports:
63
+ - os-family: linux
64
+ depends:
65
+ - name: profile
66
+ path: ../path/to/profile
67
+
68
+ ## Verify Profiles
69
+
70
+ Use the `inspec check` command to verify the implementation of a profile:
71
+
72
+ $ inspec check examples/profile
73
+
74
+ # Platform Support
75
+
76
+ Use the `supports` setting in the `inspec.yml` file to specify one (or more) platforms for which a profile is targeting. The list of supported platforms may contain simple names, names and versions, or detailed flags, and may be combined arbitrarily. For example, to target anything running Debian Linux:
77
+
78
+ name: ssh
79
+ supports:
80
+ - os-name: debian
81
+
82
+ and to target only Ubuntu version 14.04
83
+
84
+ name: ssh
85
+ supports:
86
+ - os-name: ubuntu
87
+ release: 14.04
88
+
89
+ and to target the entire RedHat platform (including CentOS and Oracle Linux):
90
+
91
+ name: ssh
92
+ supports:
93
+ - os-family: redhat
94
+
95
+ and to target anything running on Amazon AWS:
96
+
97
+ name: ssh
98
+ supports:
99
+ - platform: aws
100
+
101
+ and to target all of these examples in a single `inspec.yml` file:
102
+
103
+ name: ssh
104
+ supports:
105
+ - os-name: debian
106
+ - os-name: ubuntu
107
+ release: 14.04
108
+ - os-family: redhat
109
+ - platform: aws
110
+
111
+
112
+ # Profile Dependencies
113
+
114
+ An InSpec profile can bring in the controls and custom resources from another InSpec profile. Additionally, when inheriting the controls of another profile, a profile can skip or even modify those included controls.
115
+
116
+ For hands-on examples, check out [Create a custom InSpec profile](https://learn.chef.io/modules/create-a-custom-profile#/) on Learn Chef Rally.
117
+
118
+ ## Defining the Dependencies
119
+
120
+ Before a profile can use controls from another profile, the to-be-included profile needs to be specified in the including profile’s `inspec.yml` file in the `depends` section. For each profile to be included, a location for the profile from where to be fetched and a name for the profile should be included. For example:
121
+
122
+ depends:
123
+ - name: linux-baseline
124
+ url: https://github.com/dev-sec/linux-baseline/archive/master.tar.gz
125
+ - name: ssh-baseline
126
+ url: https://github.com/dev-sec/ssh-baseline/archive/master.tar.gz
127
+
128
+ InSpec supports a number of dependency sources.
129
+
130
+ ### path
131
+
132
+ The `path` setting defines a profile that is located on disk. This setting is typically used during development of profiles and when debugging profiles.
133
+
134
+ depends:
135
+ - name: my-profile
136
+ path: /absolute/path
137
+ - name: another
138
+ path: ../relative/path
139
+
140
+ ### url
141
+
142
+ The `url` setting specifies a profile that is located at an HTTP- or HTTPS-based URL. The profile must be accessible via a HTTP GET operation and must be a valid profile archive (zip, tar, or tar.gz format).
143
+
144
+ depends:
145
+ - name: my-profile
146
+ url: https://my.domain/path/to/profile.tgz
147
+ - name: profile-via-git
148
+ url: https://github.com/myusername/myprofile-repo/archive/master.tar.gz
149
+
150
+ ### git
151
+
152
+ A `git` setting specifies a profile that is located in a git repository, with optional settings for branch, tag, commit, and version. The source location is translated into a URL upon resolution. This type of dependency supports version constraints via semantic versioning as git tags.
153
+
154
+ For example:
155
+
156
+ depends:
157
+ - name: git-profile
158
+ git: http://url/to/repo
159
+ branch: desired_branch
160
+ tag: desired_version
161
+ commit: pinned_commit
162
+ version: semver_via_tags
163
+
164
+ ### supermarket
165
+
166
+ A `supermarket` setting specifies a profile that is located in a cookbook hosted on Chef Supermarket. The source location is translated into a URL upon resolution.
167
+
168
+ For example:
169
+
170
+ depends:
171
+ - name: supermarket-profile
172
+ supermarket: supermarket-username/supermarket-profile
173
+
174
+ Available Supermarket profiles can be listed with `inspec supermarket profiles`.
175
+
176
+ ### compliance
177
+
178
+ A `compliance` setting specifies a profile that is located on the Chef Automate or Chef Compliance server.
179
+
180
+ For example:
181
+
182
+ depends:
183
+ - name: linux
184
+ compliance: base/linux
185
+
186
+ ## Vendoring Dependencies
187
+
188
+ When you execute a local profile, the `inspec.yml` file will be read in order to source any profile dependencies. It will then cache the dependencies locally and generate an `inspec.lock` file.
189
+
190
+ If you add or update dependencies in `inspec.yml`, dependencies may be re-vendored and the lockfile updated with `inspec vendor --overwrite`
191
+
192
+ ## Using Controls from an Included Profile
193
+
194
+ Once defined in the `inspec.yml`, controls from the included profiles can be used! Let’s look at some examples.
195
+
196
+ ### Including All Controls from a Profile
197
+
198
+ With the `include_controls` command in a profile, all controls from the named profile will be executed every time the including profile is executed.
199
+
200
+ ![Include Controls](/images/profile_inheritance/include_controls.png)
201
+
202
+ In the example above, every time `my-app-profile` is executed, all the controls from `my-baseline` are also executed. Therefore, the following controls would be executed:
203
+
204
+ * myapp-1
205
+ * myapp-2
206
+ * myapp-3
207
+ * baseline-1
208
+ * baseline-2
209
+
210
+ This is a great reminder that having a good naming convention for your controls is helpful to avoid confusion when
211
+ including controls from other profiles!
212
+
213
+ ### Skipping a Control from a Profile
214
+
215
+ What if one of the controls from the included profile does not apply to your environment? Luckily, it is not necessary to maintain a slightly-modified copy of the included profile just to delete a control. The `skip_control` command tells InSpec to not run a particular control.
216
+
217
+ ![Include Controls with Skip](/images/profile_inheritance/include_controls_with_skip.png)
218
+
219
+ In the above example, all controls from `my-app-profile` and `my-baseline` profile will be executed every time `my-app-profile` is executed **except** for control `baseline-2` from the `my-baseline` profile.
220
+
221
+ ### Modifying a Control
222
+
223
+ Let's say a particular control from an included profile should still be run, but the impact isn't appropriate? Perhaps the test should still run, but if it fails, it should be treated as low severity instead of high severity?
224
+
225
+ When a control is included, it can also be modified!
226
+
227
+ ![Include Controls with Modification](/images/profile_inheritance/include_controls_with_mod.png)
228
+
229
+ In the above example, all controls from `my-baseline` are executed along with all the controls from the including profile, `my-app-profile`. However, should control `baseline-1` fail, it will be raised with an impact of `0.5` instead of the originally-intended impact of `1.0`.
230
+
231
+ ### Selectively Including Controls from a Profile
232
+
233
+ If there are only a handful of controls that should be executed from an included profile, it's not necessarily to skip all the unneeded controls, or worse, copy/paste those controls bit-for-bit into your profile. Instead, use the `require_controls` command.
234
+
235
+ ![Require Controls](/images/profile_inheritance/require_controls.png)
236
+
237
+ Whenever `my-app-profile` is executed, in addition to its own controls, it will run only the controls specified in the `require_controls` block. In the case, the following controls would be executed:
238
+
239
+ * myapp-1
240
+ * myapp-2
241
+ * myapp-3
242
+ * baseline-2
243
+ * baseline-4
244
+
245
+ Controls `baseline-1`, `baseline-3`, and `baseline-5` would not be run, just as if they were manually skipped. This method of including specific controls ensures only the controls specified are executed; if new controls are added to a later version of `my-baseline`, they would not be run.
246
+
247
+ And, just the way its possible to modify controls when using `include_controls`, controls can be modified as well.
248
+
249
+ ![Require Controls with Modification](/images/profile_inheritance/require_controls_with_mod.png)
250
+
251
+ As with the prior example, only `baseline-2` and `baseline-4` are executed, but if `baseline-2` fails, it will report with an impact of `0.5` instead of the originally-intended `1.0` impact.
252
+
253
+ ## Using Resources from an Included Profile
254
+
255
+ By default, all of the custom resources from a listed dependency are available
256
+ for use in your profile. If two of your dependencies provide a resource with
257
+ the same name, you can use the `require_resource` DSL function to
258
+ disambiguate the two:
259
+
260
+ require_resource(profile: 'my_dep', resource: 'my_res',
261
+ as: 'my_res2')
262
+
263
+ This will allow you to reference the resource `my_res` from the
264
+ profile `my_dep` using the name `my_res2`.
265
+
266
+ # Profile Attributes
267
+
268
+ Attributes may be used in profiles to define secrets, such as user names and passwords, that should not otherwise be stored in plain-text in a cookbook. First specify a variable in the control for each secret, then add the secret to a Yaml file located on the local machine, and then run `inspec exec` and specify the path to that Yaml file using the `--attrs` attribute.
269
+
270
+ For example, a control:
271
+
272
+ # define these attributes on the top-level of your file and re-use them across all tests!
273
+ val_user = attribute('user', default: 'alice', description: 'An identification for the user')
274
+ val_password = attribute('password', description: 'A value for the password')
275
+
276
+ control 'system-users' do
277
+ impact 0.8
278
+ desc '
279
+ This test assures that the user "Bob" has a user installed on the system, along with a
280
+ specified password.
281
+ '
282
+
283
+ describe val_user do
284
+ it { should eq 'bob' }
285
+ end
286
+
287
+ describe val_password do
288
+ it { should eq 'secret' }
289
+ end
290
+ end
291
+
292
+ And a Yaml file named `profile-attribute.yml`:
293
+
294
+ user: bob
295
+ password: secret
296
+
297
+ The following command runs the tests and applies the secrets specified in `profile-attribute.yml`:
298
+
299
+ $ inspec exec examples/profile-attribute --attrs examples/profile-attribute.yml
300
+
301
+ See the full example in the InSpec open source repository: https://github.com/chef/inspec/tree/master/examples/profile-attribute
302
+
303
+ # Profile files
304
+
305
+ An InSpec profile may contain additional files that can be accessed during tests. A profile file enables you to separate the logic of your tests from the data your tests check for, for example, the list of ports you require to be open.
306
+
307
+ To access these files, they must be stored in the `files` directory at the root of a profile. They are accessed by their name relative to this folder with `inspec.profile.file(...)`.
308
+
309
+ Here is an example for reading and testing a list of ports. The folder structure is:
310
+
311
+ examples/profile
312
+ ├── controls
313
+ │ ├── example.rb
314
+ |── files
315
+ │ └── services.yml
316
+ └── inspec.yml
317
+
318
+ With `services.yml` containing:
319
+
320
+ - service_name: httpd-alpha
321
+ port: 80
322
+ - service_name: httpd-beta
323
+ port: 8080
324
+
325
+ The tests in `example.rb` can now access this file:
326
+
327
+ my_services = yaml(content: inspec.profile.file('services.yml')).params
328
+
329
+ my_services.each do |s|
330
+ describe service(s['service_name']) do
331
+ it { should be_running }
332
+ end
333
+
334
+ describe port(s['port']) do
335
+ it { should be_listening }
336
+ end
337
+ end
338
+
339
+ For a more complete example that uses a profile file, see [Explore InSpec resources](https://learn.chef.io/modules/explore-inspec-resources#/) on Learn Chef Rally.
340
+
341
+ # "should" vs. "expect" syntax
342
+
343
+ Users familiar with the RSpec testing framework may know that there are two ways to write test statements: `should` and `expect`. The RSpec community decided that `expect` is the preferred syntax. However, InSpec recommends the `should` syntax as it tends to read more easily to those users who are not as technical.
344
+
345
+ InSpec will continue to support both methods of writing tests. Consider this `file` test:
346
+
347
+ describe file('/tmp/test.txt') do
348
+ it { should be_file }
349
+ end
350
+
351
+ This can be re-written with `expect` syntax
352
+
353
+ describe file('/tmp/test.txt') do
354
+ it 'should be a file' do
355
+ expect(subject).to(be_file)
356
+ end
357
+ end
358
+
359
+ The output of both of the above examples looks like this:
360
+
361
+ File /tmp/test.txt
362
+ ✔ should be a file
363
+
364
+ In addition, you can make use of the `subject` keyword to further control your output if you choose:
365
+
366
+ describe 'test file' do
367
+ subject { file('/tmp/test.txt') }
368
+ it 'should be a file' do
369
+ expect(subject).to(be_file)
370
+ end
371
+ end
372
+
373
+ ... which will render the following output:
374
+
375
+ test file
376
+ ✔ should be a file