2018-11-13 20:47:07 +00:00
|
|
|
## Sane Recommendations
|
|
|
|
|
|
|
|
TLS, PKI, X509, HTTPS, etc. all require configuration. All of
|
|
|
|
these technologies allow the user to "shoot themselves in the foot" by
|
|
|
|
misconfiguring them and reducing their benefits significantly. Therefore,
|
|
|
|
offering an easy to use solution that works out of the box means choosing and
|
|
|
|
enforcing sane default configurations for all these technologies.
|
|
|
|
|
|
|
|
Below we document some of the significant default configuration that we recommend.
|
|
|
|
This document is a moving target: security and cryptography are constanly
|
|
|
|
changing and evolving - vulnerabilities are found, new algorithms are created,
|
|
|
|
etc. We inted for this document be an accurate representation of current
|
|
|
|
best practices in the industry, and to have these practices codified as defaults
|
|
|
|
in the `certificates` code base. If you have questions, suggestions, or comments
|
|
|
|
about any of these decisions please let us know.
|
|
|
|
|
2018-11-14 06:05:06 +00:00
|
|
|
### Tokens
|
|
|
|
|
|
|
|
We use JWTs (JSON Web Tokens to prove authenticity and identity within the Step
|
|
|
|
ecosystem. JWTs have received negative attention because they are easy to
|
|
|
|
misuse, misconfigure.
|
|
|
|
We agree! But lots of things are easy to misuse. We also believe
|
|
|
|
that when configured well JWTs are a great way to sign and encode data. Our JWT's
|
|
|
|
are, by default, short-lived (5 minute lifespan) and can only be used once during
|
|
|
|
the lifetime of the Step CA. We use a 1 minute clock drift leeway because that
|
|
|
|
was the recommended default in the reputable JWT package that we chose. If using
|
|
|
|
Step JWTs or your own JWTs in your code be sure to verify and validate every
|
|
|
|
single standard attributed of the JWT. JWTs, like all cryptographic tools,
|
|
|
|
are useless without proper attention to configuration and guidelines.
|
|
|
|
|
2018-11-13 20:47:07 +00:00
|
|
|
### Keys
|
|
|
|
|
|
|
|
```
|
|
|
|
// RSA keys don't scale very well. To get 128 bits of security, you need 3,072-bit
|
|
|
|
// RSA keys, which are noticeably slower. ECDSA keys provide an alternative
|
|
|
|
// that offers better security and better performance. At 256 bits, ECDSA keys
|
|
|
|
// provide 128 bits of security. A small number of older clients don't support
|
|
|
|
// ECDSA, but most modern clients do.
|
|
|
|
Default Key Type: ECDSA
|
|
|
|
Default Curve Bits: P-256
|
|
|
|
|
|
|
|
// Encryption algorithm for writing private keys to disk. We've chosen AES
|
|
|
|
// (aka Rijndael) because it was the official choice of the Advanced Encryption
|
|
|
|
// Standard contest. The three supported key sizes are 128, 192, and 256. Each
|
|
|
|
// of these is considered to be unbreakable for the forseeable future, therefore
|
|
|
|
// we chose 128 bits as our default because the performance is better
|
|
|
|
// (as compared to the greater key sizes) and because we agree, with the
|
|
|
|
// designers of the algorithm, that 128 bits are quite sufficient for most
|
|
|
|
// security needs.
|
|
|
|
Default PEMCipher: AES128
|
|
|
|
```
|
|
|
|
|
|
|
|
### X.509 Certificate Defaults
|
|
|
|
|
|
|
|
* **root certificate**
|
|
|
|
|
|
|
|
```
|
|
|
|
* Validity (10 year window)
|
|
|
|
* Not Before: Now
|
|
|
|
// A 10 year window seems advisable until software and tools can be written
|
|
|
|
// for rotating the root certificate.
|
|
|
|
* Not After: Now + 10 years
|
|
|
|
* Basic Constraints
|
|
|
|
// The root certificate is a Certificate Authority, it will be used to sign
|
|
|
|
// other Certificates.
|
|
|
|
* CA: TRUE
|
|
|
|
// The path length constraint expresses the number of possible intermediate
|
|
|
|
// CA certificates in a path built from an end-entity certificate up to the
|
|
|
|
// CA certificate. An absent path length constraint means that there is no
|
|
|
|
// limitation to the number of intermediate certificates from end-entity to
|
|
|
|
// the CA certificate. The smallstep PKI has only one intermediate CA
|
|
|
|
//certificate between end-entity certificates and the root CA certificcate.
|
|
|
|
* pathlen: 1
|
|
|
|
* Key Usage // Describes how the keys can be used.
|
|
|
|
// Indicates that a certificate will be used with a protocol that encrypts keys.
|
|
|
|
* Key Encipherment
|
|
|
|
// Indicates that our root public key will be used to verify a signature on
|
|
|
|
// certificates.
|
|
|
|
* Certificate Signing
|
|
|
|
// Indicates that our root public key will be used to verify a signature on
|
|
|
|
// revocation
|
|
|
|
// information, such as CRL.
|
|
|
|
* CRL Sign
|
|
|
|
// Indicates that our root public key may be used as a digital signature to
|
|
|
|
// support security services that enable entity authentication and data
|
|
|
|
// origin authentication with integrity.
|
|
|
|
* Digital Signature
|
|
|
|
```
|
|
|
|
|
|
|
|
* **intermediate certificate**
|
|
|
|
|
|
|
|
```
|
|
|
|
* Validity (10 year window)
|
|
|
|
* Not Before: Now
|
|
|
|
// A 10 year window seems advisable until software and tools can be written
|
|
|
|
// for rotating the intermediates certificates without considerable agony
|
|
|
|
// on the part of the user.
|
|
|
|
* Not After: Now + 10 years
|
|
|
|
* Basic Constraints
|
|
|
|
// The intermediate certificate is a Certificate Authority, used to sign
|
|
|
|
// end-entity (service, process, job, etc.) certificates.
|
|
|
|
* CA: TRUE
|
|
|
|
// The path length constraint expresses the number of possible intermediate
|
|
|
|
// CA certificates in a path built from an end-entity certificate up to the
|
|
|
|
// CA certificate. An absent path length constraint means that there is no
|
|
|
|
// limitation to the number of intermediate certificates from end-entity to
|
|
|
|
// the CA certificate. There are no additional intermediary certificates in
|
|
|
|
// the path between the smallstep intermediate CA and end-entity certificates.
|
|
|
|
* pathlen: 0
|
|
|
|
* Key Usage
|
|
|
|
// Indicates that a certificate will be used with a protocol that encrypts keys.
|
|
|
|
* Key Encipherment
|
|
|
|
// Indicates that our root public key will be used to verify a signature on
|
|
|
|
// certificates.
|
|
|
|
* Certificate Signing
|
|
|
|
// Indicates that this public key can be used to verify a signature on
|
|
|
|
// revocation information, such as CRL.
|
|
|
|
* CRL Sign
|
|
|
|
// Indicates that this public key may be used as a digital signature to
|
|
|
|
// support security services that enable entity authentication and data
|
|
|
|
// origin authentication with integrity.
|
|
|
|
* Digital Signature
|
|
|
|
* Extended Key Usage
|
|
|
|
// Certificate can be used as the server side certificate in the TLS protocol.
|
|
|
|
* TLS Web Server Authentication
|
|
|
|
// Certificate can be used as the client side certificate in the TLS protocol.
|
|
|
|
* TLS Web Client Authentication
|
|
|
|
```
|
|
|
|
|
|
|
|
* **Leaf Certificate - End Entity Certificate** (certificates returned by the CA)
|
|
|
|
|
|
|
|
```
|
|
|
|
* Validity (24 hour window)
|
|
|
|
* Not Before: Now
|
|
|
|
// The default is a 24hr window. This value is somewhat arbitrary, however,
|
|
|
|
// our goal is to have seamless end-entity certificate rotation (we are
|
|
|
|
// getting close). Rotating certificates frequently is good security hygiene
|
|
|
|
// because it gives bad actors very little time to form an attack and limits
|
|
|
|
// the usefulness of any single private key in the system. We will continue
|
|
|
|
// to work towards decreasing this window because we believe it significantly
|
|
|
|
// reduces probability and effectiveness of any attack.
|
|
|
|
* Not After: Now + 24 hours
|
|
|
|
* Key Usage
|
|
|
|
// Indicates that a certificate will be used with a protocol that encrypts keys.
|
|
|
|
* Key Encipherment
|
|
|
|
// Indicates that this public key may be used as a digital signature to
|
|
|
|
// support security services that enable entity authentication and data
|
|
|
|
// origin authentication with integrity.
|
|
|
|
* Digital Signature
|
|
|
|
* Extended Key Usage
|
|
|
|
// Certificate can be used as the server side certificate in the TLS protocol.
|
|
|
|
* TLS Web Server Authentication
|
|
|
|
// Certificate can be used as the client side certificate in the TLS protocol.
|
|
|
|
* TLS Web Client Authentication
|
|
|
|
```
|
|
|
|
|
|
|
|
### Default TLS Configuration Options
|
|
|
|
|
|
|
|
```
|
|
|
|
// The PCI Security Standards Council is requiring all payment processors
|
|
|
|
// and merchants to move to TLS 1.2 and above by June 30, 2018. By setting
|
|
|
|
// TLS 1.2 as the default for all tls protocol negotiation we encourage our
|
|
|
|
// users to adopt the same security conventions.
|
|
|
|
* MinVersion: TLS 1.2
|
|
|
|
* MaxVersion: TLS 1.2
|
|
|
|
|
|
|
|
// https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices#23-use-secure-cipher-suites
|
|
|
|
// The default 'ciphersuites' is a single cipher combination. For communication
|
|
|
|
// between services running step there is no need for cipher suite negotiation.
|
|
|
|
// The server can specify a single cipher suite which the client is already
|
|
|
|
// known to support. Reasons for selecting "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305":
|
|
|
|
// - ECDHE key exchange algorithm has perfect forward secrecy
|
|
|
|
// - ECDSA has smaller keys and better performance (than RSA)
|
|
|
|
// - CHACHA20 with POLY1305 is the cipher mode used by google.
|
2018-12-20 17:04:08 +00:00
|
|
|
// - CHACHA20's performance is better than GCM and CBC.
|
2018-11-13 20:47:07 +00:00
|
|
|
// NOTE: The http2 spec requires the "TLS_ECDHE_(RSA|ECDSA)_WITH_AES_128_GCM_SHA256"
|
|
|
|
// ciphersuite be accepted by the server, therefore it makes our list of
|
|
|
|
// default ciphersuites until we build the functionality to modify our defaults
|
|
|
|
// based on http version.
|
|
|
|
* DefaultCipherSuites: [
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
|
|
|
|
]
|
|
|
|
// The following is a list of step approved cipher suites. Not all communication
|
|
|
|
// can be mediated with step TLS functionality. For those connections the list of
|
|
|
|
// server supported cipher suites must have more options - in case older clients
|
|
|
|
// do not support our favored cipher suite. Reasons for selecting these cipher
|
|
|
|
// suites can be found in the ssllabs article cited above.
|
|
|
|
* ApprovedCipherSuites: [
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
|
|
|
|
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
|
|
|
|
]
|
|
|
|
// TLS renegotiation significantly complicates the state machine and has been
|
|
|
|
// the source of numerous, subtle security issues. Therefore, by default we
|
|
|
|
// disable it.
|
|
|
|
* Renegotation: Never
|
|
|
|
|