github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/docs/security/trust/content_trust.md (about) 1 <!--[metadata]> 2 +++ 3 title = "Content trust in Docker" 4 description = "Enabling content trust in Docker" 5 keywords = ["content, trust, security, docker, documentation"] 6 [menu.main] 7 parent= "smn_content_trust" 8 weight=-1 9 +++ 10 <![end-metadata]--> 11 12 # Content trust in Docker 13 14 When transferring data among networked systems, *trust* is a central concern. In 15 particular, when communicating over an untrusted medium such as the internet, it 16 is critical to ensure the integrity and the publisher of all the data a system 17 operates on. You use Docker Engine to push and pull images (data) to a public or private registry. Content trust 18 gives you the ability to verify both the integrity and the publisher of all the 19 data received from a registry over any channel. 20 21 ## Understand trust in Docker 22 23 Content trust allows operations with a remote Docker registry to enforce 24 client-side signing and verification of image tags. Content trust provides the 25 ability to use digital signatures for data sent to and received from remote 26 Docker registries. These signatures allow client-side verification of the 27 integrity and publisher of specific image tags. 28 29 Currently, content trust is disabled by default. You must enable it by setting 30 the `DOCKER_CONTENT_TRUST` environment variable. Refer to the 31 [environment variables](../../reference/commandline/cli.md#environment-variables) 32 and [Notary](../../reference/commandline/cli.md#notary) configuration 33 for the docker client for more options. 34 35 Once content trust is enabled, image publishers can sign their images. Image consumers can 36 ensure that the images they use are signed. publishers and consumers can be 37 individuals alone or in organizations. Docker's content trust supports users and 38 automated processes such as builds. 39 40 ### Image tags and content trust 41 42 An individual image record has the following identifier: 43 44 ``` 45 [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG] 46 ``` 47 48 A particular image `REPOSITORY` can have multiple tags. For example, `latest` and 49 `3.1.2` are both tags on the `mongo` image. An image publisher can build an image 50 and tag combination many times changing the image with each build. 51 52 Content trust is associated with the `TAG` portion of an image. Each image 53 repository has a set of keys that image publishers use to sign an image tag. 54 Image publishers have discretion on which tags they sign. 55 56 An image repository can contain an image with one tag that is signed and another 57 tag that is not. For example, consider [the Mongo image 58 repository](https://hub.docker.com/r/library/mongo/tags/). The `latest` 59 tag could be unsigned while the `3.1.6` tag could be signed. It is the 60 responsibility of the image publisher to decide if an image tag is signed or 61 not. In this representation, some image tags are signed, others are not: 62 63  64 65 Publishers can choose to sign a specific tag or not. As a result, the content of 66 an unsigned tag and that of a signed tag with the same name may not match. For 67 example, a publisher can push a tagged image `someimage:latest` and sign it. 68 Later, the same publisher can push an unsigned `someimage:latest` image. This second 69 push replaces the last unsigned tag `latest` but does not affect the signed `latest` version. 70 The ability to choose which tags they can sign, allows publishers to iterate over 71 the unsigned version of an image before officially signing it. 72 73 Image consumers can enable content trust to ensure that images they use were 74 signed. If a consumer enables content trust, they can only pull, run, or build 75 with trusted images. Enabling content trust is like wearing a pair of 76 rose-colored glasses. Consumers "see" only signed images tags and the less 77 desirable, unsigned image tags are "invisible" to them. 78 79  80 81 To the consumer who has not enabled content trust, nothing about how they 82 work with Docker images changes. Every image is visible regardless of whether it 83 is signed or not. 84 85 86 ### Content trust operations and keys 87 88 When content trust is enabled, `docker` CLI commands that operate on tagged images must 89 either have content signatures or explicit content hashes. The commands that 90 operate with content trust are: 91 92 * `push` 93 * `build` 94 * `create` 95 * `pull` 96 * `run` 97 98 For example, with content trust enabled a `docker pull someimage:latest` only 99 succeeds if `someimage:latest` is signed. However, an operation with an explicit 100 content hash always succeeds as long as the hash exists: 101 102 ```bash 103 $ docker pull someimage@sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a 104 ``` 105 106 Trust for an image tag is managed through the use of signing keys. A key set is 107 created when an operation using content trust is first invoked. A key set consists 108 of the following classes of keys: 109 110 - an offline key that is the root of content trust for an image tag 111 - repository or tagging keys that sign tags 112 - server-managed keys such as the timestamp key, which provides freshness 113 security guarantees for your repository 114 115 The following image depicts the various signing keys and their relationships: 116 117  118 119 >**WARNING**: Loss of the root key is **very difficult** to recover from. 120 >Correcting this loss requires intervention from [Docker 121 >Support](https://support.docker.com) to reset the repository state. This loss 122 >also requires **manual intervention** from every consumer that used a signed 123 >tag from this repository prior to the loss. 124 125 You should backup the root key somewhere safe. Given that it is only required 126 to create new repositories, it is a good idea to store it offline in hardware. 127 For details on securing, and backing up your keys, make sure you 128 read how to [manage keys for content trust](trust_key_mng.md). 129 130 ## Survey of typical content trust operations 131 132 This section surveys the typical trusted operations users perform with Docker 133 images. 134 135 ### Enable and disable content trust per-shell or per-invocation 136 137 In a shell, you can enable content trust by setting the `DOCKER_CONTENT_TRUST` 138 environment variable. Enabling per-shell is useful because you can have one 139 shell configured for trusted operations and another terminal shell for untrusted 140 operations. You can also add this declaration to your shell profile to have it 141 turned on always by default. 142 143 To enable content trust in a `bash` shell enter the following command: 144 145 ```bash 146 export DOCKER_CONTENT_TRUST=1 147 ``` 148 149 Once set, each of the "tag" operations requires a key for a trusted tag. 150 151 In an environment where `DOCKER_CONTENT_TRUST` is set, you can use the 152 `--disable-content-trust` flag to run individual operations on tagged images 153 without content trust on an as-needed basis. 154 155 ```bash 156 $ docker pull --disable-content-trust docker/trusttest:untrusted 157 ``` 158 159 To invoke a command with content trust enabled regardless of whether or how the `DOCKER_CONTENT_TRUST` variable is set: 160 161 ```bash 162 $ docker build --disable-content-trust=false -t docker/trusttest:testing . 163 ``` 164 165 All of the trusted operations support the `--disable-content-trust` flag. 166 167 168 ### Push trusted content 169 170 To create signed content for a specific image tag, simply enable content trust 171 and push a tagged image. If this is the first time you have pushed an image 172 using content trust on your system, the session looks like this: 173 174 ```bash 175 $ docker push docker/trusttest:latest 176 The push refers to a repository [docker.io/docker/trusttest] (len: 1) 177 9a61b6b1315e: Image already exists 178 902b87aaaec9: Image already exists 179 latest: digest: sha256:d02adacee0ac7a5be140adb94fa1dae64f4e71a68696e7f8e7cbf9db8dd49418 size: 3220 180 Signing and pushing trust metadata 181 You are about to create a new root signing key passphrase. This passphrase 182 will be used to protect the most sensitive key in your signing system. Please 183 choose a long, complex passphrase and be careful to keep the password and the 184 key file itself secure and backed up. It is highly recommended that you use a 185 password manager to generate the passphrase and keep it safe. There will be no 186 way to recover this key. You can find the key in your config directory. 187 Enter passphrase for new root key with id a1d96fb: 188 Repeat passphrase for new root key with id a1d96fb: 189 Enter passphrase for new repository key with id docker.io/docker/trusttest (3a932f1): 190 Repeat passphrase for new repository key with id docker.io/docker/trusttest (3a932f1): 191 Finished initializing "docker.io/docker/trusttest" 192 ``` 193 When you push your first tagged image with content trust enabled, the `docker` 194 client recognizes this is your first push and: 195 196 - alerts you that it will create a new root key 197 - requests a passphrase for the root key 198 - generates a root key in the `~/.docker/trust` directory 199 - requests a passphrase for the repository key 200 - generates a repository key for in the `~/.docker/trust` directory 201 202 The passphrase you chose for both the root key and your repository key-pair 203 should be randomly generated and stored in a *password manager*. 204 205 > **NOTE**: If you omit the `latest` tag, content trust is skipped. This is true 206 even if content trust is enabled and even if this is your first push. 207 208 ```bash 209 $ docker push docker/trusttest 210 The push refers to a repository [docker.io/docker/trusttest] (len: 1) 211 9a61b6b1315e: Image successfully pushed 212 902b87aaaec9: Image successfully pushed 213 latest: digest: sha256:a9a9c4402604b703bed1c847f6d85faac97686e48c579bd9c3b0fa6694a398fc size: 3220 214 No tag specified, skipping trust metadata push 215 ``` 216 217 It is skipped because as the message states, you did not supply an image `TAG` 218 value. In Docker content trust, signatures are associated with tags. 219 220 Once you have a root key on your system, subsequent images repositories 221 you create can use that same root key: 222 223 ```bash 224 $ docker push docker.io/docker/seaside:latest 225 The push refers to a repository [docker.io/docker/seaside] (len: 1) 226 a9539b34a6ab: Image successfully pushed 227 b3dbab3810fc: Image successfully pushed 228 latest: digest: sha256:d2ba1e603661a59940bfad7072eba698b79a8b20ccbb4e3bfb6f9e367ea43939 size: 3346 229 Signing and pushing trust metadata 230 Enter key passphrase for root key with id a1d96fb: 231 Enter passphrase for new repository key with id docker.io/docker/seaside (bb045e3): 232 Repeat passphrase for new repository key with id docker.io/docker/seaside (bb045e3): 233 Finished initializing "docker.io/docker/seaside" 234 ``` 235 236 The new image has its own repository key and timestamp key. The `latest` tag is signed with both of 237 these. 238 239 240 ### Pull image content 241 242 A common way to consume an image is to `pull` it. With content trust enabled, the Docker 243 client only allows `docker pull` to retrieve signed images. 244 245 ``` 246 $ docker pull docker/seaside 247 Using default tag: latest 248 Pull (1 of 1): docker/trusttest:latest@sha256:d149ab53f871 249 ... 250 Tagging docker/trusttest@sha256:d149ab53f871 as docker/trusttest:latest 251 ``` 252 253 The `seaside:latest` image is signed. In the following example, the command does not specify a tag, so the system uses 254 the `latest` tag by default again and the `docker/cliffs:latest` tag is not signed. 255 256 ```bash 257 $ docker pull docker/cliffs 258 Using default tag: latest 259 no trust data available 260 ``` 261 262 Because the tag `docker/cliffs:latest` is not trusted, the `pull` fails. 263 264 265 ### Disable content trust for specific operations 266 267 A user who wants to disable content trust for a particular operation can use the 268 `--disable-content-trust` flag. **Warning: this flag disables content trust for 269 this operation**. With this flag, Docker will ignore content-trust and allow all 270 operations to be done without verifying any signatures. If we wanted the 271 previous untrusted build to succeed we could do: 272 273 ``` 274 $ cat Dockerfile 275 FROM docker/trusttest:notrust 276 RUN echo 277 $ docker build --disable-content-trust -t docker/trusttest:testing . 278 Sending build context to Docker daemon 42.84 MB 279 ... 280 Successfully built f21b872447dc 281 ``` 282 283 The same is true for all the other commands, such as `pull` and `push`: 284 285 ``` 286 $ docker pull --disable-content-trust docker/trusttest:untrusted 287 ... 288 $ docker push --disable-content-trust docker/trusttest:untrusted 289 ... 290 ``` 291 292 ## Related information 293 294 * [Manage keys for content trust](trust_key_mng.md) 295 * [Automation with content trust](trust_automation.md) 296 * [Delegations for content trust](trust_delegation.md) 297 * [Play in a content trust sandbox](trust_sandbox.md)