2015-10-29 12:01:00 +00:00
# InSpec
2015-04-09 15:34:05 +00:00
2015-10-26 22:41:27 +00:00
## What is InSpec?
2015-10-27 01:16:32 +00:00
InSpec is an open-source testing framework for infrastructure with an easy language for specifying compliance, security, and policy requirements. The project name stands for "infrastructure specification" and can be thought of as an abbreviation of "inspect".
2015-10-29 15:42:22 +00:00
You can use InSpec to examine any node in your infrastructure. The InSpec framework runs locally or remotely on the node being inspected. It uses test rules written in the InSpec language as input. Detected security, compliance, or policy issues are flagged in a log.
2015-10-26 22:41:27 +00:00
The InSpec project includes many resources that help you write audit rules quickly and easily. Here are some examples.
* Disallow insecure protocols - In this example, the package and inetd_conf resources ensure that insecure services and protocols, such as telnet, are not used.
```ruby
describe package('telnetd') do
2015-10-27 01:16:32 +00:00
it { should_not be_installed }
2015-10-26 22:41:27 +00:00
end
describe inetd_conf do
2015-10-27 01:16:32 +00:00
its("telnet") { should eq nil }
2015-10-26 22:41:27 +00:00
end
```
2015-10-27 01:16:32 +00:00
* Only accept requests on secure ports - This test ensures, that a web server is only listening on well-secured ports.
2015-10-26 22:41:27 +00:00
```ruby
describe port(80) do
2015-10-27 01:16:32 +00:00
it { should_not be_listening }
2015-10-26 22:41:27 +00:00
end
describe port(443) do
2015-10-27 01:16:32 +00:00
it { should be_listening }
its('protocol') {should eq 'tcp'}
2015-10-26 22:41:27 +00:00
end
```
2015-10-27 01:16:32 +00:00
* Use approved strong ciphers - This test ensures, that only enterprise-compliant ciphers are used for SSH servers.
2015-10-26 22:41:27 +00:00
```ruby
describe sshd_config do
its('Ciphers') { should eq('chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr') }
end
```
2015-10-27 01:16:32 +00:00
* Test your `kitchen.yml` file, to verify that only Vagrant is configured as the driver.
2015-10-26 22:41:27 +00:00
```ruby
describe yaml('.kitchen.yml') do
its('driver.name') { should eq('vagrant') }
end
```
## Test your Server, VM, or workstation.
2015-04-09 15:34:05 +00:00
2015-09-07 15:20:39 +00:00
Small example: Write a your checks in `test.rb` :
2015-06-10 15:38:24 +00:00
```ruby
2015-09-07 15:18:44 +00:00
describe file('/proc/cpuinfo') do
it { should be_file }
2015-06-10 15:38:24 +00:00
end
2015-09-07 15:18:44 +00:00
describe ssh_config do
its('Protocol') { should eq('2') }
end
```
2015-09-07 15:20:39 +00:00
Run this file locally:
2015-09-07 15:18:44 +00:00
```bash
2015-10-26 03:04:18 +00:00
inspec exec test.rb
2015-09-07 15:18:44 +00:00
```
## Installation
2015-09-07 15:24:07 +00:00
Requires Ruby ( >1.9 ).
2015-09-07 15:18:44 +00:00
2015-09-07 15:24:07 +00:00
To simply run it without installation, you must install [bundler ](http://bundler.io/ ):
```bash
bundle install
2015-10-26 03:04:18 +00:00
bundle exec bin/inspec help
2015-09-07 15:24:07 +00:00
```
To install it as a gem locally, run:
2015-09-07 15:18:44 +00:00
```bash
2015-10-26 03:04:18 +00:00
gem build inspec.gemspec
gem install inspec-*.gem
2015-09-07 15:18:44 +00:00
```
You should now be able to run:
```bash
2015-10-26 03:04:18 +00:00
inspec --help
2015-09-07 15:18:44 +00:00
```
2015-09-23 08:08:12 +00:00
## Usage
### exec
2015-09-07 15:18:44 +00:00
Run tests against different targets:
```bash
# run test locally
2015-10-26 03:04:18 +00:00
inspec exec test.rb
2015-09-07 15:18:44 +00:00
# run test on remote host on SSH
2015-10-26 03:04:18 +00:00
inspec exec test.rb -t ssh://user@hostname
2015-09-07 15:18:44 +00:00
# run test on remote windows host on WinRM
2015-10-26 03:04:18 +00:00
inspec exec test.rb -t winrm://Administrator@windowshost --password 'your-password'
2015-09-07 15:18:44 +00:00
# run test on docker container
2015-10-26 03:04:18 +00:00
inspec exec test.rb -t docker://container_id
2015-06-10 15:38:24 +00:00
```
2015-09-23 08:08:12 +00:00
### detect
Verify your configuration and detect
```bash
id=$( docker run -dti ubuntu:14.04 /bin/bash )
2015-10-26 03:04:18 +00:00
inspec detect -t docker://$id
2015-09-23 08:08:12 +00:00
```
Which will provide you with:
```
2015-09-23 08:25:05 +00:00
{"family":"ubuntu","release":"14.04","arch":null}
2015-09-23 08:08:12 +00:00
```
2015-09-07 15:18:44 +00:00
## Custom resources
You can easily create your own resources. Here is a custom resource for an
application called Gordon and save it in `gordon_config.rb` :
```ruby
require 'yaml'
2015-10-26 03:04:18 +00:00
class GordonConfig < Inspec.resource
2015-09-07 15:18:44 +00:00
name 'gordon_config'
def initialize
@path = '/etc/gordon/config.yaml'
2015-10-26 03:04:18 +00:00
@config = inspec.file(@path).content
2015-09-07 15:18:44 +00:00
@params = YAML.load(@config)
end
def method_missing(name)
@params [name.to_s]
end
end
```
Include this file in your `test.rb` :
```ruby
require_relative 'gordon_config'
```
Now you can start using your new resource:
```ruby
describe gordon_config do
its('Version') { should eq('1.0') }
end
```
2015-09-15 13:05:11 +00:00
## Tests
2015-10-30 13:03:59 +00:00
It may be informative to look at what tests delivery is running for CI in case this documentation becomes out of date:
https://github.com/chef/inspec/blob/master/.delivery/build-cookbook/recipes/unit.rb
2015-09-15 13:05:11 +00:00
2015-10-30 13:03:59 +00:00
### Unit tests
Just
```bash
rake test
```
as usual.
### Resource tests
Make sure the backend execution layer behaves as expected.
2015-09-15 13:05:11 +00:00
These tests will take a while, as a lot of different operating systems and configurations
are being tested.
You will require:
* vagrant with virtualbox
* test-kitchen
* docker
2015-10-30 13:03:59 +00:00
Run resource tests with
2015-09-15 13:05:11 +00:00
```bash
2015-10-30 13:03:59 +00:00
bundle exec rake test:resources config=test/test.yaml
bundle exec rake test:resources config=test/test-extra.yaml
2015-09-15 13:05:11 +00:00
```
2015-10-26 22:41:27 +00:00
## Learn More
For more information see the InSpec documentation: https://github.com/chef/inspec/tree/master/docs
2015-09-07 15:18:44 +00:00
## Contributing
1. Fork it
1. Create your feature branch (git checkout -b my-new-feature)
1. Commit your changes (git commit -am 'Add some feature')
1. Push to the branch (git push origin my-new-feature)
1. Create new Pull Request
2015-06-10 15:38:24 +00:00
2015-09-07 15:18:44 +00:00
Copyright 2015 Chef Software Inc. All rights reserved.
2015-10-26 22:41:27 +00:00
2015-09-07 15:18:44 +00:00
Copyright 2015 Vulcano Security GmbH. All rights reserved.
2015-10-26 22:41:27 +00:00
2015-04-09 15:34:05 +00:00
Copyright 2015 Dominik Richter. All rights reserved.