inspec 1.30.0 → 1.31.0
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 +15 -0
- data/README.md +1 -1
- data/docs/resources/host.md.erb +10 -1
- data/docs/resources/kernel_module.md.erb +57 -3
- data/docs/resources/postgres_hba_conf.md.erb +104 -0
- data/docs/resources/postgres_ident_conf.md.erb +87 -0
- data/lib/inspec/resource.rb +2 -0
- data/lib/inspec/rspec_json_formatter.rb +10 -1
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/host.rb +55 -21
- data/lib/resources/kernel_module.rb +67 -11
- data/lib/resources/postgres_hba_conf.rb +101 -0
- data/lib/resources/postgres_ident_conf.rb +79 -0
- data/lib/resources/postgres_session.rb +17 -11
- metadata +6 -8
- data/docs/resources.md +0 -91
- data/examples/inheritance/inspec.lock +0 -11
- data/examples/meta-profile/inspec.lock +0 -18
- data/examples/meta-profile/vendor/0e6d170415e120af5f1dda113f96f7e0d156e49f82706ac41d13da00599f9b25.tar.gz +0 -0
- data/examples/meta-profile/vendor/403580959915ea24bc176b9ebdc555aeda5e2c957604b48d5f32b43554423582.tar.gz +0 -0
- data/examples/meta-profile/vendor/d08d3cc35debff04e708147cdd07739876c5d1c8357afb5e58adfaad92dd650f.tar.gz +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0f63e2bc3c79b42602da904d3a7d1c270eb82281
         | 
| 4 | 
            +
              data.tar.gz: 0f288778eab441b7325fb7f4401c15a24cca1abb
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 036eaca5d11a52c0218416510139b133547811ceecfc8ac19659cbec50951a61d8eb7bfda9a3280b3e3944c7bfd0b295d8691124ed6984372968330d8af8db0f
         | 
| 7 | 
            +
              data.tar.gz: fc6b35830b818319d4a13ec75015b16e9dca38f048d52ed2f1c1d034b7a87a16d08a1deea09010cbc153f82de8ba24dc4ce4c2d1b777676f26affc69d79da7c0
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,20 @@ | |
| 1 1 | 
             
            # Change Log
         | 
| 2 2 |  | 
| 3 | 
            +
            ## [v1.31.0](https://github.com/chef/inspec/tree/v1.31.0) (2017-07-06)
         | 
