inspec 1.37.6 → 1.38.8
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -16
- data/docs/resources/auditd.md.erb +93 -0
- data/docs/resources/file.md.erb +12 -0
- data/inspec.gemspec +1 -1
- data/lib/inspec/file_provider.rb +1 -1
- data/lib/inspec/objects/attribute.rb +16 -7
- data/lib/inspec/profile_context.rb +1 -1
- data/lib/inspec/resource.rb +1 -0
- data/lib/inspec/shell.rb +7 -2
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/auditd.rb +231 -0
- data/lib/resources/auditd_rules.rb +2 -0
- data/lib/resources/mssql_session.rb +3 -3
- data/lib/resources/nginx_conf.rb +28 -1
- data/lib/resources/postgres_session.rb +1 -1
- data/lib/resources/registry_key.rb +11 -2
- data/lib/resources/service.rb +4 -23
- data/lib/utils/find_files.rb +2 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a11293dc2aaa9e66285a63b04a476b03ebe6a703
|
4
|
+
data.tar.gz: 5498bd736298eab2b16776a92ebb1921b848e4fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 001f1e34e039a7eb24f433ecb54fb2afab16f1b6ac4ed86658b9a71db66c958b4b24532feecb072d988d37e3be6a3b37821ab46cbd8457fcd6c1fae47ca0cd96
|
7
|
+
data.tar.gz: 35f44d8abafac513133c35844bc1f907263e6023acf5003a48000248d620095a755b2ccf4236e373c67c7273713460b2f930d0895e2db7e37e5a8096413eabae
|
data/CHANGELOG.md
CHANGED
@@ -1,32 +1,57 @@
|
|
1
1
|
# Change Log
|
2
2
|
<!-- usage documentation: http://expeditor-docs.es.chef.io/configuration/changelog/ -->
|
3
|
-
<!-- latest_release 1.
|
4
|
-
## [v1.
|
3
|
+
<!-- latest_release 1.38.8 -->
|
4
|
+
## [v1.38.5](https://github.com/chef/inspec/tree/v1.38.5) (2017-09-23)
|
5
5
|
|
6
6
|
#### Merged Pull Requests
|
7
|
-
- Bump
|
7
|
+
- Bump train to 0.27 [#2180](https://github.com/chef/inspec/pull/2180) ([adamleff](https://github.com/adamleff))
|
8
8
|
<!-- latest_release -->
|
9
9
|
|
10
|
-
<!-- release_rollup since=1.
|
11
|
-
### Changes since 1.
|
10
|
+
<!-- release_rollup since=1.37.6 -->
|
11
|
+
### Changes since 1.37.6 release
|
12
12
|
|
13
|
-
####
|
14
|
-
-
|
13
|
+
#### Bug Fixes
|
14
|
+
- Modify Upstart enabled check to use config file [#2163](https://github.com/chef/inspec/pull/2163) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.38.2 -->
|
15
|
+
- Support `false` for attribute value [#2168](https://github.com/chef/inspec/pull/2168) ([adamleff](https://github.com/adamleff)) <!-- 1.38.1 -->
|
16
|
+
- quote username and hostname in mssql_session.rb [#2151](https://github.com/chef/inspec/pull/2151) ([bratdim](https://github.com/bratdim)) <!-- 1.37.11 -->
|
17
|
+
- Update method in which Pry hooks are removed [#2170](https://github.com/chef/inspec/pull/2170) ([adamleff](https://github.com/adamleff)) <!-- 1.37.13 -->
|
18
|
+
|
19
|
+
#### New Resources
|
20
|
+
- auditd resource: test active auditd configuration against the audit daemon [#2133](https://github.com/chef/inspec/pull/2133) ([jburns12](https://github.com/jburns12)) <!-- 1.37.9 -->
|
15
21
|
|
16
22
|
#### Enhancements
|
17
|
-
-
|
18
|
-
- Support
|
23
|
+
- forgiving default attributes [#2177](https://github.com/chef/inspec/pull/2177) ([arlimus](https://github.com/arlimus)) <!-- 1.38.4 -->
|
24
|
+
- Support array syntax for registry_key resource [#2160](https://github.com/chef/inspec/pull/2160) ([adamleff](https://github.com/adamleff)) <!-- 1.37.12 -->
|
25
|
+
- Add wildcard/multiple server support to nginx_conf resource [#2141](https://github.com/chef/inspec/pull/2141) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.37.8 -->
|
19
26
|
|
20
|
-
####
|
21
|
-
-
|
22
|
-
-
|
27
|
+
#### Merged Pull Requests
|
28
|
+
- Bump train to 0.27 [#2180](https://github.com/chef/inspec/pull/2180) ([adamleff](https://github.com/adamleff)) <!-- 1.38.8 -->
|
29
|
+
- Properly return postgres query errors on failure [#2179](https://github.com/chef/inspec/pull/2179) ([adamleff](https://github.com/adamleff)) <!-- 1.38.7 -->
|
30
|
+
- Add wildcard support to `Utils::FindFiles` [#2159](https://github.com/chef/inspec/pull/2159) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.38.6 -->
|
31
|
+
- Modify `DirProvider` to allow special characters [#2174](https://github.com/chef/inspec/pull/2174) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.38.5 -->
|
32
|
+
- Update changelog for v1.38.2 release [#2173](https://github.com/chef/inspec/pull/2173) ([adamleff](https://github.com/adamleff)) <!-- 1.37.13 -->
|
33
|
+
- Add deprecation warning to auditd_rules resource [#2156](https://github.com/chef/inspec/pull/2156) ([adamleff](https://github.com/adamleff)) <!-- 1.37.10 -->
|
34
|
+
<!-- release_rollup -->
|
35
|
+
|
36
|
+
<!-- latest_stable_release -->
|
37
|
+
## [v1.37.6](https://github.com/chef/inspec/tree/v1.37.6) (2017-09-14)
|
23
38
|
|
24
39
|
#### New Resources
|
25
|
-
-
|
26
|
-
-
|
27
|
-
<!-- release_rollup -->
|
40
|
+
- etc_fstab resource: test contents of the /etc/fstab file [#2064](https://github.com/chef/inspec/pull/2064) ([dromazmj](https://github.com/dromazmj))
|
41
|
+
- nginx resource: audit the nginx binary and how it was compiled [#1958](https://github.com/chef/inspec/pull/1958) ([rx294](https://github.com/rx294))
|
28
42
|
|
43
|
+
#### Enhancements
|
44
|
+
- Support profile versions for automate profiles storage [#2128](https://github.com/chef/inspec/pull/2128) ([alexpop](https://github.com/alexpop))
|
45
|
+
- Show versions for inspec compliance profiles [#2143](https://github.com/chef/inspec/pull/2143) ([alexpop](https://github.com/alexpop))
|
46
|
+
|
47
|
+
#### Bug Fixes
|
48
|
+
- Ignore linked container names when parsing docker containers [#2134](https://github.com/chef/inspec/pull/2134) ([adamleff](https://github.com/adamleff))
|
49
|
+
- package resource: assume a default Homebrew path [#2140](https://github.com/chef/inspec/pull/2140) ([adamleff](https://github.com/adamleff))
|
50
|
+
|
51
|
+
#### Merged Pull Requests
|
52
|
+
- Bump Ruby to 2.3.5 for Omnibus build [#2149](https://github.com/chef/inspec/pull/2149) ([adamleff](https://github.com/adamleff))
|
29
53
|
<!-- latest_stable_release -->
|
54
|
+
|
30
55
|
## [v1.36.1](https://github.com/chef/inspec/tree/v1.36.1) (2017-09-07)
|
31
56
|
|
32
57
|
#### Enhancements
|
@@ -36,7 +61,6 @@
|
|
36
61
|
#### Bug Fixes
|
37
62
|
- Modify linux regular expression to handle process names with spaces [#2117](https://github.com/chef/inspec/pull/2117) ([ChadScott](https://github.com/ChadScott))
|
38
63
|
- Fix alternate path profile chaining [#2121](https://github.com/chef/inspec/pull/2121) ([trevor-vaughan](https://github.com/trevor-vaughan))
|
39
|
-
<!-- latest_stable_release -->
|
40
64
|
|
41
65
|
## [v1.35.1](https://github.com/chef/inspec/tree/v1.35.1) (2017-08-31)
|
42
66
|
|
@@ -0,0 +1,93 @@
|
|
1
|
+
---
|
2
|
+
title: About the auditd Resource
|
3
|
+
---
|
4
|
+
|
5
|
+
# auditd
|
6
|
+
|
7
|
+
Use the `auditd` InSpec audit resource to test the rules for logging that exist on the system. The audit.rules file is typically located under /etc/audit/ and contains the list of rules that define what is captured in log files. These rules are output using the auditcl -l command. This resource supports versions of `audit` >= 2.3.
|
8
|
+
|
9
|
+
## Syntax
|
10
|
+
|
11
|
+
An `auditd` resource block declares one (or more) rules to be tested, and then what that rule should do:
|
12
|
+
|
13
|
+
describe auditd do
|
14
|
+
its('lines') { should include %r(-w /etc/ssh/sshd_config) }
|
15
|
+
end
|
16
|
+
|
17
|
+
or test that multiple individual rules are defined:
|
18
|
+
|
19
|
+
describe auditd do
|
20
|
+
its('lines') { should include %r(-a always,exit -F arch=.* -S init_module,delete_module -F key=modules) }
|
21
|
+
its('lines') { should include %r(-a always,exit -F arch=.* -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=-1 -F key=.+) }
|
22
|
+
end
|
23
|
+
|
24
|
+
where each test must declare one (or more) rules to be tested.
|
25
|
+
|
26
|
+
|
27
|
+
## Matchers
|
28
|
+
|
29
|
+
This InSpec audit resource has the following matchers:
|
30
|
+
|
31
|
+
### be
|
32
|
+
|
33
|
+
<%= partial "/shared/matcher_be" %>
|
34
|
+
|
35
|
+
### cmp
|
36
|
+
|
37
|
+
<%= partial "/shared/matcher_cmp" %>
|
38
|
+
|
39
|
+
### eq
|
40
|
+
|
41
|
+
<%= partial "/shared/matcher_eq" %>
|
42
|
+
|
43
|
+
### include
|
44
|
+
|
45
|
+
<%= partial "/shared/matcher_include" %>
|
46
|
+
|
47
|
+
### match
|
48
|
+
|
49
|
+
<%= partial "/shared/matcher_match" %>
|
50
|
+
|
51
|
+
## Examples
|
52
|
+
|
53
|
+
The following examples show how to use this InSpec audit resource.
|
54
|
+
|
55
|
+
### Test if a rule contains a matching element that is identified by a regular expression
|
56
|
+
|
57
|
+
For `audit` >= 2.3:
|
58
|
+
|
59
|
+
describe auditd do
|
60
|
+
its('lines') { should include %r(-a always,exit -F arch=.* -S chown.* -F auid>=1000 -F auid!=-1 -F key=perm_mod) }
|
61
|
+
end
|
62
|
+
|
63
|
+
### Query the audit daemon status
|
64
|
+
|
65
|
+
describe auditd.status('backlog') do
|
66
|
+
it { should cmp 0 }
|
67
|
+
end
|
68
|
+
|
69
|
+
### Query properties of rules targeting specific syscalls or files - uniq is used to handle multiple rules for the same syscall with redundant field values
|
70
|
+
|
71
|
+
describe auditd.syscall('open') do
|
72
|
+
its('action.uniq') { should eq ['always'] }
|
73
|
+
its('list.uniq') { should eq ['exit'] }
|
74
|
+
end
|
75
|
+
|
76
|
+
describe auditd.file('/etc/sudoers') do
|
77
|
+
its('permissions') { should include ['x'] }
|
78
|
+
end
|
79
|
+
|
80
|
+
The where accessor can be used to filter on fields. For example:
|
81
|
+
|
82
|
+
describe auditd.syscall('chown').where { arch == "b32" } do
|
83
|
+
its('action') { should eq ['always'] }
|
84
|
+
its('list') { should eq ['exit'] }
|
85
|
+
its('exit') { should include ['-EACCES'] }
|
86
|
+
its('exit') { should include ['-EPERM'] }
|
87
|
+
end
|
88
|
+
|
89
|
+
The key filter may be useful in evaluating rules with particular key values:
|
90
|
+
|
91
|
+
describe auditd.where { key == "privileged" } do
|
92
|
+
its('permissions') { should include ['x'] }
|
93
|
+
end
|
data/docs/resources/file.md.erb
CHANGED
@@ -61,6 +61,10 @@ an owner:
|
|
61
61
|
|
62
62
|
it { should be_executable.by('owner') }
|
63
63
|
|
64
|
+
any user other than the owner or members of the file's group:
|
65
|
+
|
66
|
+
it { should be_executable.by('others') }
|
67
|
+
|
64
68
|
a user:
|
65
69
|
|
66
70
|
it { should be_executable.by_user('user') }
|
@@ -121,6 +125,10 @@ an owner:
|
|
121
125
|
|
122
126
|
it { should be_readable.by('owner') }
|
123
127
|
|
128
|
+
any user other than the owner or members of the file's group:
|
129
|
+
|
130
|
+
it { should be_readable.by('others') }
|
131
|
+
|
124
132
|
a user:
|
125
133
|
|
126
134
|
it { should be_readable.by_user('user') }
|
@@ -175,6 +183,10 @@ an owner:
|
|
175
183
|
|
176
184
|
it { should be_writable.by('owner') }
|
177
185
|
|
186
|
+
any user other than the owner or members of the file's group:
|
187
|
+
|
188
|
+
it { should be_writable.by('others') }
|
189
|
+
|
178
190
|
a user:
|
179
191
|
|
180
192
|
it { should be_writable.by_user('user') }
|
data/inspec.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
|
27
27
|
spec.required_ruby_version = '>= 2.1'
|
28
28
|
|
29
|
-
spec.add_dependency 'train', '~> 0.
|
29
|
+
spec.add_dependency 'train', '~> 0.27'
|
30
30
|
spec.add_dependency 'thor', '~> 0.19'
|
31
31
|
spec.add_dependency 'json', '>= 1.8', '< 3.0'
|
32
32
|
spec.add_dependency 'rainbow', '~> 2'
|
data/lib/inspec/file_provider.rb
CHANGED
@@ -3,22 +3,31 @@
|
|
3
3
|
module Inspec
|
4
4
|
class Attribute
|
5
5
|
attr_accessor :name
|
6
|
-
|
6
|
+
attr_writer :value
|
7
|
+
|
8
|
+
DEFAULT_ATTRIBUTE = Class.new do
|
9
|
+
def method_missing(*_)
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def respond_to_missing?(_, _)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(name, options = {})
|
7
19
|
@name = name
|
8
20
|
@opts = options
|
9
21
|
@value = nil
|
10
22
|
end
|
11
23
|
|
12
24
|
# implicit call is done by inspec to determine the value of an attribute
|
13
|
-
def value
|
14
|
-
|
15
|
-
@value = newvalue
|
16
|
-
end
|
17
|
-
@value || default
|
25
|
+
def value
|
26
|
+
@value.nil? ? default : @value
|
18
27
|
end
|
19
28
|
|
20
29
|
def default
|
21
|
-
@opts[:default]
|
30
|
+
@opts[:default] || DEFAULT_ATTRIBUTE.new
|
22
31
|
end
|
23
32
|
|
24
33
|
def title
|
@@ -177,7 +177,7 @@ module Inspec
|
|
177
177
|
# we need to return an attribute object, to allow dermination of default values
|
178
178
|
attr = Attribute.new(name, options)
|
179
179
|
# read value from given gived values
|
180
|
-
attr.value
|
180
|
+
attr.value = @conf['attributes'][attr.name] unless @conf['attributes'].nil?
|
181
181
|
@attributes.push(attr)
|
182
182
|
attr.value
|
183
183
|
end
|
data/lib/inspec/resource.rb
CHANGED
data/lib/inspec/shell.rb
CHANGED
@@ -26,8 +26,13 @@ module Inspec
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def configure_pry # rubocop:disable Metrics/AbcSize
|
29
|
-
#
|
30
|
-
Pry.
|
29
|
+
# Delete any before_session, before_eval, and after_eval hooks so we can
|
30
|
+
# replace them with our own. Pry 0.10 used to have a single method to clear
|
31
|
+
# all hooks, but this was removed in Pry 0.11.
|
32
|
+
[:before_session, :before_eval, :after_eval].each do |event|
|
33
|
+
Pry.hooks.get_hooks(event).keys.map { |hook| Pry.hooks.delete_hook(event, hook) }
|
34
|
+
end
|
35
|
+
|
31
36
|
that = self
|
32
37
|
|
33
38
|
# Add the help command
|
data/lib/inspec/version.rb
CHANGED
@@ -0,0 +1,231 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Richter
|
4
|
+
# author: Jen Burns
|
5
|
+
|
6
|
+
require 'forwardable'
|
7
|
+
require 'utils/filter_array'
|
8
|
+
require 'utils/filter'
|
9
|
+
require 'utils/parser'
|
10
|
+
|
11
|
+
module Inspec::Resources
|
12
|
+
# rubocop:disable Metrics/ClassLength
|
13
|
+
class AuditDaemon < Inspec.resource(1)
|
14
|
+
extend Forwardable
|
15
|
+
attr_accessor :lines
|
16
|
+
attr_reader :params
|
17
|
+
|
18
|
+
name 'auditd'
|
19
|
+
desc 'Use the auditd InSpec audit resource to test the rules for logging that exist on the system. The audit.rules file is typically located under /etc/audit/ and contains the list of rules that define what is captured in log files. These rules are output using the auditcl -l command.'
|
20
|
+
example "
|
21
|
+
describe auditd.syscall('chown').where {arch == 'b32'} do
|
22
|
+
its('action') { should eq ['always'] }
|
23
|
+
its('list') { should eq ['exit'] }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe auditd.where {key == 'privileged'} do
|
27
|
+
its('permissions') { should include ['x'] }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe auditd do
|
31
|
+
its('lines') { should include %r(-w /etc/ssh/sshd_config) }
|
32
|
+
end
|
33
|
+
"
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
@content = inspec.command('/sbin/auditctl -l').stdout.chomp
|
37
|
+
@params = []
|
38
|
+
|
39
|
+
if @content =~ /^LIST_RULES:/
|
40
|
+
return skip_resource 'The version of audit is outdated. The `auditd` resource supports versions of audit >= 2.3.'
|
41
|
+
end
|
42
|
+
parse_content
|
43
|
+
end
|
44
|
+
|
45
|
+
filter = FilterTable.create
|
46
|
+
filter.add_accessor(:where)
|
47
|
+
.add_accessor(:entries)
|
48
|
+
.add(:file, field: 'file')
|
49
|
+
.add(:list, field: 'list')
|
50
|
+
.add(:action, field: 'action')
|
51
|
+
.add(:fields, field: 'fields')
|
52
|
+
.add(:fields_nokey, field: 'fields_nokey')
|
53
|
+
.add(:syscall, field: 'syscall')
|
54
|
+
.add(:key, field: 'key')
|
55
|
+
.add(:arch, field: 'arch')
|
56
|
+
.add(:path, field: 'path')
|
57
|
+
.add(:permissions, field: 'permissions')
|
58
|
+
.add(:exit, field: 'exit')
|
59
|
+
|
60
|
+
filter.connect(self, :params)
|
61
|
+
|
62
|
+
def status(name = nil)
|
63
|
+
@status_content ||= inspec.command('/sbin/auditctl -s').stdout.chomp
|
64
|
+
@status_params ||= Hash[@status_content.scan(/^([^ ]+) (.*)$/)]
|
65
|
+
|
66
|
+
return @status_params[name] if name
|
67
|
+
@status_params
|
68
|
+
end
|
69
|
+
|
70
|
+
def parse_content
|
71
|
+
@lines = @content.lines.map(&:chomp)
|
72
|
+
|
73
|
+
lines.each do |line|
|
74
|
+
if is_file_syscall_syntax?(line)
|
75
|
+
file_syscall_syntax_rules_for(line)
|
76
|
+
end
|
77
|
+
|
78
|
+
if is_syscall?(line)
|
79
|
+
syscall_rules_for(line)
|
80
|
+
|
81
|
+
elsif is_file?(line)
|
82
|
+
file_rules_for(line)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def file_syscall_syntax_rules_for(line)
|
88
|
+
file = file_syscall_syntax_for(line)
|
89
|
+
action, list = action_list_for(line)
|
90
|
+
fields = rule_fields_for(line)
|
91
|
+
key_field, fields_nokey = remove_key_from(fields)
|
92
|
+
key = key_in(key_field.join(''))
|
93
|
+
perms = perms_in(fields)
|
94
|
+
|
95
|
+
@params.push(
|
96
|
+
{
|
97
|
+
'file' => file,
|
98
|
+
'list' => list,
|
99
|
+
'action' => action,
|
100
|
+
'fields' => fields,
|
101
|
+
'permissions' => perms,
|
102
|
+
'key' => key,
|
103
|
+
'fields_nokey' => fields_nokey,
|
104
|
+
},)
|
105
|
+
end
|
106
|
+
|
107
|
+
def syscall_rules_for(line)
|
108
|
+
syscalls = syscalls_for(line)
|
109
|
+
action, list = action_list_for(line)
|
110
|
+
fields = rule_fields_for(line)
|
111
|
+
key_field, fields_nokey = remove_key_from(fields)
|
112
|
+
key = key_in(key_field.join(''))
|
113
|
+
arch = arch_in(fields)
|
114
|
+
path = path_in(fields)
|
115
|
+
perms = perms_in(fields)
|
116
|
+
exit_field = exit_in(fields)
|
117
|
+
|
118
|
+
syscalls.each do |s|
|
119
|
+
@params.push(
|
120
|
+
{
|
121
|
+
'syscall' => s,
|
122
|
+
'list' => list,
|
123
|
+
'action' => action,
|
124
|
+
'fields' => fields,
|
125
|
+
'key' => key,
|
126
|
+
'arch' => arch,
|
127
|
+
'path' => path,
|
128
|
+
'permissions' => perms,
|
129
|
+
'exit' => exit_field,
|
130
|
+
'fields_nokey' => fields_nokey,
|
131
|
+
},)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def file_rules_for(line)
|
136
|
+
file = file_for(line)
|
137
|
+
perms = permissions_for(line)
|
138
|
+
key = key_for(line)
|
139
|
+
|
140
|
+
@params.push(
|
141
|
+
{
|
142
|
+
'file' => file,
|
143
|
+
'key' => key,
|
144
|
+
'permissions' => perms,
|
145
|
+
},)
|
146
|
+
end
|
147
|
+
|
148
|
+
def to_s
|
149
|
+
'Auditd Rules'
|
150
|
+
end
|
151
|
+
|
152
|
+
private
|
153
|
+
|
154
|
+
def is_syscall?(line)
|
155
|
+
line.match(/-S /)
|
156
|
+
end
|
157
|
+
|
158
|
+
def is_file?(line)
|
159
|
+
line.match(/-w /)
|
160
|
+
end
|
161
|
+
|
162
|
+
def is_file_syscall_syntax?(line)
|
163
|
+
line.match(/-F path=/)
|
164
|
+
end
|
165
|
+
|
166
|
+
def syscalls_for(line)
|
167
|
+
line.scan(/-S ([^ ]+)\s?/).flatten.first.split(',')
|
168
|
+
end
|
169
|
+
|
170
|
+
def action_list_for(line)
|
171
|
+
line.scan(/-a ([^,]+),([^ ]+)\s?/).flatten
|
172
|
+
end
|
173
|
+
|
174
|
+
def key_for(line)
|
175
|
+
line.match(/-k ([^ ]+)\s?/)[1] if line.include?('-k ')
|
176
|
+
end
|
177
|
+
|
178
|
+
def file_for(line)
|
179
|
+
line.match(/-w ([^ ]+)\s?/)[1]
|
180
|
+
end
|
181
|
+
|
182
|
+
def file_syscall_syntax_for(line)
|
183
|
+
line.match(/-F path=(\S+)\s?/)[1]
|
184
|
+
end
|
185
|
+
|
186
|
+
def permissions_for(line)
|
187
|
+
line.match(/-p ([^ ]+)/)[1].scan(/\w/)
|
188
|
+
end
|
189
|
+
|
190
|
+
def rule_fields_for(line)
|
191
|
+
line.gsub(/-[aS] [^ ]+ /, '').split('-F ').map { |l| l.split(' ') }.flatten
|
192
|
+
end
|
193
|
+
|
194
|
+
def arch_in(fields)
|
195
|
+
fields.each do |field|
|
196
|
+
return field.match(/arch=(\S+)\s?/)[1] if field.start_with?('arch=')
|
197
|
+
end
|
198
|
+
nil
|
199
|
+
end
|
200
|
+
|
201
|
+
def perms_in(fields)
|
202
|
+
fields.each do |field|
|
203
|
+
return field.match(/perm=(\S+)\s?/)[1].scan(/\w/) if field.start_with?('perm=')
|
204
|
+
end
|
205
|
+
nil
|
206
|
+
end
|
207
|
+
|
208
|
+
def path_in(fields)
|
209
|
+
fields.each do |field|
|
210
|
+
return field.match(/path=(\S+)\s?/)[1] if field.start_with?('path=')
|
211
|
+
end
|
212
|
+
nil
|
213
|
+
end
|
214
|
+
|
215
|
+
def exit_in(fields)
|
216
|
+
fields.each do |field|
|
217
|
+
return field.match(/exit=(\S+)\s?/)[1] if field.start_with?('exit=')
|
218
|
+
end
|
219
|
+
nil
|
220
|
+
end
|
221
|
+
|
222
|
+
def key_in(field)
|
223
|
+
_, v = field.split('=')
|
224
|
+
v
|
225
|
+
end
|
226
|
+
|
227
|
+
def remove_key_from(fields)
|
228
|
+
fields.partition { |x| x.start_with? 'key' }
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
@@ -87,6 +87,8 @@ module Inspec::Resources
|
|
87
87
|
parse_content
|
88
88
|
@legacy = nil
|
89
89
|
end
|
90
|
+
|
91
|
+
warn '[DEPRECATION] The `auditd_rules` resource is deprecated and will be removed in InSpec 2.0. Use the `auditd` resource instead.'
|
90
92
|
end
|
91
93
|
|
92
94
|
# non-legacy instances are not asked for `its('LIST_RULES')`
|
@@ -51,11 +51,11 @@ module Inspec::Resources
|
|
51
51
|
escaped_query = q.gsub(/\\/, '\\\\').gsub(/"/, '\\"').gsub(/\$/, '\\$')
|
52
52
|
# surpress 'x rows affected' in SQLCMD with 'set nocount on;'
|
53
53
|
cmd_string = "sqlcmd -Q \"set nocount on; #{escaped_query}\" -W -w 1024 -s ','"
|
54
|
-
cmd_string += " -U #{@user} -P '#{@password}'" unless @user.nil? || @password.nil?
|
54
|
+
cmd_string += " -U '#{@user}' -P '#{@password}'" unless @user.nil? || @password.nil?
|
55
55
|
if @instance.nil?
|
56
|
-
cmd_string += " -S #{@host}"
|
56
|
+
cmd_string += " -S '#{@host}'"
|
57
57
|
else
|
58
|
-
cmd_string += " -S #{@host}\\#{@instance}"
|
58
|
+
cmd_string += " -S '#{@host}\\#{@instance}'"
|
59
59
|
end
|
60
60
|
cmd = inspec.command(cmd_string)
|
61
61
|
out = cmd.stdout + "\n" + cmd.stderr
|
data/lib/resources/nginx_conf.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# author: Christoph Hartmann
|
4
4
|
|
5
5
|
require 'utils/nginx_parser'
|
6
|
+
require 'utils/find_files'
|
6
7
|
require 'forwardable'
|
7
8
|
|
8
9
|
# STABILITY: Experimental
|
@@ -25,6 +26,8 @@ module Inspec::Resources
|
|
25
26
|
|
26
27
|
extend Forwardable
|
27
28
|
|
29
|
+
include FindFiles
|
30
|
+
|
28
31
|
attr_reader :contents
|
29
32
|
|
30
33
|
def initialize(conf_path = nil)
|
@@ -93,13 +96,37 @@ module Inspec::Resources
|
|
93
96
|
if data.key?('include')
|
94
97
|
data.delete('include').flatten
|
95
98
|
.map { |x| File.expand_path(x, rel_path) }
|
99
|
+
.map { |x| find_files(x) }.flatten
|
96
100
|
.map { |path| parse_nginx(path) }
|
97
|
-
.
|
101
|
+
.each { |conf| merge_config!(data, conf) }
|
98
102
|
end
|
99
103
|
|
100
104
|
# Walk through the remaining hash fields to find more references
|
101
105
|
Hash[data.map { |k, v| [k, resolve_references(v, rel_path)] }]
|
102
106
|
end
|
107
|
+
|
108
|
+
# Deep merge fields from NginxConfig.parse.
|
109
|
+
# A regular merge would overwrite values so a deep merge is needed.
|
110
|
+
# @param data [Hash] data structure from NginxConfig.parse
|
111
|
+
# @param conf [Hash] data structure to be deep merged into data
|
112
|
+
# @return [Hash] data structure with conf and data deep merged
|
113
|
+
def merge_config!(data, conf)
|
114
|
+
# Catch edge-cases
|
115
|
+
return if data.nil? || conf.nil?
|
116
|
+
# Step through all conf items and create combined return value
|
117
|
+
data.merge!(conf) do |_, v1, v2|
|
118
|
+
if v1.is_a?(Array) && v2.is_a?(Array)
|
119
|
+
# If both the data field and the conf field are arrays, then combine them
|
120
|
+
v1 + v2
|
121
|
+
elsif v1.is_a?(Hash) && v2.is_a?(Hash)
|
122
|
+
# If both the data field and the conf field are maps, then deep merge them
|
123
|
+
merge_config!(v1, v2)
|
124
|
+
else
|
125
|
+
# All other cases, just use the new value (regular merge behavior)
|
126
|
+
v2
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
103
130
|
end
|
104
131
|
|
105
132
|
class NginxConfHttp
|
@@ -52,7 +52,7 @@ module Inspec::Resources
|
|
52
52
|
cmd = inspec.command(psql_cmd)
|
53
53
|
out = cmd.stdout + "\n" + cmd.stderr
|
54
54
|
if cmd.exit_status != 0 || out =~ /could not connect to .*/ || out.downcase =~ /^error:.*/
|
55
|
-
|
55
|
+
Lines.new(out, "PostgreSQL query with errors: #{query}")
|
56
56
|
else
|
57
57
|
Lines.new(cmd.stdout.strip, "PostgreSQL query: #{query}")
|
58
58
|
end
|
@@ -106,10 +106,19 @@ module Inspec::Resources
|
|
106
106
|
end
|
107
107
|
|
108
108
|
# returns nil, if not existant or value
|
109
|
-
def method_missing(
|
109
|
+
def method_missing(*keys)
|
110
|
+
# allow the use of array syntax in an `its` block so that users
|
111
|
+
# can use it to query for keys with . characters in them
|
112
|
+
if keys.is_a?(Array)
|
113
|
+
keys.shift if keys[0] == :[]
|
114
|
+
key = keys.first
|
115
|
+
else
|
116
|
+
key = keys
|
117
|
+
end
|
118
|
+
|
110
119
|
# get data
|
111
120
|
val = registry_key(@options[:path])
|
112
|
-
registry_property_value(val,
|
121
|
+
registry_property_value(val, key)
|
113
122
|
end
|
114
123
|
|
115
124
|
def to_s
|
data/lib/resources/service.rb
CHANGED
@@ -349,40 +349,21 @@ module Inspec::Resources
|
|
349
349
|
description: nil,
|
350
350
|
installed: true,
|
351
351
|
running: running,
|
352
|
-
enabled: info_enabled(
|
352
|
+
enabled: info_enabled(service_name),
|
353
353
|
type: 'upstart',
|
354
354
|
}
|
355
355
|
end
|
356
356
|
|
357
357
|
private
|
358
358
|
|
359
|
-
def info_enabled(
|
359
|
+
def info_enabled(service_name)
|
360
360
|
# check if a service is enabled
|
361
|
-
|
362
|
-
# $ initctl show-config $job | grep -q "^ start on" && echo enabled || echo disabled
|
363
|
-
# Ubuntu 10.04 show-config is not supported
|
364
|
-
# @see http://manpages.ubuntu.com/manpages/maverick/man8/initctl.8.html
|
365
|
-
support_for_show_config = Gem::Version.new('1.3')
|
366
|
-
|
367
|
-
if version >= support_for_show_config
|
368
|
-
config = inspec.command("#{service_ctl} show-config #{service_name}").stdout
|
369
|
-
else # use config file as fallback
|
370
|
-
config = inspec.file("/etc/init/#{service_name}.conf").content
|
371
|
-
end
|
361
|
+
config = inspec.file("/etc/init/#{service_name}.conf").content
|
372
362
|
|
373
363
|
# disregard if the config does not exist
|
374
364
|
return nil if config.nil?
|
375
|
-
enabled = !config[/^\s*start on/].nil?
|
376
|
-
|
377
|
-
# implement fallback for Ubuntu 10.04
|
378
|
-
if inspec.os[:name] == 'ubuntu' &&
|
379
|
-
inspec.os[:release].to_f >= 10.04 &&
|
380
|
-
inspec.os[:release].to_f < 12.04 &&
|
381
|
-
status.exit_status == 0
|
382
|
-
enabled = true
|
383
|
-
end
|
384
365
|
|
385
|
-
|
366
|
+
!config.match(/^\s*start on/).nil?
|
386
367
|
end
|
387
368
|
|
388
369
|
def version
|
data/lib/utils/find_files.rb
CHANGED
@@ -24,9 +24,10 @@ module FindFiles
|
|
24
24
|
depth = opts[:depth]
|
25
25
|
type = TYPES[opts[:type].to_sym] if opts[:type]
|
26
26
|
|
27
|
-
cmd = "find #{path}"
|
27
|
+
cmd = "sh -c \'find #{path}"
|
28
28
|
cmd += " -type #{type}" unless type.nil?
|
29
29
|
cmd += " -maxdepth #{depth.to_i}" if depth.to_i > 0
|
30
|
+
cmd += "\'"
|
30
31
|
|
31
32
|
result = inspec.command(cmd)
|
32
33
|
exit_status = result.exit_status
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.38.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Richter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: train
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.27'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.27'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: thor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -316,6 +316,7 @@ files:
|
|
316
316
|
- docs/resources/apache_conf.md.erb
|
317
317
|
- docs/resources/apt.md.erb
|
318
318
|
- docs/resources/audit_policy.md.erb
|
319
|
+
- docs/resources/auditd.md.erb
|
319
320
|
- docs/resources/auditd_conf.md.erb
|
320
321
|
- docs/resources/auditd_rules.md.erb
|
321
322
|
- docs/resources/bash.md.erb
|
@@ -560,6 +561,7 @@ files:
|
|
560
561
|
- lib/resources/apache_conf.rb
|
561
562
|
- lib/resources/apt.rb
|
562
563
|
- lib/resources/audit_policy.rb
|
564
|
+
- lib/resources/auditd.rb
|
563
565
|
- lib/resources/auditd_conf.rb
|
564
566
|
- lib/resources/auditd_rules.rb
|
565
567
|
- lib/resources/bash.rb
|