blob: d45195ffa4562459cf6a935354b3e54815b74909 [file] [log] [blame]
James E. Blaireff5a9d2017-06-20 00:00:37 -07001:title: Encryption
2
3.. _encryption:
4
5Encryption
6==========
7
8Zuul supports storing encrypted data directly in the git repositories
9of projects it operates on. If you have a job which requires private
10information in order to run (e.g., credentials to interact with a
11third-party service) those credentials can be stored along with the
12job definition.
13
14Each project in Zuul has its own automatically generated RSA keypair
15which can be used by anyone to encrypt a secret and only Zuul is able
16to decrypt it. Zuul serves each project's public key using its
17build-in webserver. They can be fetched at the path
James E. Blair3f42c532017-09-15 20:12:30 -060018``/<tenant>/<project>.pub`` where ``<project>`` is the canonical name
19of a project and ``<tenant>`` is the name of a tenant with that project.
James E. Blaireff5a9d2017-06-20 00:00:37 -070020
21Zuul currently supports one encryption scheme, PKCS#1 with OAEP, which
James E. Blair9118c012017-08-03 11:19:16 -070022can not store secrets longer than the 3760 bits (derived from the key
23length of 4096 bits minus 336 bits of overhead). The padding used by
24this scheme ensures that someone examining the encrypted data can not
25determine the length of the plaintext version of the data, except to
26know that it is not longer than 3760 bits (or some multiple thereof).
James E. Blaireff5a9d2017-06-20 00:00:37 -070027
28In the config files themselves, Zuul uses an extensible method of
29specifying the encryption scheme used for a secret so that other
30schemes may be added later. To specify a secret, use the
31``!encrypted/pkcs1-oaep`` YAML tag along with the base64 encoded
James E. Blair9118c012017-08-03 11:19:16 -070032value. For example:
33
34.. code-block:: yaml
James E. Blaireff5a9d2017-06-20 00:00:37 -070035
36 - secret:
37 name: test_secret
38 data:
39 password: !encrypted/pkcs1-oaep |
James E. Blair9118c012017-08-03 11:19:16 -070040 BFhtdnm8uXx7kn79RFL/zJywmzLkT1GY78P3bOtp4WghUFWobkifSu7ZpaV4NeO0s71YUsi
James E. Blaireff5a9d2017-06-20 00:00:37 -070041 ...
42
James E. Blair9118c012017-08-03 11:19:16 -070043To support secrets longer than 3760 bits, the value after the
44encryption tag may be a list rather than a scalar. For example:
45
46.. code-block:: yaml
47
48 - secret:
49 name: long_secret
50 data:
51 password: !encrypted/pkcs1-oaep
52 - er1UXNOD3OqtsRJaP0Wvaqiqx0ZY2zzRt6V9vqIsRaz1R5C4/AEtIad/DERZHwk3Nk+KV
53 ...
54 - HdWDS9lCBaBJnhMsm/O9tpzCq+GKRELpRzUwVgU5k822uBwhZemeSrUOLQ8hQ7q/vVHln
55 ...
56
James E. Blaireff5a9d2017-06-20 00:00:37 -070057Zuul provides a standalone script to make encrypting values easy; it
58can be found at `tools/encrypt_secret.py` in the Zuul source
59directory.
60
61.. program-output:: python3 ../../tools/encrypt_secret.py --help
62