inspec 1.0.0 → 1.35.1
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 +933 -101
- data/Gemfile +8 -17
- data/MAINTAINERS.md +2 -1
- data/MAINTAINERS.toml +9 -4
- data/README.md +49 -28
- data/Rakefile +54 -39
- data/bin/inspec +1 -1
- data/docs/dsl_inspec.md +17 -4
- data/docs/dsl_resource.md +1 -1
- data/docs/habitat.md +192 -0
- data/docs/inspec_and_friends.md +4 -2
- data/docs/matchers.md +11 -0
- data/docs/migration.md +293 -0
- data/docs/profiles.md +124 -76
- data/docs/resources/aide_conf.md.erb +81 -0
- data/docs/resources/apache_conf.md.erb +10 -10
- data/docs/resources/apt.md.erb +13 -13
- data/docs/resources/audit_policy.md.erb +10 -10
- data/docs/resources/auditd_conf.md.erb +10 -10
- data/docs/resources/auditd_rules.md.erb +11 -11
- data/docs/resources/bash.md.erb +12 -12
- data/docs/resources/bond.md.erb +15 -15
- data/docs/resources/bridge.md.erb +11 -11
- data/docs/resources/bsd_service.md.erb +11 -11
- data/docs/resources/command.md.erb +23 -23
- data/docs/resources/crontab.md.erb +84 -0
- data/docs/resources/csv.md.erb +10 -10
- data/docs/resources/dh_params.md +191 -0
- data/docs/resources/directory.md.erb +8 -8
- data/docs/resources/docker.md.erb +160 -0
- data/docs/resources/docker_container.md.erb +89 -0
- data/docs/resources/docker_image.md.erb +86 -0
- data/docs/resources/etc_group.md.erb +16 -16
- data/docs/resources/etc_hosts.md.erb +62 -0
- data/docs/resources/file.md.erb +80 -58
- data/docs/resources/gem.md.erb +32 -13
- data/docs/resources/group.md.erb +12 -12
- data/docs/resources/grub_conf.md.erb +11 -11
- data/docs/resources/host.md.erb +27 -18
- data/docs/resources/http.md.erb +104 -0
- data/docs/resources/iis_app.md.erb +126 -0
- data/docs/resources/iis_site.md.erb +17 -17
- data/docs/resources/inetd_conf.md.erb +10 -10
- data/docs/resources/ini.md.erb +9 -9
- data/docs/resources/interface.md.erb +13 -13
- data/docs/resources/iptables.md.erb +21 -14
- data/docs/resources/json.md.erb +11 -11
- data/docs/resources/kernel_module.md.erb +73 -12
- data/docs/resources/kernel_parameter.md.erb +12 -12
- data/docs/resources/key_rsa.md.erb +70 -0
- data/docs/resources/launchd_service.md.erb +11 -11
- data/docs/resources/limits_conf.md.erb +10 -10
- data/docs/resources/login_def.md.erb +12 -12
- data/docs/resources/mount.md.erb +14 -14
- data/docs/resources/mssql_session.md.erb +62 -0
- data/docs/resources/mysql_conf.md.erb +14 -14
- data/docs/resources/mysql_session.md.erb +22 -10
- data/docs/resources/npm.md.erb +13 -13
- data/docs/resources/ntp_conf.md.erb +9 -9
- data/docs/resources/oneget.md.erb +11 -11
- data/docs/resources/oracledb_session.md.erb +53 -0
- data/docs/resources/os.md.erb +17 -17
- data/docs/resources/os_env.md.erb +12 -12
- data/docs/resources/package.md.erb +29 -16
- data/docs/resources/parse_config.md.erb +18 -18
- data/docs/resources/parse_config_file.md.erb +29 -23
- data/docs/resources/{etc_passwd.md.erb → passwd.md.erb} +17 -17
- data/docs/resources/pip.md.erb +15 -15
- data/docs/resources/port.md.erb +23 -23
- data/docs/resources/postgres_conf.md.erb +15 -13
- data/docs/resources/postgres_hba_conf.md.erb +104 -0
- data/docs/resources/postgres_ident_conf.md.erb +87 -0
- data/docs/resources/postgres_session.md.erb +28 -21
- data/docs/resources/powershell.md.erb +14 -14
- data/docs/resources/processes.md.erb +123 -0
- data/docs/resources/rabbitmq_config.md.erb +55 -0
- data/docs/resources/registry_key.md.erb +44 -21
- data/docs/resources/runit_service.md.erb +11 -11
- data/docs/resources/security_policy.md.erb +10 -10
- data/docs/resources/service.md.erb +18 -18
- data/docs/resources/{etc_shadow.md.erb → shadow.md.erb} +19 -19
- data/docs/resources/ssh_config.md.erb +13 -13
- data/docs/resources/sshd_config.md.erb +15 -15
- data/docs/resources/ssl.md.erb +13 -13
- data/docs/resources/sys_info.md.erb +10 -10
- data/docs/resources/systemd_service.md.erb +11 -11
- data/docs/resources/sysv_service.md.erb +11 -11
- data/docs/resources/upstart_service.md.erb +11 -11
- data/docs/resources/user.md.erb +20 -20
- data/docs/resources/users.md.erb +19 -19
- data/docs/resources/vbscript.md.erb +13 -13
- data/docs/resources/virtualization.md.erb +71 -0
- data/docs/resources/windows_feature.md.erb +10 -10
- data/docs/resources/windows_task.md.erb +103 -0
- data/docs/resources/wmi.md.erb +10 -10
- data/docs/resources/x509_certificate.md.erb +146 -0
- data/docs/resources/xinetd_conf.md.erb +17 -17
- data/docs/resources/xml.md.erb +75 -0
- data/docs/resources/yaml.md.erb +25 -11
- data/docs/resources/yum.md.erb +24 -16
- data/docs/resources/zfs_dataset.md.erb +63 -0
- data/docs/resources/zfs_pool.md.erb +57 -0
- data/docs/ruby_usage.md +50 -0
- data/docs/shared/matcher_cmp.md.erb +4 -6
- data/examples/inheritance/README.md +49 -3
- data/examples/inheritance/controls/example.rb +4 -1
- data/examples/inheritance/inspec.yml +3 -1
- data/examples/meta-profile/README.md +29 -3
- data/examples/meta-profile/controls/example.rb +10 -5
- data/examples/meta-profile/inspec.yml +4 -8
- data/examples/profile/README.md +1 -1
- data/examples/profile/controls/example.rb +0 -1
- data/examples/profile/controls/gordon.rb +0 -1
- data/examples/profile/inspec.yml +1 -1
- data/examples/profile-attribute/inspec.yml +1 -1
- data/examples/profile-sensitive/README.md +29 -0
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -0
- data/examples/profile-sensitive/controls/sensitive.rb +9 -0
- data/examples/profile-sensitive/inspec.yml +8 -0
- data/inspec.gemspec +10 -2
- data/lib/bundles/inspec-artifact/README.md +1 -0
- data/lib/bundles/inspec-artifact/cli.rb +284 -0
- data/lib/bundles/inspec-artifact.rb +7 -0
- data/lib/bundles/inspec-compliance/README.md +44 -15
- data/lib/bundles/inspec-compliance/api.rb +135 -29
- data/lib/bundles/inspec-compliance/cli.rb +128 -21
- data/lib/bundles/inspec-compliance/configuration.rb +8 -0
- data/lib/bundles/inspec-compliance/http.rb +26 -19
- data/lib/bundles/inspec-compliance/target.rb +50 -25
- data/lib/bundles/inspec-habitat/cli.rb +31 -0
- data/lib/bundles/inspec-habitat/log.rb +10 -0
- data/lib/bundles/inspec-habitat/profile.rb +372 -0
- data/lib/bundles/inspec-habitat.rb +12 -0
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +0 -1
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +1 -1
- data/lib/bundles/inspec-supermarket/api.rb +7 -5
- data/lib/bundles/inspec-supermarket/cli.rb +2 -2
- data/lib/fetchers/git.rb +4 -2
- data/lib/fetchers/local.rb +4 -1
- data/lib/fetchers/url.rb +64 -10
- data/lib/inspec/archive/tar.rb +1 -1
- data/lib/inspec/backend.rb +26 -3
- data/lib/inspec/base_cli.rb +44 -7
- data/lib/inspec/cached_fetcher.rb +2 -2
- data/lib/inspec/cli.rb +34 -12
- data/lib/inspec/completions/fish.sh.erb +34 -0
- data/lib/inspec/control_eval_context.rb +0 -2
- data/lib/inspec/dependencies/cache.rb +0 -1
- data/lib/inspec/dependencies/dependency_set.rb +2 -2
- data/lib/inspec/dependencies/lockfile.rb +13 -6
- data/lib/inspec/dependencies/requirement.rb +6 -6
- data/lib/inspec/dependencies/resolver.rb +4 -4
- data/lib/inspec/dsl.rb +3 -5
- data/lib/inspec/env_printer.rb +9 -1
- data/lib/inspec/exceptions.rb +8 -0
- data/lib/inspec/fetcher.rb +1 -1
- data/lib/inspec/file_provider.rb +47 -11
- data/lib/inspec/library_eval_context.rb +1 -1
- data/lib/inspec/metadata.rb +62 -18
- data/lib/inspec/method_source.rb +24 -0
- data/lib/inspec/objects/attribute.rb +21 -0
- data/lib/inspec/objects/control.rb +21 -3
- data/lib/inspec/objects/each_loop.rb +2 -1
- data/lib/inspec/objects/list.rb +1 -1
- data/lib/inspec/objects/or_test.rb +17 -2
- data/lib/inspec/objects/tag.rb +27 -0
- data/lib/inspec/objects/test.rb +9 -8
- data/lib/inspec/objects.rb +1 -0
- data/lib/inspec/plugins/fetcher.rb +4 -5
- data/lib/inspec/plugins/resource.rb +1 -2
- data/lib/inspec/plugins/source_reader.rb +3 -3
- data/lib/inspec/plugins.rb +1 -1
- data/lib/inspec/polyfill.rb +0 -1
- data/lib/inspec/profile.rb +92 -23
- data/lib/inspec/profile_context.rb +1 -1
- data/lib/inspec/profile_vendor.rb +66 -0
- data/lib/inspec/resource.rb +29 -3
- data/lib/inspec/rspec_json_formatter.rb +672 -285
- data/lib/inspec/rule.rb +12 -16
- data/lib/inspec/runner.rb +26 -15
- data/lib/inspec/runner_rspec.rb +1 -0
- data/lib/inspec/runtime_profile.rb +26 -0
- data/lib/inspec/schema.rb +185 -0
- data/lib/inspec/secrets/yaml.rb +8 -1
- data/lib/inspec/secrets.rb +1 -1
- data/lib/inspec/shell.rb +92 -22
- data/lib/inspec/source_reader.rb +1 -1
- data/lib/inspec/version.rb +1 -1
- data/lib/inspec.rb +1 -1
- data/lib/matchers/matchers.rb +67 -17
- data/lib/resources/aide_conf.rb +162 -0
- data/lib/resources/apache.rb +0 -1
- data/lib/resources/apache_conf.rb +3 -3
- data/lib/resources/apt.rb +2 -1
- data/lib/resources/audit_policy.rb +0 -1
- data/lib/resources/auditd_conf.rb +1 -2
- data/lib/resources/auditd_rules.rb +5 -5
- data/lib/resources/bond.rb +1 -1
- data/lib/resources/bridge.rb +1 -1
- data/lib/resources/command.rb +5 -3
- data/lib/resources/crontab.rb +102 -0
- data/lib/resources/csv.rb +18 -1
- data/lib/resources/dh_params.rb +84 -0
- data/lib/resources/directory.rb +7 -3
- data/lib/resources/docker.rb +198 -0
- data/lib/resources/docker_container.rb +114 -0
- data/lib/resources/docker_image.rb +96 -0
- data/lib/resources/etc_group.rb +2 -3
- data/lib/resources/etc_hosts.rb +81 -0
- data/lib/resources/file.rb +88 -30
- data/lib/resources/gem.rb +26 -6
- data/lib/resources/groups.rb +4 -5
- data/lib/resources/grub_conf.rb +3 -4
- data/lib/resources/host.rb +175 -35
- data/lib/resources/http.rb +73 -0
- data/lib/resources/iis_app.rb +103 -0
- data/lib/resources/iis_site.rb +23 -0
- data/lib/resources/inetd_conf.rb +9 -4
- data/lib/resources/interface.rb +4 -3
- data/lib/resources/json.rb +37 -14
- data/lib/resources/kernel_module.rb +77 -10
- data/lib/resources/kernel_parameter.rb +0 -1
- data/lib/resources/key_rsa.rb +67 -0
- data/lib/resources/limits_conf.rb +3 -4
- data/lib/resources/login_def.rb +2 -3
- data/lib/resources/mount.rb +34 -4
- data/lib/resources/mssql_session.rb +81 -12
- data/lib/resources/mysql.rb +0 -1
- data/lib/resources/mysql_conf.rb +1 -2
- data/lib/resources/mysql_session.rb +18 -7
- data/lib/resources/nginx_conf.rb +95 -0
- data/lib/resources/ntp_conf.rb +2 -3
- data/lib/resources/oracledb_session.rb +138 -0
- data/lib/resources/os_env.rb +7 -5
- data/lib/resources/package.rb +70 -13
- data/lib/resources/packages.rb +111 -0
- data/lib/resources/parse_config.rb +3 -4
- data/lib/resources/passwd.rb +4 -5
- data/lib/resources/pip.rb +29 -21
- data/lib/resources/port.rb +133 -14
- data/lib/resources/postgres.rb +53 -43
- data/lib/resources/postgres_conf.rb +40 -13
- data/lib/resources/postgres_hba_conf.rb +101 -0
- data/lib/resources/postgres_ident_conf.rb +79 -0
- data/lib/resources/postgres_session.rb +28 -20
- data/lib/resources/powershell.rb +2 -2
- data/lib/resources/processes.rb +61 -26
- data/lib/resources/rabbitmq_conf.rb +53 -0
- data/lib/resources/registry_key.rb +34 -11
- data/lib/resources/security_policy.rb +2 -2
- data/lib/resources/service.rb +17 -7
- data/lib/resources/ssh_conf.rb +17 -6
- data/lib/resources/ssl.rb +3 -4
- data/lib/resources/sys_info.rb +1 -1
- data/lib/resources/toml.rb +26 -0
- data/lib/resources/users.rb +41 -41
- data/lib/resources/virtualization.rb +252 -0
- data/lib/resources/windows_task.rb +106 -0
- data/lib/resources/x509_certificate.rb +143 -0
- data/lib/resources/xinetd.rb +18 -2
- data/lib/resources/xml.rb +27 -0
- data/lib/resources/yaml.rb +10 -2
- data/lib/resources/yum.rb +25 -7
- data/lib/resources/zfs_dataset.rb +60 -0
- data/lib/resources/zfs_pool.rb +49 -0
- data/lib/source_readers/flat.rb +2 -1
- data/lib/source_readers/inspec.rb +30 -11
- data/lib/utils/command_wrapper.rb +3 -3
- data/lib/utils/database_helpers.rb +77 -0
- data/lib/utils/erlang_parser.rb +192 -0
- data/lib/utils/filter.rb +2 -1
- data/lib/utils/filter_array.rb +0 -1
- data/lib/utils/find_files.rb +1 -2
- data/lib/utils/latest_version.rb +21 -0
- data/lib/utils/nginx_parser.rb +76 -0
- data/lib/utils/object_traversal.rb +5 -4
- data/lib/utils/parser.rb +23 -4
- data/lib/utils/plugin_registry.rb +3 -3
- data/lib/utils/simpleconfig.rb +25 -8
- data/lib/utils/spdx.rb +13 -0
- data/lib/utils/spdx.txt +344 -0
- metadata +168 -22
- data/docs/cli.md +0 -342
- data/docs/resources/process.md.erb +0 -73
- /data/docs/{plugin_kitchen_inspec.html.md → plugin_kitchen_inspec.md} +0 -0
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
# author: Christoph Hartmann
|
|
4
4
|
require 'utils/plugin_registry'
|
|
5
5
|
require 'inspec/file_provider'
|
|
6
|
-
require 'digest'
|
|
7
6
|
|
|
8
7
|
module Inspec
|
|
9
8
|
module Plugins
|
|
@@ -36,7 +35,7 @@ module Inspec
|
|
|
36
35
|
# profile.
|
|
37
36
|
#
|
|
38
37
|
def archive_path
|
|
39
|
-
|
|
38
|
+
raise "Fetcher #{self} does not implement `archive_path()`. This is required."
|
|
40
39
|
end
|
|
41
40
|
|
|
42
41
|
#
|
|
@@ -49,7 +48,7 @@ module Inspec
|
|
|
49
48
|
# /foo/bar/baz.zip
|
|
50
49
|
#
|
|
51
50
|
def fetch(_path)
|
|
52
|
-
|
|
51
|
+
raise "Fetcher #{self} does not implement `fetch()`. This is required."
|
|
53
52
|
end
|
|
54
53
|
|
|
55
54
|
#
|
|
@@ -59,14 +58,14 @@ module Inspec
|
|
|
59
58
|
# tag will be resolved to an exact revision.
|
|
60
59
|
#
|
|
61
60
|
def resolved_source
|
|
62
|
-
|
|
61
|
+
raise "Fetcher #{self} does not implement `resolved_source()`. This is required for terminal fetchers."
|
|
63
62
|
end
|
|
64
63
|
|
|
65
64
|
#
|
|
66
65
|
# The unique key based on the content of the remote archive.
|
|
67
66
|
#
|
|
68
67
|
def cache_key
|
|
69
|
-
|
|
68
|
+
raise "Fetcher #{self} does not implement `cache_key()`. This is required for terminal fetchers."
|
|
70
69
|
end
|
|
71
70
|
|
|
72
71
|
#
|
|
@@ -38,7 +38,6 @@ module Inspec
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def __register(name, obj)
|
|
41
|
-
# rubocop:disable Lint/NestedMethodDefinition
|
|
42
41
|
cl = Class.new(obj) do
|
|
43
42
|
def initialize(backend, name, *args)
|
|
44
43
|
# attach the backend to this instance
|
|
@@ -59,7 +58,7 @@ module Inspec
|
|
|
59
58
|
end
|
|
60
59
|
|
|
61
60
|
def resource_skipped
|
|
62
|
-
@resource_skipped
|
|
61
|
+
@resource_skipped if defined?(@resource_skipped)
|
|
63
62
|
end
|
|
64
63
|
|
|
65
64
|
def skip_resource(message)
|
|
@@ -15,7 +15,7 @@ module Inspec
|
|
|
15
15
|
#
|
|
16
16
|
# @return [Inspec::Metadata] profile metadata
|
|
17
17
|
def metadata
|
|
18
|
-
|
|
18
|
+
raise "SourceReader #{self} does not implement `metadata()`. This method is required"
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# Retrieve this profile's tests
|
|
@@ -26,14 +26,14 @@ module Inspec
|
|
|
26
26
|
#
|
|
27
27
|
# @return [Hash] Collection with references pointing to test contents
|
|
28
28
|
def tests
|
|
29
|
-
|
|
29
|
+
raise "SourceReader #{self} does not implement `tests()`. This method is required"
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
# Retrieve this profile's libraries
|
|
33
33
|
#
|
|
34
34
|
# @return [Hash] Collection with references pointing to library contents
|
|
35
35
|
def libraries
|
|
36
|
-
|
|
36
|
+
raise "SourceReader #{self} does not implement `libraries()`. This method is required"
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
end
|
data/lib/inspec/plugins.rb
CHANGED
|
@@ -51,7 +51,7 @@ module Inspec
|
|
|
51
51
|
def load(name)
|
|
52
52
|
path = @registry[name]
|
|
53
53
|
if path.nil?
|
|
54
|
-
|
|
54
|
+
raise "Couldn't find plugin #{name}. Searching in #{@home}"
|
|
55
55
|
end
|
|
56
56
|
# puts "Loading plugin #{name} from #{path}"
|
|
57
57
|
require path
|
data/lib/inspec/polyfill.rb
CHANGED
data/lib/inspec/profile.rb
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
# Copyright 2015 Dominik Richter
|
|
2
|
+
# Copyright 2015 Dominik Richter
|
|
3
3
|
# author: Dominik Richter
|
|
4
4
|
# author: Christoph Hartmann
|
|
5
5
|
|
|
6
6
|
require 'forwardable'
|
|
7
|
+
require 'openssl'
|
|
7
8
|
require 'inspec/polyfill'
|
|
8
9
|
require 'inspec/cached_fetcher'
|
|
9
10
|
require 'inspec/file_provider'
|
|
@@ -13,6 +14,8 @@ require 'inspec/backend'
|
|
|
13
14
|
require 'inspec/rule'
|
|
14
15
|
require 'inspec/log'
|
|
15
16
|
require 'inspec/profile_context'
|
|
17
|
+
require 'inspec/runtime_profile'
|
|
18
|
+
require 'inspec/method_source'
|
|
16
19
|
require 'inspec/dependencies/cache'
|
|
17
20
|
require 'inspec/dependencies/lockfile'
|
|
18
21
|
require 'inspec/dependencies/dependency_set'
|
|
@@ -21,26 +24,56 @@ module Inspec
|
|
|
21
24
|
class Profile # rubocop:disable Metrics/ClassLength
|
|
22
25
|
extend Forwardable
|
|
23
26
|
|
|
24
|
-
def self.resolve_target(target, cache
|
|
25
|
-
Inspec::
|
|
27
|
+
def self.resolve_target(target, cache)
|
|
28
|
+
Inspec::Log.debug "Resolve #{target} into cache #{cache.path}"
|
|
29
|
+
Inspec::CachedFetcher.new(target, cache)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check if the profile contains a vendored cache, move content into global cache
|
|
33
|
+
# TODO: use relative file provider
|
|
34
|
+
# TODO: use source reader for Cache as well
|
|
35
|
+
def self.copy_deps_into_cache(file_provider, opts)
|
|
36
|
+
# filter content
|
|
37
|
+
cache = file_provider.files.find_all do |entry|
|
|
38
|
+
entry.start_with?('vendor')
|
|
39
|
+
end
|
|
40
|
+
content = Hash[cache.map { |x| [x, file_provider.binread(x)] }]
|
|
41
|
+
keys = content.keys
|
|
42
|
+
keys.each do |key|
|
|
43
|
+
next if content[key].nil?
|
|
44
|
+
# remove prefix
|
|
45
|
+
rel = Pathname.new(key).relative_path_from(Pathname.new('vendor')).to_s
|
|
46
|
+
tar = Pathname.new(opts[:cache].path).join(rel)
|
|
47
|
+
|
|
48
|
+
FileUtils.mkdir_p tar.dirname.to_s
|
|
49
|
+
Inspec::Log.debug "Copy #{tar} to cache directory"
|
|
50
|
+
File.binwrite(tar.to_s, content[key])
|
|
51
|
+
end
|
|
26
52
|
end
|
|
27
53
|
|
|
28
54
|
def self.for_path(path, opts)
|
|
29
55
|
file_provider = FileProvider.for_path(path)
|
|
30
|
-
|
|
56
|
+
rp = file_provider.relative_provider
|
|
57
|
+
|
|
58
|
+
# copy embedded dependecies into global cache
|
|
59
|
+
copy_deps_into_cache(rp, opts) unless opts[:cache].nil?
|
|
60
|
+
|
|
61
|
+
reader = Inspec::SourceReader.resolve(rp)
|
|
31
62
|
if reader.nil?
|
|
32
|
-
|
|
63
|
+
raise("Don't understand inspec profile in #{path}, it " \
|
|
33
64
|
"doesn't look like a supported profile structure.")
|
|
34
65
|
end
|
|
35
66
|
new(reader, opts)
|
|
36
67
|
end
|
|
37
68
|
|
|
38
69
|
def self.for_fetcher(fetcher, opts)
|
|
70
|
+
opts[:cache] = opts[:cache] || Cache.new
|
|
39
71
|
path, writable = fetcher.fetch
|
|
40
72
|
for_path(path, opts.merge(target: fetcher.target, writable: writable))
|
|
41
73
|
end
|
|
42
74
|
|
|
43
75
|
def self.for_target(target, opts = {})
|
|
76
|
+
opts[:cache] = opts[:cache] || Cache.new
|
|
44
77
|
fetcher = resolve_target(target, opts[:cache])
|
|
45
78
|
for_fetcher(fetcher, opts)
|
|
46
79
|
end
|
|
@@ -52,21 +85,26 @@ module Inspec
|
|
|
52
85
|
|
|
53
86
|
# rubocop:disable Metrics/AbcSize
|
|
54
87
|
def initialize(source_reader, options = {})
|
|
55
|
-
@
|
|
88
|
+
@source_reader = source_reader
|
|
89
|
+
@target = options[:target]
|
|
56
90
|
@logger = options[:logger] || Logger.new(nil)
|
|
57
91
|
@locked_dependencies = options[:dependencies]
|
|
58
92
|
@controls = options[:controls] || []
|
|
59
93
|
@writable = options[:writable] || false
|
|
60
94
|
@profile_id = options[:id]
|
|
61
95
|
@cache = options[:cache] || Cache.new
|
|
62
|
-
@backend = options[:backend] || Inspec::Backend.create(options)
|
|
63
|
-
@
|
|
96
|
+
@backend = options[:backend] || Inspec::Backend.create(options.select { |k, _| k != 'target' })
|
|
97
|
+
@attr_values = options[:attributes]
|
|
64
98
|
@tests_collected = false
|
|
65
99
|
@libraries_loaded = false
|
|
66
|
-
Metadata.finalize(@source_reader.metadata, @profile_id)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
100
|
+
Metadata.finalize(@source_reader.metadata, @profile_id, options)
|
|
101
|
+
|
|
102
|
+
@runtime_profile = RuntimeProfile.new(self)
|
|
103
|
+
@backend.profile = @runtime_profile
|
|
104
|
+
|
|
105
|
+
@runner_context =
|
|
106
|
+
options[:profile_context] ||
|
|
107
|
+
Inspec::ProfileContext.for_profile(self, @backend, @attr_values)
|
|
70
108
|
end
|
|
71
109
|
|
|
72
110
|
def name
|
|
@@ -77,7 +115,7 @@ module Inspec
|
|
|
77
115
|
metadata.params[:version]
|
|
78
116
|
end
|
|
79
117
|
|
|
80
|
-
def writable?
|
|
118
|
+
def writable?
|
|
81
119
|
@writable
|
|
82
120
|
end
|
|
83
121
|
|
|
@@ -172,10 +210,11 @@ module Inspec
|
|
|
172
210
|
|
|
173
211
|
# add information about the required attributes
|
|
174
212
|
res[:attributes] = res[:attributes].map(&:to_hash) unless res[:attributes].nil? || res[:attributes].empty?
|
|
213
|
+
res[:sha256] = sha256
|
|
175
214
|
res
|
|
176
215
|
end
|
|
177
216
|
|
|
178
|
-
# Check if the profile is
|
|
217
|
+
# Check if the profile is internally well-structured. The logger will be
|
|
179
218
|
# used to print information on errors and warnings which are found.
|
|
180
219
|
#
|
|
181
220
|
# @return [Boolean] true if no errors were found, false otherwise
|
|
@@ -287,8 +326,6 @@ module Inspec
|
|
|
287
326
|
|
|
288
327
|
# display all files that will be part of the archive
|
|
289
328
|
@logger.debug 'Add the following files to archive:'
|
|
290
|
-
root_path = @source_reader.target.prefix
|
|
291
|
-
files = @source_reader.target.files
|
|
292
329
|
files.each { |f| @logger.debug ' ' + f }
|
|
293
330
|
|
|
294
331
|
if opts[:zip]
|
|
@@ -312,13 +349,21 @@ module Inspec
|
|
|
312
349
|
end
|
|
313
350
|
|
|
314
351
|
def lockfile_exists?
|
|
315
|
-
|
|
352
|
+
@source_reader.target.files.include?('inspec.lock')
|
|
316
353
|
end
|
|
317
354
|
|
|
318
355
|
def lockfile_path
|
|
319
356
|
File.join(cwd, 'inspec.lock')
|
|
320
357
|
end
|
|
321
358
|
|
|
359
|
+
def root_path
|
|
360
|
+
@source_reader.target.prefix
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def files
|
|
364
|
+
@source_reader.target.files
|
|
365
|
+
end
|
|
366
|
+
|
|
322
367
|
#
|
|
323
368
|
# TODO(ssd): Relative path handling really needs to be carefully
|
|
324
369
|
# thought through, especially with respect to relative paths in
|
|
@@ -330,7 +375,7 @@ module Inspec
|
|
|
330
375
|
|
|
331
376
|
def lockfile
|
|
332
377
|
@lockfile ||= if lockfile_exists?
|
|
333
|
-
Inspec::Lockfile.
|
|
378
|
+
Inspec::Lockfile.from_content(@source_reader.target.read('inspec.lock'))
|
|
334
379
|
else
|
|
335
380
|
generate_lockfile
|
|
336
381
|
end
|
|
@@ -350,7 +395,27 @@ module Inspec
|
|
|
350
395
|
end
|
|
351
396
|
|
|
352
397
|
def load_dependencies
|
|
353
|
-
Inspec::DependencySet.from_lockfile(lockfile, cwd, @cache, @backend)
|
|
398
|
+
Inspec::DependencySet.from_lockfile(lockfile, cwd, @cache, @backend, { attributes: @attr_values })
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# Calculate this profile's SHA256 checksum. Includes metadata, dependencies,
|
|
402
|
+
# libraries, data files, and controls.
|
|
403
|
+
#
|
|
404
|
+
# @return [Type] description of returned object
|
|
405
|
+
def sha256
|
|
406
|
+
# get all dependency checksums
|
|
407
|
+
deps = Hash[locked_dependencies.list.map { |k, v| [k, v.profile.sha256] }]
|
|
408
|
+
|
|
409
|
+
res = OpenSSL::Digest::SHA256.new
|
|
410
|
+
files = source_reader.tests.to_a + source_reader.libraries.to_a +
|
|
411
|
+
source_reader.data_files.to_a +
|
|
412
|
+
[['inspec.yml', source_reader.metadata.content]] +
|
|
413
|
+
[['inspec.lock.deps', YAML.dump(deps)]]
|
|
414
|
+
|
|
415
|
+
files.sort { |a, b| a[0] <=> b[0] }
|
|
416
|
+
.map { |f| res << f[0] << "\0" << f[1] << "\0" }
|
|
417
|
+
|
|
418
|
+
res.digest.unpack('H*')[0]
|
|
354
419
|
end
|
|
355
420
|
|
|
356
421
|
private
|
|
@@ -366,11 +431,14 @@ module Inspec
|
|
|
366
431
|
end
|
|
367
432
|
|
|
368
433
|
name = params[:name] ||
|
|
369
|
-
|
|
434
|
+
raise('Cannot create an archive without a profile name! Please '\
|
|
370
435
|
'specify the name in metadata or use --output to create the archive.')
|
|
436
|
+
version = params[:version] ||
|
|
437
|
+
raise('Cannot create an archive without a profile version! Please '\
|
|
438
|
+
'specify the version in metadata or use --output to create the archive.')
|
|
371
439
|
ext = opts[:zip] ? 'zip' : 'tar.gz'
|
|
372
440
|
slug = name.downcase.strip.tr(' ', '-').gsub(/[^\w-]/, '_')
|
|
373
|
-
Pathname.new(Dir.pwd).join("#{slug}.#{ext}")
|
|
441
|
+
Pathname.new(Dir.pwd).join("#{slug}-#{version}.#{ext}")
|
|
374
442
|
end
|
|
375
443
|
|
|
376
444
|
def load_params
|
|
@@ -404,6 +472,7 @@ module Inspec
|
|
|
404
472
|
|
|
405
473
|
def load_rule(rule, file, controls, groups)
|
|
406
474
|
id = Inspec::Rule.rule_id(rule)
|
|
475
|
+
location = rule.instance_variable_get(:@__source_location)
|
|
407
476
|
controls[id] = {
|
|
408
477
|
title: rule.title,
|
|
409
478
|
desc: rule.desc,
|
|
@@ -411,8 +480,8 @@ module Inspec
|
|
|
411
480
|
refs: rule.ref,
|
|
412
481
|
tags: rule.tag,
|
|
413
482
|
checks: Inspec::Rule.checks(rule),
|
|
414
|
-
code:
|
|
415
|
-
source_location:
|
|
483
|
+
code: Inspec::MethodSource.code_at(location, source_reader),
|
|
484
|
+
source_location: location,
|
|
416
485
|
}
|
|
417
486
|
|
|
418
487
|
groups[file] ||= {
|
|
@@ -21,7 +21,7 @@ module Inspec
|
|
|
21
21
|
attr_accessor :rules
|
|
22
22
|
def initialize(profile_id, backend, conf)
|
|
23
23
|
if backend.nil?
|
|
24
|
-
|
|
24
|
+
raise 'ProfileContext is initiated with a backend == nil. ' \
|
|
25
25
|
'This is a backend error which must be fixed upstream.'
|
|
26
26
|
end
|
|
27
27
|
@profile_id = profile_id
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# author: Adam Leff
|
|
3
|
+
|
|
4
|
+
require 'inspec/profile'
|
|
5
|
+
|
|
6
|
+
module Inspec
|
|
7
|
+
class ProfileVendor
|
|
8
|
+
attr_reader :profile_path
|
|
9
|
+
|
|
10
|
+
def initialize(path)
|
|
11
|
+
@profile_path = Pathname.new(path)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def vendor!
|
|
15
|
+
vendor_dependencies
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# The URL fetcher uses a Tempfile to retrieve the vendored
|
|
19
|
+
# profile, which creates a file that is only readable by
|
|
20
|
+
# the current user. In most circumstances, this is likely OK.
|
|
21
|
+
# However, in environments like a Habitat package, these files
|
|
22
|
+
# need to be readable by all users or the Habitat Supervisor
|
|
23
|
+
# may not be able to start InSpec correctly.
|
|
24
|
+
#
|
|
25
|
+
# This method makes sure all vendored files are mode 644 for this
|
|
26
|
+
# use case. This method is not called by default - the caller
|
|
27
|
+
# vendoring the profile must make the decision as to whether this
|
|
28
|
+
# is necessary.
|
|
29
|
+
def make_readable
|
|
30
|
+
Dir.glob("#{cache_path}/**/*") do |e|
|
|
31
|
+
FileUtils.chmod(0644, e) if File.file?(e)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def cache_path
|
|
36
|
+
profile_path.join('vendor')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def lockfile
|
|
40
|
+
profile_path.join('inspec.lock')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def profile
|
|
46
|
+
@profile ||= Inspec::Profile.for_target(profile_path.to_s, profile_opts)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def profile_opts
|
|
50
|
+
{
|
|
51
|
+
cache: Inspec::Cache.new(cache_path.to_s),
|
|
52
|
+
backend: Inspec::Backend.create(target: 'mock://'),
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def vendor_dependencies
|
|
57
|
+
delete_vendored_data
|
|
58
|
+
File.write(lockfile, profile.generate_lockfile.to_yaml)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def delete_vendored_data
|
|
62
|
+
FileUtils.rm_rf(cache_path) if cache_path.exist?
|
|
63
|
+
File.delete(lockfile) if lockfile.exist?
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
data/lib/inspec/resource.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
# copyright: 2015, Vulcano Security GmbH
|
|
3
|
-
# license: All rights reserved
|
|
4
3
|
# author: Dominik Richter
|
|
5
4
|
# author: Christoph Hartmann
|
|
6
5
|
require 'inspec/plugins'
|
|
@@ -39,7 +38,7 @@ module Inspec
|
|
|
39
38
|
profile_context.subcontext_by_name(profile_name)
|
|
40
39
|
end
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
raise ProfileNotFound, "Cannot find profile named: #{profile_name}" if inner_context.nil?
|
|
43
42
|
inner_context.resource_registry[resource_name]
|
|
44
43
|
end
|
|
45
44
|
|
|
@@ -48,6 +47,10 @@ module Inspec
|
|
|
48
47
|
r.new(backend, id.to_s, *args)
|
|
49
48
|
end
|
|
50
49
|
end
|
|
50
|
+
|
|
51
|
+
define_method :inspec do
|
|
52
|
+
backend
|
|
53
|
+
end
|
|
51
54
|
end
|
|
52
55
|
end
|
|
53
56
|
end
|
|
@@ -64,11 +67,12 @@ module Inspec
|
|
|
64
67
|
|
|
65
68
|
def self.validate_resource_dsl_version!(version)
|
|
66
69
|
if version != 1
|
|
67
|
-
|
|
70
|
+
raise 'Only resource version 1 is supported!'
|
|
68
71
|
end
|
|
69
72
|
end
|
|
70
73
|
end
|
|
71
74
|
|
|
75
|
+
require 'resources/aide_conf'
|
|
72
76
|
require 'resources/apache'
|
|
73
77
|
require 'resources/apache_conf'
|
|
74
78
|
require 'resources/apt'
|
|
@@ -79,13 +83,21 @@ require 'resources/bash'
|
|
|
79
83
|
require 'resources/bond'
|
|
80
84
|
require 'resources/bridge'
|
|
81
85
|
require 'resources/command'
|
|
86
|
+
require 'resources/crontab'
|
|
87
|
+
require 'resources/dh_params'
|
|
82
88
|
require 'resources/directory'
|
|
89
|
+
require 'resources/docker'
|
|
90
|
+
require 'resources/docker_image'
|
|
91
|
+
require 'resources/docker_container'
|
|
83
92
|
require 'resources/etc_group'
|
|
93
|
+
require 'resources/etc_hosts'
|
|
84
94
|
require 'resources/file'
|
|
85
95
|
require 'resources/gem'
|
|
86
96
|
require 'resources/groups'
|
|
87
97
|
require 'resources/grub_conf'
|
|
88
98
|
require 'resources/host'
|
|
99
|
+
require 'resources/http'
|
|
100
|
+
require 'resources/iis_app'
|
|
89
101
|
require 'resources/iis_site'
|
|
90
102
|
require 'resources/inetd_conf'
|
|
91
103
|
require 'resources/interface'
|
|
@@ -93,6 +105,7 @@ require 'resources/iptables'
|
|
|
93
105
|
require 'resources/json'
|
|
94
106
|
require 'resources/kernel_module'
|
|
95
107
|
require 'resources/kernel_parameter'
|
|
108
|
+
require 'resources/key_rsa'
|
|
96
109
|
require 'resources/limits_conf'
|
|
97
110
|
require 'resources/login_def'
|
|
98
111
|
require 'resources/mount'
|
|
@@ -100,14 +113,19 @@ require 'resources/mssql_session'
|
|
|
100
113
|
require 'resources/mysql'
|
|
101
114
|
require 'resources/mysql_conf'
|
|
102
115
|
require 'resources/mysql_session'
|
|
116
|
+
require 'resources/nginx_conf'
|
|
103
117
|
require 'resources/npm'
|
|
104
118
|
require 'resources/ntp_conf'
|
|
105
119
|
require 'resources/oneget'
|
|
120
|
+
require 'resources/oracledb_session'
|
|
106
121
|
require 'resources/os'
|
|
107
122
|
require 'resources/os_env'
|
|
108
123
|
require 'resources/package'
|
|
124
|
+
require 'resources/packages'
|
|
109
125
|
require 'resources/parse_config'
|
|
110
126
|
require 'resources/passwd'
|
|
127
|
+
require 'resources/postgres_hba_conf'
|
|
128
|
+
require 'resources/postgres_ident_conf'
|
|
111
129
|
require 'resources/pip'
|
|
112
130
|
require 'resources/port'
|
|
113
131
|
require 'resources/postgres'
|
|
@@ -115,6 +133,7 @@ require 'resources/postgres_conf'
|
|
|
115
133
|
require 'resources/postgres_session'
|
|
116
134
|
require 'resources/powershell'
|
|
117
135
|
require 'resources/processes'
|
|
136
|
+
require 'resources/rabbitmq_conf'
|
|
118
137
|
require 'resources/registry_key'
|
|
119
138
|
require 'resources/security_policy'
|
|
120
139
|
require 'resources/service'
|
|
@@ -122,15 +141,22 @@ require 'resources/shadow'
|
|
|
122
141
|
require 'resources/ssl'
|
|
123
142
|
require 'resources/ssh_conf'
|
|
124
143
|
require 'resources/sys_info'
|
|
144
|
+
require 'resources/toml'
|
|
125
145
|
require 'resources/users'
|
|
126
146
|
require 'resources/vbscript'
|
|
147
|
+
require 'resources/virtualization'
|
|
127
148
|
require 'resources/windows_feature'
|
|
149
|
+
require 'resources/windows_task'
|
|
128
150
|
require 'resources/xinetd'
|
|
129
151
|
require 'resources/wmi'
|
|
152
|
+
require 'resources/x509_certificate'
|
|
130
153
|
require 'resources/yum'
|
|
154
|
+
require 'resources/zfs_dataset'
|
|
155
|
+
require 'resources/zfs_pool'
|
|
131
156
|
|
|
132
157
|
# file formats, depend on json implementation
|
|
133
158
|
require 'resources/json'
|
|
134
159
|
require 'resources/yaml'
|
|
135
160
|
require 'resources/csv'
|
|
136
161
|
require 'resources/ini'
|
|
162
|
+
require 'resources/xml'
|