blob: 011b84de7e098bb0324e9426d7ff9847052796b5 [file] [log] [blame] [view]
# Config Management
The configuration in the `config.yaml` contains secrets and should not be openly
accessible. To secure the data contained within it, the values can be encrypted
using a tool called [`sops`](https://github.com/mozilla/sops). This tool will use
a key to encrypt the values of the yaml file. Access to the key allows decryption of the values.
As long as the key is not compromised, the encrypted file can be shared securely between collaborators.
The process of using `sops` is described below.
## Install `sops`
On OSX, `sops` can be installed using brew:
```sh
brew install sops
```
## Using a local PGP key
### Install GPG
Install `gpg`:
```sh
brew install gpg
```
You might need to add this to your `.bashrc` or `.zshrc` to enable `sops` to work
correctly with `gpg` [1]:
```sh
GPG_TTY=$(tty)
export GPG_TTY
```
### Create GPG-key (first time only)
Create a key by running the following command and following the instructions on
the screen:
```sh
gpg --gen-key
```
### Encrypt the config-file
Run the following command to encode the file:
```sh
sops \
--encrypt \
--in-place \
--encrypted-regex '(password|htpasswd|cert|key|apiUrl|caCert|secret|accessToken)$' \
--pgp \
`gpg --fingerprint "$EMAIL" | \
grep pub -A 1 | \
grep -v pub | \
sed s/\ //g` \
$FILE_TO_ENCODE
```
`$EMAIL` refers to the email used during the creation of the GPG key.
Alternatively, the `gerrit-monitoring.py encrypt`-script can be used to encrypt
the file:
```sh
pipenv run python ./gerrit-monitoring.py \
--config config.yaml \
encrypt \
--enc-method "pgp" \
--pgp-id "abcde1234"
```
The gpg-key used to encrypt the file can be selected by giving the fingerprint,
key ID or part of the unique ID to the `--pgp-id`-argument. This identifier has to
be unique among the keys in the GPG keystore.
### Export GPG-key
For other developers or build servers to be able to decrypt the configuration,
the key has to be exported:
```sh
gpg --export -a "$EMAIL" > public.key
gpg --export-secret-key -a "$EMAIL" > private.key
```
On the receiving computer the key has to be imported by running:
```sh
gpg --import public.key
gpg --allow-secret-key-import --import private.key
```
## Encrypt using HashiCorp Vault
### Install `vault` CLI tool
On OSX, `vault` can be installed using brew:
```sh
brew install vault
```
### Log into vault
Use the CLI to log into your vault instance:
```sh
vault login -method=<auth-method> -address=https://vault.example.com
```
### Create a key to use for encryption (first time only)
To use sops with HashiCorp Vault, a secret engine of type transit containing
at least one key has to be created:
```sh
vault secrets enable -path=some-engine transit
vault write sops/keys/some-key type=rsa-4096
```
### Encrypt the config-file
Run the following command to encode the file:
```sh
sops \
--encrypt \
--in-place \
--encrypted-regex '(password|htpasswd|cert|key|apiUrl|caCert|secret|accessToken)$' \
--hc-vault-transit https://vault.example.com/v1/some-engine/keys/some-key \
$FILE_TO_ENCODE
```
Alternatively, the `gerrit-monitoring.py encrypt`-script can be used to encrypt
the file:
```sh
pipenv run python ./gerrit-monitoring.py \
--config config.yaml \
encrypt \
--enc-method "vault" \
--vault-url https://vault.example.com \
--vault-engine some-engine \
--vault-key some-key
```
## Decrypt file
To decrypt the file, run:
```sh
sops --in-place -d $FILE_TO_DECODE
```
## Links
[1] https://github.com/mozilla/sops/issues/304