Git Product home page Git Product logo

gyunt / talisman Goto Github PK

View Code? Open in Web Editor NEW

This project forked from thoughtworks/talisman

0.0 1.0 0.0 946 KB

By hooking into the pre-push hook provided by Git, Talisman validates the outgoing changeset for things that look suspicious - such as authorization tokens and private keys.

Home Page: https://thoughtworks.github.io/talisman/

License: MIT License

Dockerfile 0.01% Go 98.68% Shell 1.31%

talisman's Introduction

Talisman

A tool to detect and prevent secrets from getting checked in

License: MIT Go Report Card contributions welcome

Table of Contents

What is Talisman?

Talisman is a tool that installs a hook to your repository to ensure that potential secrets or sensitive information do not leave the developer's workstation.

It validates the outgoing changeset for things that look suspicious - such as potential SSH keys, authorization tokens, private keys etc.

Installation

Talisman supports MAC OSX, Linux and Windows.

Talisman can be installed and used in one of three different ways:

  1. As a git hook as a global git hook template
  2. As a git hook into a single git repository
  3. As a CLI with the --pattern argument to find files

Talisman can be set up as either a pre-commit or pre-push hook on the git repositories.

Find the instructions below.

[Recommended approach]

Installation as a global hook template

We recommend installing Talisman as a git hook template, as that will cause Talisman to be present, not only in your existing git repositories, but also in any new repository that you 'init' or 'clone'.

  1. Run the following command on your terminal, to download and install the binary at $HOME/.talisman/bin

As a pre-commit hook:

curl --silent  https://raw.githubusercontent.com/thoughtworks/talisman/master/global_install_scripts/install.bash > /tmp/install_talisman.bash && /bin/bash /tmp/install_talisman.bash 

OR

As a pre-push hook:

curl --silent  https://raw.githubusercontent.com/thoughtworks/talisman/master/global_install_scripts/install.bash > /tmp/install_talisman.bash && /bin/bash /tmp/install_talisman.bash pre-push
  1. If you do not have TALISMAN_HOME set up in your $PATH, you will be asked an appropriate place to set it up. Choose the option number where you set the profile source on your machine.

