mirror of https://github.com/docker/docs.git
Add documentation for notary server (what it does, etc.).
Signed-off-by: Ying Li <ying.li@docker.com>
This commit is contained in:
parent
41b1d57b95
commit
ca54b435ce
|
|
@ -1,6 +1,6 @@
|
||||||
<!--[metadata]>
|
<!--[metadata]>
|
||||||
+++
|
+++
|
||||||
title = "Notary Configuration File"
|
title = "Notary Serer Configuration File"
|
||||||
description = "Specifies the configuration file for Notary Server"
|
description = "Specifies the configuration file for Notary Server"
|
||||||
keywords = ["docker, notary, notary-server, configuration"]
|
keywords = ["docker, notary, notary-server, configuration"]
|
||||||
[menu.main]
|
[menu.main]
|
||||||
|
|
@ -87,15 +87,15 @@ Example:
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"><code>tls_key_file</code></td>
|
<td valign="top"><code>tls_key_file</code></td>
|
||||||
<td valign="top">no</td>
|
<td valign="top">no</td>
|
||||||
<td valign="top"> Specifies the private key to use for HTTPS. Must be
|
<td valign="top">Specifies the private key to use for HTTPS. Must be
|
||||||
provided together with <code>tls_cert_file</code>, or not at all.
|
provided together with <code>tls_cert_file</code>, or not at all.
|
||||||
If neither are provided, the server will use HTTP instead of HTTPS.</td>
|
If neither are provided, the server will use HTTP instead of HTTPS.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"><code>tls_cert_file</code></td>
|
<td valign="top"><code>tls_cert_file</code></td>
|
||||||
<td valign="top">no</td>
|
<td valign="top">no</td>
|
||||||
<td valign="top"> Specifies the certificate to use for HTTPS. Must be
|
<td valign="top">Specifies the certificate to use for HTTPS. Must be
|
||||||
provided together with <code>tls_cert_key</code>, or not at all.
|
provided together with <code>tls_key_file</code>, or not at all.
|
||||||
If neither are provided, the server will use HTTP instead of HTTPS.</td>
|
If neither are provided, the server will use HTTP instead of HTTPS.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -119,6 +119,9 @@ Example:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that this entire section is optional. However, you would like
|
||||||
|
authentication, then then the required parameters below are needed configure it.
|
||||||
|
|
||||||
**Token authentication:**
|
**Token authentication:**
|
||||||
|
|
||||||
This is an implementation of the same authentication used by
|
This is an implementation of the same authentication used by
|
||||||
|
|
@ -167,6 +170,10 @@ Remote trust service example:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that this entire section is optional. However, you would like to use a
|
||||||
|
separate trust service (recommended), then then the required parameters below
|
||||||
|
are needed configure it.
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Parameter</th>
|
<th>Parameter</th>
|
||||||
|
|
@ -233,6 +240,10 @@ Example:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that this entire section is optional. However, you would like to
|
||||||
|
specify a different log level, then then the required parameters below
|
||||||
|
are needed configure it.
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Parameter</th>
|
<th>Parameter</th>
|
||||||
|
|
@ -262,6 +273,10 @@ DB storage example:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that this entire section is optional. However, you would like to
|
||||||
|
use a database backend (recommended), then then the required parameters below
|
||||||
|
are needed configure it.
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Parameter</th>
|
<th>Parameter</th>
|
||||||
|
|
@ -299,6 +314,10 @@ configuration.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that this entire section is optional. However, you would like to
|
||||||
|
use Bugsnag reporting, then then the required parameters below are needed
|
||||||
|
configure it.
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Parameter</th>
|
<th>Parameter</th>
|
||||||
|
|
@ -307,19 +326,19 @@ configuration.
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"><code>bugsnag</code></td>
|
<td valign="top"><code>bugsnag</code></td>
|
||||||
<td valign="top">no</td>
|
<td valign="top">yes</td>
|
||||||
<td>Any string value. If this value is not set, no errors will be
|
<td>Any string value. If this value is not set, no errors will be
|
||||||
reported to Bugsnag (all other parameters will be ignored)</td>
|
reported to Bugsnag (all other parameters will be ignored)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"><code>bugsnag_api_key</code></td>
|
<td valign="top"><code>bugsnag_api_key</code></td>
|
||||||
<td valign="top">no</td>
|
<td valign="top">yes</td>
|
||||||
<td>The API key to use to report errors - if this value is not set,
|
<td>The API key to use to report errors - if this value is not set,
|
||||||
no errors will be reported to Bugsnag.</td>
|
no errors will be reported to Bugsnag.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"><code>bugsnag_release_stage</code></td>
|
<td valign="top"><code>bugsnag_release_stage</code></td>
|
||||||
<td valign="top">no</td>
|
<td valign="top">yes</td>
|
||||||
<td>The current release stage, such as "production" (which is the
|
<td>The current release stage, such as "production" (which is the
|
||||||
default), used to filter errors in the Bugsnag dashboard.</td>
|
default), used to filter errors in the Bugsnag dashboard.</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,105 @@
|
||||||
|
<!--[metadata]>
|
||||||
|
+++
|
||||||
|
title = "Notary Server"
|
||||||
|
description = "Description of the Notary Server"
|
||||||
|
keywords = ["docker, notary, notary-server"]
|
||||||
|
[menu.main]
|
||||||
|
parent="mn_notary"
|
||||||
|
+++
|
||||||
|
<![end-metadata]-->
|
||||||
|
|
||||||
|
# Notary Server
|
||||||
|
|
||||||
|
The notary server is a remote store for, and coordinates updates to, the signed
|
||||||
|
metadata files for a repository (which are created by clients). The server is
|
||||||
|
also responsible for creating and keeping track of timestamp keys for each repo,
|
||||||
|
and signing a timestamp file for each repo whenever a client sends updates,
|
||||||
|
after verifying the root/target/snapshot signatures on the client update.
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
|
||||||
|
Notary Server supports authentication from clients using [JWT](http://jwt.io/)
|
||||||
|
tokens. This requires an authorization server that manages access controls,
|
||||||
|
and a cert bundle from this authorization server containing the public key it
|
||||||
|
uses to sign tokens.
|
||||||
|
|
||||||
|
The client will log into the server (it gets redirected by Notary Server if
|
||||||
|
authentication is configured), obtain a token, and present the token to Notary
|
||||||
|
Server, which should be configured to trust signatures from that authorization
|
||||||
|
server.
|
||||||
|
|
||||||
|
See the docs for [Docker Registry v2 authentication](
|
||||||
|
https://github.com/docker/distribution/blob/master/docs/spec/auth/token.md)
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
### Server storage
|
||||||
|
|
||||||
|
Currently Notary Server uses MySQL as a backend for storing the timestamp
|
||||||
|
*public* keys and the TUF metadata for each repository.
|
||||||
|
|
||||||
|
### Signing service
|
||||||
|
|
||||||
|
The recommended usage of the server is with a separate signing service:
|
||||||
|
[Notary Signer](notary-signer.md). The signing service actually
|
||||||
|
stores the timestamp *private* keys and performs signing for the server.
|
||||||
|
|
||||||
|
By using a signing service, the private keys then would never be stored on the
|
||||||
|
server itself.
|
||||||
|
|
||||||
|
Notary Signer supports mutual authentication - when you generate client
|
||||||
|
certificates for Notary Server to authenticate with Notary Signer, please make
|
||||||
|
sure that the certificates **are not CAs**. Otherwise any server that is
|
||||||
|
compromised can sign any number of other client certs.
|
||||||
|
|
||||||
|
As an example, please see [this script](opensslGenCert.sh) to see how to
|
||||||
|
generate client SSL certs with basic constraints using OpenSSL.
|
||||||
|
|
||||||
|
### How to configure notary server
|
||||||
|
|
||||||
|
A JSON configuration file needs to be passed as a parameter/flag when starting
|
||||||
|
up Notary Server:
|
||||||
|
|
||||||
|
```
|
||||||
|
notary-server -config /path/to/configuration.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Please see the [Notary Server configuration document](notary-server-config.md)
|
||||||
|
for more details about the format of the configuration file.
|
||||||
|
|
||||||
|
### What happens if the server is compromised
|
||||||
|
|
||||||
|
The server does not hold any keys for the repository except the timestamp key,
|
||||||
|
so the attacker cannot modify the root, targets, or snapshots metadata.
|
||||||
|
|
||||||
|
If using a signer service, an attacker cannot get access to the timestamp key.
|
||||||
|
They can use the server to make calls to the signer service to sign arbitrary
|
||||||
|
data, such as an empty timestamp, an invalid timestamp, or an old timestamp.
|
||||||
|
|
||||||
|
TOFU (trust on first use) would prevent the attacker from being able to make
|
||||||
|
existing clients for existing repositories download arbitrary data. They would
|
||||||
|
need the original root/target/snapshots keys. The attacker could, by signing
|
||||||
|
bad timestamps, prevent the user from seeing any updated metadata.
|
||||||
|
|
||||||
|
The attacker can also make all new keys, and simply replace the repository
|
||||||
|
metadata with metadata signed with these new keys. New clients who have not
|
||||||
|
seen this repository before will trust this bad data, but older clients will
|
||||||
|
know that something is wrong.
|
||||||
|
|
||||||
|
### Ops features
|
||||||
|
|
||||||
|
Notary server provides the following endpoints for ops friendliness:
|
||||||
|
|
||||||
|
1. A health endpoint at `/_notary_server/health` which returns 200 and a
|
||||||
|
body of `{}` if the server is healthy, and a 500 with a list of
|
||||||
|
failed services if the server cannot access its storage backend.
|
||||||
|
|
||||||
|
If it cannot contact the signing service (in which case service is degraded,
|
||||||
|
but not down, since the server can still serve metadata, but not accept
|
||||||
|
updates), an error will be logged, but the service will still be considered
|
||||||
|
healthy.
|
||||||
|
|
||||||
|
1. A [Bugsnag](https://bugsnag.com) hook for error logs, if a Bugsnag
|
||||||
|
configuration is provided.
|
||||||
|
|
||||||
|
1. A [prometheus](http://prometheus.io/) endpoint at `/_notary_server/metrics`
|
||||||
|
which provides HTTP stats.
|
||||||
Loading…
Reference in New Issue