inspec 2.1.0 → 2.1.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +101 -101
- data/CHANGELOG.md +3024 -3004
- data/Gemfile +55 -55
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +447 -446
- data/Rakefile +322 -322
- data/bin/inspec +12 -12
- data/docs/.gitignore +2 -2
- data/docs/README.md +40 -40
- data/docs/dsl_inspec.md +258 -258
- data/docs/dsl_resource.md +100 -93
- data/docs/glossary.md +99 -99
- data/docs/habitat.md +191 -191
- data/docs/inspec_and_friends.md +114 -114
- data/docs/matchers.md +169 -169
- data/docs/migration.md +293 -293
- data/docs/platforms.md +118 -118
- data/docs/plugin_kitchen_inspec.md +50 -50
- data/docs/profiles.md +376 -376
- data/docs/reporters.md +105 -105
- data/docs/resources/aide_conf.md.erb +75 -75
- data/docs/resources/apache.md.erb +67 -67
- data/docs/resources/apache_conf.md.erb +68 -68
- data/docs/resources/apt.md.erb +71 -71
- data/docs/resources/audit_policy.md.erb +47 -47
- data/docs/resources/auditd.md.erb +79 -79
- data/docs/resources/auditd_conf.md.erb +68 -68
- data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
- data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
- data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
- data/docs/resources/aws_config_recorder.md.erb +71 -71
- data/docs/resources/aws_ec2_instance.md.erb +106 -106
- data/docs/resources/aws_iam_access_key.md.erb +123 -123
- data/docs/resources/aws_iam_access_keys.md.erb +198 -198
- data/docs/resources/aws_iam_group.md.erb +46 -46
- data/docs/resources/aws_iam_groups.md.erb +43 -43
- data/docs/resources/aws_iam_password_policy.md.erb +76 -76
- data/docs/resources/aws_iam_policies.md.erb +82 -82
- data/docs/resources/aws_iam_policy.md.erb +144 -144
- data/docs/resources/aws_iam_role.md.erb +63 -63
- data/docs/resources/aws_iam_root_user.md.erb +58 -58
- data/docs/resources/aws_iam_user.md.erb +64 -64
- data/docs/resources/aws_iam_users.md.erb +89 -89
- data/docs/resources/aws_kms_keys.md.erb +84 -84
- data/docs/resources/aws_route_table.md.erb +47 -47
- data/docs/resources/aws_s3_bucket.md.erb +134 -134
- data/docs/resources/aws_s3_bucket_object.md.erb +83 -0
- data/docs/resources/aws_security_group.md.erb +151 -151
- data/docs/resources/aws_security_groups.md.erb +91 -91
- data/docs/resources/aws_sns_subscription.md.erb +125 -0
- data/docs/resources/aws_sns_topic.md.erb +63 -63
- data/docs/resources/aws_sns_topics.md.erb +52 -0
- data/docs/resources/aws_subnet.md.erb +134 -134
- data/docs/resources/aws_subnets.md.erb +126 -126
- data/docs/resources/aws_vpc.md.erb +120 -120
- data/docs/resources/aws_vpcs.md.erb +48 -48
- data/docs/resources/azure_generic_resource.md.erb +171 -171
- data/docs/resources/azure_resource_group.md.erb +284 -284
- data/docs/resources/azure_virtual_machine.md.erb +347 -347
- data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
- data/docs/resources/bash.md.erb +75 -75
- data/docs/resources/bond.md.erb +90 -90
- data/docs/resources/bridge.md.erb +57 -57
- data/docs/resources/bsd_service.md.erb +67 -67
- data/docs/resources/command.md.erb +138 -138
- data/docs/resources/cpan.md.erb +79 -79
- data/docs/resources/cran.md.erb +64 -64
- data/docs/resources/crontab.md.erb +89 -89
- data/docs/resources/csv.md.erb +54 -54
- data/docs/resources/dh_params.md.erb +205 -205
- data/docs/resources/directory.md.erb +30 -30
- data/docs/resources/docker.md.erb +219 -219
- data/docs/resources/docker_container.md.erb +103 -103
- data/docs/resources/docker_image.md.erb +94 -94
- data/docs/resources/docker_service.md.erb +114 -114
- data/docs/resources/elasticsearch.md.erb +242 -242
- data/docs/resources/etc_fstab.md.erb +125 -125
- data/docs/resources/etc_group.md.erb +75 -75
- data/docs/resources/etc_hosts.md.erb +78 -78
- data/docs/resources/etc_hosts_allow.md.erb +74 -74
- data/docs/resources/etc_hosts_deny.md.erb +74 -74
- data/docs/resources/file.md.erb +526 -526
- data/docs/resources/filesystem.md.erb +41 -41
- data/docs/resources/firewalld.md.erb +107 -107
- data/docs/resources/gem.md.erb +79 -79
- data/docs/resources/group.md.erb +61 -61
- data/docs/resources/grub_conf.md.erb +101 -101
- data/docs/resources/host.md.erb +86 -86
- data/docs/resources/http.md.erb +196 -196
- data/docs/resources/iis_app.md.erb +122 -122
- data/docs/resources/iis_site.md.erb +135 -135
- data/docs/resources/inetd_conf.md.erb +94 -94
- data/docs/resources/ini.md.erb +76 -76
- data/docs/resources/interface.md.erb +58 -58
- data/docs/resources/iptables.md.erb +64 -64
- data/docs/resources/json.md.erb +63 -63
- data/docs/resources/kernel_module.md.erb +120 -120
- data/docs/resources/kernel_parameter.md.erb +53 -53
- data/docs/resources/key_rsa.md.erb +85 -85
- data/docs/resources/launchd_service.md.erb +57 -57
- data/docs/resources/limits_conf.md.erb +75 -75
- data/docs/resources/{login_def.md.erb → login_defs.md.erb} +71 -71
- data/docs/resources/mount.md.erb +69 -69
- data/docs/resources/mssql_session.md.erb +60 -60
- data/docs/resources/mysql_conf.md.erb +99 -99
- data/docs/resources/mysql_session.md.erb +74 -74
- data/docs/resources/nginx.md.erb +79 -79
- data/docs/resources/nginx_conf.md.erb +138 -128
- data/docs/resources/npm.md.erb +60 -60
- data/docs/resources/ntp_conf.md.erb +60 -60
- data/docs/resources/oneget.md.erb +53 -53
- data/docs/resources/oracledb_session.md.erb +52 -52
- data/docs/resources/os.md.erb +141 -141
- data/docs/resources/os_env.md.erb +78 -78
- data/docs/resources/package.md.erb +120 -120
- data/docs/resources/packages.md.erb +67 -67
- data/docs/resources/parse_config.md.erb +103 -103
- data/docs/resources/parse_config_file.md.erb +138 -138
- data/docs/resources/passwd.md.erb +141 -141
- data/docs/resources/pip.md.erb +67 -67
- data/docs/resources/port.md.erb +137 -137
- data/docs/resources/postgres_conf.md.erb +79 -79
- data/docs/resources/postgres_hba_conf.md.erb +93 -93
- data/docs/resources/postgres_ident_conf.md.erb +76 -76
- data/docs/resources/postgres_session.md.erb +69 -69
- data/docs/resources/powershell.md.erb +102 -102
- data/docs/resources/processes.md.erb +109 -109
- data/docs/resources/rabbitmq_config.md.erb +41 -41
- data/docs/resources/registry_key.md.erb +158 -158
- data/docs/resources/runit_service.md.erb +57 -57
- data/docs/resources/security_policy.md.erb +47 -47
- data/docs/resources/service.md.erb +121 -121
- data/docs/resources/shadow.md.erb +146 -146
- data/docs/resources/ssh_config.md.erb +73 -80
- data/docs/resources/sshd_config.md.erb +83 -83
- data/docs/resources/ssl.md.erb +119 -119
- data/docs/resources/sys_info.md.erb +42 -42
- data/docs/resources/systemd_service.md.erb +57 -57
- data/docs/resources/sysv_service.md.erb +57 -57
- data/docs/resources/upstart_service.md.erb +57 -57
- data/docs/resources/user.md.erb +140 -140
- data/docs/resources/users.md.erb +127 -127
- data/docs/resources/vbscript.md.erb +55 -55
- data/docs/resources/virtualization.md.erb +57 -57
- data/docs/resources/windows_feature.md.erb +47 -47
- data/docs/resources/windows_hotfix.md.erb +53 -53
- data/docs/resources/windows_task.md.erb +95 -95
- data/docs/resources/wmi.md.erb +81 -81
- data/docs/resources/x509_certificate.md.erb +151 -151
- data/docs/resources/xinetd_conf.md.erb +156 -156
- data/docs/resources/xml.md.erb +85 -85
- data/docs/resources/yaml.md.erb +69 -69
- data/docs/resources/yum.md.erb +98 -98
- data/docs/resources/zfs_dataset.md.erb +53 -53
- data/docs/resources/zfs_pool.md.erb +47 -47
- data/docs/ruby_usage.md +203 -203
- data/docs/shared/matcher_be.md.erb +1 -1
- data/docs/shared/matcher_cmp.md.erb +43 -43
- data/docs/shared/matcher_eq.md.erb +3 -3
- data/docs/shared/matcher_include.md.erb +1 -1
- data/docs/shared/matcher_match.md.erb +1 -1
- data/docs/shell.md +217 -217
- data/examples/README.md +8 -8
- data/examples/inheritance/README.md +65 -65
- data/examples/inheritance/controls/example.rb +14 -14
- data/examples/inheritance/inspec.yml +15 -15
- data/examples/kitchen-ansible/.kitchen.yml +25 -25
- data/examples/kitchen-ansible/Gemfile +19 -19
- data/examples/kitchen-ansible/README.md +53 -53
- data/examples/kitchen-ansible/files/nginx.repo +6 -6
- data/examples/kitchen-ansible/tasks/main.yml +16 -16
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-chef/.kitchen.yml +20 -20
- data/examples/kitchen-chef/Berksfile +3 -3
- data/examples/kitchen-chef/Gemfile +19 -19
- data/examples/kitchen-chef/README.md +27 -27
- data/examples/kitchen-chef/metadata.rb +7 -7
- data/examples/kitchen-chef/recipes/default.rb +6 -6
- data/examples/kitchen-chef/recipes/nginx.rb +30 -30
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-puppet/.kitchen.yml +22 -22
- data/examples/kitchen-puppet/Gemfile +20 -20
- data/examples/kitchen-puppet/Puppetfile +25 -25
- data/examples/kitchen-puppet/README.md +53 -53
- data/examples/kitchen-puppet/manifests/site.pp +33 -33
- data/examples/kitchen-puppet/metadata.json +11 -11
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
- data/examples/meta-profile/README.md +37 -37
- data/examples/meta-profile/controls/example.rb +13 -13
- data/examples/meta-profile/inspec.yml +13 -13
- data/examples/profile-attribute.yml +2 -2
- data/examples/profile-attribute/README.md +14 -14
- data/examples/profile-attribute/controls/example.rb +11 -11
- data/examples/profile-attribute/inspec.yml +8 -8
- data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
- data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
- data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
- data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
- data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
- data/examples/profile-aws/inspec.yml +11 -11
- data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
- data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
- data/examples/profile-azure/inspec.yml +11 -11
- data/examples/profile-sensitive/README.md +29 -29
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
- data/examples/profile-sensitive/controls/sensitive.rb +9 -9
- data/examples/profile-sensitive/inspec.yml +8 -8
- data/examples/profile/README.md +48 -48
- data/examples/profile/controls/example.rb +23 -23
- data/examples/profile/controls/gordon.rb +36 -36
- data/examples/profile/controls/meta.rb +34 -34
- data/examples/profile/inspec.yml +10 -10
- data/examples/profile/libraries/gordon_config.rb +53 -53
- data/inspec.gemspec +47 -47
- data/lib/bundles/README.md +3 -3
- data/lib/bundles/inspec-artifact.rb +7 -7
- data/lib/bundles/inspec-artifact/README.md +1 -1
- data/lib/bundles/inspec-artifact/cli.rb +277 -277
- data/lib/bundles/inspec-compliance.rb +16 -16
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
- data/lib/bundles/inspec-compliance/README.md +185 -185
- data/lib/bundles/inspec-compliance/api.rb +316 -316
- data/lib/bundles/inspec-compliance/api/login.rb +152 -152
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
- data/lib/bundles/inspec-compliance/cli.rb +254 -254
- data/lib/bundles/inspec-compliance/configuration.rb +103 -103
- data/lib/bundles/inspec-compliance/http.rb +86 -86
- data/lib/bundles/inspec-compliance/support.rb +36 -36
- data/lib/bundles/inspec-compliance/target.rb +98 -98
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
- data/lib/bundles/inspec-habitat.rb +12 -12
- data/lib/bundles/inspec-habitat/cli.rb +36 -36
- data/lib/bundles/inspec-habitat/log.rb +10 -10
- data/lib/bundles/inspec-habitat/profile.rb +390 -390
- data/lib/bundles/inspec-init.rb +8 -8
- data/lib/bundles/inspec-init/README.md +31 -31
- data/lib/bundles/inspec-init/cli.rb +97 -97
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
- data/lib/bundles/inspec-supermarket.rb +13 -13
- data/lib/bundles/inspec-supermarket/README.md +45 -45
- data/lib/bundles/inspec-supermarket/api.rb +84 -84
- data/lib/bundles/inspec-supermarket/cli.rb +73 -73
- data/lib/bundles/inspec-supermarket/target.rb +34 -34
- data/lib/fetchers/git.rb +163 -163
- data/lib/fetchers/local.rb +74 -74
- data/lib/fetchers/mock.rb +35 -35
- data/lib/fetchers/url.rb +204 -204
- data/lib/inspec.rb +24 -24
- data/lib/inspec/archive/tar.rb +29 -29
- data/lib/inspec/archive/zip.rb +19 -19
- data/lib/inspec/backend.rb +93 -93
- data/lib/inspec/base_cli.rb +357 -355
- data/lib/inspec/cached_fetcher.rb +66 -66
- data/lib/inspec/cli.rb +292 -292
- data/lib/inspec/completions/bash.sh.erb +45 -45
- data/lib/inspec/completions/fish.sh.erb +34 -34
- data/lib/inspec/completions/zsh.sh.erb +61 -61
- data/lib/inspec/control_eval_context.rb +179 -179
- data/lib/inspec/dependencies/cache.rb +72 -72
- data/lib/inspec/dependencies/dependency_set.rb +92 -92
- data/lib/inspec/dependencies/lockfile.rb +115 -115
- data/lib/inspec/dependencies/requirement.rb +123 -123
- data/lib/inspec/dependencies/resolver.rb +86 -86
- data/lib/inspec/describe.rb +27 -27
- data/lib/inspec/dsl.rb +66 -66
- data/lib/inspec/dsl_shared.rb +33 -33
- data/lib/inspec/env_printer.rb +157 -157
- data/lib/inspec/errors.rb +13 -13
- data/lib/inspec/exceptions.rb +12 -12
- data/lib/inspec/expect.rb +45 -45
- data/lib/inspec/fetcher.rb +45 -45
- data/lib/inspec/file_provider.rb +275 -275
- data/lib/inspec/formatters.rb +3 -3
- data/lib/inspec/formatters/base.rb +250 -250
- data/lib/inspec/formatters/json_rspec.rb +20 -20
- data/lib/inspec/formatters/show_progress.rb +12 -12
- data/lib/inspec/library_eval_context.rb +58 -58
- data/lib/inspec/log.rb +11 -11
- data/lib/inspec/metadata.rb +247 -247
- data/lib/inspec/method_source.rb +24 -24
- data/lib/inspec/objects.rb +14 -14
- data/lib/inspec/objects/attribute.rb +65 -65
- data/lib/inspec/objects/control.rb +61 -61
- data/lib/inspec/objects/describe.rb +92 -92
- data/lib/inspec/objects/each_loop.rb +36 -36
- data/lib/inspec/objects/list.rb +15 -15
- data/lib/inspec/objects/or_test.rb +40 -40
- data/lib/inspec/objects/ruby_helper.rb +15 -15
- data/lib/inspec/objects/tag.rb +27 -27
- data/lib/inspec/objects/test.rb +87 -87
- data/lib/inspec/objects/value.rb +27 -27
- data/lib/inspec/plugins.rb +60 -60
- data/lib/inspec/plugins/cli.rb +24 -24
- data/lib/inspec/plugins/fetcher.rb +86 -86
- data/lib/inspec/plugins/resource.rb +135 -135
- data/lib/inspec/plugins/secret.rb +15 -15
- data/lib/inspec/plugins/source_reader.rb +40 -40
- data/lib/inspec/polyfill.rb +12 -12
- data/lib/inspec/profile.rb +510 -510
- data/lib/inspec/profile_context.rb +207 -207
- data/lib/inspec/profile_vendor.rb +66 -66
- data/lib/inspec/reporters.rb +54 -54
- data/lib/inspec/reporters/base.rb +24 -24
- data/lib/inspec/reporters/cli.rb +356 -356
- data/lib/inspec/reporters/json.rb +116 -116
- data/lib/inspec/reporters/json_min.rb +48 -48
- data/lib/inspec/reporters/junit.rb +77 -77
- data/lib/inspec/require_loader.rb +33 -33
- data/lib/inspec/resource.rb +186 -186
- data/lib/inspec/rule.rb +266 -266
- data/lib/inspec/runner.rb +345 -345
- data/lib/inspec/runner_mock.rb +41 -41
- data/lib/inspec/runner_rspec.rb +175 -175
- data/lib/inspec/runtime_profile.rb +26 -26
- data/lib/inspec/schema.rb +213 -213
- data/lib/inspec/secrets.rb +19 -19
- data/lib/inspec/secrets/yaml.rb +30 -30
- data/lib/inspec/shell.rb +220 -220
- data/lib/inspec/shell_detector.rb +90 -90
- data/lib/inspec/source_reader.rb +29 -29
- data/lib/inspec/version.rb +8 -8
- data/lib/matchers/matchers.rb +339 -339
- data/lib/resource_support/aws.rb +44 -41
- data/lib/resource_support/aws/aws_backend_base.rb +12 -12
- data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
- data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
- data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
- data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
- data/lib/resources/aide_conf.rb +151 -159
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +149 -156
- data/lib/resources/apt.rb +149 -149
- data/lib/resources/audit_policy.rb +63 -63
- data/lib/resources/auditd.rb +231 -231
- data/lib/resources/auditd_conf.rb +46 -55
- data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
- data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
- data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
- data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
- data/lib/resources/aws/aws_config_recorder.rb +98 -98
- data/lib/resources/aws/aws_ec2_instance.rb +157 -157
- data/lib/resources/aws/aws_iam_access_key.rb +106 -106
- data/lib/resources/aws/aws_iam_access_keys.rb +149 -149
- data/lib/resources/aws/aws_iam_group.rb +56 -56
- data/lib/resources/aws/aws_iam_groups.rb +52 -52
- data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
- data/lib/resources/aws/aws_iam_policies.rb +53 -53
- data/lib/resources/aws/aws_iam_policy.rb +125 -125
- data/lib/resources/aws/aws_iam_role.rb +51 -51
- data/lib/resources/aws/aws_iam_root_user.rb +60 -60
- data/lib/resources/aws/aws_iam_user.rb +111 -111
- data/lib/resources/aws/aws_iam_users.rb +108 -108
- data/lib/resources/aws/aws_kms_keys.rb +53 -53
- data/lib/resources/aws/aws_route_table.rb +61 -61
- data/lib/resources/aws/aws_s3_bucket.rb +115 -115
- data/lib/resources/aws/aws_s3_bucket_object.rb +82 -0
- data/lib/resources/aws/aws_security_group.rb +93 -93
- data/lib/resources/aws/aws_security_groups.rb +68 -68
- data/lib/resources/aws/aws_sns_subscription.rb +78 -0
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_sns_topics.rb +56 -0
- data/lib/resources/aws/aws_subnet.rb +88 -88
- data/lib/resources/aws/aws_subnets.rb +53 -53
- data/lib/resources/aws/aws_vpc.rb +69 -69
- data/lib/resources/aws/aws_vpcs.rb +45 -45
- data/lib/resources/azure/azure_backend.rb +377 -377
- data/lib/resources/azure/azure_generic_resource.rb +59 -59
- data/lib/resources/azure/azure_resource_group.rb +152 -152
- data/lib/resources/azure/azure_virtual_machine.rb +264 -264
- data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
- data/lib/resources/bash.rb +35 -35
- data/lib/resources/bond.rb +69 -68
- data/lib/resources/bridge.rb +122 -122
- data/lib/resources/command.rb +73 -73
- data/lib/resources/cpan.rb +58 -58
- data/lib/resources/cran.rb +64 -64
- data/lib/resources/crontab.rb +169 -169
- data/lib/resources/csv.rb +56 -60
- data/lib/resources/dh_params.rb +77 -82
- data/lib/resources/directory.rb +25 -25
- data/lib/resources/docker.rb +236 -236
- data/lib/resources/docker_container.rb +89 -89
- data/lib/resources/docker_image.rb +83 -83
- data/lib/resources/docker_object.rb +57 -57
- data/lib/resources/docker_service.rb +90 -90
- data/lib/resources/elasticsearch.rb +169 -169
- data/lib/resources/etc_fstab.rb +94 -101
- data/lib/resources/etc_group.rb +152 -152
- data/lib/resources/etc_hosts.rb +66 -82
- data/lib/resources/etc_hosts_allow_deny.rb +112 -122
- data/lib/resources/file.rb +298 -298
- data/lib/resources/filesystem.rb +31 -31
- data/lib/resources/firewalld.rb +143 -143
- data/lib/resources/gem.rb +70 -70
- data/lib/resources/groups.rb +215 -215
- data/lib/resources/grub_conf.rb +227 -237
- data/lib/resources/host.rb +306 -306
- data/lib/resources/http.rb +251 -251
- data/lib/resources/iis_app.rb +101 -101
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +54 -62
- data/lib/resources/ini.rb +29 -29
- data/lib/resources/interface.rb +129 -129
- data/lib/resources/iptables.rb +80 -80
- data/lib/resources/json.rb +107 -117
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +61 -67
- data/lib/resources/limits_conf.rb +46 -55
- data/lib/resources/login_def.rb +57 -66
- data/lib/resources/mount.rb +88 -88
- data/lib/resources/mssql_session.rb +101 -101
- data/lib/resources/mysql.rb +81 -81
- data/lib/resources/mysql_conf.rb +127 -134
- data/lib/resources/mysql_session.rb +85 -85
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +226 -227
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +51 -58
- data/lib/resources/oneget.rb +71 -71
- data/lib/resources/oracledb_session.rb +139 -139
- data/lib/resources/os.rb +36 -36
- data/lib/resources/os_env.rb +76 -76
- data/lib/resources/package.rb +370 -370
- data/lib/resources/packages.rb +111 -111
- data/lib/resources/parse_config.rb +112 -116
- data/lib/resources/passwd.rb +76 -74
- data/lib/resources/pip.rb +89 -89
- data/lib/resources/platform.rb +109 -109
- data/lib/resources/port.rb +771 -771
- data/lib/resources/postgres.rb +130 -130
- data/lib/resources/postgres_conf.rb +114 -121
- data/lib/resources/postgres_hba_conf.rb +90 -99
- data/lib/resources/postgres_ident_conf.rb +79 -76
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +53 -53
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +51 -52
- data/lib/resources/registry_key.rb +296 -296
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +790 -789
- data/lib/resources/shadow.rb +149 -146
- data/lib/resources/ssh_conf.rb +97 -102
- data/lib/resources/ssl.rb +99 -99
- data/lib/resources/sys_info.rb +28 -28
- data/lib/resources/toml.rb +32 -32
- data/lib/resources/users.rb +654 -654
- data/lib/resources/vbscript.rb +68 -68
- data/lib/resources/virtualization.rb +247 -247
- data/lib/resources/windows_feature.rb +84 -84
- data/lib/resources/windows_hotfix.rb +35 -35
- data/lib/resources/windows_task.rb +102 -102
- data/lib/resources/wmi.rb +110 -110
- data/lib/resources/x509_certificate.rb +137 -143
- data/lib/resources/xinetd.rb +106 -111
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +43 -47
- data/lib/resources/yum.rb +180 -180
- data/lib/resources/zfs_dataset.rb +60 -60
- data/lib/resources/zfs_pool.rb +49 -49
- data/lib/source_readers/flat.rb +39 -39
- data/lib/source_readers/inspec.rb +75 -75
- data/lib/utils/command_wrapper.rb +27 -27
- data/lib/utils/convert.rb +12 -12
- data/lib/utils/database_helpers.rb +77 -77
- data/lib/utils/erlang_parser.rb +192 -192
- data/lib/utils/file_reader.rb +25 -0
- data/lib/utils/filter.rb +272 -272
- data/lib/utils/filter_array.rb +27 -27
- data/lib/utils/find_files.rb +44 -44
- data/lib/utils/hash.rb +41 -41
- data/lib/utils/json_log.rb +18 -18
- data/lib/utils/latest_version.rb +22 -22
- data/lib/utils/modulator.rb +12 -12
- data/lib/utils/nginx_parser.rb +85 -85
- data/lib/utils/object_traversal.rb +49 -49
- data/lib/utils/parser.rb +274 -274
- data/lib/utils/plugin_registry.rb +93 -93
- data/lib/utils/simpleconfig.rb +120 -120
- data/lib/utils/spdx.rb +13 -13
- data/lib/utils/spdx.txt +343 -343
- metadata +12 -5
data/lib/resources/inetd_conf.rb
CHANGED
@@ -1,62 +1,54 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# copyright: 2015, Vulcano Security GmbH
|
3
|
-
|
4
|
-
require 'utils/simpleconfig'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
its('
|
15
|
-
its('
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def
|
30
|
-
read_params[
|
31
|
-
end
|
32
|
-
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
if
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
@params = conf.params
|
56
|
-
end
|
57
|
-
|
58
|
-
def to_s
|
59
|
-
'inetd.conf'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
# copyright: 2015, Vulcano Security GmbH
|
3
|
+
|
4
|
+
require 'utils/simpleconfig'
|
5
|
+
require 'utils/file_reader'
|
6
|
+
|
7
|
+
module Inspec::Resources
|
8
|
+
class InetdConf < Inspec.resource(1)
|
9
|
+
name 'inetd_conf'
|
10
|
+
supports platform: 'unix'
|
11
|
+
desc 'Use the inetd_conf InSpec audit resource to test if a service is enabled in the inetd.conf file on Linux and UNIX platforms. inetd---the Internet service daemon---listens on dedicated ports, and then loads the appropriate program based on a request. The inetd.conf file is typically located at /etc/inetd.conf and contains a list of Internet services associated to the ports on which that service will listen. Only enabled services may handle a request; only services that are required by the system should be enabled.'
|
12
|
+
example "
|
13
|
+
describe inetd_conf do
|
14
|
+
its('shell') { should eq nil }
|
15
|
+
its('login') { should eq nil }
|
16
|
+
its('exec') { should eq nil }
|
17
|
+
end
|
18
|
+
"
|
19
|
+
|
20
|
+
include FileReader
|
21
|
+
|
22
|
+
def initialize(path = nil)
|
23
|
+
@conf_path = path || '/etc/inetd.conf'
|
24
|
+
@content = read_file_content(@conf_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
# overwrite exec to ensure it works with its
|
28
|
+
# TODO: this needs to be fixed in RSpec
|
29
|
+
def exec
|
30
|
+
read_params['exec']
|
31
|
+
end
|
32
|
+
|
33
|
+
def method_missing(name)
|
34
|
+
read_params[name.to_s]
|
35
|
+
end
|
36
|
+
|
37
|
+
def read_params
|
38
|
+
return @params if defined?(@params)
|
39
|
+
|
40
|
+
# parse the file
|
41
|
+
conf = SimpleConfig.new(
|
42
|
+
@content,
|
43
|
+
assignment_regex: /^\s*(\S+?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s*$/,
|
44
|
+
key_values: 6,
|
45
|
+
multiple_values: false,
|
46
|
+
)
|
47
|
+
@params = conf.params
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_s
|
51
|
+
'inetd.conf'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/resources/ini.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'utils/simpleconfig'
|
4
|
-
|
5
|
-
module Inspec::Resources
|
6
|
-
class IniConfig < JsonConfig
|
7
|
-
name 'ini'
|
8
|
-
supports platform: 'unix'
|
9
|
-
supports platform: 'windows'
|
10
|
-
desc 'Use the ini InSpec audit resource to test data in a INI file.'
|
11
|
-
example "
|
12
|
-
descibe ini do
|
13
|
-
its('auth_protocol') { should eq 'https' }
|
14
|
-
end
|
15
|
-
"
|
16
|
-
# override file load and parse hash with simple config
|
17
|
-
def parse(content)
|
18
|
-
SimpleConfig.new(content).params
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
# used by JsonConfig to build up a full to_s method
|
24
|
-
# based on whether a file path, content, or command was supplied.
|
25
|
-
def resource_base_name
|
26
|
-
'INI'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/simpleconfig'
|
4
|
+
|
5
|
+
module Inspec::Resources
|
6
|
+
class IniConfig < JsonConfig
|
7
|
+
name 'ini'
|
8
|
+
supports platform: 'unix'
|
9
|
+
supports platform: 'windows'
|
10
|
+
desc 'Use the ini InSpec audit resource to test data in a INI file.'
|
11
|
+
example "
|
12
|
+
descibe ini do
|
13
|
+
its('auth_protocol') { should eq 'https' }
|
14
|
+
end
|
15
|
+
"
|
16
|
+
# override file load and parse hash with simple config
|
17
|
+
def parse(content)
|
18
|
+
SimpleConfig.new(content).params
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# used by JsonConfig to build up a full to_s method
|
24
|
+
# based on whether a file path, content, or command was supplied.
|
25
|
+
def resource_base_name
|
26
|
+
'INI'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/resources/interface.rb
CHANGED
@@ -1,129 +1,129 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'utils/convert'
|
4
|
-
|
5
|
-
module Inspec::Resources
|
6
|
-
class NetworkInterface < Inspec.resource(1)
|
7
|
-
name 'interface'
|
8
|
-
supports platform: 'unix'
|
9
|
-
supports platform: 'windows'
|
10
|
-
desc 'Use the interface InSpec audit resource to test basic network adapter properties, such as name, status, and link speed (in MB/sec).'
|
11
|
-
example "
|
12
|
-
describe interface('eth0') do
|
13
|
-
it { should exist }
|
14
|
-
it { should be_up }
|
15
|
-
its('speed') { should eq 1000 }
|
16
|
-
end
|
17
|
-
"
|
18
|
-
def initialize(iface)
|
19
|
-
@iface = iface
|
20
|
-
|
21
|
-
@interface_provider = nil
|
22
|
-
if inspec.os.linux?
|
23
|
-
@interface_provider = LinuxInterface.new(inspec)
|
24
|
-
elsif inspec.os.windows?
|
25
|
-
@interface_provider = WindowsInterface.new(inspec)
|
26
|
-
else
|
27
|
-
return skip_resource 'The `interface` resource is not supported on your OS yet.'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def exists?
|
32
|
-
!interface_info.nil? && !interface_info[:name].nil?
|
33
|
-
end
|
34
|
-
|
35
|
-
def up?
|
36
|
-
interface_info.nil? ? false : interface_info[:up]
|
37
|
-
end
|
38
|
-
|
39
|
-
# returns link speed in Mbits/sec
|
40
|
-
def speed
|
41
|
-
interface_info.nil? ? nil : interface_info[:speed]
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_s
|
45
|
-
"Interface #{@iface}"
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
def interface_info
|
51
|
-
return @cache if defined?(@cache)
|
52
|
-
@cache = @interface_provider.interface_info(@iface) if !@interface_provider.nil?
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
class InterfaceInfo
|
57
|
-
include Converter
|
58
|
-
attr_reader :inspec
|
59
|
-
def initialize(inspec)
|
60
|
-
@inspec = inspec
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
class LinuxInterface < InterfaceInfo
|
65
|
-
def interface_info(iface)
|
66
|
-
# will return "[mtu]\n1500\n[type]\n1"
|
67
|
-
cmd = inspec.command("find /sys/class/net/#{iface}/ -maxdepth 1 -type f -exec sh -c 'echo \"[$(basename {})]\"; cat {} || echo -n' \\;")
|
68
|
-
return nil if cmd.exit_status.to_i != 0
|
69
|
-
|
70
|
-
# parse values, we only recieve values, therefore we threat them as keys
|
71
|
-
params = SimpleConfig.new(cmd.stdout.chomp).params
|
72
|
-
|
73
|
-
# abort if we got an empty result-set
|
74
|
-
return nil if params.empty?
|
75
|
-
|
76
|
-
# parse state
|
77
|
-
state = false
|
78
|
-
if params.key?('operstate')
|
79
|
-
operstate, _value = params['operstate'].first
|
80
|
-
state = operstate == 'up'
|
81
|
-
end
|
82
|
-
|
83
|
-
# parse speed
|
84
|
-
speed = nil
|
85
|
-
if params.key?('speed')
|
86
|
-
speed, _value = params['speed'].first
|
87
|
-
speed = convert_to_i(speed)
|
88
|
-
end
|
89
|
-
|
90
|
-
{
|
91
|
-
name: iface,
|
92
|
-
up: state,
|
93
|
-
speed: speed,
|
94
|
-
}
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
class WindowsInterface < InterfaceInfo
|
99
|
-
def interface_info(iface)
|
100
|
-
# gather all network interfaces
|
101
|
-
cmd = inspec.command('Get-NetAdapter | Select-Object -Property Name, InterfaceDescription, Status, State, MacAddress, LinkSpeed, ReceiveLinkSpeed, TransmitLinkSpeed, Virtual | ConvertTo-Json')
|
102
|
-
|
103
|
-
# filter network interface
|
104
|
-
begin
|
105
|
-
net_adapter = JSON.parse(cmd.stdout)
|
106
|
-
rescue JSON::ParserError => _e
|
107
|
-
return nil
|
108
|
-
end
|
109
|
-
|
110
|
-
# ensure we have an array of groups
|
111
|
-
net_adapter = [net_adapter] if !net_adapter.is_a?(Array)
|
112
|
-
|
113
|
-
# select the requested interface
|
114
|
-
adapters = net_adapter.each_with_object([]) do |adapter, adapter_collection|
|
115
|
-
# map object
|
116
|
-
info = {
|
117
|
-
name: adapter['Name'],
|
118
|
-
up: adapter['State'] == 2,
|
119
|
-
speed: adapter['ReceiveLinkSpeed'] / 1000,
|
120
|
-
}
|
121
|
-
adapter_collection.push(info) if info[:name].casecmp(iface) == 0
|
122
|
-
end
|
123
|
-
|
124
|
-
return nil if adapters.empty?
|
125
|
-
warn "[Possible Error] detected multiple network interfaces with the name #{iface}" if adapters.size > 1
|
126
|
-
adapters[0]
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'utils/convert'
|
4
|
+
|
5
|
+
module Inspec::Resources
|
6
|
+
class NetworkInterface < Inspec.resource(1)
|
7
|
+
name 'interface'
|
8
|
+
supports platform: 'unix'
|
9
|
+
supports platform: 'windows'
|
10
|
+
desc 'Use the interface InSpec audit resource to test basic network adapter properties, such as name, status, and link speed (in MB/sec).'
|
11
|
+
example "
|
12
|
+
describe interface('eth0') do
|
13
|
+
it { should exist }
|
14
|
+
it { should be_up }
|
15
|
+
its('speed') { should eq 1000 }
|
16
|
+
end
|
17
|
+
"
|
18
|
+
def initialize(iface)
|
19
|
+
@iface = iface
|
20
|
+
|
21
|
+
@interface_provider = nil
|
22
|
+
if inspec.os.linux?
|
23
|
+
@interface_provider = LinuxInterface.new(inspec)
|
24
|
+
elsif inspec.os.windows?
|
25
|
+
@interface_provider = WindowsInterface.new(inspec)
|
26
|
+
else
|
27
|
+
return skip_resource 'The `interface` resource is not supported on your OS yet.'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def exists?
|
32
|
+
!interface_info.nil? && !interface_info[:name].nil?
|
33
|
+
end
|
34
|
+
|
35
|
+
def up?
|
36
|
+
interface_info.nil? ? false : interface_info[:up]
|
37
|
+
end
|
38
|
+
|
39
|
+
# returns link speed in Mbits/sec
|
40
|
+
def speed
|
41
|
+
interface_info.nil? ? nil : interface_info[:speed]
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
"Interface #{@iface}"
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def interface_info
|
51
|
+
return @cache if defined?(@cache)
|
52
|
+
@cache = @interface_provider.interface_info(@iface) if !@interface_provider.nil?
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class InterfaceInfo
|
57
|
+
include Converter
|
58
|
+
attr_reader :inspec
|
59
|
+
def initialize(inspec)
|
60
|
+
@inspec = inspec
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class LinuxInterface < InterfaceInfo
|
65
|
+
def interface_info(iface)
|
66
|
+
# will return "[mtu]\n1500\n[type]\n1"
|
67
|
+
cmd = inspec.command("find /sys/class/net/#{iface}/ -maxdepth 1 -type f -exec sh -c 'echo \"[$(basename {})]\"; cat {} || echo -n' \\;")
|
68
|
+
return nil if cmd.exit_status.to_i != 0
|
69
|
+
|
70
|
+
# parse values, we only recieve values, therefore we threat them as keys
|
71
|
+
params = SimpleConfig.new(cmd.stdout.chomp).params
|
72
|
+
|
73
|
+
# abort if we got an empty result-set
|
74
|
+
return nil if params.empty?
|
75
|
+
|
76
|
+
# parse state
|
77
|
+
state = false
|
78
|
+
if params.key?('operstate')
|
79
|
+
operstate, _value = params['operstate'].first
|
80
|
+
state = operstate == 'up'
|
81
|
+
end
|
82
|
+
|
83
|
+
# parse speed
|
84
|
+
speed = nil
|
85
|
+
if params.key?('speed')
|
86
|
+
speed, _value = params['speed'].first
|
87
|
+
speed = convert_to_i(speed)
|
88
|
+
end
|
89
|
+
|
90
|
+
{
|
91
|
+
name: iface,
|
92
|
+
up: state,
|
93
|
+
speed: speed,
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class WindowsInterface < InterfaceInfo
|
99
|
+
def interface_info(iface)
|
100
|
+
# gather all network interfaces
|
101
|
+
cmd = inspec.command('Get-NetAdapter | Select-Object -Property Name, InterfaceDescription, Status, State, MacAddress, LinkSpeed, ReceiveLinkSpeed, TransmitLinkSpeed, Virtual | ConvertTo-Json')
|
102
|
+
|
103
|
+
# filter network interface
|
104
|
+
begin
|
105
|
+
net_adapter = JSON.parse(cmd.stdout)
|
106
|
+
rescue JSON::ParserError => _e
|
107
|
+
return nil
|
108
|
+
end
|
109
|
+
|
110
|
+
# ensure we have an array of groups
|
111
|
+
net_adapter = [net_adapter] if !net_adapter.is_a?(Array)
|
112
|
+
|
113
|
+
# select the requested interface
|
114
|
+
adapters = net_adapter.each_with_object([]) do |adapter, adapter_collection|
|
115
|
+
# map object
|
116
|
+
info = {
|
117
|
+
name: adapter['Name'],
|
118
|
+
up: adapter['State'] == 2,
|
119
|
+
speed: adapter['ReceiveLinkSpeed'] / 1000,
|
120
|
+
}
|
121
|
+
adapter_collection.push(info) if info[:name].casecmp(iface) == 0
|
122
|
+
end
|
123
|
+
|
124
|
+
return nil if adapters.empty?
|
125
|
+
warn "[Possible Error] detected multiple network interfaces with the name #{iface}" if adapters.size > 1
|
126
|
+
adapters[0]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
data/lib/resources/iptables.rb
CHANGED
@@ -1,80 +1,80 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# Usage:
|
4
|
-
# describe iptables do
|
5
|
-
# it { should have_rule('-P INPUT ACCEPT') }
|
6
|
-
# end
|
7
|
-
#
|
8
|
-
# The following serverspec sytax is not implemented:
|
9
|
-
# describe iptables do
|
10
|
-
# it { should have_rule('-P INPUT ACCEPT').with_table('mangle').with_chain('INPUT') }
|
11
|
-
# end
|
12
|
-
# Please use the new sytax:
|
13
|
-
# describe iptables(table:'mangle', chain: 'input') do
|
14
|
-
# it { should have_rule('-P INPUT ACCEPT') }
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# Note: Docker containers normally do not have iptables installed
|
18
|
-
#
|
19
|
-
# @see http://ipset.netfilter.org/iptables.man.html
|
20
|
-
# @see http://ipset.netfilter.org/iptables.man.html
|
21
|
-
# @see https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
|
22
|
-
module Inspec::Resources
|
23
|
-
class IpTables < Inspec.resource(1)
|
24
|
-
name 'iptables'
|
25
|
-
supports platform: 'linux'
|
26
|
-
desc 'Use the iptables InSpec audit resource to test rules that are defined in iptables, which maintains tables of IP packet filtering rules. There may be more than one table. Each table contains one (or more) chains (both built-in and custom). A chain is a list of rules that match packets. When the rule matches, the rule defines what target to assign to the packet.'
|
27
|
-
example "
|
28
|
-
describe iptables do
|
29
|
-
it { should have_rule('-P INPUT ACCEPT') }
|
30
|
-
end
|
31
|
-
"
|
32
|
-
|
33
|
-
def initialize(params = {})
|
34
|
-
@table = params[:table]
|
35
|
-
@chain = params[:chain]
|
36
|
-
|
37
|
-
# we're done if we are on linux
|
38
|
-
return if inspec.os.linux?
|
39
|
-
|
40
|
-
# ensures, all calls are aborted for non-supported os
|
41
|
-
@iptables_cache = []
|
42
|
-
skip_resource 'The `iptables` resource is not supported on your OS yet.'
|
43
|
-
end
|
44
|
-
|
45
|
-
def has_rule?(rule = nil, _table = nil, _chain = nil)
|
46
|
-
# checks if the rule is part of the ruleset
|
47
|
-
# for now, we expect an exact match
|
48
|
-
retrieve_rules.any? { |line| line.casecmp(rule) == 0 }
|
49
|
-
end
|
50
|
-
|
51
|
-
def retrieve_rules
|
52
|
-
return @iptables_cache if defined?(@iptables_cache)
|
53
|
-
|
54
|
-
# construct iptables command to read all rules
|
55
|
-
bin = find_iptables_or_error
|
56
|
-
table_cmd = "-t #{@table}" if @table
|
57
|
-
iptables_cmd = format('%s %s -S %s', bin, table_cmd, @chain).strip
|
58
|
-
|
59
|
-
cmd = inspec.command(iptables_cmd)
|
60
|
-
return [] if cmd.exit_status.to_i != 0
|
61
|
-
|
62
|
-
# split rules, returns array or rules
|
63
|
-
@iptables_cache = cmd.stdout.split("\n").map(&:strip)
|
64
|
-
end
|
65
|
-
|
66
|
-
def to_s
|
67
|
-
format('Iptables %s %s', @table && "table: #{@table}", @chain && "chain: #{@chain}").strip
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def find_iptables_or_error
|
73
|
-
%w{/usr/sbin/iptables /sbin/iptables iptables}.each do |cmd|
|
74
|
-
return cmd if inspec.command(cmd).exist?
|
75
|
-
end
|
76
|
-
|
77
|
-
raise Inspec::Exceptions::ResourceFailed, 'Could not find `iptables`'
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Usage:
|
4
|
+
# describe iptables do
|
5
|
+
# it { should have_rule('-P INPUT ACCEPT') }
|
6
|
+
# end
|
7
|
+
#
|
8
|
+
# The following serverspec sytax is not implemented:
|
9
|
+
# describe iptables do
|
10
|
+
# it { should have_rule('-P INPUT ACCEPT').with_table('mangle').with_chain('INPUT') }
|
11
|
+
# end
|
12
|
+
# Please use the new sytax:
|
13
|
+
# describe iptables(table:'mangle', chain: 'input') do
|
14
|
+
# it { should have_rule('-P INPUT ACCEPT') }
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# Note: Docker containers normally do not have iptables installed
|
18
|
+
#
|
19
|
+
# @see http://ipset.netfilter.org/iptables.man.html
|
20
|
+
# @see http://ipset.netfilter.org/iptables.man.html
|
21
|
+
# @see https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
|
22
|
+
module Inspec::Resources
|
23
|
+
class IpTables < Inspec.resource(1)
|
24
|
+
name 'iptables'
|
25
|
+
supports platform: 'linux'
|
26
|
+
desc 'Use the iptables InSpec audit resource to test rules that are defined in iptables, which maintains tables of IP packet filtering rules. There may be more than one table. Each table contains one (or more) chains (both built-in and custom). A chain is a list of rules that match packets. When the rule matches, the rule defines what target to assign to the packet.'
|
27
|
+
example "
|
28
|
+
describe iptables do
|
29
|
+
it { should have_rule('-P INPUT ACCEPT') }
|
30
|
+
end
|
31
|
+
"
|
32
|
+
|
33
|
+
def initialize(params = {})
|
34
|
+
@table = params[:table]
|
35
|
+
@chain = params[:chain]
|
36
|
+
|
37
|
+
# we're done if we are on linux
|
38
|
+
return if inspec.os.linux?
|
39
|
+
|
40
|
+
# ensures, all calls are aborted for non-supported os
|
41
|
+
@iptables_cache = []
|
42
|
+
skip_resource 'The `iptables` resource is not supported on your OS yet.'
|
43
|
+
end
|
44
|
+
|
45
|
+
def has_rule?(rule = nil, _table = nil, _chain = nil)
|
46
|
+
# checks if the rule is part of the ruleset
|
47
|
+
# for now, we expect an exact match
|
48
|
+
retrieve_rules.any? { |line| line.casecmp(rule) == 0 }
|
49
|
+
end
|
50
|
+
|
51
|
+
def retrieve_rules
|
52
|
+
return @iptables_cache if defined?(@iptables_cache)
|
53
|
+
|
54
|
+
# construct iptables command to read all rules
|
55
|
+
bin = find_iptables_or_error
|
56
|
+
table_cmd = "-t #{@table}" if @table
|
57
|
+
iptables_cmd = format('%s %s -S %s', bin, table_cmd, @chain).strip
|
58
|
+
|
59
|
+
cmd = inspec.command(iptables_cmd)
|
60
|
+
return [] if cmd.exit_status.to_i != 0
|
61
|
+
|
62
|
+
# split rules, returns array or rules
|
63
|
+
@iptables_cache = cmd.stdout.split("\n").map(&:strip)
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_s
|
67
|
+
format('Iptables %s %s', @table && "table: #{@table}", @chain && "chain: #{@chain}").strip
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def find_iptables_or_error
|
73
|
+
%w{/usr/sbin/iptables /sbin/iptables iptables}.each do |cmd|
|
74
|
+
return cmd if inspec.command(cmd).exist?
|
75
|
+
end
|
76
|
+
|
77
|
+
raise Inspec::Exceptions::ResourceFailed, 'Could not find `iptables`'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|