inspec 1.37.6 → 1.38.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|