inspec 1.0.0.beta2 → 1.0.0.beta3

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -2
  3. data/Gemfile +4 -0
  4. data/Rakefile +2 -1
  5. data/docs/.gitignore +2 -0
  6. data/docs/README.md +21 -1
  7. data/docs/resources/apache_conf.md.erb +75 -0
  8. data/docs/resources/apt.md.erb +84 -0
  9. data/docs/resources/audit_policy.md.erb +61 -0
  10. data/docs/resources/auditd_conf.md.erb +79 -0
  11. data/docs/resources/auditd_rules.md.erb +132 -0
  12. data/docs/resources/bash.md.erb +84 -0
  13. data/docs/resources/bond.md.erb +97 -0
  14. data/docs/resources/bridge.md.erb +67 -0
  15. data/docs/resources/bsd_service.md.erb +76 -0
  16. data/docs/resources/command.md.erb +151 -0
  17. data/docs/resources/csv.md.erb +62 -0
  18. data/docs/resources/directory.md.erb +43 -0
  19. data/docs/resources/etc_group.md.erb +116 -0
  20. data/docs/resources/etc_passwd.md.erb +155 -0
  21. data/docs/resources/etc_shadow.md.erb +149 -0
  22. data/docs/resources/file.md.erb +460 -0
  23. data/docs/resources/gem.md.erb +73 -0
  24. data/docs/resources/group.md.erb +74 -0
  25. data/docs/resources/grub_conf.md.erb +115 -0
  26. data/docs/resources/host.md.erb +85 -0
  27. data/docs/resources/iis_site.md.erb +142 -0
  28. data/docs/resources/inetd_conf.md.erb +99 -0
  29. data/docs/resources/ini.md.erb +69 -0
  30. data/docs/resources/interface.md.erb +66 -0
  31. data/docs/resources/iptables.md.erb +70 -0
  32. data/docs/resources/json.md.erb +76 -0
  33. data/docs/resources/kernel_module.md.erb +60 -0
  34. data/docs/resources/kernel_parameter.md.erb +72 -0
  35. data/docs/resources/launchd_service.md.erb +76 -0
  36. data/docs/resources/limits_conf.md.erb +80 -0
  37. data/docs/resources/login_def.md.erb +77 -0
  38. data/docs/resources/mount.md.erb +83 -0
  39. data/docs/resources/mysql_conf.md.erb +102 -0
  40. data/docs/resources/mysql_session.md.erb +63 -0
  41. data/docs/resources/npm.md.erb +75 -0
  42. data/docs/resources/ntp_conf.md.erb +76 -0
  43. data/docs/resources/oneget.md.erb +67 -0
  44. data/docs/resources/os.md.erb +154 -0
  45. data/docs/resources/os_env.md.erb +98 -0
  46. data/docs/resources/package.md.erb +115 -0
  47. data/docs/resources/parse_config.md.erb +122 -0
  48. data/docs/resources/parse_config_file.md.erb +143 -0
  49. data/docs/resources/pip.md.erb +74 -0
  50. data/docs/resources/port.md.erb +150 -0
  51. data/docs/resources/postgres_conf.md.erb +90 -0
  52. data/docs/resources/postgres_session.md.erb +75 -0
  53. data/docs/resources/powershell.md.erb +116 -0
  54. data/docs/resources/process.md.erb +73 -0
  55. data/docs/resources/registry_key.md.erb +149 -0
  56. data/docs/resources/runit_service.md.erb +76 -0
  57. data/docs/resources/security_policy.md.erb +61 -0
  58. data/docs/resources/service.md.erb +135 -0
  59. data/docs/resources/ssh_config.md.erb +94 -0
  60. data/docs/resources/sshd_config.md.erb +97 -0
  61. data/docs/resources/ssl.md.erb +133 -0
  62. data/docs/resources/sys_info.md.erb +55 -0
  63. data/docs/resources/systemd_service.md.erb +76 -0
  64. data/docs/resources/sysv_service.md.erb +76 -0
  65. data/docs/resources/upstart_service.md.erb +76 -0
  66. data/docs/resources/user.md.erb +154 -0
  67. data/docs/resources/users.md.erb +140 -0
  68. data/docs/resources/vbscript.md.erb +69 -0
  69. data/docs/resources/windows_feature.md.erb +61 -0
  70. data/docs/resources/wmi.md.erb +95 -0
  71. data/docs/resources/xinetd_conf.md.erb +170 -0
  72. data/docs/resources/yaml.md.erb +69 -0
  73. data/docs/resources/yum.md.erb +103 -0
  74. data/docs/ruby_usage.md +154 -0
  75. data/docs/shared/matcher_be.md.erb +1 -0
  76. data/docs/shared/matcher_cmp.md.erb +45 -0
  77. data/docs/shared/matcher_eq.md.erb +3 -0
  78. data/docs/shared/matcher_include.md.erb +1 -0
  79. data/docs/shared/matcher_match.md.erb +1 -0
  80. data/lib/fetchers/url.rb +27 -29
  81. data/lib/inspec/cached_fetcher.rb +67 -0
  82. data/lib/inspec/dependencies/requirement.rb +6 -7
  83. data/lib/inspec/objects/each_loop.rb +5 -2
  84. data/lib/inspec/plugins/fetcher.rb +2 -0
  85. data/lib/inspec/profile.rb +9 -41
  86. data/lib/inspec/resource.rb +1 -1
  87. data/lib/inspec/rspec_json_formatter.rb +11 -5
  88. data/lib/inspec/version.rb +1 -1
  89. data/lib/resources/groups.rb +190 -0
  90. data/lib/resources/users.rb +3 -2
  91. metadata +79 -6
  92. data/docs/cli.rst +0 -448
  93. data/docs/resources.rst +0 -4836
  94. data/docs/ruby_usage.rst +0 -145
  95. data/lib/resources/group.rb +0 -137
