Sanctify
Sanctify is a gem that allows you to scan the git diff of any repo for secrets before you commit.
Installation
Add this line to your application's Gemfile:
gem install 'sanctify'
And then execute:
$ bundle
Or install it yourself as:
$ gem install sanctify
Usage
Run sanctify as part of the pre-commit hook, which will make sure to find and deny secrets before commit and PR. You can use the precommit hook project to easily integrate this script with your repo. You can also run as a standalone command. If it fails, you'll get an exit code of 1 otherwise, 0 so you can very easily integrate it into bash scripts.
Sancitfy has very simple usage:
Usage: sanctify [-r REPO_PATH] [-c CONFIG_PATH] [-d FROM_COMMIT..TO_COMMIT | -d FROM_COMMIT]
-r, --repo REPO Repo to test
-c, --config CONFIG Configuration file in YAML
-d, --diff DIFF Specify a diff or commit from which to check secrets
-v, --version Prints the version and exits
-h, --help Prints this help
To integrate with pre-commit, add the following to your pre-commit-config.yaml
:
repos:
- repo: https://github.com/onetwopunch/sanctify
sha: v0.2.5
hooks:
- id: sanctify
args:
- -c
- sanctify.yml
Configuration
Sanctify supports 3 top-level objects in the config: ignored_paths
,custom_matchers
, and disabled_matchers
. Currently sanctify supports a number of default matchers, but you are free to add more to your config file under custom_matchers. If there is a file that you know has secrets or is a false positive, you can add a list of Ruby-style regexes to ignore certain files. Currently the id
field is optional and is used to select matchers from the default list you want to disable. However, we recommend adding an id
so that in future features you will be able to explicitly reference your custom matcher as well.
Here's an example config file:
---
custom_matchers:
- id: test_description
description: "Test Description"
regex: "secret.*"
ignored_paths:
- test.*
- .*thing.rb
The list of current default matchers are located in lib/sanctify/matcher_list.rb
:
[
{
description: "AWS Access Key ID",
regex: /AKIA[0-9A-Z]{16}/
},
{
description: "SSH RSA Private Key",
regex: /^-----BEGIN RSA PRIVATE KEY-----$/
},
...
]
If you'd like to disable certain matchers from the default list, you can do so by adding the id
of the matcher you'd like to disable to a list in the config called disabled_matchers
. For example, if you wanted to disable all default matchers and only use your custom matchers, you can add the following to the config:
disabled_matchers:
- aws_access_key_id
- aws_secret_key
- ssh_rsa_private_key
- x509_certificate
- redis_url_with_password
- url_basic_auth
- google_access_token
- google_api
- slack_api
- slack_bot
- gem_fury_v1
- gem_fury_v2
If you see any problem with a default matcher list or would like to add another to the default list, please feel free to make a pull request.
Troubleshooting
- If you are facing an issue with integration with a Rail project, where you are using rbenv, and get the following error:
An unexpected error has occurred: CalledProcessError: Command: (u'/bin/bash', u'/Users/ryan/.rbenv/shims/gem', 'build', 'sanctify.gemspec')
Return code: 1
Expected return code: 0
Output: (none)
Errors:
WARNING: See http://guides.rubygems.org/specification-reference/ for help
ERROR: While executing gem ... (Gem::InvalidSpecificationException)
["travis.yml", "literally every file in your Rails repo", ...]
This is an issue with pre-commit since they build their own version of rbenv that conflicts under certain circumstances I have yet to fully grok. The best way to get around this is to install sanctify external to the pre-commit repo.
In your pre-commit-config.yaml:
- repo: local
hooks:
- id: secret-check-hook
name: "Sanctify Secret Scanner"
entry: ./bin/secret-check
language: script
files: .
And then in the ./bin/secret-check
file just install and run sanctify:
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [[ ! $(which sanctify) ]]; then
gem install sanctify
fi
sanctify -c $DIR/sanctify.yml
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/onetwopunch/sanctify. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
License
The gem is available as open source under the terms of the MIT License.
Code of Conduct
Everyone interacting in the Sanctify project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.