| 4 | 
            +
            [Full Changelog](https://github.com/chef/inspec/compare/v1.30.0...v1.31.0)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            **Implemented enhancements:**
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            - Add support for ncat in host resource for CoreOS [\#1993](https://github.com/chef/inspec/pull/1993) ([adamleff](https://github.com/adamleff))
         | 
| 9 | 
            +
            - New postgres\_hba\_conf resource [\#1964](https://github.com/chef/inspec/pull/1964) ([aaronlippold](https://github.com/aaronlippold))
         | 
| 10 | 
            +
            - New postgres\_ident\_conf resource [\#1963](https://github.com/chef/inspec/pull/1963) ([aaronlippold](https://github.com/aaronlippold))
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            **Fixed bugs:**
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            - Fix formatter when two profiles have the same name [\#1991](https://github.com/chef/inspec/pull/1991) ([adamleff](https://github.com/adamleff))
         | 
| 15 | 
            +
            - Fix host resolution on Darwin, use dig wherever possible [\#1986](https://github.com/chef/inspec/pull/1986) ([adamleff](https://github.com/adamleff))
         | 
| 16 | 
            +
            - updated postgres\_session resource properly escape queries [\#1939](https://github.com/chef/inspec/pull/1939) ([aaronlippold](https://github.com/aaronlippold))
         | 
| 17 | 
            +
             | 
| 3 18 | 
             
            ## [v1.30.0](https://github.com/chef/inspec/tree/v1.30.0) (2017-06-29)
         | 
| 4 19 | 
             
            [Full Changelog](https://github.com/chef/inspec/compare/v1.29.0...v1.30.0)
         | 
| 5 20 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -284,7 +284,7 @@ Gentoo Linux | | x86_64 | |
| 284 284 | 
             
            Arch Linux | | x86_64
         | 
| 285 285 | 
             
            HP-UX | 11.31 | ia64
         | 
| 286 286 |  | 
| 287 | 
            -
            *For Windows  | 
| 287 | 
            +
            *For Windows, PowerShell 3.0 or above is required.*
         | 
| 288 288 |  | 
| 289 289 | 
             
            In addition, runtime support is provided for:
         | 
| 290 290 |  | 
    
        data/docs/resources/host.md.erb
    CHANGED
    
    | @@ -14,6 +14,8 @@ A `host` resource block declares a host name, and then (depending on what is to | |
| 14 14 |  | 
| 15 15 | 
             
               describe host('example.com', port: 80, protocol: 'tcp') do
         | 
| 16 16 | 
             
                 it { should be_reachable }
         | 
| 17 | 
            +
                 it { should be_resolvable }
         | 
| 18 | 
            +
                 its('ipaddress') { should include '12.34.56.78' }
         | 
| 17 19 | 
             
               end
         | 
| 18 20 |  | 
| 19 21 | 
             
            where
         | 
| @@ -22,7 +24,6 @@ where | |
| 22 24 | 
             
            * `'example.com'` is the host name
         | 
| 23 25 | 
             
            * `port:` is the port number
         | 
| 24 26 | 
             
            * `protocol: 'name'` is the Internet protocol: TCP (`protocol: 'tcp'`), UDP (`protocol: 'udp'` or  ICMP (`protocol: 'icmp'`))
         | 
| 25 | 
            -
            * `be_reachable` is a valid matcher for this resource
         | 
| 26 27 |  | 
| 27 28 |  | 
| 28 29 | 
             
            ## Matchers
         | 
| @@ -83,3 +84,11 @@ The following examples show how to use this InSpec audit resource. | |
| 83 84 | 
             
                  it { should be_resolvable }
         | 
| 84 85 | 
             
                  its('ipaddress') { should include '192.168.1.1' }
         | 
| 85 86 | 
             
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            ### Review the connection setup and socket contents when checking reachability
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                describe host('example.com', port: 12345, protocol: 'tcp') do
         | 
| 91 | 
            +
                  it { should be_reachable }
         | 
| 92 | 
            +
                  its('connection') { should_not match /connection refused/ }
         | 
| 93 | 
            +
                  its('socket') { should match /STATUS_OK/ }
         | 
| 94 | 
            +
                end
         | 
| @@ -4,20 +4,33 @@ title: About the kernel_module Resource | |
| 4 4 |  | 
| 5 5 | 
             
            # kernel_module
         | 
| 6 6 |  | 
| 7 | 
            -
            Use the `kernel_module` InSpec audit resource to test kernel modules on Linux | 
| 7 | 
            +
            Use the `kernel_module` InSpec audit resource to test kernel modules on Linux
         | 
| 8 | 
            +
            platforms. These parameters are located under `/lib/modules`. Any submodule may
         | 
| 9 | 
            +
            be tested using this resource.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            The `kernel_module` resource can also verify if a kernel module is `blacklisted`
         | 
| 12 | 
            +
            or if a module is disabled via a fake install using the `bin_true` or `bin_false`
         | 
| 13 | 
            +
            method.
         | 
| 8 14 |  | 
| 9 15 | 
             
            ## Syntax
         | 
| 10 16 |  | 
| 11 | 
            -
            A `kernel_module` resource block declares a module name, and then tests if that | 
| 17 | 
            +
            A `kernel_module` resource block declares a module name, and then tests if that
         | 
| 18 | 
            +
            module is a loadable kernel module, if it is enabled, disabled or if it is
         | 
| 19 | 
            +
            blacklisted:
         | 
| 12 20 |  | 
| 13 21 | 
             
                describe kernel_module('module_name') do
         | 
| 14 22 | 
             
                  it { should be_loaded }
         | 
| 23 | 
            +
                  it { should_not be_disabled }
         | 
| 24 | 
            +
                  it { should_not be_blacklisted }
         | 
| 25 | 
            +
                end
         | 
| 15 26 | 
             
                end
         | 
| 16 27 |  | 
| 17 28 | 
             
            where
         | 
| 18 29 |  | 
| 19 30 | 
             
            * `'module_name'` must specify a kernel module, such as `'bridge'`
         | 
| 20 31 | 
             
            * `{ should be_loaded }` tests if the module is a loadable kernel module
         | 
| 32 | 
            +
            * `{ should be_blacklisted }` tests if the module is blacklisted or if the module is disabled via a fake install using /bin/false or /bin/true
         | 
| 33 | 
            +
            * `{ should be_disabled }` tests if the module is disabled via a fake install using /bin/false or /bin/true
         | 
| 21 34 |  | 
| 22 35 | 
             
            ## Matchers
         | 
| 23 36 |  | 
| @@ -59,9 +72,50 @@ The `version` matcher tests if the named module version is on the system: | |
| 59 72 |  | 
| 60 73 | 
             
            The following examples show how to use this InSpec audit resource.
         | 
| 61 74 |  | 
| 62 | 
            -
            ### Test  | 
| 75 | 
            +
                ### Test a modules 'version'
         | 
| 63 76 |  | 
| 64 77 | 
             
                describe kernel_module('bridge') do
         | 
| 65 78 | 
             
                  it { should be_loaded }
         | 
| 66 79 | 
             
                  its(:version) { should cmp >= '2.2.2' }
         | 
| 67 80 | 
             
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                ### Test if a module is loaded, not disabled and not blacklisted
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                describe kernel_module('video') do
         | 
| 85 | 
            +
                  it { should be_loaded }
         | 
| 86 | 
            +
                  it { should_not be_disabled }
         | 
| 87 | 
            +
                  it { should_not be_blacklisted }
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                ### Check if a module is blacklisted
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                describe kernel_module('floppy') do
         | 
| 93 | 
            +
                  it { should be_blacklisted }
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                ### Ensure a module is *not* blacklisted and it is loaded
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                describe kernel_module('video') do
         | 
| 99 | 
            +
                  it { should_not be_blacklisted }
         | 
| 100 | 
            +
                  it { should be_loaded }
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                ### Ensure a module is disabled via 'bin_false'
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                describe kernel_module('sstfb') do
         | 
| 106 | 
            +
                  it { should_not be_loaded }
         | 
| 107 | 
            +
                  it { should be_disabled }
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                ### Ensure a module is 'blacklisted'/'disabled' via 'bin_true'
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                describe kernel_module('nvidiafb') do
         | 
| 113 | 
            +
                  it { should_not be_loaded }
         | 
| 114 | 
            +
                  it { should be_blacklisted }
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                ### Ensure a module is not loaded
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                describe kernel_module('dhcp') do
         | 
| 120 | 
            +
                  it { should_not be_loaded }
         | 
| 121 | 
            +
                end
         | 
| @@ -0,0 +1,104 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            title: About the postgres_hba_conf Resource
         | 
| 3 | 
            +
            ---
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # postgres_hba_conf
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Use the `postgres_hba_conf` InSpec audit resource to test the client authentication data defined in the pg_hba.conf file.
         | 
| 8 | 
            +
            ## Syntax
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            An `postgres_hba_conf` InSpec audit resource block declares client authentication data that should be tested:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                describe postgres_hba_conf.where { type == 'local' } do
         | 
| 13 | 
            +
                 its('auth_method') { should eq ['peer'] }
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            where
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            * `'attribute'` is a attribute in the  pg hba configuration file
         | 
| 19 | 
            +
            * `'filter_value'` is the value that is to be filtered for
         | 
| 20 | 
            +
            * `'value'` is the value that is to be matched expected
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            ## Matchers
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            This InSpec audit resource matches any service that is listed in the HBA configuration file:
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                its('auth_method') { should_not cmp 'peer' }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            or:
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                its('auth_method') { should cmp 'peer' }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            For example:
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                describe postgres_hba_conf.where { type == 'type' } do
         | 
| 35 | 
            +
                  its('auth_method') { should cmp 'value' }
         | 
| 36 | 
            +
                  its('user') { should cmp 'value' }
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            ### be
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            <%= partial "/shared/matcher_be" %>
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            ### cmp
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            <%= partial "/shared/matcher_cmp" %>
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            ### eq
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            <%= partial "/shared/matcher_eq" %>
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            ### include
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            <%= partial "/shared/matcher_include" %>
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            ### match
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            <%= partial "/shared/matcher_match" %>
         | 
| 58 | 
            +
             | 
| 59 | 
            +
             | 
| 60 | 
            +
            ## Supported Properties
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                'address', 'auth_method', 'auth_params', 'conf_dir' , 'conf_file' , 'database', 'params' ,'type', 'user'
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            ## Property Examples and Return Types
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            ### address([String])
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            `address` returns a an array of strings that matches the where condition of the filter table
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                describe postgres_hba_conf.where { type == 'local' } do
         | 
| 71 | 
            +
                  its('address') { should cmp 'value' }
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
            ### auth_method([String])
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            `auth_method` returns a an array of strings that matches the where condition of the filter table
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                describe postgres_hba_conf.where { type == 'local' } do
         | 
| 79 | 
            +
                  its('auth_method') { should cmp 'value' }
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            ### database([String])
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            `database` returns a an array of strings that matches the where condition of the filter table
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                describe postgres_hba_conf.where { type == 'local' } do
         | 
| 87 | 
            +
                  its('database') { should cmp 'value' }
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            ### type([String])
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            `type` returns a an array of strings that matches the where condition of the filter table
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                describe postgres_hba_conf.where { database == 'acme_test_db' } do
         | 
| 95 | 
            +
                  its('type') { should cmp 'value' }
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            ### user([String])
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            `user` returns a an array of strings that matches the where condition of the filter table
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                describe postgres_hba_conf.where { database == 'acme_test_db' } do
         | 
| 103 | 
            +
                  its('user') { should cmp 'value' }
         | 
| 104 | 
            +
                end
         | 
| @@ -0,0 +1,87 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            title: About the postgres_ident_conf Resource
         | 
| 3 | 
            +
            ---
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # postgres_ident_conf
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Use the `postgres_ident_conf` InSpec audit resource to test the client authentication data defined in the pg_hba.conf file.
         | 
| 8 | 
            +
            ## Syntax
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            An `postgres_ident_conf` InSpec audit resource block declares client authentication data that should be tested:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                describe postgres_ident_conf.where { pg_username == 'filter_value' } do
         | 
| 13 | 
            +
                  its('attribute') { should eq ['value'] }
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            where
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            * `'attribute'` is a attribute in the  pg ident configuration file
         | 
| 19 | 
            +
            * `'filter_value'` is the value that is to be filtered for
         | 
| 20 | 
            +
            * `'value'` is the value that is to be matched expected
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            ## Matchers
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            This InSpec audit resource matches any service that is listed in the pg ident  configuration file:
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                its('pg_username') { should_not eq ['peer'] }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            or:
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                its('map_name') { should eq ['value'] }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            For example:
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                describe postgres_ident_conf.where { pg_username == 'name' } do
         | 
| 35 | 
            +
                  its('system_username') { should eq ['value'] }
         | 
| 36 | 
            +
                  its('map_name') { should eq ['value'] }
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            ### be
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            <%= partial "/shared/matcher_be" %>
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            ### cmp
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            <%= partial "/shared/matcher_cmp" %>
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            ### eq
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            <%= partial "/shared/matcher_eq" %>
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            ### include
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            <%= partial "/shared/matcher_include" %>
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            ### match
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            <%= partial "/shared/matcher_match" %>
         | 
| 58 | 
            +
             | 
| 59 | 
            +
             | 
| 60 | 
            +
            ## Supported Properties
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                'conf_file', 'map_name', 'params', 'pg_username', 'system_username'
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            ## Property Examples and Return Types
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            ### map_name([String])
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            `address` returns a an array of strings that matches the where condition of the filter table
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                describe pg_hba_conf.where { pg_username == 'name' } do
         | 
| 71 | 
            +
                  its('map_name') { should eq ['value'] }
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
            ### pg_username([String])
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            `pg_username` returns a an array of strings that matches the where condition of the filter table
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                describe pg_hba_conf.where { pg_username == 'name' } do
         | 
| 78 | 
            +
                  its('pg_username') { should eq ['value'] }
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            ### system_username([String])
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            `system_username` returns a an array of strings that matches the where condition of the filter table
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                describe pg_hba_conf.where { pg_username == 'name' } do
         | 
| 86 | 
            +
                  its('system_username') { should eq ['value'] }
         | 
| 87 | 
            +
                end
         | 
    
        data/lib/inspec/resource.rb
    CHANGED
    
    | @@ -122,6 +122,8 @@ require 'resources/package' | |
| 122 122 | 
             
            require 'resources/packages'
         | 
| 123 123 | 
             
            require 'resources/parse_config'
         | 
| 124 124 | 
             
            require 'resources/passwd'
         | 
| 125 | 
            +
            require 'resources/postgres_hba_conf'
         | 
| 126 | 
            +
            require 'resources/postgres_ident_conf'
         | 
| 125 127 | 
             
            require 'resources/pip'
         | 
| 126 128 | 
             
            require 'resources/port'
         | 
| 127 129 | 
             
            require 'resources/postgres'
         | 
| @@ -243,7 +243,16 @@ class InspecRspecJson < InspecRspecMiniJson # rubocop:disable Metrics/ClassLengt | |
| 243 243 | 
             
                # this example, leading to Ruby exceptions.
         | 
| 244 244 | 
             
                return false if profile_name.nil? || example_profile_id.nil?
         | 
| 245 245 |  | 
| 246 | 
            -
                 | 
| 246 | 
            +
                # The correct profile is one where the name of the profile, and the profile
         | 
| 247 | 
            +
                # name in the example match. Additionally, the list of controls in the
         | 
| 248 | 
            +
                # profile must contain the example in question (which we match by ID).
         | 
| 249 | 
            +
                #
         | 
| 250 | 
            +
                # While the profile name match is usually good enough, we must also match by
         | 
| 251 | 
            +
                # the control ID in the case where an InSpec runner has multiple profiles of
         | 
| 252 | 
            +
                # the same name (i.e. when Test Kitchen is running concurrently using a
         | 
| 253 | 
            +
                # single test suite that uses the Flat source reader, in which case InSpec
         | 
| 254 | 
            +
                # creates a fake profile with a name like "tests from /path/to/tests")
         | 
| 255 | 
            +
                profile_name == example_profile_id && profile[:controls].any? { |control| control[:id] == example[:id] }
         | 
| 247 256 | 
             
              end
         | 
| 248 257 |  | 
| 249 258 | 
             
              def move_example_into_control(example, control)
         | 
    
        data/lib/inspec/version.rb
    CHANGED
    
    
    
        data/lib/resources/host.rb
    CHANGED
    
    | @@ -24,6 +24,8 @@ | |
| 24 24 | 
             
            #   it { should be_resolvable.by('dns') }
         | 
| 25 25 | 
             
            # end
         | 
| 26 26 |  | 
| 27 | 
            +
            require 'resolv'
         | 
| 28 | 
            +
             | 
| 27 29 | 
             
            module Inspec::Resources
         | 
| 28 30 | 
             
              class Host < Inspec.resource(1)
         | 
| 29 31 | 
             
                name 'host'
         | 
| @@ -31,6 +33,8 @@ module Inspec::Resources | |
| 31 33 | 
             
                example "
         | 
| 32 34 | 
             
                  describe host('example.com') do
         | 
| 33 35 | 
             
                    it { should be_reachable }
         | 
| 36 | 
            +
                    it { should be_resolvable }
         | 
| 37 | 
            +
                    its('ipaddress') { should include '12.34.56.78' }
         | 
| 34 38 | 
             
                  end
         | 
| 35 39 |  | 
| 36 40 | 
             
                  describe host('example.com', port: '80', protocol: 'tcp') do
         | 
| @@ -140,7 +144,39 @@ module Inspec::Resources | |
| 140 144 | 
             
                end
         | 
| 141 145 | 
             
              end
         | 
| 142 146 |  | 
| 143 | 
            -
              class  | 
| 147 | 
            +
              class UnixHostProvider < HostProvider
         | 
| 148 | 
            +
                def resolve_with_dig(hostname)
         | 
| 149 | 
            +
                  addresses = []
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  # look for IPv6 addresses
         | 
| 152 | 
            +
                  cmd = inspec.command("dig +short AAAA #{hostname}")
         | 
| 153 | 
            +
                  cmd.stdout.lines.each do |line|
         | 
| 154 | 
            +
                    matched = line.chomp.match(Resolv::IPv6::Regex)
         | 
| 155 | 
            +
                    addresses << matched.to_s unless matched.nil?
         | 
| 156 | 
            +
                  end
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                  # look for IPv4 addresses
         | 
| 159 | 
            +
                  cmd = inspec.command("dig +short A #{hostname}")
         | 
| 160 | 
            +
                  cmd.stdout.lines.each do |line|
         | 
| 161 | 
            +
                    matched = line.chomp.match(Resolv::IPv4::Regex)
         | 
| 162 | 
            +
                    addresses << matched.to_s unless matched.nil?
         | 
| 163 | 
            +
                  end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                  addresses.empty? ? nil : addresses
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                def resolve_with_getent(hostname)
         | 
| 169 | 
            +
                  # TODO: we rely on getent hosts for now, but it prefers to return IPv6, only then IPv4
         | 
| 170 | 
            +
                  cmd = inspec.command("getent hosts #{hostname}")
         | 
| 171 | 
            +
                  return nil if cmd.exit_status.to_i != 0
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                  # extract ip adress
         | 
| 174 | 
            +
                  resolve = /^\s*(?<ip>\S+)\s+(.*)\s*$/.match(cmd.stdout.chomp)
         | 
| 175 | 
            +
                  [resolve[1]] if resolve
         | 
| 176 | 
            +
                end
         | 
| 177 | 
            +
              end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
              class DarwinHostProvider < UnixHostProvider
         | 
| 144 180 | 
             
                def missing_requirements(protocol)
         | 
| 145 181 | 
             
                  missing = []
         | 
| 146 182 |  | 
| @@ -166,24 +202,16 @@ module Inspec::Resources | |
| 166 202 | 
             
                end
         | 
| 167 203 |  | 
| 168 204 | 
             
                def resolve(hostname)
         | 
| 169 | 
            -
                   | 
| 170 | 
            -
                  cmd = inspec.command("host -t AAAA #{hostname}")
         | 
| 171 | 
            -
                  if cmd.exit_status.to_i != 0
         | 
| 172 | 
            -
                    cmd = inspec.command("host -t A #{hostname}")
         | 
| 173 | 
            -
                  end
         | 
| 174 | 
            -
                  return nil if cmd.exit_status.to_i != 0
         | 
| 175 | 
            -
             | 
| 176 | 
            -
                  resolve = /^.* has IPv\d address\s+(?<ip>\S+)\s*$/.match(cmd.stdout.chomp)
         | 
| 177 | 
            -
                  [resolve[1]] if resolve
         | 
| 205 | 
            +
                  resolve_with_dig(hostname)
         | 
| 178 206 | 
             
                end
         | 
| 179 207 | 
             
              end
         | 
| 180 208 |  | 
| 181 | 
            -
              class LinuxHostProvider <  | 
| 209 | 
            +
              class LinuxHostProvider < UnixHostProvider
         | 
| 182 210 | 
             
                def missing_requirements(protocol)
         | 
| 183 211 | 
             
                  missing = []
         | 
| 184 212 |  | 
| 185 | 
            -
                  if protocol == 'tcp'
         | 
| 186 | 
            -
                    missing << 'netcat must be installed' | 
| 213 | 
            +
                  if protocol == 'tcp' && (!inspec.command('nc').exist? || !inspec.command('ncat').exist?)
         | 
| 214 | 
            +
                    missing << 'netcat must be installed'
         | 
| 187 215 | 
             
                  end
         | 
| 188 216 |  | 
| 189 217 | 
             
                  missing
         | 
| @@ -191,7 +219,7 @@ module Inspec::Resources | |
| 191 219 |  | 
| 192 220 | 
             
                def ping(hostname, port, protocol)
         | 
| 193 221 | 
             
                  if protocol == 'tcp'
         | 
| 194 | 
            -
                    resp = inspec.command( | 
| 222 | 
            +
                    resp = inspec.command(tcp_check_command(hostname, port))
         | 
| 195 223 | 
             
                  else
         | 
| 196 224 | 
             
                    # fall back to ping, but we can only test ICMP packages with ping
         | 
| 197 225 | 
             
                    resp = inspec.command("ping -w 1 -c 1 #{hostname}")
         | 
| @@ -204,14 +232,20 @@ module Inspec::Resources | |
| 204 232 | 
             
                  }
         | 
| 205 233 | 
             
                end
         | 
| 206 234 |  | 
| 207 | 
            -
                def  | 
| 208 | 
            -
                   | 
| 209 | 
            -
             | 
| 210 | 
            -
                   | 
| 235 | 
            +
                def tcp_check_command(hostname, port)
         | 
| 236 | 
            +
                  if inspec.command('nc').exist?
         | 
| 237 | 
            +
                    base_cmd = 'nc'
         | 
| 238 | 
            +
                  elsif inspec.command('ncat').exist?
         | 
| 239 | 
            +
                    base_cmd = 'ncat'
         | 
| 240 | 
            +
                  else
         | 
| 241 | 
            +
                    return
         | 
| 242 | 
            +
                  end
         | 
| 211 243 |  | 
| 212 | 
            -
                  #  | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 244 | 
            +
                  "echo | #{base_cmd} -v -w 1 #{hostname} #{port}"
         | 
| 245 | 
            +
                end
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                def resolve(hostname)
         | 
| 248 | 
            +
                  inspec.command('dig').exist? ? resolve_with_dig(hostname) : resolve_with_getent(hostname)
         | 
| 215 249 | 
             
                end
         | 
| 216 250 | 
             
              end
         | 
| 217 251 |  | 
| @@ -1,20 +1,44 @@ | |
| 1 1 | 
             
            # encoding: utf-8
         | 
| 2 2 | 
             
            # author: Christoph Hartmann
         | 
| 3 3 | 
             
            # author: Dominik Richter
         | 
| 4 | 
            +
            # author: Aaron Lippold
         | 
| 5 | 
            +
            # author: Adam Leff
         | 
| 4 6 |  | 
| 5 7 | 
             
            module Inspec::Resources
         | 
| 6 8 | 
             
              class KernelModule < Inspec.resource(1)
         | 
| 7 9 | 
             
                name 'kernel_module'
         | 
| 8 | 
            -
                desc 'Use the kernel_module InSpec audit resource to test kernel modules on | 
| 10 | 
            +
                desc 'Use the kernel_module InSpec audit resource to test kernel modules on
         | 
| 11 | 
            +
                Linux platforms. These parameters are located under /lib/modules. Any submodule
         | 
| 12 | 
            +
                may be tested using this resource.
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                The `kernel_module` resource can also verify if a kernel module is `blacklisted`
         | 
| 15 | 
            +
                or if a module is disabled via a fake install using the `bin_true` or `bin_false`
         | 
| 16 | 
            +
                method.'
         | 
| 17 | 
            +
             | 
| 9 18 | 
             
                example "
         | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
                   | 
| 19 | 
            +
             | 
| 20 | 
            +
                describe kernel_module('video') do
         | 
| 21 | 
            +
                  it { should be_loaded }
         | 
| 22 | 
            +
                  it { should_not be_disabled }
         | 
| 23 | 
            +
                  it { should_not be_blacklisted }
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                describe kernel_module('sstfb') do
         | 
| 27 | 
            +
                  it { should_not be_loaded }
         | 
| 28 | 
            +
                  it { should be_disabled }
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                describe kernel_module('floppy') do
         | 
| 32 | 
            +
                  it { should be_blacklisted }
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                describe kernel_module('dhcp') do
         | 
| 36 | 
            +
                  it { should_not be_loaded }
         | 
| 37 | 
            +
                end
         | 
| 13 38 | 
             
                "
         | 
| 14 39 |  | 
| 15 40 | 
             
                def initialize(modulename = nil)
         | 
| 16 41 | 
             
                  @module = modulename
         | 
| 17 | 
            -
             | 
| 18 42 | 
             
                  # this resource is only supported on Linux
         | 
| 19 43 | 
             
                  return skip_resource 'The `kernel_parameter` resource is not supported on your OS.' if !inspec.os.linux?
         | 
| 20 44 | 
             
                end
         | 
| @@ -36,19 +60,51 @@ module Inspec::Resources | |
| 36 60 | 
             
                  !found.nil?
         | 
| 37 61 | 
             
                end
         | 
| 38 62 |  | 
| 63 | 
            +
                def disabled?
         | 
| 64 | 
            +
                  !modprobe_output.match(%r{^install\s+#{@module}\s+/(s?)bin/(true|false)}).nil?
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                def blacklisted?
         | 
| 68 | 
            +
                  !modprobe_output.match(/^blacklist\s+#{@module}/).nil? || disabled_via_bin_true? || disabled_via_bin_false?
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
             | 
| 39 71 | 
             
                def version
         | 
| 72 | 
            +
                  cmd = inspec.command("#{modinfo_cmd_for_os} -F version #{@module}")
         | 
| 73 | 
            +
                  cmd.exit_status.zero? ? cmd.stdout.delete("\n") : nil
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                def to_s
         | 
| 77 | 
            +
                  "Kernel Module #{@module}"
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                private
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def modprobe_output
         | 
| 83 | 
            +
                  @modprobe_output ||= inspec.command("#{modprobe_cmd_for_os} --showconfig").stdout
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                def modinfo_cmd_for_os
         | 
| 40 87 | 
             
                  if inspec.os.redhat? || inspec.os.name == 'fedora'
         | 
| 41 | 
            -
                     | 
| 88 | 
            +
                    '/sbin/modinfo'
         | 
| 42 89 | 
             
                  else
         | 
| 43 | 
            -
                     | 
| 90 | 
            +
                    'modinfo'
         | 
| 44 91 | 
             
                  end
         | 
| 92 | 
            +
                end
         | 
| 45 93 |  | 
| 46 | 
            -
             | 
| 47 | 
            -
                   | 
| 94 | 
            +
                def modprobe_cmd_for_os
         | 
| 95 | 
            +
                  if inspec.os.redhat? || inspec.os.name == 'fedora'
         | 
| 96 | 
            +
                    '/sbin/modprobe'
         | 
| 97 | 
            +
                  else
         | 
| 98 | 
            +
                    'modprobe'
         | 
| 99 | 
            +
                  end
         | 
| 48 100 | 
             
                end
         | 
| 49 101 |  | 
| 50 | 
            -
                def  | 
| 51 | 
            -
                   | 
| 102 | 
            +
                def disabled_via_bin_true?
         | 
| 103 | 
            +
                  !modprobe_output.match(%r{^install\s+#{@module}\s+/(s?)bin/true}).nil?
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                def disabled_via_bin_false?
         | 
| 107 | 
            +
                  !modprobe_output.match(%r{^install\s+#{@module}\s+/(s?)bin/false}).nil?
         | 
| 52 108 | 
             
                end
         | 
| 53 109 | 
             
              end
         | 
| 54 110 | 
             
            end
         | 
| @@ -0,0 +1,101 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
            # author: Rony Xavier,rx294@nyu.edu
         | 
| 3 | 
            +
            # author: Aaron Lippold, lippold@gmail.com
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'resources/postgres'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Inspec::Resources
         | 
| 8 | 
            +
              class PostgresHbaConf < Inspec.resource(1)
         | 
| 9 | 
            +
                name 'postgres_hba_conf'
         | 
| 10 | 
            +
                desc 'Use the `postgres_hba_conf` InSpec audit resource to test the client
         | 
| 11 | 
            +
                      authentication data defined in the pg_hba.conf file.'
         | 
| 12 | 
            +
                example "
         | 
| 13 | 
            +
                  describe postgres_hba_conf.where { type == 'local' } do
         | 
| 14 | 
            +
                    its('auth_method') { should eq ['peer'] }
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                "
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                attr_reader :conf_file, :params
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # @todo add checks to ensure that we have data in our file
         | 
| 21 | 
            +
                def initialize(hba_conf_path = nil)
         | 
| 22 | 
            +
                  return skip_resource 'The `postgres_hba_conf` resource is not supported on your OS.' unless inspec.os.linux?
         | 
| 23 | 
            +
                  @conf_file = hba_conf_path || File.expand_path('pg_hba.conf', inspec.postgres.conf_dir)
         | 
| 24 | 
            +
                  @content = ''
         | 
| 25 | 
            +
                  @params = {}
         | 
| 26 | 
            +
                  read_content
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                filter = FilterTable.create
         | 
| 30 | 
            +
                filter.add_accessor(:where)
         | 
| 31 | 
            +
                      .add_accessor(:entries)
         | 
| 32 | 
            +
                      .add(:type,     field: 'type')
         | 
| 33 | 
            +
                      .add(:database, field: 'database')
         | 
| 34 | 
            +
                      .add(:user,     field: 'user')
         | 
| 35 | 
            +
                      .add(:address,  field: 'address')
         | 
| 36 | 
            +
                      .add(:auth_method, field: 'auth_method')
         | 
| 37 | 
            +
                      .add(:auth_params, field: 'auth_params')
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                filter.connect(self, :params)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def to_s
         | 
| 42 | 
            +
                  "Postgres Hba Config #{@conf_file}"
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                private
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                def clean_conf_file(conf_file = @conf_file)
         | 
| 48 | 
            +
                  data = inspec.file(conf_file).content.to_s.lines
         | 
| 49 | 
            +
                  content = []
         | 
| 50 | 
            +
                  data.each do |line|
         | 
| 51 | 
            +
                    line.chomp!
         | 
| 52 | 
            +
                    content << line unless line.match(/^\s*#/) || line.empty?
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                  content
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                def read_content(config_file = @conf_file)
         | 
| 58 | 
            +
                  file = inspec.file(config_file)
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  if !file.file?
         | 
| 61 | 
            +
                    return skip_resource "Can't find file \"#{@conf_file}\""
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  raw_conf = file.content
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  if raw_conf.empty? && !file.empty?
         | 
| 67 | 
            +
                    return skip_resource("Can't read the contents of \"#{@conf_file}\"")
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  # @todo use SimpleConfig here if we can
         | 
| 71 | 
            +
                  # ^\s*(\S+)\s+(\S+)\s+(\S+)\s(?:(\d*.\d*.\d*.\d*\/\d*)|(::\/\d+))\s+(\S+)\s*(.*)?\s*$
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  @content = clean_conf_file(@conf_file)
         | 
| 74 | 
            +
                  @params = parse_conf(@content)
         | 
| 75 | 
            +
                  @params.each do |line|
         | 
| 76 | 
            +
                    if line['type'] == 'local'
         | 
| 77 | 
            +
                      line['auth_method'] = line['address']
         | 
| 78 | 
            +
                      line['address'] = ''
         | 
| 79 | 
            +
                    end
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def parse_conf(content)
         | 
| 84 | 
            +
                  content.map do |line|
         | 
| 85 | 
            +
                    parse_line(line)
         | 
| 86 | 
            +
                  end.compact
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                def parse_line(line)
         | 
| 90 | 
            +
                  x = line.split(/\s+/)
         | 
| 91 | 
            +
                  {
         | 
| 92 | 
            +
                    'type' => x[0],
         | 
| 93 | 
            +
                    'database' => x[1],
         | 
| 94 | 
            +
                    'user' => x[2],
         | 
| 95 | 
            +
                    'address' => x[3],
         | 
| 96 | 
            +
                    'auth_method' => x[4],
         | 
| 97 | 
            +
                    'auth_params' =>  ('' if x.length == 4) || x[5..-1].join(' '),
         | 
| 98 | 
            +
                  }
         | 
| 99 | 
            +
                end
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
            end
         | 
| @@ -0,0 +1,79 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
            # author: Rony Xavier,  rx294@nyu.edu
         | 
| 3 | 
            +
            # author: Aaron Lippold, lippold@gmail.com
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'resources/postgres'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Inspec::Resources
         | 
| 8 | 
            +
              class PostgresIdentConf < Inspec.resource(1)
         | 
| 9 | 
            +
                name 'postgres_ident_conf'
         | 
| 10 | 
            +
                desc 'Use the postgres_ident_conf InSpec audit resource to test the client
         | 
| 11 | 
            +
                      authentication data is controlled by a pg_ident.conf file.'
         | 
| 12 | 
            +
                example "
         | 
| 13 | 
            +
                  describe postgres_ident_conf.where { pg_username == 'acme_user' } do
         | 
| 14 | 
            +
                    its('map_name') { should eq ['ssl-test'] }
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                "
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                attr_reader :params, :conf_file
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def initialize(ident_conf_path = nil)
         | 
| 21 | 
            +
                  return skip_resource 'The `postgres_ident_conf` resource is not supported on your OS.' unless inspec.os.linux?
         | 
| 22 | 
            +
                  @conf_file = ident_conf_path || File.expand_path('pg_ident.conf', inspec.postgres.conf_dir)
         | 
| 23 | 
            +
                  @content = nil
         | 
| 24 | 
            +
                  @params = nil
         | 
| 25 | 
            +
                  read_content
         | 
| 26 | 
            +
                  return skip_resource '`pg_ident_conf` is not yet supported on your OS' if inspec.os.windows?
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                filter = FilterTable.create
         | 
| 30 | 
            +
                filter.add_accessor(:where)
         | 
| 31 | 
            +
                      .add_accessor(:entries)
         | 
| 32 | 
            +
                      .add(:map_name,        field: 'map_name')
         | 
| 33 | 
            +
                      .add(:system_username, field: 'system_username')
         | 
| 34 | 
            +
                      .add(:pg_username,     field: 'pg_username')
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                filter.connect(self, :params)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def to_s
         | 
| 39 | 
            +
                  "PostgreSQL Ident Config #{@conf_file}"
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                private
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                def filter_comments(data)
         | 
| 45 | 
            +
                  content = []
         | 
| 46 | 
            +
                  data.each do |line|
         | 
| 47 | 
            +
                    line.chomp!
         | 
| 48 | 
            +
                    content << line unless line.match(/^\s*#/) || line.empty?
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                  content
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                def read_content
         | 
| 54 | 
            +
                  @content = ''
         | 
| 55 | 
            +
                  @params = {}
         | 
| 56 | 
            +
                  @content = filter_comments(read_file(@conf_file))
         | 
| 57 | 
            +
                  @params = parse_conf(@content)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def parse_conf(content)
         | 
| 61 | 
            +
                  content.map do |line|
         | 
| 62 | 
            +
                    parse_line(line)
         | 
| 63 | 
            +
                  end.compact
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def parse_line(line)
         | 
| 67 | 
            +
                  x = line.split(/\s+/)
         | 
| 68 | 
            +
                  {
         | 
| 69 | 
            +
                    'map_name' => x[0],
         | 
| 70 | 
            +
                    'system_username' => x[1],
         | 
| 71 | 
            +
                    'pg_username' => x[2],
         | 
| 72 | 
            +
                  }
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                def read_file(conf_file = @conf_file)
         | 
| 76 | 
            +
                  inspec.file(conf_file).content.lines
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
| @@ -4,6 +4,8 @@ | |
| 4 4 | 
             
            # author: Christoph Hartmann
         | 
| 5 5 | 
             
            # author: Aaron Lippold
         | 
| 6 6 |  | 
| 7 | 
            +
            require 'shellwords'
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
            module Inspec::Resources
         | 
| 8 10 | 
             
              class Lines
         | 
| 9 11 | 
             
                attr_reader :output
         | 
| @@ -35,7 +37,7 @@ module Inspec::Resources | |
| 35 37 | 
             
                  # db: databse == db_user running the sql query
         | 
| 36 38 |  | 
| 37 39 | 
             
                  describe sql.query('SELECT * FROM pg_shadow WHERE passwd IS NULL;') do
         | 
| 38 | 
            -
                    its('output') { should eq | 
| 40 | 
            +
                    its('output') { should eq '' }
         | 
| 39 41 | 
             
                  end
         | 
| 40 42 | 
             
                "
         | 
| 41 43 |  | 
| @@ -46,21 +48,25 @@ module Inspec::Resources | |
| 46 48 | 
             
                end
         | 
| 47 49 |  | 
| 48 50 | 
             
                def query(query, db = [])
         | 
| 49 | 
            -
                   | 
| 50 | 
            -
                   | 
| 51 | 
            -
                  # that does this securely
         | 
| 52 | 
            -
                  escaped_query = query.gsub(/\\/, '\\\\').gsub(/"/, '\\"').gsub(/\$/, '\\$')
         | 
| 53 | 
            -
                  # run the query
         | 
| 54 | 
            -
                  cmd = inspec.command("PGPASSWORD='#{@pass}' psql -U #{@user} #{dbs} -h #{@host} -A -t -c \"#{escaped_query}\"")
         | 
| 51 | 
            +
                  psql_cmd = create_psql_cmd(query, db)
         | 
| 52 | 
            +
                  cmd = inspec.command(psql_cmd)
         | 
| 55 53 | 
             
                  out = cmd.stdout + "\n" + cmd.stderr
         | 
| 56 | 
            -
                  if cmd.exit_status != 0  | 
| 57 | 
            -
                     out =~ /could not connect to .*/ or
         | 
| 58 | 
            -
                     out.downcase =~ /^error/
         | 
| 59 | 
            -
                    # skip this test if the server can't run the query
         | 
| 54 | 
            +
                  if cmd.exit_status != 0 || out =~ /could not connect to .*/ || out.downcase =~ /^error:.*/
         | 
| 60 55 | 
             
                    skip_resource "Can't read run query #{query.inspect} on postgres_session: #{out}"
         | 
| 61 56 | 
             
                  else
         | 
| 62 57 | 
             
                    Lines.new(cmd.stdout.strip, "PostgreSQL query: #{query}")
         | 
| 63 58 | 
             
                  end
         | 
| 64 59 | 
             
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                private
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                def escaped_query(query)
         | 
| 64 | 
            +
                  Shellwords.escape(query)
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                def create_psql_cmd(query, db = [])
         | 
| 68 | 
            +
                  dbs = db.map { |x| "-d #{x}" }.join(' ')
         | 
| 69 | 
            +
                  "PGPASSWORD='#{@pass}' psql -U #{@user} #{dbs} -h #{@host} -A -t -c #{escaped_query(query)}"
         | 
| 70 | 
            +
                end
         | 
| 65 71 | 
             
              end
         | 
| 66 72 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: inspec
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.31.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Dominik Richter
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017-06 | 
| 11 | 
            +
            date: 2017-07-06 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: train
         | 
| @@ -319,7 +319,6 @@ files: | |
| 319 319 | 
             
            - docs/migration.md
         | 
| 320 320 | 
             
            - docs/plugin_kitchen_inspec.md
         | 
| 321 321 | 
             
            - docs/profiles.md
         | 
| 322 | 
            -
            - docs/resources.md
         | 
| 323 322 | 
             
            - docs/resources/apache_conf.md.erb
         | 
| 324 323 | 
             
            - docs/resources/apt.md.erb
         | 
| 325 324 | 
             
            - docs/resources/audit_policy.md.erb
         | 
| @@ -375,6 +374,8 @@ files: | |
| 375 374 | 
             
            - docs/resources/pip.md.erb
         | 
| 376 375 | 
             
            - docs/resources/port.md.erb
         | 
| 377 376 | 
             
            - docs/resources/postgres_conf.md.erb
         | 
| 377 | 
            +
            - docs/resources/postgres_hba_conf.md.erb
         | 
| 378 | 
            +
            - docs/resources/postgres_ident_conf.md.erb
         | 
| 378 379 | 
             
            - docs/resources/postgres_session.md.erb
         | 
| 379 380 | 
             
            - docs/resources/powershell.md.erb
         | 
| 380 381 | 
             
            - docs/resources/processes.md.erb
         | 
| @@ -413,7 +414,6 @@ files: | |
| 413 414 | 
             
            - examples/README.md
         | 
| 414 415 | 
             
            - examples/inheritance/README.md
         | 
| 415 416 | 
             
            - examples/inheritance/controls/example.rb
         | 
| 416 | 
            -
            - examples/inheritance/inspec.lock
         | 
| 417 417 | 
             
            - examples/inheritance/inspec.yml
         | 
| 418 418 | 
             
            - examples/kitchen-ansible/.kitchen.yml
         | 
| 419 419 | 
             
            - examples/kitchen-ansible/Gemfile
         | 
| @@ -439,11 +439,7 @@ files: | |
| 439 439 | 
             
            - examples/kitchen-puppet/test/integration/default/web_spec.rb
         | 
| 440 440 | 
             
            - examples/meta-profile/README.md
         | 
| 441 441 | 
             
            - examples/meta-profile/controls/example.rb
         | 
| 442 | 
            -
            - examples/meta-profile/inspec.lock
         | 
| 443 442 | 
             
            - examples/meta-profile/inspec.yml
         | 
| 444 | 
            -
            - examples/meta-profile/vendor/0e6d170415e120af5f1dda113f96f7e0d156e49f82706ac41d13da00599f9b25.tar.gz
         | 
| 445 | 
            -
            - examples/meta-profile/vendor/403580959915ea24bc176b9ebdc555aeda5e2c957604b48d5f32b43554423582.tar.gz
         | 
| 446 | 
            -
            - examples/meta-profile/vendor/d08d3cc35debff04e708147cdd07739876c5d1c8357afb5e58adfaad92dd650f.tar.gz
         | 
| 447 443 | 
             
            - examples/profile-attribute.yml
         | 
| 448 444 | 
             
            - examples/profile-attribute/README.md
         | 
| 449 445 | 
             
            - examples/profile-attribute/controls/example.rb
         | 
| @@ -612,6 +608,8 @@ files: | |
| 612 608 | 
             
            - lib/resources/port.rb
         | 
| 613 609 | 
             
            - lib/resources/postgres.rb
         | 
| 614 610 | 
             
            - lib/resources/postgres_conf.rb
         | 
| 611 | 
            +
            - lib/resources/postgres_hba_conf.rb
         | 
| 612 | 
            +
            - lib/resources/postgres_ident_conf.rb
         | 
| 615 613 | 
             
            - lib/resources/postgres_session.rb
         | 
| 616 614 | 
             
            - lib/resources/powershell.rb
         | 
| 617 615 | 
             
            - lib/resources/processes.rb
         | 
    
        data/docs/resources.md
    DELETED
    
    | @@ -1,91 +0,0 @@ | |
| 1 | 
            -
            ---
         | 
| 2 | 
            -
            title: InSpec Resources Reference
         | 
| 3 | 
            -
            ---
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            # InSpec Resources Reference
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            The following InSpec audit resources are available:
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            * [apache\_conf](resources/apache_conf.html)
         | 
| 10 | 
            -
            * [apt](resources/apt.html)
         | 
| 11 | 
            -
            * [audit\_policy](resources/audit_policy.html)
         | 
| 12 | 
            -
            * [auditd\_conf](resources/auditd_conf.html)
         | 
| 13 | 
            -
            * [auditd\_rules](resources/auditd_rules.html)
         | 
| 14 | 
            -
            * [bash](resources/bash.html)
         | 
| 15 | 
            -
            * [bond](resources/bond.html)
         | 
| 16 | 
            -
            * [bridge](resources/bridge.html)
         | 
| 17 | 
            -
            * [bsd\_service](resources/bsd_service.html)
         | 
| 18 | 
            -
            * [command](resources/command.html)
         | 
| 19 | 
            -
            * [crontab](resources/crontab.html)
         | 
| 20 | 
            -
            * [csv](resources/csv.html)
         | 
| 21 | 
            -
            * [directory](resources/directory.html)
         | 
| 22 | 
            -
            * [docker](resources/docker.html)
         | 
| 23 | 
            -
            * [docker\_container](resources/docker_container.html)
         | 
| 24 | 
            -
            * [docker\_image](resources/docker_image.html)
         | 
| 25 | 
            -
            * [etc\_group](resources/etc_group.html)
         | 
| 26 | 
            -
            * [etc\_passwd](resources/etc_passwd.html)
         | 
| 27 | 
            -
            * [etc\_shadow](resources/etc_shadow.html)
         | 
| 28 | 
            -
            * [file](resources/file.html)
         | 
| 29 | 
            -
            * [gem](resources/gem.html)
         | 
| 30 | 
            -
            * [group](resources/group.html)
         | 
| 31 | 
            -
            * [grub\_conf](resources/grub_conf.html)
         | 
| 32 | 
            -
            * [host](resources/host.html)
         | 
| 33 | 
            -
            * [http](resources/http.html)
         | 
| 34 | 
            -
            * [iis\_app](resources/iis_app.html)
         | 
| 35 | 
            -
            * [iis\_site](resources/iis_site.html)
         | 
| 36 | 
            -
            * [inetd\_conf](resources/inetd_conf.html)
         | 
| 37 | 
            -
            * [ini](resources/ini.html)
         | 
| 38 | 
            -
            * [interface](resources/interface.html)
         | 
| 39 | 
            -
            * [iptables](resources/iptables.html)
         | 
| 40 | 
            -
            * [json](resources/json.html)
         | 
| 41 | 
            -
            * [kernel\_module](resources/kernel_module.html)
         | 
| 42 | 
            -
            * [kernel\_parameter](resources/kernel_parameter.html)
         | 
| 43 | 
            -
            * [key\_rsa](resources/key_rsa.html)
         | 
| 44 | 
            -
            * [launchd\_service](resources/launchd_service.html)
         | 
| 45 | 
            -
            * [limits\_conf](resources/limits_conf.html)
         | 
| 46 | 
            -
            * [login\_def](resources/login_def.html)
         | 
| 47 | 
            -
            * [mount](resources/mount.html)
         | 
| 48 | 
            -
            * [mssql\_session](resources/mssql_session.html)
         | 
| 49 | 
            -
            * [mysql\_conf](resources/mysql_conf.html)
         | 
| 50 | 
            -
            * [mysql\_session](resources/mysql_session.html)
         | 
| 51 | 
            -
            * [npm](resources/npm.html)
         | 
| 52 | 
            -
            * [ntp\_conf](resources/ntp_conf.html)
         | 
| 53 | 
            -
            * [oneget](resources/oneget.html)
         | 
| 54 | 
            -
            * [oracledb\_session](resources/oracledb_session.html)
         | 
| 55 | 
            -
            * [os](resources/os.html)
         | 
| 56 | 
            -
            * [os\_env](resources/os_env.html)
         | 
| 57 | 
            -
            * [package](resources/package.html)
         | 
| 58 | 
            -
            * [parse\_config](resources/parse_config.html)
         | 
| 59 | 
            -
            * [parse\_config_file](resources/parse_config_file.html)
         | 
| 60 | 
            -
            * [pip](resources/pip.html)
         | 
| 61 | 
            -
            * [port](resources/port.html)
         | 
| 62 | 
            -
            * [postgres\_conf](resources/postgres_conf.html)
         | 
| 63 | 
            -
            * [postgres\_session](resources/postgres_session.html)
         | 
| 64 | 
            -
            * [powershell](resources/powershell.html)
         | 
| 65 | 
            -
            * [processes](resources/processes.html)
         | 
| 66 | 
            -
            * [rabbitmq\_config](resources/rabbitmq_config.html)
         | 
| 67 | 
            -
            * [registry\_key](resources/registry_key.html)
         | 
| 68 | 
            -
            * [runit\_service](resources/runit_service.html)
         | 
| 69 | 
            -
            * [security\_policy](resources/security_policy.html)
         | 
| 70 | 
            -
            * [service](resources/service.html)
         | 
| 71 | 
            -
            * [ssh\_config](resources/ssh_config.html)
         | 
| 72 | 
            -
            * [sshd\_config](resources/sshd_config.html)
         | 
| 73 | 
            -
            * [ssl](resources/ssl.html)
         | 
| 74 | 
            -
            * [sys\_info](resources/sys_info.html)
         | 
| 75 | 
            -
            * [systemd\_service](resources/systemd_service.html)
         | 
| 76 | 
            -
            * [sysv\_service](resources/sysv_service.html)
         | 
| 77 | 
            -
            * [upstart\_service](resources/upstart_service.html)
         | 
| 78 | 
            -
            * [user](resources/user.html)
         | 
| 79 | 
            -
            * [users](resources/users.html)
         | 
| 80 | 
            -
            * [vbscript](resources/vbscript.html)
         | 
| 81 | 
            -
            * [virtualization](resources/virtualization.html)
         | 
| 82 | 
            -
            * [windows\_feature](resources/windows_feature.html)
         | 
| 83 | 
            -
            * [windows\_task](resources/windows_task.html)
         | 
| 84 | 
            -
            * [wmi](resources/wmi.html)
         | 
| 85 | 
            -
            * [x509\_certificate](resources/x509_certificate.html)
         | 
| 86 | 
            -
            * [xinetd\_conf](resources/xinetd_conf.html)
         | 
| 87 | 
            -
            * [yaml](resources/yaml.html)
         | 
| 88 | 
            -
            * [yum](resources/yum.html)
         | 
| 89 | 
            -
            * [zfs\_dataset](resources/zfs_dataset.html)
         | 
| 90 | 
            -
            * [zfs\_pool](resources/zfs_pool.html)
         | 
| 91 | 
            -
             | 
| @@ -1,11 +0,0 @@ | |
| 1 | 
            -
            ---
         | 
| 2 | 
            -
            lockfile_version: 1
         | 
| 3 | 
            -
            depends:
         | 
| 4 | 
            -
            - name: profile
         | 
| 5 | 
            -
              resolved_source:
         | 
| 6 | 
            -
                path: "/Users/aleff/projects/inspec/examples/profile"
         | 
| 7 | 
            -
              version_constraints: ">= 0"
         | 
| 8 | 
            -
            - name: profile-attribute
         | 
| 9 | 
            -
              resolved_source:
         | 
| 10 | 
            -
                path: "/Users/aleff/projects/inspec/examples/profile-attribute"
         | 
| 11 | 
            -
              version_constraints: ">= 0"
         | 
| @@ -1,18 +0,0 @@ | |
| 1 | 
            -
            ---
         | 
| 2 | 
            -
            lockfile_version: 1
         | 
| 3 | 
            -
            depends:
         | 
| 4 | 
            -
            - name: dev-sec/ssh-baseline
         | 
| 5 | 
            -
              resolved_source:
         | 
| 6 | 
            -
                url: https://github.com/dev-sec/ssh-baseline/archive/master.tar.gz
         | 
| 7 | 
            -
                sha256: 403580959915ea24bc176b9ebdc555aeda5e2c957604b48d5f32b43554423582
         | 
| 8 | 
            -
              version_constraints: ">= 0"
         | 
| 9 | 
            -
            - name: ssl-baseline
         | 
| 10 | 
            -
              resolved_source:
         | 
| 11 | 
            -
                url: https://github.com/dev-sec/ssl-baseline/archive/master.tar.gz
         | 
| 12 | 
            -
                sha256: 0e6d170415e120af5f1dda113f96f7e0d156e49f82706ac41d13da00599f9b25
         | 
| 13 | 
            -
              version_constraints: ">= 0"
         | 
| 14 | 
            -
            - name: windows-patch-benchmark
         | 
| 15 | 
            -
              resolved_source:
         | 
| 16 | 
            -
                url: https://github.com/chris-rock/windows-patch-benchmark/archive/master.tar.gz
         | 
| 17 | 
            -
                sha256: d08d3cc35debff04e708147cdd07739876c5d1c8357afb5e58adfaad92dd650f
         | 
| 18 | 
            -
              version_constraints: ">= 0"
         | 
| Binary file | 
| Binary file |