Attesting Remote Services and Applications
Problem Description
Consider that you operate a confidential service S or an application A consisting of a set of multiple services. In both cases, clients connect to a service S via TLS.
Each client wants to ensure that S (and all services used by S) runs inside of an enclave, runs the expected code, and it was properly configured. A client C is running at a remote site, i.e., not in the same cluster as S.
How can C attest that S is properly set up?
Approach
Service Deployment
The provide of S / A performs the following steps:
- Create a policy P_S for service S and all services of application A
- stores this in a CAS CS via
scone session create
. - ensure that these policies do not define any explicit secrets values
- if you need explicit secret values, import them from another policy with very limited read access (see secret sharing)
- permit clients to read the service policy P_S (see access control)
- P_S generates or imports a CA certificate and generates with this a certificate Ce for the service S,
- P_S exports CA certificate that generated C (see
export_public
).
- stores this in a CAS CS via
- service S will use Ce and its private key for TLS (see secret injection files)
Client (Runtime)
Each client C
- when connecting to S via TLS, C only accepts CA as valid certificate authority for the TLS certificate provided by S (by limiting the root certificates to CA or by defining name constraints for the root certificates)
- since the policy of S ensures that only a correctly configured service, executing inside of an enclave, can get access to a certificate Ce issued by CA,
- being able to establish a TLS connection to S means, that S satisfies all constraints of its security policy P_S.
Client (Development/Deployment)
When client C is built or, alternatively, during deployment time, one:
- attests CAS CS via CLI
scone cas attest
, - one verifies the policy (a.k.a. session) of each services of application A using
scone session verify
, and - retrieve the CA certificate from CAS via its REST API (see flask demo).