Remember to execute source on the path file or restart your terminal. If you choose to set the $PATH later, please export TALISMAN_HOME=$HOME/.talisman/bin to the path.

  1. Choose a base directory where Talisman should scan for all git repositories, and setup a git hook (pre-commit or pre-push, as chosen in step 1) as a symlink. This script will not clobber pre-existing hooks. If you have existing hooks, [look for ways to chain Talisman into them.] (#handling-existing-hooks)

Handling existing hooks

Installation of Talisman globally does not clobber pre-existing hooks on repositories.
If the installation script finds any existing hooks, it will only indicate so on the console.
To achieve running multiple hooks we suggest (but not limited to) the following two tools

1. Pre-commit (Linux/Unix)

Use pre-commit tool to manage all the existing hooks along with Talisman. In the suggestion, it will prompt the following code to be included in .pre-commit-config.yaml

    -   repo: local
        hooks:
        -   id: talisman-precommit
            name: talisman
            entry: bash -c 'if [ -n "${TALISMAN_HOME:-}" ]; then ${TALISMAN_HOME}/talisman_hook_script pre-commit; else echo "TALISMAN does not exist. Consider installing from https://github.com/thoughtworks/talisman . If you already have talisman installed, please ensure TALISMAN_HOME variable is set to where talisman_hook_script resides, for example, TALISMAN_HOME=${HOME}/.talisman/bin"; fi'
            language: system
            pass_filenames: false
            types: [text]
            verbose: true

2. Husky (Linux/Unix/Windows)

husky is an npm module for managing git hooks. In order to use husky, make sure you have already set TALISMAN_HOME to $PATH.

  • Existing Users

If you already are using husky, add the following lines to husky pre-commit in package.json

Windows
   "bash -c '\"%TALISMAN_HOME%\\${TALISMAN_BINARY_NAME}\" -githook pre-commit'" 
Linux/Unix
   $TALISMAN_HOME/talisman_hook_script pre-commit
  • New Users

If you want to use husky with multiple hooks along with talisman, add the following snippet to you package json.

Windows
    {
       "husky": {
         "hooks": {
           "pre-commit": "bash -c '\"%TALISMAN_HOME%\\${TALISMAN_BINARY_NAME}\" -githook pre-commit'" && "other-scripts"
           }
       }
   }
Linux/Unix
   {
     "husky": {
      "hooks": {
        "pre-commit": "$TALISMAN_HOME/talisman_hook_script pre-commit" && "other-scripts"
         }
       }
     }

Installation to a single project

# Download the talisman binary
curl https://thoughtworks.github.io/talisman/install.sh > ~/install-talisman.sh
chmod +x ~/install-talisman.sh
# Install to a single project (as pre-push hook)
cd my-git-project
~/install-talisman.sh

Handling existing hooks

Talisman will need to be chained with any existing git hooks.You can use pre-commit git hooks framework to handle this.

Add this to your .pre-commit-config.yaml (be sure to update rev to point to a real git revision!)

-   repo: https://github.com/thoughtworks/talisman
    rev: ''  # Update me!
    hooks:
    # either `commit` or `push` support
    -   id: talisman-commit
    # -   id: talisman-push

Installation as a CLI

  1. Download the Talisman binary from the Releases page corresponding to your system type
  2. Place the binary somewhere (either directly in your repository, or by putting it somewhere in your system and adding it to your $PATH)
  3. Run talisman with the --pattern argument (matches glob-like patterns, see more)
# finds all .go and .md files in the current directory (recursively) 
talisman --pattern="./**/*.{go,md}"

Talisman in action

After the installation is successful, Talisman will run checks for obvious secrets automatically before each commit or push (as chosen during installation):

$ git push
The following errors were detected in danger.pem
         The file name "danger.pem" failed checks against the pattern ^.+\.pem$

error: failed to push some refs to '[email protected]:jacksingleton/talisman-demo.git'

Validations

The following detectors execute against the changesets to detect secrets/sensitive information:

  • Encoded values - scans for encoded secrets in Base64, hex etc.
  • File content - scans for suspicious content in file that could be potential secrets or passwords
  • File size - scans for large files that may potentially contain keys or other secrets
  • Entropy - scans for content with high entropy that are likely to contain passwords
  • Credit card numbers - scans for content that could be potential credit card numbers
  • File names - scans for file names and extensions that could indicate them potentially containing secrets, such as keys, credentials etc.

Ignoring Files

If you're really sure you want to push that file, you can add it to a .talismanignore file in the project root:

echo 'danger.pem' >> .talismanignore

Note that we can ignore files in a few different ways:

  • If the pattern ends in a path separator, then all files inside a directory with that name are matched. However, files with that name itself will not be matched.

  • If a pattern contains the path separator in any other location, the match works according to the pattern logic of the default golang glob mechanism.

  • If there is no path separator anywhere in the pattern, the pattern is matched against the base name of the file. Thus, the pattern will match files with that name anywhere in the repository.

You can also disable only specific detectors. For example, if your init-env.sh filename triggers a warning, you can only disable this warning while still being alerted if other things go wrong (e.g. file content):

echo 'init-env.sh # ignore:filename,filesize' >> .talismanignore

Note: Here both filename and filesize detectors are ignored for init-env.sh, but filecontent detector will still activate on init-env.sh

At the moment, you can ignore

  • filecontent
  • filename
  • filesize

Uninstallation

The uninstallation process depends on how you had installed Talisman. You could have chosen to install as a global hook template or at a single repository.

Please follow the steps below based on which option you had chosen at installation.

Uninstallation from a global hook template

To uninstall talisman globally from your machine, run:

curl --silent  https://raw.githubusercontent.com/thoughtworks/talisman/master/global_install_scripts/uninstall.bash > /tmp/uninstall_talisman.bash && /bin/bash /tmp/uninstall_talisman.bash 

This will

  1. ask you for the base dir of all your repos, find all git repos inside it and remove talisman hooks
  2. remove talisman hook from .git-template
  3. remove talisman from the central install location ($HOME/.talisman/bin).

You will have to manually remove TALISMAN_HOME from your environment variables

Uninstallation from a single repository

When you installed Talisman, it must have created a pre-commit or pre-push hook (as selected) in your repository during installation.

You can remove the hook manually by deleting the Talisman pre-commit or pre-push hook from .git/hooks folder in repository.

Contributing to Talisman

Developing locally

To contribute to Talisman, you need a working golang development environment. Check this link to help you get started with that.

Talisman now uses go modules (GO111MODULE=on) to manage dependencies

Once you have go 1.11 installed and setup, clone the talisman repository. In your working copy, fetch the dependencies by having go mod fetch them for you.

GO111MODULE=on go mod vendor

To run tests GO111MODULE=on go test -mod=vendor ./...

To build Talisman, we can use gox:

gox -osarch="darwin/amd64 linux/386 linux/amd64"

Convenince scripts ./build and ./clean perform build and clean-up as mentioned above.

Releasing

  • Follow the instructions at the end of 'Developing locally' to build the binaries
  • Bump the version in install.sh according to semver conventions
  • Update the expected hashes in install.sh to match the new binaries you just created (shasum -b -a256 ...)
  • Make release commit and tag with the new version prefixed by v (like git tag v0.3.0)
  • Push your release commit and tag: git push && git push --tags
  • Create a new release in github, filling in the new commit tag you just created
  • Update the install script hosted on github pages: git checkout gh-pages, git checkout master -- install.sh, git commit -m ...

The latest version will now be accessible to anyone who builds their own binaries, downloads binaries directly from github releases, or uses the install script from the website.

talisman's People

Contributors

jacksingleton avatar svishwanath-tw avatar harinee avatar badrij avatar rrajagop avatar prachisr avatar mabaritw avatar flosell avatar jmpak avatar nossbigg avatar yaman avatar asottile avatar cburgmer avatar kashishm avatar

Watchers

JongGyun Kim avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.