inspec 2.3.10 → 2.3.23
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 +34 -13
- data/etc/plugin_filters.json +25 -0
- data/inspec.gemspec +3 -3
- data/lib/bundles/inspec-compliance/api.rb +3 -0
- data/lib/bundles/inspec-compliance/configuration.rb +3 -0
- data/lib/bundles/inspec-compliance/http.rb +3 -0
- data/lib/bundles/inspec-compliance/support.rb +3 -0
- data/lib/bundles/inspec-compliance/target.rb +3 -0
- data/lib/inspec/objects/attribute.rb +3 -0
- data/lib/inspec/plugin/v2.rb +3 -0
- data/lib/inspec/plugin/v2/filter.rb +62 -0
- data/lib/inspec/plugin/v2/installer.rb +21 -1
- data/lib/inspec/plugin/v2/loader.rb +4 -0
- data/lib/inspec/profile.rb +3 -1
- data/lib/inspec/version.rb +1 -1
- data/lib/plugins/inspec-plugin-manager-cli/lib/inspec-plugin-manager-cli/cli_command.rb +25 -3
- data/lib/plugins/inspec-plugin-manager-cli/test/functional/inspec-plugin_test.rb +65 -11
- data/lib/plugins/inspec-plugin-manager-cli/test/unit/cli_args_test.rb +5 -1
- data/lib/resources/package.rb +1 -1
- metadata +5 -253
- data/MAINTAINERS.toml +0 -52
- data/docs/.gitignore +0 -2
- data/docs/README.md +0 -41
- data/docs/dev/control-eval.md +0 -62
- data/docs/dev/filtertable-internals.md +0 -353
- data/docs/dev/filtertable-usage.md +0 -533
- data/docs/dev/integration-testing.md +0 -31
- data/docs/dev/plugins.md +0 -323
- data/docs/dsl_inspec.md +0 -354
- data/docs/dsl_resource.md +0 -100
- data/docs/glossary.md +0 -381
- data/docs/habitat.md +0 -193
- data/docs/inspec_and_friends.md +0 -114
- data/docs/matchers.md +0 -161
- data/docs/migration.md +0 -293
- data/docs/platforms.md +0 -119
- data/docs/plugin_kitchen_inspec.md +0 -60
- data/docs/plugins.md +0 -57
- data/docs/profiles.md +0 -576
- data/docs/reporters.md +0 -170
- data/docs/resources/aide_conf.md.erb +0 -86
- data/docs/resources/apache.md.erb +0 -77
- data/docs/resources/apache_conf.md.erb +0 -78
- data/docs/resources/apt.md.erb +0 -81
- data/docs/resources/audit_policy.md.erb +0 -57
- data/docs/resources/auditd.md.erb +0 -89
- data/docs/resources/auditd_conf.md.erb +0 -78
- data/docs/resources/aws_cloudtrail_trail.md.erb +0 -165
- data/docs/resources/aws_cloudtrail_trails.md.erb +0 -96
- data/docs/resources/aws_cloudwatch_alarm.md.erb +0 -101
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +0 -164
- data/docs/resources/aws_config_delivery_channel.md.erb +0 -111
- data/docs/resources/aws_config_recorder.md.erb +0 -96
- data/docs/resources/aws_ebs_volume.md.erb +0 -76
- data/docs/resources/aws_ebs_volumes.md.erb +0 -86
- data/docs/resources/aws_ec2_instance.md.erb +0 -122
- data/docs/resources/aws_ec2_instances.md.erb +0 -89
- data/docs/resources/aws_elb.md.erb +0 -154
- data/docs/resources/aws_elbs.md.erb +0 -252
- data/docs/resources/aws_flow_log.md.erb +0 -128
- data/docs/resources/aws_iam_access_key.md.erb +0 -139
- data/docs/resources/aws_iam_access_keys.md.erb +0 -214
- data/docs/resources/aws_iam_group.md.erb +0 -74
- data/docs/resources/aws_iam_groups.md.erb +0 -92
- data/docs/resources/aws_iam_password_policy.md.erb +0 -92
- data/docs/resources/aws_iam_policies.md.erb +0 -97
- data/docs/resources/aws_iam_policy.md.erb +0 -264
- data/docs/resources/aws_iam_role.md.erb +0 -79
- data/docs/resources/aws_iam_root_user.md.erb +0 -86
- data/docs/resources/aws_iam_user.md.erb +0 -130
- data/docs/resources/aws_iam_users.md.erb +0 -289
- data/docs/resources/aws_kms_key.md.erb +0 -187
- data/docs/resources/aws_kms_keys.md.erb +0 -99
- data/docs/resources/aws_rds_instance.md.erb +0 -76
- data/docs/resources/aws_route_table.md.erb +0 -63
- data/docs/resources/aws_route_tables.md.erb +0 -65
- data/docs/resources/aws_s3_bucket.md.erb +0 -156
- data/docs/resources/aws_s3_bucket_object.md.erb +0 -99
- data/docs/resources/aws_s3_buckets.md.erb +0 -69
- data/docs/resources/aws_security_group.md.erb +0 -323
- data/docs/resources/aws_security_groups.md.erb +0 -107
- data/docs/resources/aws_sns_subscription.md.erb +0 -140
- data/docs/resources/aws_sns_topic.md.erb +0 -79
- data/docs/resources/aws_sns_topics.md.erb +0 -68
- data/docs/resources/aws_subnet.md.erb +0 -150
- data/docs/resources/aws_subnets.md.erb +0 -142
- data/docs/resources/aws_vpc.md.erb +0 -135
- data/docs/resources/aws_vpcs.md.erb +0 -135
- data/docs/resources/azure_generic_resource.md.erb +0 -183
- data/docs/resources/azure_resource_group.md.erb +0 -294
- data/docs/resources/azure_virtual_machine.md.erb +0 -357
- data/docs/resources/azure_virtual_machine_data_disk.md.erb +0 -234
- data/docs/resources/bash.md.erb +0 -85
- data/docs/resources/bond.md.erb +0 -100
- data/docs/resources/bridge.md.erb +0 -67
- data/docs/resources/bsd_service.md.erb +0 -77
- data/docs/resources/chocolatey_package.md.erb +0 -68
- data/docs/resources/command.md.erb +0 -176
- data/docs/resources/cpan.md.erb +0 -89
- data/docs/resources/cran.md.erb +0 -74
- data/docs/resources/crontab.md.erb +0 -103
- data/docs/resources/csv.md.erb +0 -64
- data/docs/resources/dh_params.md.erb +0 -221
- data/docs/resources/directory.md.erb +0 -40
- data/docs/resources/docker.md.erb +0 -240
- data/docs/resources/docker_container.md.erb +0 -113
- data/docs/resources/docker_image.md.erb +0 -104
- data/docs/resources/docker_plugin.md.erb +0 -80
- data/docs/resources/docker_service.md.erb +0 -124
- data/docs/resources/elasticsearch.md.erb +0 -252
- data/docs/resources/etc_fstab.md.erb +0 -135
- data/docs/resources/etc_group.md.erb +0 -85
- data/docs/resources/etc_hosts.md.erb +0 -88
- data/docs/resources/etc_hosts_allow.md.erb +0 -84
- data/docs/resources/etc_hosts_deny.md.erb +0 -84
- data/docs/resources/file.md.erb +0 -543
- data/docs/resources/filesystem.md.erb +0 -51
- data/docs/resources/firewalld.md.erb +0 -117
- data/docs/resources/gem.md.erb +0 -108
- data/docs/resources/group.md.erb +0 -71
- data/docs/resources/grub_conf.md.erb +0 -111
- data/docs/resources/host.md.erb +0 -96
- data/docs/resources/http.md.erb +0 -207
- data/docs/resources/iis_app.md.erb +0 -132
- data/docs/resources/iis_site.md.erb +0 -145
- data/docs/resources/inetd_conf.md.erb +0 -104
- data/docs/resources/ini.md.erb +0 -86
- data/docs/resources/interface.md.erb +0 -68
- data/docs/resources/iptables.md.erb +0 -74
- data/docs/resources/json.md.erb +0 -73
- data/docs/resources/kernel_module.md.erb +0 -130
- data/docs/resources/kernel_parameter.md.erb +0 -63
- data/docs/resources/key_rsa.md.erb +0 -95
- data/docs/resources/launchd_service.md.erb +0 -67
- data/docs/resources/limits_conf.md.erb +0 -85
- data/docs/resources/login_defs.md.erb +0 -81
- data/docs/resources/mount.md.erb +0 -79
- data/docs/resources/mssql_session.md.erb +0 -78
- data/docs/resources/mysql_conf.md.erb +0 -109
- data/docs/resources/mysql_session.md.erb +0 -84
- data/docs/resources/nginx.md.erb +0 -89
- data/docs/resources/nginx_conf.md.erb +0 -148
- data/docs/resources/npm.md.erb +0 -78
- data/docs/resources/ntp_conf.md.erb +0 -70
- data/docs/resources/oneget.md.erb +0 -63
- data/docs/resources/oracledb_session.md.erb +0 -103
- data/docs/resources/os.md.erb +0 -153
- data/docs/resources/os_env.md.erb +0 -101
- data/docs/resources/package.md.erb +0 -130
- data/docs/resources/packages.md.erb +0 -77
- data/docs/resources/parse_config.md.erb +0 -113
- data/docs/resources/parse_config_file.md.erb +0 -148
- data/docs/resources/passwd.md.erb +0 -151
- data/docs/resources/pip.md.erb +0 -77
- data/docs/resources/port.md.erb +0 -147
- data/docs/resources/postgres_conf.md.erb +0 -89
- data/docs/resources/postgres_hba_conf.md.erb +0 -103
- data/docs/resources/postgres_ident_conf.md.erb +0 -86
- data/docs/resources/postgres_session.md.erb +0 -79
- data/docs/resources/powershell.md.erb +0 -112
- data/docs/resources/processes.md.erb +0 -119
- data/docs/resources/rabbitmq_config.md.erb +0 -51
- data/docs/resources/registry_key.md.erb +0 -197
- data/docs/resources/runit_service.md.erb +0 -67
- data/docs/resources/security_policy.md.erb +0 -57
- data/docs/resources/service.md.erb +0 -131
- data/docs/resources/shadow.md.erb +0 -267
- data/docs/resources/ssh_config.md.erb +0 -83
- data/docs/resources/sshd_config.md.erb +0 -93
- data/docs/resources/ssl.md.erb +0 -129
- data/docs/resources/sys_info.md.erb +0 -52
- data/docs/resources/systemd_service.md.erb +0 -67
- data/docs/resources/sysv_service.md.erb +0 -67
- data/docs/resources/upstart_service.md.erb +0 -67
- data/docs/resources/user.md.erb +0 -150
- data/docs/resources/users.md.erb +0 -137
- data/docs/resources/vbscript.md.erb +0 -65
- data/docs/resources/virtualization.md.erb +0 -67
- data/docs/resources/windows_feature.md.erb +0 -69
- data/docs/resources/windows_hotfix.md.erb +0 -63
- data/docs/resources/windows_task.md.erb +0 -95
- data/docs/resources/wmi.md.erb +0 -91
- data/docs/resources/x509_certificate.md.erb +0 -161
- data/docs/resources/xinetd_conf.md.erb +0 -166
- data/docs/resources/xml.md.erb +0 -95
- data/docs/resources/yaml.md.erb +0 -79
- data/docs/resources/yum.md.erb +0 -108
- data/docs/resources/zfs_dataset.md.erb +0 -63
- data/docs/resources/zfs_pool.md.erb +0 -57
- data/docs/shared/matcher_be.md.erb +0 -1
- data/docs/shared/matcher_cmp.md.erb +0 -43
- data/docs/shared/matcher_eq.md.erb +0 -3
- data/docs/shared/matcher_include.md.erb +0 -1
- data/docs/shared/matcher_match.md.erb +0 -1
- data/docs/shell.md +0 -217
- data/docs/style.md +0 -178
- data/examples/README.md +0 -8
- data/examples/custom-resource/README.md +0 -3
- data/examples/custom-resource/controls/example.rb +0 -7
- data/examples/custom-resource/inspec.yml +0 -8
- data/examples/custom-resource/libraries/batsignal.rb +0 -20
- data/examples/custom-resource/libraries/gordon.rb +0 -21
- data/examples/inheritance/README.md +0 -65
- data/examples/inheritance/controls/example.rb +0 -14
- data/examples/inheritance/inspec.yml +0 -16
- data/examples/kitchen-ansible/.kitchen.yml +0 -25
- data/examples/kitchen-ansible/Gemfile +0 -19
- data/examples/kitchen-ansible/README.md +0 -53
- data/examples/kitchen-ansible/files/nginx.repo +0 -6
- data/examples/kitchen-ansible/tasks/main.yml +0 -16
- data/examples/kitchen-ansible/test/integration/default/default.yml +0 -5
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +0 -28
- data/examples/kitchen-chef/.kitchen.yml +0 -20
- data/examples/kitchen-chef/Berksfile +0 -3
- data/examples/kitchen-chef/Gemfile +0 -19
- data/examples/kitchen-chef/README.md +0 -27
- data/examples/kitchen-chef/metadata.rb +0 -7
- data/examples/kitchen-chef/recipes/default.rb +0 -6
- data/examples/kitchen-chef/recipes/nginx.rb +0 -30
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +0 -28
- data/examples/kitchen-puppet/.kitchen.yml +0 -23
- data/examples/kitchen-puppet/Gemfile +0 -20
- data/examples/kitchen-puppet/Puppetfile +0 -25
- data/examples/kitchen-puppet/README.md +0 -53
- data/examples/kitchen-puppet/manifests/site.pp +0 -33
- data/examples/kitchen-puppet/metadata.json +0 -11
- data/examples/kitchen-puppet/modules/.gitkeep +0 -0
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +0 -28
- data/examples/meta-profile/README.md +0 -37
- data/examples/meta-profile/controls/example.rb +0 -13
- data/examples/meta-profile/inspec.yml +0 -13
- data/examples/plugins/inspec-resource-lister/Gemfile +0 -12
- data/examples/plugins/inspec-resource-lister/LICENSE +0 -13
- data/examples/plugins/inspec-resource-lister/README.md +0 -62
- data/examples/plugins/inspec-resource-lister/Rakefile +0 -40
- data/examples/plugins/inspec-resource-lister/inspec-resource-lister.gemspec +0 -45
- data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister.rb +0 -16
- data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister/cli_command.rb +0 -70
- data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister/plugin.rb +0 -55
- data/examples/plugins/inspec-resource-lister/lib/inspec-resource-lister/version.rb +0 -10
- data/examples/plugins/inspec-resource-lister/test/fixtures/README.md +0 -24
- data/examples/plugins/inspec-resource-lister/test/functional/README.md +0 -18
- data/examples/plugins/inspec-resource-lister/test/functional/inspec_resource_lister_test.rb +0 -110
- data/examples/plugins/inspec-resource-lister/test/helper.rb +0 -26
- data/examples/plugins/inspec-resource-lister/test/unit/README.md +0 -17
- data/examples/plugins/inspec-resource-lister/test/unit/cli_args_test.rb +0 -64
- data/examples/plugins/inspec-resource-lister/test/unit/plugin_def_test.rb +0 -51
- data/examples/profile-attribute.yml +0 -2
- data/examples/profile-attribute/README.md +0 -14
- data/examples/profile-attribute/controls/example.rb +0 -11
- data/examples/profile-attribute/inspec.yml +0 -8
- data/examples/profile-aws/controls/iam_password_policy_expiration.rb +0 -8
- data/examples/profile-aws/controls/iam_password_policy_max_age.rb +0 -8
- data/examples/profile-aws/controls/iam_root_user_mfa.rb +0 -8
- data/examples/profile-aws/controls/iam_users_access_key_age.rb +0 -8
- data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +0 -8
- data/examples/profile-aws/inspec.yml +0 -11
- data/examples/profile-azure/controls/azure_resource_group_example.rb +0 -24
- data/examples/profile-azure/controls/azure_vm_example.rb +0 -29
- data/examples/profile-azure/inspec.yml +0 -11
- data/examples/profile-sensitive/README.md +0 -29
- data/examples/profile-sensitive/controls/sensitive-failures.rb +0 -9
- data/examples/profile-sensitive/controls/sensitive.rb +0 -9
- data/examples/profile-sensitive/inspec.yml +0 -8
- data/examples/profile/README.md +0 -48
- data/examples/profile/controls/example.rb +0 -24
- data/examples/profile/controls/gordon.rb +0 -36
- data/examples/profile/controls/meta.rb +0 -36
- data/examples/profile/inspec.yml +0 -11
- data/examples/profile/libraries/gordon_config.rb +0 -59
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: About the shadow Resource
|
|
3
|
-
platform: linux
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# shadow
|
|
7
|
-
|
|
8
|
-
Use the `shadow` InSpec audit resource to test the contents of `/etc/shadow`, which contains password details that are readable only by the `root` user. `shadow` is a [plural resource](https://www.inspec.io/docs/reference/glossary/#plural_resource). Like all plural resources, it functions by performing searches across multiple entries in the shadow file.
|
|
9
|
-
|
|
10
|
-
The format for `/etc/shadow` includes:
|
|
11
|
-
|
|
12
|
-
* A username
|
|
13
|
-
* The hashed password for that user
|
|
14
|
-
* The last date a password was changed, as the number of days since Jan 1 1970
|
|
15
|
-
* The minimum number of days a password must exist, before it may be changed
|
|
16
|
-
* The maximum number of days after which a password must be changed
|
|
17
|
-
* The number of days a user is warned about an expiring password
|
|
18
|
-
* The number of days a user must be inactive before the user account is disabled
|
|
19
|
-
* The date on which a user account was disabled, as the number of days since Jan 1 1970
|
|
20
|
-
|
|
21
|
-
These entries are defined as a colon-delimited row in the file, one row per user:
|
|
22
|
-
|
|
23
|
-
dannos:Gb7crrO5CDF.:10063:0:99999:7:::
|
|
24
|
-
|
|
25
|
-
The `shadow` resource understands this format, allows you to search on the fields, and exposes the selected users' properties.
|
|
26
|
-
|
|
27
|
-
<br>
|
|
28
|
-
|
|
29
|
-
## Availability
|
|
30
|
-
|
|
31
|
-
### Installation
|
|
32
|
-
|
|
33
|
-
This resource is distributed along with InSpec itself. You can use it automatically.
|
|
34
|
-
|
|
35
|
-
### Version
|
|
36
|
-
|
|
37
|
-
This resource first became available in v1.0.0 of InSpec.
|
|
38
|
-
|
|
39
|
-
## Resource Parameters
|
|
40
|
-
|
|
41
|
-
The `shadow` resource takes one optional parameter: the path to the shadow file. If omitted, `/etc/shadow` is assumed.
|
|
42
|
-
|
|
43
|
-
# Expect a file to exist at the default location and have 32 users
|
|
44
|
-
describe shadow do
|
|
45
|
-
its('count') { should eq 32 }
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Use a custom location
|
|
49
|
-
describe shadow('/etc/my-custom-place/shadow') do
|
|
50
|
-
its('count') { should eq 32 }
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
## Examples
|
|
54
|
-
|
|
55
|
-
A `shadow` resource block uses `where` to filter entries from the shadow file. If `where` is omitted, all entries are selected.
|
|
56
|
-
|
|
57
|
-
# Select all users. Among them, there should not be a user with the name 'forbidden_user'.
|
|
58
|
-
describe shadow do
|
|
59
|
-
its('users') { should_not include 'forbidden_user' }
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Ensure there is only one user named 'root' (Select all with name 'root', then count them).
|
|
63
|
-
describe shadow.where(user: 'root') do
|
|
64
|
-
its('count') { should eq 1 }
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
Use `where` to match any of the supported [filter criteria](#filter_criteria). `where` has a method form for simple equality and a block form for more complex queries.
|
|
68
|
-
|
|
69
|
-
# Method form, simple
|
|
70
|
-
# Select just the root user (direct equality)
|
|
71
|
-
describe shadow.where(user: 'root') do
|
|
72
|
-
its ('count') { should eq 1 }
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# Method form, with a regex
|
|
76
|
-
# Select all users whose names begin with smb
|
|
77
|
-
describe shadow.where(user: /^smb/) do
|
|
78
|
-
its ('count') { should eq 2 }
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Block form
|
|
82
|
-
# Select users whose passwords have expired
|
|
83
|
-
describe shadow.where { expiry_date > 0 } do
|
|
84
|
-
# This test directly asserts that there should be 0 such users
|
|
85
|
-
its('count') { should eq 0 }
|
|
86
|
-
# But if the count test fails, this test outputs the users that are causing the failure.
|
|
87
|
-
its('users') { should be_empty }
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
<br>
|
|
91
|
-
|
|
92
|
-
## Properties
|
|
93
|
-
|
|
94
|
-
As a [plural resource](https://www.inspec.io/docs/reference/glossary/#plural_resource), all of `shadow`'s properties return lists (that is, Ruby Arrays). `include` and `be_empty` are two useful matchers when working with lists. You can also perform manipulation of the lists, such as calling `uniq`, `sort`, `count`, `first`, `last`, `min`, and `max`.
|
|
95
|
-
|
|
96
|
-
### users
|
|
97
|
-
|
|
98
|
-
A list of strings, representing the usernames matched by the filter.
|
|
99
|
-
|
|
100
|
-
describe shadow
|
|
101
|
-
its('users') { should include 'root' }
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
### passwords
|
|
105
|
-
|
|
106
|
-
A list of strings, representing the encrypted password strings for entries matched by the `where` filter. Each string may not be an encrypted password, but rather a `*` or similar which indicates that direct logins are not allowed. Different operating systems use different flags here (such as `*LK*` to indicate the account is locked).
|
|
107
|
-
|
|
108
|
-
# Use uniq to remove duplicates, then determine
|
|
109
|
-
# if the only password left on the list is '*'
|
|
110
|
-
describe shadow.where(user: /adm$/) do
|
|
111
|
-
its('passwords.uniq.first') { should cmp '*' }
|
|
112
|
-
its('passwords.uniq.count') { should eq 1 }
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
### last\_changes
|
|
116
|
-
|
|
117
|
-
A list of integers, indicating the number of days since Jan 1 1970 since the password for each matching entry was changed.
|
|
118
|
-
|
|
119
|
-
# Ensure all entries have changed their password in the last 90 days. (Probably want a filter on that)
|
|
120
|
-
describe shadow do
|
|
121
|
-
its('last_changes.min') { should be < Date.today - 90 - Date.new(1970,1,1) }
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
### min\_days
|
|
125
|
-
|
|
126
|
-
A list of integers reflecting the minimum number of days a password must exist, before it may be changed, for the users that matched the filter.
|
|
127
|
-
|
|
128
|
-
# min_days seems crazy today; make sure it is zero for everyone
|
|
129
|
-
describe shadow do
|
|
130
|
-
its('min_days.uniq') { should eq [0] }
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
### max\_days
|
|
134
|
-
|
|
135
|
-
A list of integers reflecting the maximum number of days after which the password must be changed for each user matching the filter.
|
|
136
|
-
|
|
137
|
-
# Make sure there is no policy allowing longer than 90 days
|
|
138
|
-
describe shadow do
|
|
139
|
-
its('max_days.max') { should be < 90 }
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
### warn\_days
|
|
143
|
-
|
|
144
|
-
A list of integers reflecting the number of days a user is warned about an expiring password for each user matching the filter.
|
|
145
|
-
|
|
146
|
-
# Ensure everyone gets the same 7-day policy
|
|
147
|
-
describe shadow do
|
|
148
|
-
its('warn_days.uniq.count') { should eq 1 }
|
|
149
|
-
its('warn_days.uniq.first') { should eq 7 }
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
### inactive\_days
|
|
153
|
-
|
|
154
|
-
A list of integers reflecting the number of days a user must be inactive before the user account is disabled for each user matching the filter.
|
|
155
|
-
|
|
156
|
-
# Ensure everyone except admins has an stale policy of no more than 14 days
|
|
157
|
-
describe shadow.where { user !~ /adm$/ } do
|
|
158
|
-
its('inactive_days.max') { should be <= 14 }
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
### expiry\_dates
|
|
162
|
-
|
|
163
|
-
A list of integers reflecting the number of days since Jan 1 1970 that a user account has been disabled, for each user matching the filter. Value is `nil` if the account has not expired.
|
|
164
|
-
|
|
165
|
-
# No one should have an expired account.
|
|
166
|
-
describe shadow do
|
|
167
|
-
its('expiry_dates.compact') { should be_empty }
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
### count
|
|
171
|
-
|
|
172
|
-
The `count` property tests the number of records that the filter matched.
|
|
173
|
-
|
|
174
|
-
# Should probably only have one root user
|
|
175
|
-
describe shadow.user('root') do
|
|
176
|
-
its('count') { should eq 1 }
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
<br>
|
|
180
|
-
|
|
181
|
-
## Filter Criteria
|
|
182
|
-
|
|
183
|
-
You may use any of these filter criteria with the `where` function. They are named after the columns in the shadow file. Each has a related list [property](#properties).
|
|
184
|
-
|
|
185
|
-
### user
|
|
186
|
-
|
|
187
|
-
The string username of a user. Always present. Not required to be unique.
|
|
188
|
-
|
|
189
|
-
# Expect all users whose name ends in adm to have a disabled password via the '*' flag
|
|
190
|
-
describe shadow.where(user: /adm$/) do
|
|
191
|
-
its('password.uniq') { should eq ['*'] }
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
### password
|
|
195
|
-
|
|
196
|
-
The encrypted password strings, or an account status string. Each string may not be an encrypted password, but rather a `*` or similar which indicates that direct logins are not allowed. Different operating systems use other flags here (such as `*LK*` to indicate the account is locked).
|
|
197
|
-
|
|
198
|
-
# Find 'locked' accounts and ensure 'nobody' is on the list
|
|
199
|
-
describe shadow.where(password: '*LK*') do
|
|
200
|
-
its('users') { should include 'nobody' }
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
### last_change
|
|
204
|
-
|
|
205
|
-
An integer reflecting the number of days since Jan 1 1970 since the user's password was changed.
|
|
206
|
-
|
|
207
|
-
# Find users who have not changed their password within 90 days
|
|
208
|
-
describe shadow.where { last_change > Date.today - 90 - Date.new(1970,1,1) } do
|
|
209
|
-
its('users') { should be_empty }
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
### min_days
|
|
213
|
-
|
|
214
|
-
An integer reflecting the minimum number of days a user is required to wait before
|
|
215
|
-
changing their password again.
|
|
216
|
-
|
|
217
|
-
# Find users who have a nonzero wait time
|
|
218
|
-
describe shadow.where { min_days > 0 } do
|
|
219
|
-
its('users') { should be_empty }
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
### max_days
|
|
223
|
-
|
|
224
|
-
An integer reflecting the maximum number of days a user may go without changing their password.
|
|
225
|
-
|
|
226
|
-
# All users should have a 30-day policy
|
|
227
|
-
describe shadow.where { max_days != 30 } do
|
|
228
|
-
its('users') { should be_empty }
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
### warn_days
|
|
232
|
-
|
|
233
|
-
An integer reflecting the number of days before a password expiration that a user recieves an alert.
|
|
234
|
-
|
|
235
|
-
# All users should have a 7-day warning policy
|
|
236
|
-
describe shadow.where { warn_days != 7 } do
|
|
237
|
-
its('users') { should be_empty }
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
### inactive_days
|
|
241
|
-
|
|
242
|
-
An integer reflecting the number of days that must pass before a user who has not logged in will be disabled.
|
|
243
|
-
|
|
244
|
-
# Ensure everyone has a stale policy of no more than 14 days.
|
|
245
|
-
describe shadow.where { inactive_days.nil? || inactive_days > 14 } do
|
|
246
|
-
its('users') { should be_empty }
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
### expiry_date
|
|
250
|
-
|
|
251
|
-
An integer reflecting the number of days since Jan 1, 1970 on which the user was disabled. The `expiry_date` criterion is `nil` for enabled users.
|
|
252
|
-
|
|
253
|
-
# Ensure no one is disabled due to a old password
|
|
254
|
-
describe shadow.where { !expiry_date.nil? } do
|
|
255
|
-
its('users') { should be_empty }
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
# Ensure no one is disabled for more than 14 days
|
|
259
|
-
describe shadow.where { !expiry_date.nil? && expiry_date - Date.new(1970,1,1) > 14} do
|
|
260
|
-
its('users') { should be_empty }
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
## Matchers
|
|
264
|
-
|
|
265
|
-
This resource has no resource-specific matchers.
|
|
266
|
-
|
|
267
|
-
For a full list of available matchers, please visit our [Universal Matchers page](https://www.inspec.io/docs/reference/matchers/).
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: About the ssh_config Resource
|
|
3
|
-
platform: linux
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# ssh_config
|
|
7
|
-
|
|
8
|
-
Use the `ssh_config` InSpec audit resource to test OpenSSH client configuration data located at `/etc/ssh/ssh_config` on Linux and Unix platforms.
|
|
9
|
-
|
|
10
|
-
<br>
|
|
11
|
-
|
|
12
|
-
## Availability
|
|
13
|
-
|
|
14
|
-
### Installation
|
|
15
|
-
|
|
16
|
-
This resource is distributed along with InSpec itself. You can use it automatically.
|
|
17
|
-
|
|
18
|
-
### Version
|
|
19
|
-
|
|
20
|
-
This resource first became available in v1.0.0 of InSpec.
|
|
21
|
-
|
|
22
|
-
## Syntax
|
|
23
|
-
|
|
24
|
-
An `ssh_config` resource block declares the client OpenSSH configuration data to be tested:
|
|
25
|
-
|
|
26
|
-
describe ssh_config('path') do
|
|
27
|
-
its('name') { should include('foo') }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
where
|
|
31
|
-
|
|
32
|
-
* `name` is a configuration setting in `ssh_config`
|
|
33
|
-
* `('path')` is the non-default `/path/to/ssh_config`
|
|
34
|
-
* `{ should include('foo') }` tests the value of `name` as read from `ssh_config` versus the value declared in the test
|
|
35
|
-
|
|
36
|
-
<br>
|
|
37
|
-
|
|
38
|
-
## Examples
|
|
39
|
-
|
|
40
|
-
The following examples show how to use this InSpec audit resource.
|
|
41
|
-
|
|
42
|
-
### Test SSH configuration settings
|
|
43
|
-
|
|
44
|
-
describe ssh_config do
|
|
45
|
-
its('cipher') { should contain '3des' }
|
|
46
|
-
its('port') { should eq '22' }
|
|
47
|
-
its('hostname') { should include('example.com') }
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
### Test which variables from the local environment are sent to the server
|
|
51
|
-
|
|
52
|
-
only_if do
|
|
53
|
-
command('sshd').exist? or command('ssh').exists?
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
describe ssh_config do
|
|
57
|
-
its('SendEnv') { should include('GORDON_CLIENT') }
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
### Test SSH configuration
|
|
61
|
-
|
|
62
|
-
describe ssh_config do
|
|
63
|
-
its('Host') { should eq '*' }
|
|
64
|
-
its('Tunnel') { should eq nil }
|
|
65
|
-
its('SendEnv') { should eq 'LANG LC_*' }
|
|
66
|
-
its('HashKnownHosts') { should eq 'yes' }
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
<br>
|
|
70
|
-
|
|
71
|
-
## Matchers
|
|
72
|
-
|
|
73
|
-
For a full list of available matchers, please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
|
|
74
|
-
|
|
75
|
-
### name
|
|
76
|
-
|
|
77
|
-
The `name` matcher tests the value of `name` as read from `ssh_config` versus the value declared in the test:
|
|
78
|
-
|
|
79
|
-
its('name') { should eq 'foo' }
|
|
80
|
-
|
|
81
|
-
or:
|
|
82
|
-
|
|
83
|
-
its('name') { should include('bar') }
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: About the sshd_config Resource
|
|
3
|
-
platform: linux
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# sshd_config
|
|
7
|
-
|
|
8
|
-
Use the `sshd_config` InSpec audit resource to test configuration data for the OpenSSH daemon located at `/etc/ssh/sshd_config` on Linux and Unix platforms. sshd---the OpenSSH daemon---listens on dedicated ports, starts a daemon for each incoming connection, and then handles encryption, authentication, key exchanges, command execution, and data exchanges.
|
|
9
|
-
|
|
10
|
-
<br>
|
|
11
|
-
|
|
12
|
-
## Availability
|
|
13
|
-
|
|
14
|
-
### Installation
|
|
15
|
-
|
|
16
|
-
This resource is distributed along with InSpec itself. You can use it automatically.
|
|
17
|
-
|
|
18
|
-
### Version
|
|
19
|
-
|
|
20
|
-
This resource first became available in v1.0.0 of InSpec.
|
|
21
|
-
|
|
22
|
-
## Syntax
|
|
23
|
-
|
|
24
|
-
An `sshd_config` resource block declares the client OpenSSH configuration data to be tested:
|
|
25
|
-
|
|
26
|
-
describe sshd_config('path') do
|
|
27
|
-
its('name') { should include('foo') }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
where
|
|
31
|
-
|
|
32
|
-
* `name` is a configuration setting in `sshd_config`
|
|
33
|
-
* `('path')` is the non-default `/path/to/sshd_config`
|
|
34
|
-
* `{ should include('foo') }` tests the value of `name` as read from `sshd_config` versus the value declared in the test
|
|
35
|
-
|
|
36
|
-
<br>
|
|
37
|
-
|
|
38
|
-
## Examples
|
|
39
|
-
|
|
40
|
-
The following examples show how to use this InSpec audit resource.
|
|
41
|
-
|
|
42
|
-
### Test which variables may be sent to the server
|
|
43
|
-
|
|
44
|
-
describe sshd_config do
|
|
45
|
-
its('AcceptEnv') { should include('GORDON_SERVER') }
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
### Test for IPv6-only addresses
|
|
49
|
-
|
|
50
|
-
describe sshd_config do
|
|
51
|
-
its('AddressFamily') { should cmp 'inet6' }
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
### Test the Protocol setting
|
|
55
|
-
|
|
56
|
-
describe sshd_config do
|
|
57
|
-
its('Protocol') { should cmp 2 }
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
### Test for approved, strong ciphers
|
|
61
|
-
|
|
62
|
-
describe sshd_config do
|
|
63
|
-
its('Ciphers') { should cmp('chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr') }
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
### Test SSH protocols
|
|
67
|
-
|
|
68
|
-
describe sshd_config do
|
|
69
|
-
its('Port') { should cmp 22 }
|
|
70
|
-
its('UsePAM') { should eq 'yes' }
|
|
71
|
-
its('ListenAddress') { should eq nil }
|
|
72
|
-
its('HostKey') { should eq [
|
|
73
|
-
'/etc/ssh/ssh_host_rsa_key',
|
|
74
|
-
'/etc/ssh/ssh_host_dsa_key',
|
|
75
|
-
'/etc/ssh/ssh_host_ecdsa_key',
|
|
76
|
-
] }
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
<br>
|
|
80
|
-
|
|
81
|
-
## Matchers
|
|
82
|
-
|
|
83
|
-
For a full list of available matchers, please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
|
|
84
|
-
|
|
85
|
-
### name
|
|
86
|
-
|
|
87
|
-
The `name` matcher tests the value of `name` as read from `sshd_config` versus the value declared in the test:
|
|
88
|
-
|
|
89
|
-
its('name') { should cmp 'foo' }
|
|
90
|
-
|
|
91
|
-
or:
|
|
92
|
-
|
|
93
|
-
its('name') {should include('bar') }
|
data/docs/resources/ssl.md.erb
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: About the ssl Resource
|
|
3
|
-
platform: os
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# ssl
|
|
7
|
-
|
|
8
|
-
Use the `ssl` InSpec audit resource to test SSL settings for the named port.
|
|
9
|
-
|
|
10
|
-
<br>
|
|
11
|
-
|
|
12
|
-
## Availability
|
|
13
|
-
|
|
14
|
-
### Installation
|
|
15
|
-
|
|
16
|
-
This resource is distributed along with InSpec itself. You can use it automatically.
|
|
17
|
-
|
|
18
|
-
### Version
|
|
19
|
-
|
|
20
|
-
This resource first became available in v1.0.0 of InSpec.
|
|
21
|
-
|
|
22
|
-
## Syntax
|
|
23
|
-
|
|
24
|
-
An `ssl` resource block declares an SSL port, and then other properties of the test like cipher and/or protocol:
|
|
25
|
-
|
|
26
|
-
describe ssl(port: #) do
|
|
27
|
-
it { should be_enabled }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
or:
|
|
31
|
-
|
|
32
|
-
describe ssl(port: #).filter('value') do
|
|
33
|
-
it { should be_enabled }
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
where
|
|
37
|
-
|
|
38
|
-
* `ssl(port: #)` is the port number, such as `ssl(port: 443)`
|
|
39
|
-
* `filter` may take any of the following arguments: `ciphers`, `protocols`, and `handshake`
|
|
40
|
-
|
|
41
|
-
<br>
|
|
42
|
-
|
|
43
|
-
## Examples
|
|
44
|
-
|
|
45
|
-
The following examples show how to use this InSpec audit resource.
|
|
46
|
-
|
|
47
|
-
### Run the ssl-benchmark example profile
|
|
48
|
-
|
|
49
|
-
The following shows how to use the `ssl` InSpec audit resource to find all TCP ports on the system, including IPv4 and IPv6. (This is a partial example based on the `ssl_text.rb` file in the `ssl-benchmark` profile on GitHub.)
|
|
50
|
-
|
|
51
|
-
...
|
|
52
|
-
|
|
53
|
-
control 'tls1.2' do
|
|
54
|
-
title 'Run TLS 1.2 whenever SSL is active on a port'
|
|
55
|
-
impact 0.5
|
|
56
|
-
|
|
57
|
-
sslports.each do |socket|
|
|
58
|
-
proc_desc = "on node == #{command('hostname').stdout.strip} running #{socket.process.inspect} (#{socket.pid})"
|
|
59
|
-
describe ssl(port: socket.port).protocols('tls1.2') do
|
|
60
|
-
it(proc_desc) { should be_enabled }
|
|
61
|
-
it { should be_enabled }
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
...
|
|
67
|
-
|
|
68
|
-
control 'rc4' do
|
|
69
|
-
title 'Disable RC4 ciphers from all exposed SSL/TLS ports and versions.'
|
|
70
|
-
impact 0.5
|
|
71
|
-
|
|
72
|
-
sslports.each do |socket|
|
|
73
|
-
proc_desc = "on node == #{command('hostname').stdout.strip} running #{socket.process.inspect} (#{socket.pid})"
|
|
74
|
-
describe ssl(port: socket.port).ciphers(/rc4/i) do
|
|
75
|
-
it(proc_desc) { should_not be_enabled }
|
|
76
|
-
it { should_not be_enabled }
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
There are two ways to run the `ssl-benchmark` example profile to test SSL via the `ssl` resource.
|
|
82
|
-
|
|
83
|
-
Clone the profile:
|
|
84
|
-
|
|
85
|
-
$ git clone https://github.com/dev-sec/ssl-benchmark
|
|
86
|
-
|
|
87
|
-
and then run:
|
|
88
|
-
|
|
89
|
-
$ inspec exec ssl-benchmark
|
|
90
|
-
|
|
91
|
-
Or execute the profile directly via URL:
|
|
92
|
-
|
|
93
|
-
$ inspec exec https://github.com/dev-sec/ssl-benchmark
|
|
94
|
-
|
|
95
|
-
<br>
|
|
96
|
-
|
|
97
|
-
## Matchers
|
|
98
|
-
|
|
99
|
-
For a full list of available matchers, please visit our [matchers page](https://www.inspec.io/docs/reference/matchers/).
|
|
100
|
-
|
|
101
|
-
### be_enabled
|
|
102
|
-
|
|
103
|
-
The `be_enabled` matcher tests if SSL is enabled:
|
|
104
|
-
|
|
105
|
-
it { should be_enabled }
|
|
106
|
-
|
|
107
|
-
### ciphers
|
|
108
|
-
|
|
109
|
-
The `ciphers` matcher tests the named cipher:
|
|
110
|
-
|
|
111
|
-
its('ciphers') { should_not eq '/rc4/i' }
|
|
112
|
-
|
|
113
|
-
or:
|
|
114
|
-
|
|
115
|
-
describe ssl(port: 443).ciphers(/rc4/i) do
|
|
116
|
-
it { should_not be_enabled }
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
### protocols
|
|
120
|
-
|
|
121
|
-
The `protocols` matcher tests what protocol versions (SSLv3, TLSv1.1, etc) are enabled:
|
|
122
|
-
|
|
123
|
-
its('protocols') { should eq 'ssl2' }
|
|
124
|
-
|
|
125
|
-
or:
|
|
126
|
-
|
|
127
|
-
describe ssl(port: 443).protocols('ssl2') do
|
|
128
|
-
it { should_not be_enabled }
|
|
129
|
-
end
|