@@ -0,0 +1,62 @@
1
+ ---
2
+ title: About the csv Resource
3
+ ---
4
+
5
+ # csv
6
+
7
+ Use the `csv` InSpec audit resource to test configuration data in a CSV file.
8
+
9
+ # Syntax
10
+
11
+ A `csv` resource block declares the configuration data to be tested:
12
+
13
+ describe csv('file') do
14
+ its('name') { should eq 'foo' }
15
+ end
16
+
17
+ where
18
+
19
+ * `'file'` is the path to a CSV file
20
+ * `name` is a configuration setting in a CSV file
21
+ * `should eq 'foo'` tests a value of `name` as read from a CSV file versus the value declared in the test
22
+
23
+
24
+ # Matchers
25
+
26
+ This InSpec audit resource has the following matchers:
27
+
28
+ ## be
29
+
30
+ <%= partial "/shared/matcher_be" %>
31
+
32
+ ## cmp
33
+
34
+ <%= partial "/shared/matcher_cmp" %>
35
+
36
+ ## eq
37
+
38
+ <%= partial "/shared/matcher_eq" %>
39
+
40
+ ## include
41
+
42
+ <%= partial "/shared/matcher_include" %>
43
+
44
+ ## match
45
+
46
+ <%= partial "/shared/matcher_match" %>
47
+
48
+ ## name
49
+
50
+ The `name` matcher tests the value of `name` as read from a CSV file versus the value declared in the test:
51
+
52
+ its('name') { should eq 'foo' }
53
+
54
+ # Examples
55
+
56
+ The following examples show how to use this InSpec audit resource.
57
+
58
+ ## Test a CSV file
59
+
60
+ describe csv('some_file.csv') do
61
+ its('setting') { should eq 1 }
62
+ end
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: About the directory Resource
3
+ ---
4
+
5
+ # directory
6
+
7
+ Use the `directory` InSpec audit resource to test if the file type is a directory. This is equivalent to using the `file` resource and the `be_directory` matcher, but provides a simpler and more direct way to test directories. All of the matchers available to `file` may be used with `directory`.
8
+
9
+ # Syntax
10
+
11
+ A `directory` resource block declares the location of the directory to be tested, and then one (or more) matchers:
12
+
13
+ describe directory('path') do
14
+ it { should MATCHER 'value' }
15
+ end
16
+
17
+ # Matchers
18
+
19
+ This resource may use any of the matchers available to the `file` resource that may be useful when testing a directory.
20
+
21
+ ## be
22
+
23
+ <%= partial "/shared/matcher_be" %>
24
+
25
+ ## cmp
26
+
27
+ <%= partial "/shared/matcher_cmp" %>
28
+
29
+ ## eq
30
+
31
+ <%= partial "/shared/matcher_eq" %>
32
+
33
+ ## include
34
+
35
+ <%= partial "/shared/matcher_include" %>
36
+
37
+ ## match
38
+
39
+ <%= partial "/shared/matcher_match" %>
40
+
41
+ # Examples
42
+
43
+ None.
@@ -0,0 +1,116 @@
1
+ ---
2
+ title: About the etc_group Resource
3
+ ---
4
+
5
+ # etc_group
6
+
7
+ Use the `etc_group` InSpec audit resource to test groups that are defined on Linux and Unix platforms. The `/etc/group` file stores details about each group---group name, password, group identifier, along with a comma-separate list of users that belong to the group.
8
+
9
+ # Syntax
10
+
11
+ A `etc_group` resource block declares a collection of properties to be tested:
12
+
13
+ describe etc_group('path') do
14
+ its('matcher') { should eq 'some_value' }
15
+ end
16
+
17
+ or:
18
+
19
+ describe etc_group.where(item: 'value', item: 'value') do
20
+ its('gids') { should_not contain_duplicates }
21
+ its('groups') { should include 'user_name' }
22
+ its('users') { should include 'user_name' }
23
+ end
24
+
25
+ where
26
+
27
+ * `('path')` is the non-default path to the `inetd.conf` file
28
+ * `.where()` may specify a specific item and value, to which the matchers are compared
29
+ * `'gids'`, `'groups'`, and `'users'` are valid matchers for this resource
30
+
31
+ # Matchers
32
+
33
+ This InSpec audit resource has the following matchers:
34
+
35
+ ## be
36
+
37
+ <%= partial "/shared/matcher_be" %>
38
+
39
+ ## cmp
40
+
41
+ <%= partial "/shared/matcher_cmp" %>
42
+
43
+ ## eq
44
+
45
+ <%= partial "/shared/matcher_eq" %>
46
+
47
+ ## gids
48
+
49
+ The `gids` matcher tests if the named group identifier is present or if it contains duplicates:
50
+
51
+ its('gids') { should_not contain_duplicates }
52
+
53
+ ## groups
54
+
55
+ The `groups` matcher tests all groups for the named user:
56
+
57
+ its('groups') { should include 'my_group' }
58
+
59
+ ## include
60
+
61
+ <%= partial "/shared/matcher_include" %>
62
+
63
+ ## match
64
+
65
+ <%= partial "/shared/matcher_match" %>
66
+
67
+ ## users
68
+
69
+ The `users` matcher tests all groups for the named user:
70
+
71
+ its('users') { should include 'my_user' }
72
+
73
+ ## where
74
+
75
+ The `where` matcher allows the test to be focused to one (or more) specific items:
76
+
77
+ etc_group.where(item: 'value', item: 'value')
78
+
79
+ where `item` may be one (or more) of:
80
+
81
+ * `name: 'name'`
82
+ * `group_name: 'group_name'`
83
+ * `password: 'password'`
84
+ * `gid: 'gid'`
85
+ * `group_id: 'gid'`
86
+ * `users: 'user_name'`
87
+ * `members: 'member_name'`
88
+
89
+
90
+ # Examples
91
+
92
+ The following examples show how to use this InSpec audit resource.
93
+
94
+ ## Test group identifiers (GIDs) for duplicates
95
+
96
+ describe etc_group do
97
+ its('gids') { should_not contain_duplicates }
98
+ end
99
+
100
+ ## Test all groups to see if a specific user belongs to one (or more) groups
101
+
102
+ describe etc_group do
103
+ its('groups') { should include 'my_group' }
104
+ end
105
+
106
+ ## Test all groups for a specific user name
107
+
108
+ describe etc_group do
109
+ its('users') { should include 'my_user' }
110
+ end
111
+
112
+ ## Filter a list of groups for a specific user
113
+
114
+ describe etc_group.where(name: 'my_group') do
115
+ its('users') { should include 'my_user' }
116
+ end
@@ -0,0 +1,155 @@
1
+ ---
2
+ title: About the passwd Resource
3
+ ---
4
+
5
+ # passwd
6
+
7
+ Use the `passwd` InSpec audit resource to test the contents of `/etc/passwd`, which contains the following information for users that may log into the system and/or as users that own running processes. The format for `/etc/passwd` includes:
8
+
9
+ * A username
10
+ * The password for that user (on newer systems passwords should be stored in `/etc/shadow` )
11
+ * The user identifier (UID) assigned to that user
12
+ * The group identifier (GID) assigned to that user
13
+ * Additional information about that user
14
+ * That user's home directory
15
+ * That user's default command shell
16
+
17
+ These entries are defined as a colon-delimited row in the file, one row per user:
18
+
19
+ root:x:1234:5678:additional_info:/home/dir/:/bin/bash
20
+
21
+ # Syntax
22
+
23
+ A `passwd` resource block declares one (or more) users and associated user information to be tested:
24
+
25
+ describe passwd do
26
+ its('users') { should_not include 'forbidden_user' }
27
+ end
28
+
29
+ describe passwd.uid(filter) do
30
+ its('users') { should cmp 'root' }
31
+ its('count') { should eq 1 }
32
+ end
33
+
34
+ where
35
+
36
+ * `homes`, `gids`, `passwords`, `shells`, `uids`, and `users` are valid accessors for `passwd`
37
+ * `filter` one (or more) arguments, for example: `passwd.users(/name/)` used to define filtering
38
+ * `filter` may take any of the following arguments: `count` (retrieves the number of entries), `lines` (provides raw `passwd` lines), and `params` (returns an array of maps for all entries)
39
+
40
+
41
+ # Matchers
42
+
43
+ This InSpec audit resource has the following matchers:
44
+
45
+ ## be
46
+
47
+ <%= partial "/shared/matcher_be" %>
48
+
49
+ ## cmp
50
+
51
+ <%= partial "/shared/matcher_cmp" %>
52
+
53
+ ## eq
54
+
55
+ <%= partial "/shared/matcher_eq" %>
56
+
57
+ ## gids
58
+
59
+ The `gids` matcher tests if the group indentifiers in the test match group identifiers in `/etc/passwd`:
60
+
61
+ its('gids') { should include 1234 }
62
+ its('gids') { should cmp 0 }
63
+
64
+ ## homes
65
+
66
+ The `homes` matcher tests the absolute path to a user's home directory:
67
+
68
+ its('home') { should eq '/' }
69
+
70
+ ## include
71
+
72
+ <%= partial "/shared/matcher_include" %>
73
+
74
+ ## length
75
+
76
+ The `length` matcher tests the length of a password that appears in `/etc/passwd`:
77
+
78
+ its('length') { should be <= 32 }
79
+
80
+ This matcher is best used in conjunction with filters. For example:
81
+
82
+ describe passwd.users('highlander') do
83
+ its('length') { should_not be < 16 }
84
+ end
85
+
86
+ ## match
87
+
88
+ <%= partial "/shared/matcher_match" %>
89
+
90
+ ## passwords
91
+
92
+ The `passwords` matcher tests if passwords are
93
+
94
+ * Encrypted
95
+ * Have direct logins disabled, as indicated by an asterisk (`*`)
96
+ * In the `/etc/shadow` file, as indicated by the letter x (`x`)
97
+
98
+ For example:
99
+
100
+ its('passwords') { should eq ['x'] }
101
+ its('passwords') { should cmp '*' }
102
+
103
+ ## shells
104
+
105
+ The `shells` matcher tests the absolute path of a shell (or command) to which a user has access:
106
+
107
+ its('shells') { should_not include 'user' }
108
+
109
+ or to find all users with the nologin shell:
110
+
111
+ describe passwd.shells(/nologin/) do
112
+ its('users') { should_not include 'my_login_user' }
113
+ end
114
+
115
+ ## uids
116
+
117
+ The `uids` matcher tests if the user indentifiers in the test match user identifiers in `/etc/passwd`:
118
+
119
+ its('uids') { should eq ['1234', '1235'] }
120
+
121
+ or:
122
+
123
+ describe passwd.uids(0) do
124
+ its('users') { should cmp 'root' }
125
+ its('count') { should eq 1 }
126
+ end
127
+
128
+ ## users
129
+
130
+ The `users` matcher tests if the user names in the test match user names in `/etc/passwd`:
131
+
132
+ its('users') { should eq ['root', 'www-data'] }
133
+
134
+ # Examples
135
+
136
+ The following examples show how to use this InSpec audit resource.
137
+
138
+ ## Test usernames and UIDs
139
+
140
+ describe passwd do
141
+ its('users') { should eq ['root', 'www-data'] }
142
+ its('uids') { should eq [0, 33] }
143
+ end
144
+
145
+ ## Select one user and test for multiple occurrences
146
+
147
+ describe passwd.uids(0) do
148
+ its('users') { should cmp 'root' }
149
+ its('count') { should eq 1 }
150
+ end
151
+
152
+ describe passwd.filter(user: 'www-data') do
153
+ its('uids') { should cmp 33 }
154
+ its('count') { should eq 1 }
155
+ end
@@ -0,0 +1,149 @@
1
+ ---
2
+ title: About the shadow Resource
3
+ ---
4
+
5
+ # shadow
6
+
7
+ Use the `shadow` InSpec audit resource to test the contents of `/etc/shadow`, which contains password details that are only readable by the `root` user. The format for `/etc/shadow` includes:
8
+
9
+ * A username
10
+ * The password for that user (on newer systems passwords should be stored in `/etc/shadow` )
11
+ * The last time a password was changed
12
+ * The minimum number of days a password must exist, before it may be changed
13
+ * The maximum number of days after which a password must be changed
14
+ * The number of days a user is warned about an expiring password
15
+ * The number of days a user must be inactive before the user account is disabled
16
+ * The number of days a user account has been disabled
17
+
18
+ These entries are defined as a colon-delimited row in the file, one row per user:
19
+
20
+ dannos:Gb7crrO5CDF.:10063:0:99999:7:::
21
+
22
+ # Syntax
23
+
24
+ A `shadow` resource block declares one (or more) users and associated user information to be tested:
25
+
26
+ describe shadow do
27
+ its('users') { should_not include 'forbidden_user' }
28
+ end
29
+
30
+ or with a filter:
31
+
32
+ describe shadow.uid(filter) do
33
+ its('users') { should cmp 'root' }
34
+ its('count') { should eq 1 }
35
+ end
36
+
37
+ where
38
+
39
+ * `homes`, `gids`, `passwords`, `shells`, `uids`, and `users` are valid accessors for `passwd`
40
+ * `filter` one (or more) arguments, for example: `passwd.users(/name/)` used to define filtering; `filter` may take any of the following arguments: `count` (retrieves the number of entries), `lines` (provides raw `passwd` lines), and `params` (returns an array of maps for all entries)
41
+
42
+
43
+ # Matchers
44
+
45
+ This InSpec audit resource has the following matchers:
46
+
47
+ ## be
48
+
49
+ <%= partial "/shared/matcher_be" %>
50
+
51
+ ## cmp
52
+
53
+ <%= partial "/shared/matcher_cmp" %>
54
+
55
+ ## count
56
+
57
+ The `count` matcher tests the number of times the named user appears in `/etc/shadow`:
58
+
59
+ its('count') { should eq 1 }
60
+
61
+ TThis matcher is best used in conjunction with filters. For example:
62
+
63
+ describe shadow.users('dannos') do
64
+ its('count') { should eq 1 }
65
+ end
66
+
67
+ ## eq
68
+
69
+ <%= partial "/shared/matcher_eq" %>
70
+
71
+ ## expiry_dates
72
+
73
+ The `expiry_dates` matcher tests the number of days a user account has been disabled:
74
+
75
+ its('expiry_dates') { should eq '' }
76
+
77
+ ## inactive_days
78
+
79
+ The `inactive_days` matcher tests the number of days a user must be inactive before the user account is disabled:
80
+
81
+ its('inactive_days') { should eq '' }
82
+
83
+ ## include
84
+
85
+ <%= partial "/shared/matcher_include" %>
86
+
87
+ ## last_changes
88
+
89
+ The `last_changes` matcher tests the last time a password was changed:
90
+
91
+ its('last_changes') { should eq '' }
92
+
93
+ ## match
94
+
95
+ <%= partial "/shared/matcher_match" %>
96
+
97
+ ## max_days
98
+
99
+ The `max_days` matcher tests the maximum number of days after which a password must be changed:
100
+
101
+ its('max_days') { should eq 90 }
102
+
103
+ ## min_days
104
+
105
+ The `min_days` matcher tests the minimum number of days a password must exist, before it may be changed:
106
+
107
+ its('min_days') { should eq 0 }
108
+
109
+ ## passwords
110
+
111
+ The `passwords` matcher tests if passwords are
112
+
113
+ * Encrypted
114
+ * Have direct logins disabled, as indicated by an asterisk (`*`)
115
+ * In the `/etc/shadow` file, as indicated by the letter x (`x`)
116
+
117
+ For example:
118
+
119
+ its('passwords') { should eq ['x'] }
120
+ its('passwords') { should cmp '*' }
121
+
122
+ ## users
123
+
124
+ The `users` matcher tests if the user name exists `/etc/shadow`:
125
+
126
+ its('users') { should eq 'root' }
127
+
128
+ ## warn_days
129
+
130
+ The `warn_days` matcher tests the number of days a user is warned about an expiring password:
131
+
132
+ its('warn_days') { should eq 7 }
133
+
134
+ # Examples
135
+
136
+ The following examples show how to use this InSpec audit resource.
137
+
138
+ ## Test for a forbidden user
139
+
140
+ describe shadow do
141
+ its('users') { should_not include 'forbidden_user' }
142
+ end
143
+
144
+ ## Test that a user appears one time
145
+
146
+ describe shadow.users('bin') do
147
+ its('passwords') { should cmp 'x' }
148
+ its('count') { should eq 1 }
149
+ end