inspec 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +58 -8
- data/README.md +8 -39
- data/Rakefile +74 -9
- data/bin/inspec +66 -10
- data/docs/ctl_inspec.rst +7 -1
- data/docs/inspec_and_friends.rst +1 -1
- data/docs/resources.rst +51 -45
- data/examples/README.md +7 -0
- data/examples/kitchen-ansible/.kitchen.yml +25 -0
- data/examples/kitchen-ansible/Gemfile +20 -0
- data/examples/kitchen-ansible/README.md +53 -0
- data/examples/kitchen-ansible/files/nginx.repo +6 -0
- data/examples/kitchen-ansible/tasks/main.yml +16 -0
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -0
- data/examples/{test-kitchen → kitchen-ansible}/test/integration/default/web_spec.rb +0 -0
- data/examples/{test-kitchen → kitchen-chef}/.kitchen.yml +1 -1
- data/examples/{test-kitchen → kitchen-chef}/Berksfile +0 -0
- data/examples/{test-kitchen → kitchen-chef}/Gemfile +1 -2
- data/examples/{test-kitchen → kitchen-chef}/README.md +1 -1
- data/examples/{test-kitchen → kitchen-chef}/metadata.rb +0 -0
- data/examples/{test-kitchen → kitchen-chef}/recipes/default.rb +0 -0
- data/examples/{test-kitchen → kitchen-chef}/recipes/nginx.rb +0 -0
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -0
- data/examples/kitchen-puppet/.kitchen.yml +22 -0
- data/examples/kitchen-puppet/Gemfile +21 -0
- data/examples/kitchen-puppet/Puppetfile +25 -0
- data/examples/kitchen-puppet/README.md +53 -0
- data/examples/kitchen-puppet/manifests/site.pp +33 -0
- data/examples/kitchen-puppet/metadata.json +11 -0
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -0
- data/inspec.gemspec +2 -0
- data/lib/inspec/plugins/resource.rb +21 -0
- data/lib/inspec/shell.rb +73 -11
- data/lib/inspec/version.rb +1 -1
- data/lib/matchers/matchers.rb +43 -0
- data/lib/resources/apache_conf.rb +12 -9
- data/lib/resources/apt.rb +7 -0
- data/lib/resources/audit_policy.rb +6 -6
- data/lib/resources/auditd_conf.rb +6 -7
- data/lib/resources/auditd_rules.rb +9 -8
- data/lib/resources/bond.rb +6 -6
- data/lib/resources/bridge.rb +7 -0
- data/lib/resources/command.rb +10 -8
- data/lib/resources/csv.rb +6 -5
- data/lib/resources/directory.rb +6 -0
- data/lib/resources/etc_group.rb +9 -1
- data/lib/resources/file.rb +72 -61
- data/lib/resources/gem.rb +6 -4
- data/lib/resources/group.rb +7 -0
- data/lib/resources/host.rb +6 -0
- data/lib/resources/inetd_conf.rb +8 -8
- data/lib/resources/ini.rb +6 -6
- data/lib/resources/interface.rb +8 -8
- data/lib/resources/iptables.rb +6 -0
- data/lib/resources/json.rb +6 -5
- data/lib/resources/kernel_module.rb +6 -5
- data/lib/resources/kernel_parameter.rb +6 -4
- data/lib/resources/limits_conf.rb +6 -6
- data/lib/resources/login_def.rb +6 -0
- data/lib/resources/mysql_conf.rb +6 -0
- data/lib/resources/mysql_session.rb +7 -0
- data/lib/resources/npm.rb +6 -4
- data/lib/resources/ntp_conf.rb +7 -7
- data/lib/resources/oneget.rb +6 -0
- data/lib/resources/os.rb +8 -0
- data/lib/resources/os_env.rb +6 -0
- data/lib/resources/package.rb +8 -1
- data/lib/resources/parse_config.rb +14 -0
- data/lib/resources/passwd.rb +7 -0
- data/lib/resources/pip.rb +6 -0
- data/lib/resources/port.rb +22 -11
- data/lib/resources/postgres_conf.rb +6 -0
- data/lib/resources/postgres_session.rb +8 -0
- data/lib/resources/processes.rb +17 -1
- data/lib/resources/registry_key.rb +7 -0
- data/lib/resources/script.rb +11 -0
- data/lib/resources/security_policy.rb +6 -1
- data/lib/resources/service.rb +10 -0
- data/lib/resources/ssh_conf.rb +6 -0
- data/lib/resources/user.rb +9 -2
- data/lib/resources/windows_feature.rb +6 -0
- data/lib/resources/yaml.rb +6 -0
- data/lib/resources/yum.rb +7 -0
- data/lib/utils/find_files.rb +15 -7
- data/test/helper.rb +9 -0
- data/test/integration/.kitchen.yml +3 -0
- data/test/integration/test/integration/default/compare_matcher_spec.rb +19 -0
- data/test/integration/test/integration/default/etc_group.rb +13 -0
- data/test/integration/test/integration/default/os_spec.rb +13 -0
- data/test/integration/test/integration/default/port_spec.rb +1 -1
- data/test/unit/mock/cmd/find-apache2-conf-enabled +1 -0
- data/test/unit/mock/cmd/find-apache2-ports-conf +1 -0
- data/test/unit/mock/cmd/ps-aux +2 -0
- data/test/unit/mock/files/apache2.conf +14 -0
- data/test/unit/mock/files/ports.conf +6 -0
- data/test/unit/mock/files/serve-cgi-bin.conf +20 -0
- data/test/unit/resources/apache_conf_test.rb +31 -0
- data/test/unit/resources/file_test.rb +181 -0
- data/test/unit/resources/package_test.rb +9 -0
- data/test/unit/resources/port_test.rb +33 -13
- data/test/unit/resources/processes_test.rb +6 -0
- data/test/unit/resources/service_test.rb +10 -0
- data/test/unit/resources/user_test.rb +12 -0
- data/test/unit/utils/find_files_test.rb +23 -0
- metadata +61 -16
- data/bin/inspec.orig +0 -115
- data/lib/resources/.service.rb.swp +0 -0
- data/test/unit/mock/profiles/rules/metadata.rb +0 -2
- data/test/unit/mock/profiles/rules/test/test.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a0409ea39853cce8b89f828d6c639c48c0adfe4
|
4
|
+
data.tar.gz: a424f575ac78ec70775f6d84d577330f278be8fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4be07873774b1a7b9bb11160c9078d004808aaad09be4c91841cc5af5e4a896d0d3c5f6c83d184fadd88048e26c4611ff26e688bc499149e32b91c66fca27071
|
7
|
+
data.tar.gz: a11ee4ab19c53b5c7f8e3a8d30a1047655ffe62d562a8874818bb29050005e7cb917c7e7d93fd8e396535147530aae450ce24f4f31c36f5c7415c029362c9d83
|
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,65 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [0.9.
|
4
|
-
[Full Changelog](https://github.com/chef/inspec/compare/v0.9.
|
3
|
+
## [0.9.6](https://github.com/chef/inspec/tree/0.9.6) (2015-12-11)
|
4
|
+
[Full Changelog](https://github.com/chef/inspec/compare/v0.9.5...0.9.6)
|
5
5
|
|
6
6
|
**Implemented enhancements:**
|
7
7
|
|
8
|
-
-
|
8
|
+
- JSON configuration [\#292](https://github.com/chef/inspec/issues/292)
|
9
|
+
- Replace the `pry... ` bits in inspec shell [\#267](https://github.com/chef/inspec/issues/267)
|
10
|
+
- Better wording for check [\#260](https://github.com/chef/inspec/issues/260)
|
11
|
+
- OS resource with string and symbol support [\#227](https://github.com/chef/inspec/issues/227)
|
12
|
+
- matcher for less-restrictive comparison [\#318](https://github.com/chef/inspec/pull/318) ([chris-rock](https://github.com/chris-rock))
|
13
|
+
- add readme to examples [\#313](https://github.com/chef/inspec/pull/313) ([chris-rock](https://github.com/chris-rock))
|
14
|
+
- Minor `inspec shell` improvements [\#283](https://github.com/chef/inspec/pull/283) ([srenatus](https://github.com/srenatus))
|
15
|
+
- add kitchen-ansible inspec example [\#275](https://github.com/chef/inspec/pull/275) ([alexpop](https://github.com/alexpop))
|
16
|
+
- add kitchen-puppet example with inspec testing [\#273](https://github.com/chef/inspec/pull/273) ([alexpop](https://github.com/alexpop))
|
17
|
+
- Feature: Add shell `help resource` command [\#269](https://github.com/chef/inspec/pull/269) ([chris-rock](https://github.com/chris-rock))
|
18
|
+
|
19
|
+
**Fixed bugs:**
|
20
|
+
|
21
|
+
- auditd\_conf parameters should be case insensitive [\#307](https://github.com/chef/inspec/issues/307)
|
22
|
+
- Processes resource doesn't handle user or state [\#295](https://github.com/chef/inspec/issues/295)
|
23
|
+
- JSON configuration [\#292](https://github.com/chef/inspec/issues/292)
|
24
|
+
- Windows file matcher does not match existing files [\#288](https://github.com/chef/inspec/issues/288)
|
25
|
+
- Inspec hangs when executing some windows profiles against linux machine [\#279](https://github.com/chef/inspec/issues/279)
|
26
|
+
- Utils::FindFiles doesn't work [\#276](https://github.com/chef/inspec/issues/276)
|
27
|
+
- etc\_group not implemented for centos [\#266](https://github.com/chef/inspec/issues/266)
|
28
|
+
- Port resource returns arrays [\#256](https://github.com/chef/inspec/issues/256)
|
29
|
+
- Custom resource not available, undefined local variable or method `gordon\_config` [\#232](https://github.com/chef/inspec/issues/232)
|
30
|
+
- File permission checks should return false unless file exists [\#301](https://github.com/chef/inspec/pull/301) ([adamleff](https://github.com/adamleff))
|
31
|
+
- remove json doc for windows\_feature [\#272](https://github.com/chef/inspec/pull/272) ([chris-rock](https://github.com/chris-rock))
|
32
|
+
- improvement: add etc\_group support for centos and add integration test [\#270](https://github.com/chef/inspec/pull/270) ([chris-rock](https://github.com/chris-rock))
|
33
|
+
|
34
|
+
**Merged pull requests:**
|
35
|
+
|
36
|
+
- Bugfix: Properly initialize script resource [\#316](https://github.com/chef/inspec/pull/316) ([chris-rock](https://github.com/chris-rock))
|
37
|
+
- improve shell prompt and help [\#315](https://github.com/chef/inspec/pull/315) ([chris-rock](https://github.com/chris-rock))
|
38
|
+
- port resource: array attributes, resource alternative [\#303](https://github.com/chef/inspec/pull/303) ([srenatus](https://github.com/srenatus))
|
39
|
+
- support string and symbol for os resource [\#299](https://github.com/chef/inspec/pull/299) ([chris-rock](https://github.com/chris-rock))
|
40
|
+
- \[resources/apache\_conf\]: add tests, fix bug [\#298](https://github.com/chef/inspec/pull/298) ([srenatus](https://github.com/srenatus))
|
41
|
+
- \[resources/processes\] add user\(s\), state\(s\) attribute [\#297](https://github.com/chef/inspec/pull/297) ([srenatus](https://github.com/srenatus))
|
42
|
+
- fix small grammar error [\#294](https://github.com/chef/inspec/pull/294) ([juliandunn](https://github.com/juliandunn))
|
43
|
+
- read config from file/stdin [\#293](https://github.com/chef/inspec/pull/293) ([srenatus](https://github.com/srenatus))
|
44
|
+
- revert to old find\_files interface [\#291](https://github.com/chef/inspec/pull/291) ([srenatus](https://github.com/srenatus))
|
45
|
+
- Adding support for Wind River Linux [\#289](https://github.com/chef/inspec/pull/289) ([adamleff](https://github.com/adamleff))
|
46
|
+
- travis workarounds [\#286](https://github.com/chef/inspec/pull/286) ([srenatus](https://github.com/srenatus))
|
47
|
+
- Support mint in the integration tests [\#281](https://github.com/chef/inspec/pull/281) ([artem-sidorenko](https://github.com/artem-sidorenko))
|
48
|
+
- align cli documentation with cli [\#278](https://github.com/chef/inspec/pull/278) ([chris-rock](https://github.com/chris-rock))
|
49
|
+
- Remove description of custom resource [\#277](https://github.com/chef/inspec/pull/277) ([chris-rock](https://github.com/chris-rock))
|
50
|
+
- add rake tasks for showing and bumping the version of inspec [\#265](https://github.com/chef/inspec/pull/265) ([arlimus](https://github.com/arlimus))
|
51
|
+
|
52
|
+
## [v0.9.5](https://github.com/chef/inspec/tree/v0.9.5) (2015-11-25)
|
53
|
+
[Full Changelog](https://github.com/chef/inspec/compare/v0.9.4...v0.9.5)
|
54
|
+
|
55
|
+
**Implemented enhancements:**
|
56
|
+
|
57
|
+
- Support the -i switch for key files as per ssh [\#261](https://github.com/chef/inspec/issues/261)
|
9
58
|
- Add -p alias for --port like ssh [\#263](https://github.com/chef/inspec/pull/263) ([alexmanly](https://github.com/alexmanly))
|
10
59
|
|
11
60
|
**Merged pull requests:**
|
12
61
|
|
62
|
+
- 0.9.5 [\#264](https://github.com/chef/inspec/pull/264) ([arlimus](https://github.com/arlimus))
|
13
63
|
- Add -i alias for --key\_files like ssh [\#262](https://github.com/chef/inspec/pull/262) ([jcreedcmu](https://github.com/jcreedcmu))
|
14
64
|
|
15
65
|
## [v0.9.4](https://github.com/chef/inspec/tree/v0.9.4) (2015-11-24)
|
@@ -19,13 +69,10 @@
|
|
19
69
|
|
20
70
|
- registry\_key needs to be case insensitive [\#254](https://github.com/chef/inspec/issues/254)
|
21
71
|
- User resource doesn't handle group names with spaces [\#238](https://github.com/chef/inspec/issues/238)
|
72
|
+
- inspec does not extract section name from test file header [\#182](https://github.com/chef/inspec/issues/182)
|
22
73
|
- bugfix: user resources support for group with whitespace [\#258](https://github.com/chef/inspec/pull/258) ([chris-rock](https://github.com/chris-rock))
|
23
74
|
- Bugfix: make registry\_key resource case-insensitive [\#255](https://github.com/chef/inspec/pull/255) ([alexpop](https://github.com/alexpop))
|
24
75
|
|
25
|
-
**Closed issues:**
|
26
|
-
|
27
|
-
- inspec does not extract section name from test file header [\#182](https://github.com/chef/inspec/issues/182)
|
28
|
-
|
29
76
|
**Merged pull requests:**
|
30
77
|
|
31
78
|
- 0.9.4 [\#259](https://github.com/chef/inspec/pull/259) ([arlimus](https://github.com/arlimus))
|
@@ -39,9 +86,12 @@
|
|
39
86
|
|
40
87
|
- Support the control keyword, synonymous to rule [\#188](https://github.com/chef/inspec/issues/188)
|
41
88
|
|
42
|
-
**
|
89
|
+
**Fixed bugs:**
|
43
90
|
|
44
91
|
- Multiple computed calls to describe aren't registered [\#246](https://github.com/chef/inspec/issues/246)
|
92
|
+
|
93
|
+
**Closed issues:**
|
94
|
+
|
45
95
|
- port resource does not work on CentOS [\#239](https://github.com/chef/inspec/issues/239)
|
46
96
|
- os\_env not working [\#236](https://github.com/chef/inspec/issues/236)
|
47
97
|
- service resource misbehaves on upstart hosts [\#226](https://github.com/chef/inspec/issues/226)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# InSpec: Inspect Your Infrastructure
|
2
2
|
|
3
|
-
InSpec is open-source testing framework for infrastructure with a human- and machine-readable language for specifying compliance, security and policy requirements.
|
3
|
+
InSpec is an open-source testing framework for infrastructure with a human- and machine-readable language for specifying compliance, security and policy requirements.
|
4
4
|
|
5
5
|
```ruby
|
6
6
|
# Disallow insecure protocols by testing
|
@@ -92,7 +92,7 @@ end
|
|
92
92
|
|
93
93
|
describe port(443) do
|
94
94
|
it { should be_listening }
|
95
|
-
its('
|
95
|
+
its('protocols') {should include 'tcp'}
|
96
96
|
end
|
97
97
|
```
|
98
98
|
|
@@ -152,43 +152,6 @@ Which will provide you with:
|
|
152
152
|
{"family":"ubuntu","release":"14.04","arch":null}
|
153
153
|
```
|
154
154
|
|
155
|
-
## Custom InSpec resources
|
156
|
-
|
157
|
-
You can easily create your own resources. Here is a custom resource for an
|
158
|
-
application called Gordon. It is saved as `gordon_config.rb`.
|
159
|
-
|
160
|
-
```ruby
|
161
|
-
require 'yaml'
|
162
|
-
|
163
|
-
class GordonConfig < Inspec.resource(1)
|
164
|
-
name 'gordon_config'
|
165
|
-
|
166
|
-
def initialize
|
167
|
-
@path = '/etc/gordon/config.yaml'
|
168
|
-
@config = inspec.file(@path).content
|
169
|
-
@params = YAML.load(@config)
|
170
|
-
end
|
171
|
-
|
172
|
-
def method_missing(name)
|
173
|
-
@params[name.to_s]
|
174
|
-
end
|
175
|
-
end
|
176
|
-
```
|
177
|
-
|
178
|
-
Include this file in your `test.rb`:
|
179
|
-
|
180
|
-
```ruby
|
181
|
-
require_relative 'gordon_config'
|
182
|
-
```
|
183
|
-
|
184
|
-
Now you can start using your new resource:
|
185
|
-
|
186
|
-
```ruby
|
187
|
-
describe gordon_config do
|
188
|
-
its('Version') { should eq('1.0') }
|
189
|
-
end
|
190
|
-
```
|
191
|
-
|
192
155
|
## Documentation
|
193
156
|
|
194
157
|
Documentation is available: https://github.com/chef/inspec/tree/master/docs
|
@@ -221,6 +184,12 @@ We perform `unit`, `resource` and `integration` tests.
|
|
221
184
|
bundle exec rake test
|
222
185
|
```
|
223
186
|
|
187
|
+
If you like to run only one test, use
|
188
|
+
|
189
|
+
```bash
|
190
|
+
bundle exec ruby -W -Ilib:test test/unit/resources/user_test.rb
|
191
|
+
```
|
192
|
+
|
224
193
|
### Resource tests
|
225
194
|
|
226
195
|
Resource tests make sure the backend execution layer behaves as expected. These tests will take a while, as a lot of different operating systems and configurations are being tested.
|
data/Rakefile
CHANGED
@@ -48,14 +48,79 @@ namespace :test do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
#
|
52
|
-
#
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
51
|
+
# Print the current version of this gem or update it.
|
52
|
+
#
|
53
|
+
# @param [Type] target the new version you want to set, or nil if you only want to show
|
54
|
+
def inspec_version(target = nil)
|
55
|
+
path = 'lib/inspec/version.rb'
|
56
|
+
require_relative path.sub(/.rb$/, '')
|
57
|
+
|
58
|
+
nu_version = target.nil? ? '' : " -> #{target}"
|
59
|
+
puts "Inspec: #{Inspec::VERSION}#{nu_version}"
|
60
|
+
|
61
|
+
unless target.nil?
|
62
|
+
raw = File.read(path)
|
63
|
+
nu = raw.sub(/VERSION.*/, "VERSION = '#{target}'")
|
64
|
+
File.write(path, nu)
|
65
|
+
load(path)
|
59
66
|
end
|
60
|
-
|
67
|
+
end
|
68
|
+
|
69
|
+
# Check if a command is available
|
70
|
+
#
|
71
|
+
# @param [Type] x the command you are interested in
|
72
|
+
# @param [Type] msg the message to display if the command is missing
|
73
|
+
def require_command(x, msg = nil)
|
74
|
+
return if system("command -v #{x} || exit 1")
|
75
|
+
msg ||= 'Please install it first!'
|
76
|
+
puts "\033[31;1mCan't find command #{x.inspect}. #{msg}\033[0m"
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
# Check if a required environment variable has been set
|
81
|
+
#
|
82
|
+
# @param [String] x the variable you are interested in
|
83
|
+
# @param [String] msg the message you want to display if the variable is missing
|
84
|
+
def require_env(x, msg = nil)
|
85
|
+
exists = `env | grep "^#{x}="`
|
86
|
+
return unless exists.empty?
|
87
|
+
puts "\033[31;1mCan't find environment variable #{x.inspect}. #{msg}\033[0m"
|
88
|
+
exit 1
|
89
|
+
end
|
90
|
+
|
91
|
+
# Check the requirements for running an update of this repository.
|
92
|
+
def check_update_requirements
|
93
|
+
require_command 'git'
|
94
|
+
require_command 'github_changelog_generator', "\n"\
|
95
|
+
"For more information on how to install it see:\n"\
|
96
|
+
" https://github.com/skywinder/github-changelog-generator\n"
|
97
|
+
require_env 'CHANGELOG_GITHUB_TOKEN', "\n"\
|
98
|
+
"Please configure this token to make sure you can run all commands\n"\
|
99
|
+
"against GitHub.\n\n"\
|
100
|
+
"See github_changelog_generator homepage for more information:\n"\
|
101
|
+
" https://github.com/skywinder/github-changelog-generator\n"
|
102
|
+
end
|
103
|
+
|
104
|
+
# Show the current version of this gem.
|
105
|
+
desc 'Show the version of this gem'
|
106
|
+
task :version do
|
107
|
+
inspec_version
|
108
|
+
end
|
109
|
+
|
110
|
+
desc 'Generate the changelog'
|
111
|
+
task :changelog do
|
112
|
+
require_relative 'lib/inspec/version'
|
113
|
+
system "github_changelog_generator -u chef -p inspec --future-release #{Inspec::VERSION} --since-tag 0.7.0"
|
114
|
+
end
|
115
|
+
|
116
|
+
# Update the version of this gem and create an updated
|
117
|
+
# changelog. It covers everything short of actually releasing
|
118
|
+
# the gem.
|
119
|
+
desc 'Bump the version of this gem'
|
120
|
+
task :bump_version, [:version] do |_, args|
|
121
|
+
v = args[:version] || ENV['to']
|
122
|
+
fail "You must specify a target version! rake release[1.2.3]" if v.empty?
|
123
|
+
check_update_requirements
|
124
|
+
inspec_version(v)
|
125
|
+
Rake::Task['changelog'].invoke
|
61
126
|
end
|
data/bin/inspec
CHANGED
@@ -6,9 +6,13 @@
|
|
6
6
|
|
7
7
|
require 'thor'
|
8
8
|
require 'json'
|
9
|
+
require 'pp'
|
9
10
|
require_relative '../lib/inspec'
|
10
11
|
|
11
|
-
class InspecCLI < Thor
|
12
|
+
class InspecCLI < Thor # rubocop:disable Metrics/ClassLength
|
13
|
+
class_option :diagnose, type: :boolean,
|
14
|
+
desc: 'Show diagnostics (versions, configurations)'
|
15
|
+
|
12
16
|
def self.target_options
|
13
17
|
option :target, aliases: :t, type: :string, default: nil,
|
14
18
|
desc: 'Simple targeting option using URIs, e.g. ssh://user:pass@host:port'
|
@@ -36,16 +40,20 @@ class InspecCLI < Thor
|
|
36
40
|
desc: 'Use SSL for transport layer encryption (WinRM).'
|
37
41
|
option :self_signed, type: :boolean, default: false,
|
38
42
|
desc: 'Allow remote scans with self-signed certificates (WinRM).'
|
43
|
+
option :json_config, type: :string,
|
44
|
+
desc: 'Read configuration from JSON file (`-` reads from stdin).'
|
39
45
|
end
|
40
46
|
|
41
|
-
desc 'json PATH', 'read all tests in PATH and generate a JSON
|
47
|
+
desc 'json PATH', 'read all tests in PATH and generate a JSON summary'
|
42
48
|
option :id, type: :string,
|
43
49
|
desc: 'Attach a profile ID to all test results'
|
44
50
|
option :output, aliases: :o, type: :string,
|
45
51
|
desc: 'Save the created profile to a path'
|
46
52
|
def json(path)
|
47
|
-
|
48
|
-
|
53
|
+
diagnose
|
54
|
+
|
55
|
+
profile = Inspec::Profile.from_path(path, opts)
|
56
|
+
dst = opts[:output].to_s
|
49
57
|
if dst.empty?
|
50
58
|
puts JSON.pretty_generate(profile.info)
|
51
59
|
else
|
@@ -59,21 +67,25 @@ class InspecCLI < Thor
|
|
59
67
|
end
|
60
68
|
end
|
61
69
|
|
62
|
-
desc 'check PATH', 'verify
|
70
|
+
desc 'check PATH', 'verify all tests at the specified PATH'
|
63
71
|
def check(path)
|
64
|
-
|
72
|
+
diagnose
|
73
|
+
|
74
|
+
o = opts.dup
|
65
75
|
o[:logger] = Logger.new(STDOUT)
|
66
76
|
profile = Inspec::Profile.from_path(path, o)
|
67
77
|
exit 1 unless profile.check
|
68
78
|
end
|
69
79
|
|
70
|
-
desc 'exec PATHS', 'run all test files'
|
80
|
+
desc 'exec PATHS', 'run all test files at the specified PATH.'
|
71
81
|
option :id, type: :string,
|
72
82
|
desc: 'Attach a profile ID to all test results'
|
73
83
|
target_options
|
74
84
|
option :format, type: :string, default: 'progress'
|
75
85
|
def exec(*tests)
|
76
|
-
|
86
|
+
diagnose
|
87
|
+
|
88
|
+
runner = Inspec::Runner.new(opts)
|
77
89
|
runner.add_tests(tests)
|
78
90
|
runner.run
|
79
91
|
rescue RuntimeError => e
|
@@ -83,7 +95,9 @@ class InspecCLI < Thor
|
|
83
95
|
desc 'detect', 'detect the target OS'
|
84
96
|
target_options
|
85
97
|
def detect
|
86
|
-
|
98
|
+
diagnose
|
99
|
+
|
100
|
+
runner = Inspec::Runner.new(opts)
|
87
101
|
rel = File.join(File.dirname(__FILE__), *%w{.. lib utils detect.rb})
|
88
102
|
detect_util = File.expand_path(rel)
|
89
103
|
runner.add_tests([detect_util])
|
@@ -94,8 +108,11 @@ class InspecCLI < Thor
|
|
94
108
|
|
95
109
|
desc 'shell', 'open an interactive debugging shell'
|
96
110
|
target_options
|
111
|
+
option :format, type: :string, default: Inspec::NoSummaryFormatter, hide: true
|
97
112
|
def shell_func
|
98
|
-
|
113
|
+
diagnose
|
114
|
+
|
115
|
+
runner = Inspec::Runner.new(opts)
|
99
116
|
Inspec::Shell.new(runner).start
|
100
117
|
rescue RuntimeError => e
|
101
118
|
puts e.message
|
@@ -105,5 +122,44 @@ class InspecCLI < Thor
|
|
105
122
|
def version
|
106
123
|
puts Inspec::VERSION
|
107
124
|
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def diagnose
|
129
|
+
return unless opts['diagnose']
|
130
|
+
puts "InSpec version: #{Inspec::VERSION}"
|
131
|
+
puts "Train version: #{Train::VERSION}"
|
132
|
+
puts 'Command line configuration:'
|
133
|
+
pp options
|
134
|
+
puts 'JSON configuration file:'
|
135
|
+
pp options_json
|
136
|
+
puts 'Merged configuration:'
|
137
|
+
pp opts
|
138
|
+
puts
|
139
|
+
end
|
140
|
+
|
141
|
+
def opts
|
142
|
+
# argv overrides json
|
143
|
+
Thor::CoreExt::HashWithIndifferentAccess.new(options_json.merge(options))
|
144
|
+
end
|
145
|
+
|
146
|
+
def options_json
|
147
|
+
conffile = options['json_config']
|
148
|
+
@json ||= conffile ? read_config(conffile) : {}
|
149
|
+
end
|
150
|
+
|
151
|
+
def read_config(file)
|
152
|
+
if file == '-'
|
153
|
+
puts 'WARN: reading JSON config from standard input' if STDIN.tty?
|
154
|
+
config = STDIN.read
|
155
|
+
else
|
156
|
+
config = File.read(file)
|
157
|
+
end
|
158
|
+
|
159
|
+
JSON.load(config)
|
160
|
+
rescue JSON::ParserError => e
|
161
|
+
puts "Failed to load JSON configuration: #{e}\nConfig was: #{config.inspect}"
|
162
|
+
exit 1
|
163
|
+
end
|
108
164
|
end
|
109
165
|
InspecCLI.start(ARGV)
|
data/docs/ctl_inspec.rst
CHANGED
@@ -47,11 +47,17 @@ The following options may be used with any of the InSpec CLI subcommands:
|
|
47
47
|
``--user``
|
48
48
|
The login user for remote scanning.
|
49
49
|
|
50
|
+
``--json_config``
|
51
|
+
A JSON file containing configuration options. Use `--json_config=-` to read from standard input. The file's format corresponds to the command line argument options. For example, `{"host": "example.com", "sudo": true}` is equivalent to `--host=example.com --sudo`. Command line switches override the configuration file.
|
52
|
+
|
53
|
+
``--diagnose``
|
54
|
+
Dump configuration values from a command line options, the configuration file, and the merged effective options.
|
55
|
+
|
50
56
|
|
51
57
|
|
52
58
|
check
|
53
59
|
=====================================================
|
54
|
-
Use ``inspec check`` to
|
60
|
+
Use ``inspec check`` to verify all tests the specified path.
|
55
61
|
|
56
62
|
Syntax
|
57
63
|
-----------------------------------------------------
|
data/docs/inspec_and_friends.rst
CHANGED
data/docs/resources.rst
CHANGED
@@ -258,7 +258,7 @@ A ``auditd_conf`` |inspec resource| block declares configuration settings that s
|
|
258
258
|
.. code-block:: ruby
|
259
259
|
|
260
260
|
describe auditd_conf('path') do
|
261
|
-
its('keyword') { should
|
261
|
+
its('keyword') { should cmp 'value' }
|
262
262
|
end
|
263
263
|
|
264
264
|
where
|
@@ -269,11 +269,12 @@ where
|
|
269
269
|
|
270
270
|
Matchers
|
271
271
|
-----------------------------------------------------
|
272
|
-
This |inspec resource| matches any keyword that is listed in the ``auditd.conf`` configuration file
|
272
|
+
This |inspec resource| matches any keyword that is listed in the ``auditd.conf`` configuration file. Since all option names and values are case insensitive for ``auditd_conf``, we recommend to compare values with `cmp` instead of the `eq`:
|
273
273
|
|
274
274
|
.. code-block:: ruby
|
275
275
|
|
276
|
-
its('log_format') { should
|
276
|
+
its('log_format') { should cmp 'raw' }
|
277
|
+
its('max_log_file') { should cmp 6 }
|
277
278
|
|
278
279
|
Examples
|
279
280
|
-----------------------------------------------------
|
@@ -284,20 +285,20 @@ The following examples show how to use this InSpec audit resource.
|
|
284
285
|
.. code-block:: ruby
|
285
286
|
|
286
287
|
describe auditd_conf do
|
287
|
-
its('log_file') { should
|
288
|
-
its('log_format') { should
|
289
|
-
its('flush') { should
|
290
|
-
its('freq') { should
|
291
|
-
its('num_logs') { should
|
292
|
-
its('max_log_file') { should
|
293
|
-
its('max_log_file_action') { should
|
294
|
-
its('space_left') { should
|
295
|
-
its('action_mail_acct') { should
|
296
|
-
its('space_left_action') { should
|
297
|
-
its('admin_space_left') { should
|
298
|
-
its('admin_space_left_action') { should
|
299
|
-
its('disk_full_action') { should
|
300
|
-
its('disk_error_action') { should
|
288
|
+
its('log_file') { should cmp '/full/path/to/file' }
|
289
|
+
its('log_format') { should cmp 'raw' }
|
290
|
+
its('flush') { should cmp 'none' }
|
291
|
+
its('freq') { should cmp 1 }
|
292
|
+
its('num_logs') { should cmp 0 }
|
293
|
+
its('max_log_file') { should cmp 6 }
|
294
|
+
its('max_log_file_action') { should cmp 'email' }
|
295
|
+
its('space_left') { should cmp 2 }
|
296
|
+
its('action_mail_acct') { should cmp 'root' }
|
297
|
+
its('space_left_action') { should cmp 'email' }
|
298
|
+
its('admin_space_left') { should cmp 1 }
|
299
|
+
its('admin_space_left_action') { should cmp 'halt' }
|
300
|
+
its('disk_full_action') { should cmp 'halt' }
|
301
|
+
its('disk_error_action') { should cmp 'halt' }
|
301
302
|
end
|
302
303
|
|
303
304
|
|
@@ -3176,10 +3177,10 @@ A ``port`` |inspec resource| block declares a port, and then depending on what n
|
|
3176
3177
|
|
3177
3178
|
describe port(514) do
|
3178
3179
|
it { should be_listening }
|
3179
|
-
its('
|
3180
|
+
its('processes') {should include 'syslog'}
|
3180
3181
|
end
|
3181
3182
|
|
3182
|
-
where the ``
|
3183
|
+
where the ``processes`` returns the processes listening on port 514.
|
3183
3184
|
|
3184
3185
|
Matchers
|
3185
3186
|
-----------------------------------------------------
|
@@ -3195,33 +3196,33 @@ The ``be_listening`` matcher tests if the port is listening for traffic:
|
|
3195
3196
|
|
3196
3197
|
pid
|
3197
3198
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
3198
|
-
The ``
|
3199
|
+
The ``pids`` matcher tests the process identifier (PID):
|
3199
3200
|
|
3200
3201
|
.. code-block:: ruby
|
3201
3202
|
|
3202
|
-
its('
|
3203
|
+
its('pids') { should eq ['27808'] }
|
3203
3204
|
|
3204
3205
|
process
|
3205
3206
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
3206
|
-
The ``
|
3207
|
+
The ``processes`` matcher tests if the named process is running on the system:
|
3207
3208
|
|
3208
3209
|
.. code-block:: ruby
|
3209
3210
|
|
3210
|
-
its('
|
3211
|
+
its('processes') { should eq ['syslog'] }
|
3211
3212
|
|
3212
3213
|
protocol
|
3213
3214
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
3214
|
-
The ``
|
3215
|
+
The ``protocols`` matcher tests the Internet protocol: |icmp| (``'icmp'``), |tcp| (``'tcp'`` or ``'tcp6'``), or |udp| (``'udp'`` or ``'udp6'``):
|
3215
3216
|
|
3216
3217
|
.. code-block:: ruby
|
3217
3218
|
|
3218
|
-
its('
|
3219
|
+
its('protocols') { should eq ['tcp'] }
|
3219
3220
|
|
3220
3221
|
or for the |ipv6| protocol:
|
3221
3222
|
|
3222
3223
|
.. code-block:: ruby
|
3223
3224
|
|
3224
|
-
its('
|
3225
|
+
its('protocols') { should eq ['tcp6'] }
|
3225
3226
|
|
3226
3227
|
Examples
|
3227
3228
|
-----------------------------------------------------
|
@@ -3233,7 +3234,7 @@ The following examples show how to use this InSpec audit resource.
|
|
3233
3234
|
|
3234
3235
|
describe port(80) do
|
3235
3236
|
it { should be_listening }
|
3236
|
-
its('
|
3237
|
+
its('protocols') {should eq ['tcp']}
|
3237
3238
|
end
|
3238
3239
|
|
3239
3240
|
**Test port 80, listening with TCP version IPv6 protocol**
|
@@ -3242,7 +3243,7 @@ The following examples show how to use this InSpec audit resource.
|
|
3242
3243
|
|
3243
3244
|
describe port(80) do
|
3244
3245
|
it { should be_listening }
|
3245
|
-
its('
|
3246
|
+
its('protocols') {should eq ['tcp6']}
|
3246
3247
|
end
|
3247
3248
|
|
3248
3249
|
**Test ports for HTTPs**
|
@@ -3255,7 +3256,22 @@ The following examples show how to use this InSpec audit resource.
|
|
3255
3256
|
|
3256
3257
|
describe port(443) do
|
3257
3258
|
it { should be_listening }
|
3258
|
-
its('
|
3259
|
+
its('protocols') {should eq ['tcp']}
|
3260
|
+
end
|
3261
|
+
|
3262
|
+
**Test port 80 on a specific address**
|
3263
|
+
|
3264
|
+
This check can be implemented in two equivalent ways:
|
3265
|
+
|
3266
|
+
.. code-block:: ruby
|
3267
|
+
|
3268
|
+
describe port(80) do
|
3269
|
+
it { should be_listening }
|
3270
|
+
its('addresses') {should include '0.0.0.0'}
|
3271
|
+
end
|
3272
|
+
|
3273
|
+
describe port('0.0.0.0', 80) do
|
3274
|
+
it { should be_listening }
|
3259
3275
|
end
|
3260
3276
|
|
3261
3277
|
postgres_conf
|
@@ -3424,7 +3440,7 @@ A ``processes`` |inspec resource| block declares the name of the process to be t
|
|
3424
3440
|
where
|
3425
3441
|
|
3426
3442
|
* ``processes('process_name')`` must specify the name of a process that is running on the system
|
3427
|
-
*
|
3443
|
+
* The ``user`` and ``state`` properties may be tested; they are exposed via ``users`` and ``states``, respectively.
|
3428
3444
|
|
3429
3445
|
Matchers
|
3430
3446
|
-----------------------------------------------------
|
@@ -3466,7 +3482,7 @@ The following examples show how to use this InSpec audit resource.
|
|
3466
3482
|
.. code-block:: ruby
|
3467
3483
|
|
3468
3484
|
describe processes('init') do
|
3469
|
-
its('
|
3485
|
+
its('users') { should eq ['root'] }
|
3470
3486
|
end
|
3471
3487
|
|
3472
3488
|
**Test if a high-priority process is running**
|
@@ -3474,7 +3490,7 @@ The following examples show how to use this InSpec audit resource.
|
|
3474
3490
|
.. code-block:: ruby
|
3475
3491
|
|
3476
3492
|
describe processes('some_process') do
|
3477
|
-
its('
|
3493
|
+
its('states') { should eq ['R<'] }
|
3478
3494
|
end
|
3479
3495
|
|
3480
3496
|
|
@@ -3895,7 +3911,7 @@ The following examples show how to use this InSpec audit resource.
|
|
3895
3911
|
.. code-block:: ruby
|
3896
3912
|
|
3897
3913
|
describe sshd_config do
|
3898
|
-
its('Protocol') { should
|
3914
|
+
its('Protocol') { should cmp 2 }
|
3899
3915
|
end
|
3900
3916
|
|
3901
3917
|
**Test ciphers**
|
@@ -3911,7 +3927,7 @@ The following examples show how to use this InSpec audit resource.
|
|
3911
3927
|
.. code-block:: ruby
|
3912
3928
|
|
3913
3929
|
describe sshd_config do
|
3914
|
-
its('Port') { should
|
3930
|
+
its('Port') { should cmp 22 }
|
3915
3931
|
its('UsePAM') { should eq 'yes' }
|
3916
3932
|
its('ListenAddress') { should eq nil }
|
3917
3933
|
its('HostKey') { should eq [
|
@@ -4084,20 +4100,10 @@ The |nginx| user is typically ``www-data``, but on |centos| it's ``nginx``. The
|
|
4084
4100
|
|
4085
4101
|
windows_feature
|
4086
4102
|
=====================================================
|
4087
|
-
Use the ``windows_feature`` |inspec resource| to test features on |windows|.
|
4103
|
+
Use the ``windows_feature`` |inspec resource| to test features on |windows|. It uses the ``Get-WindowsFeature`` cmdlet under the hood.
|
4088
4104
|
|
4089
4105
|
**Stability: Experimental**
|
4090
4106
|
|
4091
|
-
.. code-block:: javascript
|
4092
|
-
|
4093
|
-
{
|
4094
|
-
"Name": "XPS-Viewer",
|
4095
|
-
"DisplayName": "XPS Viewer",
|
4096
|
-
"Description": "The XPS Viewer reads, sets permissions, and digitally signs XPS documents.",
|
4097
|
-
"Installed": false,
|
4098
|
-
"InstallState": 0
|
4099
|
-
}
|
4100
|
-
|
4101
4107
|
Syntax
|
4102
4108
|
-----------------------------------------------------
|
4103
4109
|
A ``windows_feature`` |inspec resource| block declares the name of the |windows| feature, tests if that feature is installed, and then returns information about that feature:
|