From f733ba5d6edcec7a2fd2f818677ca3311d6e3c0d Mon Sep 17 00:00:00 2001 From: Felix Schuster <1911679+flxflx@users.noreply.github.com> Date: Fri, 2 Sep 2022 16:10:27 +0200 Subject: [PATCH] Update README (#46) * Update README * Update images * Add security policy --- README.md | 175 ++-- SECURITY.md | 9 + docs/static/img/banner.svg | 155 +++ docs/static/img/concept.svg | 974 ++++++++++++++++++ docs/static/img/constellation-header.png | Bin 45822 -> 0 bytes .../img/constellation-shell-windowframe.svg | 211 ---- docs/static/img/shell-windowframe.svg | 211 ++++ 7 files changed, 1410 insertions(+), 325 deletions(-) create mode 100644 SECURITY.md create mode 100644 docs/static/img/banner.svg create mode 100644 docs/static/img/concept.svg delete mode 100644 docs/static/img/constellation-header.png delete mode 100644 docs/static/img/constellation-shell-windowframe.svg create mode 100644 docs/static/img/shell-windowframe.svg diff --git a/README.md b/README.md index 6520e3955..7c125325a 100644 --- a/README.md +++ b/README.md @@ -1,135 +1,98 @@ -

- ⭐ Star us on GitHub — it motivates us a lot! -

+![Constellation](docs/static/img/banner.svg) -![](docs/static/img/constellation-header.png) +# Always Encrypted K8s -

Welcome to Constellation!

- -

- Constellation is the first Confidential Kubernetes platform. It leverages confidential computing to isolate entire Kubernetes clusters and all workloads from the rest of the cloud infrastructure. -

- -

+

Constellation License E2E Test Azure E2E Test GCP Go Report - Discord + Discord Twitter

-## Table of contents +Constellation is a Kubernetes engine that aims to provide the best possible data security. It wraps your K8s cluster into a single *confidential context* that is shielded from the underlying cloud infrastructure. Everything inside is always encrypted, including at runtime in memory. For this, Constellation leverages confidential computing (see our [whitepaper]) and more specifically Confidential VMs. -- [✨ What is Constellation?](#-what-is-constellation) -- [🛠 Features](#-features) - - [Everything always encrypted](#everything-always-encrypted) - - [Everything verifiable](#everything-verifiable) - - [Performance and scale](#performance-and-scale) - - [100% compatibility](#100-compatibility) -- [🚀 Getting started](#-getting-started) -- [📖 Documentation](#-documentation) -- [👥 Community](#-community) -- [🤝 Contributing](#-contributing) -- [🗺 Roadmap](#-roadmap) -- [❓ Support & Enterprise Support](#-support--enterprise-support) -- [📃 License](#-license) +Concept +## Goals -## ✨ What is Constellation? +From a security perspective, Constellation is designed to keep all data always encrypted and to prevent access from the infrastructure layer (i.e., remove the infrastructure from the TCB). This includes access from datacenter employees, privileged cloud admins, and attackers coming through the infrastructure (e.g., malicious co-tenants escalating their privileges). -From the inside, it's a fully featured, [certified] Kubernetes engine. From the outside, it's an end to end isolated, always encrypted stronghold. A Confidential Cloud in the public cloud. -Constellation is open source and enterprise-ready, tailored for unleashing the power of confidential computing for all your workloads at scale. +From a DevOps perspective, Constellation is designed to work just like what you would expect from a modern K8s engine. - - - - Constellation product overview - +## Use cases -For a brief introduction to the Confidential Kubernetes concept, read the [introduction][confidential-kubernetes]. -For more elaborate overviews of Constellation, see the [architecture] documentation. +Encrypting your K8s is good for: -## 🛠 Features +* Increasing the overall security of your clusters +* Increasing the trustworthiness of your SaaS offerings +* Moving sensitive workloads from on-prem to the cloud +* Meeting regulatory requirements -### Everything always encrypted +## Features -- Memory runtime encryption of all Kubernetes nodes -- [Transparent network encryption][network-encryption] provided by [Cilium]. Application independent, no sidecar required -- [Persistent volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) encryption for block storage. [Encrypted in the confidential Kubernetes context][storage-encryption], keys and plaintext data never leave the cluster. No trust in the cloud storage backend required -- [Key management][key-management] for transparent network and storage encryption +### 🔒 Everything always encrypted -### Everything verifiable +* Runtime encryption: All nodes run inside AMD SEV-based Confidential VMs (CVMs). Support for Intel TDX will be added in the future. +* Transparent encryption of network and storage: All pod-to-pod traffic and all writes to persistent storage are automatically encrypted ([more][network-encryption]) +* Transparent key management: All cryptographic keys are managed within the confidential context ([more][key-management]) -- [Verifiable][cluster-attestation] integrity and confidentiality of the entire Kubernetes cluster -- Kubernetes node attestation based on confidential computing. Nodes are [verified][node-attestation] on their integrity and identity with a hardware-based remote attestation procedure before joining the cluster -- [Supply chain protection][supply-chain] with [sigstore](https://www.sigstore.dev/) -- [Confidential computing-optimized][images], fully measured, and integrity-protected node OS +### 🔍 Everything verifiable -### Performance and scale +* "Whole cluster" attestation based on the remote-attestation feature of CVMs ([more][cluster-attestation]) +* Confidential computing-optimized node images based on Fedora CoreOS; fully measured and integrity-protected ([more][images]) +* Supply chain protection with [Sigstore](https://www.sigstore.dev/) ([more][supply-chain]) -- High-available, enterprise-ready Kubernetes engine -- Multi-master architecture -- [Stacked etcd topology][etcd-stacked] -- Dynamic cluster autoscaling +### 🚀 Performance and scale -### 100% compatibility +* High availability with multi-master architecture and stacked etcd topology +* Dynamic cluster autoscaling with verification and secure bootstrapping of new nodes +* Competitive performance ([see K-Bench comparison with AKS and GKE][performance]) + +### 🧩 Easy to use and integrate -- [Certified][certified] Kubernetes engine -- Works with all your existing containers and tools -- The only cloud-agnostic Confidential Kubernetes platform -- Aligned to the [version support policy of Kubernetes][k8s-version-support] -- [Cilium][Cilium] networking +* Constellation is a [CNCF-certified][certified] Kubernetes. It's aligned to Kubernetes' [version support policy][k8s-version-support] and will likely work with your existing workloads and tools. +* ☁️ Support for Azure and GCP, more to come. -## 🚀 Getting started +## Getting started -![Constellation Shell](docs/static/img/constellation-shell-windowframe.svg) +If you're already familiar with Kubernetes, it's easy to get started with Constellation: -Sounds great, how can I try this? +1. 📦 [Install the CLI][install] +2. ⌨️ [Create a Constellation cluster][create-cluster] +3. 🏎️ [Run your app][examples] -Constellation can be deployed in minutes to your favorite infrastructure provider: +![Constellation Shell](docs/static/img/shell-windowframe.svg) -:wrench: [Install][install] +## Documentation -:lock: [Deploy][deploy] +To learn more, see the official [documentation](https://docs.edgeless.systems/constellation). +You may want to start with one of the following sections. -:white_check_mark: [Profit][examples] - -## 📖 Documentation - -* [Concept][confidential-kubernetes] -* [Threat model][threat-model] +* [Confidential Kubernetes][confidential-kubernetes] (Constellation vs. AKS/GKE + CVMs) +* [Security benefits][security-benefits] * [Architecture][architecture] -* [Installing the CLI][install] -* [Creating a Constellation cluster][deploy] -## 👥 Community +## Support -* Got a question? Please get in touch via [Discord][discord] or file an [issue][github-issues]. -* If you see an error message or run into an issue, please make sure to create a [bug report][github-issues]. -* Get the latest news and announcements on [Twitter][twitter], [LinkedIn][linkedin] or sign up for our monthly [newsletter][newsletter]. -* Visit our [blog](https://blog.edgeless.systems/) for technical deep-dives and tutorials. +* Please ask questions via [Discord] or file an [issue][github-issues]. +* If you experience errors, please create a [bug report][github-issues]. +* Visit our [blog](https://blog.edgeless.systems/) for technical deep-dives and tutorials and follow us on [Twitter] for news. +* Edgeless Systems also offers [Enterprise Support][enterprise-support]. -## 🤝 Contributing +## Contributing -* Read [`CONTRIBUTING.md`](CONTRIBUTING.md) for information on issue reporting, code guidelines, and how to work in this repository. +Refer to [`CONTRIBUTING.md`](CONTRIBUTING.md) on how to contribute. The most important points: * Pull requests are welcome! You need to agree to our [Contributor License Agreement][cla-assistant]. -* This project and everyone participating in it are governed by the [Code of Conduct](/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. -* To report a security issue, write to security@edgeless.systems. +* Please follow the [Code of Conduct](/CODE_OF_CONDUCT.md). +* ⚠️ To report a security issue, please write to security@edgeless.systems. -## 🗺 Roadmap +## License -Constellation maintains a [public roadmap][TODO]. It gives a high-level view of the main priorities for the project, the maturity of different features, and how to influence the project direction. - -## ❓ Support & Enterprise Support - -If you require a cluster with more than 8 vCPUs or need other services such as enterprise support: [Contact us][contact] or find more information on the [Constellation product page][constellation-product]. - -## 📃 License - -TODO +The Constellation source code is licensed under the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.en.html). Edgeless Systems provides pre-built and signed binaries and images for Constellation. You may use these free of charge to create and run services for internal consumption. You can find more information in the [license] section of the docs. [architecture]: https://docs.edgeless.systems/constellation/architecture/overview @@ -137,37 +100,21 @@ TODO [Cilium]: https://cilium.io/ [cla-assistant]: https://cla-assistant.io/edgelesssys/constellation [cluster-attestation]: https://docs.edgeless.systems/constellation/architecture/attestation#cluster-attestation -[community-license]: https://docs.edgeless.systems/constellation/overview/license -[confidential-computing]: https://www.edgeless.systems/resources/confidential-computing/ [confidential-kubernetes]: https://docs.edgeless.systems/constellation/overview/confidential-kubernetes -[Constellation]: https://www.edgeless.systems/products/constellation/ -[constellation-product]: https://www.edgeless.systems/products/constellation/ -[contact]: https://www.edgeless.systems/contact/ -[deploy]: https://docs.edgeless.systems/constellation/workflows/create [discord]: https://discord.gg/rH8QTH56JN -[discord-badge]: https://img.shields.io/badge/chat-on%20Discord-blue +[enterprise-support]: https://www.edgeless.systems/products/constellation/ +[create-cluster]: https://docs.edgeless.systems/constellation/workflows/create [documentation]: https://docs.edgeless.systems/constellation/latest -[e2eTestAzure]: https://github.com/edgelesssys/constellation/actions/workflows/e2e-test-azure.yml/badge.svg?branch=main -[e2eTestGCP]: https://github.com/edgelesssys/constellation/actions/workflows/e2e-test-gcp.yml/badge.svg?branch=main -[etcd-stacked]: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/#stacked-etcd-topology [examples]: https://docs.edgeless.systems/constellation/getting-started/examples -[getting-started]: https://docs.edgeless.systems/constellation/getting-started [github-issues]: https://github.com/edgelesssys/constellation/issues/new/choose -[go-report-card]: https://goreportcard.com/report/github.com/edgelesssys/constellation -[go-report-card-badge]: https://goreportcard.com/badge/github.com/edgelesssys/constellation [images]: https://docs.edgeless.systems/constellation/architecture/images#constellation-images [install]: https://docs.edgeless.systems/constellation/getting-started/install -[join-service]: https://docs.edgeless.systems/constellation/architecture/components#joinservice [k8s-version-support]: https://docs.edgeless.systems/constellation/architecture/versions#kubernetes-support-policy -[key-management]: https://docs.edgeless.systems/constellation/architecture/keys#constellation-managed-key-management -[license]: https://github.com/edgelesssys/constellation/blob/master/LICENSE -[license-badge]: https://img.shields.io/github/license/edgelesssys/constellation -[linkedin]: https://www.linkedin.com/company/edgeless-systems/ +[key-management]: https://docs.edgeless.systems/constellation/architecture/keys +[license]: https://docs.edgeless.systems/constellation/next/overview/license [network-encryption]: https://docs.edgeless.systems/constellation/architecture/keys#network-encryption -[newsletter]: https://www.edgeless.systems/#newsletter-signup -[node-attestation]: https://docs.edgeless.systems/constellation/architecture/attestation#node-attestation -[storage-encryption]: https://docs.edgeless.systems/constellation/architecture/keys#storage-encryption [supply-chain]: https://docs.edgeless.systems/constellation/architecture/attestation#chain-of-trust -[troubleshooting]: https://docs.edgeless.systems/constellation/workflows/troubleshooting -[threat-model]: https://docs.edgeless.systems/constellation/overview/security-benefits +[security-benefits]: https://docs.edgeless.systems/constellation/next/overview/security-benefits [twitter]: https://twitter.com/EdgelessSystems +[whitepaper]: https://content.edgeless.systems/hubfs/Confidential%20Computing%20Whitepaper.pdf +[performance]: https://docs.edgeless.systems/constellation/next/overview/benchmarks \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..9cc7603a4 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,9 @@ +# Security Policy + +## Supported Versions + +Latest version + +## Reporting a Vulnerability + +To report a security issue, please write to security@edgeless.systems. \ No newline at end of file diff --git a/docs/static/img/banner.svg b/docs/static/img/banner.svg new file mode 100644 index 000000000..cb19bc6e9 --- /dev/null +++ b/docs/static/img/banner.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/concept.svg b/docs/static/img/concept.svg new file mode 100644 index 000000000..4afb22dc2 --- /dev/null +++ b/docs/static/img/concept.svg @@ -0,0 +1,974 @@ + + diff --git a/docs/static/img/constellation-header.png b/docs/static/img/constellation-header.png deleted file mode 100644 index e9e9a277941405b7345756a575fca7a641dbc7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45822 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 ZW_!M2lx(`uqgi2gXl?>Gt~B~R;y<{*3T^-Z diff --git a/docs/static/img/constellation-shell-windowframe.svg b/docs/static/img/constellation-shell-windowframe.svg deleted file mode 100644 index a68367c31..000000000 --- a/docs/static/img/constellation-shell-windowframe.svg +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - ~/constellation c co con cons const conste constel constell constella constellat constellation constellation c constellation co constellation con constellation conf constellation confi constellation config constellation config constellation config g constellation config ge constellation config generate constellation config generate g constellation config generate gc constellation config generate gcp constellation config generate gcp constellation cr constellation cre constellation crea constellation creat constellation create constellation create constellation create g constellation create gc constellation create gcp constellation create gcp constellation create gcp - constellation create gcp -c constellation create gcp -c constellation create gcp -c 3 constellation create gcp -c 3 constellation create gcp -c 3 - constellation create gcp -c 3 -w constellation create gcp -c 3 -w constellation create gcp -c 3 -w 5 constellation create gcp -c 3 -w 5 constellation create gcp -c 3 -w 5 - constellation create gcp -c 3 -w 5 -- constellation create gcp -c 3 -w 5 --n constellation create gcp -c 3 -w 5 --na constellation create gcp -c 3 -w 5 --nam constellation create gcp -c 3 -w 5 --name constellation create gcp -c 3 -w 5 --name constellation create gcp -c 3 -w 5 --name d constellation create gcp -c 3 -w 5 --name de constellation create gcp -c 3 -w 5 --name dem constellation create gcp -c 3 -w 5 --name demo constellation create gcp -c 3 -w 5 --name demo constellation create gcp -c 3 -w 5 --name demo The following Constellation cluster will be created:3 control-plane nodes of type n2d-standard-4 will be created.5 worker nodes of type n2d-standard-4 will be created.Do you want to create this cluster? [y/n]: Do you want to create this cluster? [y/n]: y Do you want to create this cluster? [y/n]: yYour Constellation cluster was created successfully.~/constellation took 2m23s constellati constellatio constellation constellation i constellation in constellation ini constellation init constellation initYour Constellation master secret was successfully written to ./constellation-mastersecret.jsonCreating service account ...Your Constellation cluster was successfully initialized.Constellation cluster identifier 7V/9WEa8P4sn7deu33UZEjmMF6SM7eiHv87QikQWGaU=Kubernetes configuration constellation-admin.confYou can now connect to your cluster by executing:export KUBECONFIG="$PWD/constellation-admin.conf"~/constellation took 4m11s export KUBECONFIG="$PWD/constellation-admin.conf" export KUBECONFIG="$PWD/constellation-admin.conf" k ku kub kube kubec kubect kubectl kubectl kubectl g kubectl ge kubectl get kubectl get kubectl get n kubectl get no kubectl get nod kubectl get node kubectl get nodes kubectl get nodesNAME STATUS ROLES AGE VERSIONconstellation-control-plane-qedq4-8nzl Ready control-plane 3m34s v1.24.3constellation-control-plane-qedq4-j9sl Ready control-plane 68s v1.24.3constellation-control-plane-qedq4-qcmk Ready control-plane 62s v1.24.3constellation-worker-qedq4-1sq7 Ready <none> 78s v1.24.3constellation-worker-qedq4-7wzj Ready <none> 82s v1.24.3constellation-worker-qedq4-lr11 Ready <none> 95s v1.24.3constellation-worker-qedq4-nzzr Ready <none> 83s v1.24.3constellation-worker-qedq4-r3zp Ready <none> 82s v1.24.3 . c co con cons const conste constel constell constella constellat constellati constellatio constellation constellation constellation t constellation te constellation ter constellation term constellation termi constellation termin constellation termina constellation terminat constellation terminate constellation terminate Terminating ...Your Constellation cluster was terminated successfully.~/constellation took 3m50s exit - diff --git a/docs/static/img/shell-windowframe.svg b/docs/static/img/shell-windowframe.svg new file mode 100644 index 000000000..35aa17416 --- /dev/null +++ b/docs/static/img/shell-windowframe.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + ~/constellation c co con cons const conste constel constell constella constellat constellation constellation c constellation co constellation con constellation conf constellation confi constellation config constellation config constellation config g constellation config ge constellation config generate constellation config generate g constellation config generate gc constellation config generate gcp constellation config generate gcp constellation cr constellation cre constellation crea constellation creat constellation create constellation create constellation create g constellation create gc constellation create gcp constellation create gcp constellation create gcp - constellation create gcp -c constellation create gcp -c constellation create gcp -c 3 constellation create gcp -c 3 constellation create gcp -c 3 - constellation create gcp -c 3 -w constellation create gcp -c 3 -w constellation create gcp -c 3 -w 5 constellation create gcp -c 3 -w 5 constellation create gcp -c 3 -w 5 - constellation create gcp -c 3 -w 5 -- constellation create gcp -c 3 -w 5 --n constellation create gcp -c 3 -w 5 --na constellation create gcp -c 3 -w 5 --nam constellation create gcp -c 3 -w 5 --name constellation create gcp -c 3 -w 5 --name constellation create gcp -c 3 -w 5 --name d constellation create gcp -c 3 -w 5 --name de constellation create gcp -c 3 -w 5 --name dem constellation create gcp -c 3 -w 5 --name demo constellation create gcp -c 3 -w 5 --name demo constellation create gcp -c 3 -w 5 --name demo The following Constellation cluster will be created:3 control-plane nodes of type n2d-standard-2 will be created.5 worker nodes of type n2d-standard-2 will be created.Do you want to create this cluster? [y/n]: Do you want to create this cluster? [y/n]: y Do you want to create this cluster? [y/n]: yYour Constellation cluster was created successfully.~/constellation took 2m23s constellati constellatio constellation constellation i constellation in constellation ini constellation init constellation initYour Constellation master secret was successfully written to ./constellation-mastersecret.jsonCreating service account ...Your Constellation cluster was successfully initialized.Constellation cluster identifier 7V/9WEa8P4sn7deu33UZEjmMF6SM7eiHv87QikQWGaU=Kubernetes configuration constellation-admin.confYou can now connect to your cluster by executing:export KUBECONFIG="$PWD/constellation-admin.conf"~/constellation took 4m11s export KUBECONFIG="$PWD/constellation-admin.conf" export KUBECONFIG="$PWD/constellation-admin.conf" k ku kub kube kubec kubect kubectl kubectl kubectl g kubectl ge kubectl get kubectl get kubectl get n kubectl get no kubectl get nod kubectl get node kubectl get nodes kubectl get nodesNAME STATUS ROLES AGE VERSIONconstellation-control-plane-qedq4-8nzl Ready control-plane 3m34s v1.24.3constellation-control-plane-qedq4-j9sl Ready control-plane 68s v1.24.3constellation-control-plane-qedq4-qcmk Ready control-plane 62s v1.24.3constellation-worker-qedq4-1sq7 Ready <none> 78s v1.24.3constellation-worker-qedq4-7wzj Ready <none> 82s v1.24.3constellation-worker-qedq4-lr11 Ready <none> 95s v1.24.3constellation-worker-qedq4-nzzr Ready <none> 83s v1.24.3constellation-worker-qedq4-r3zp Ready <none> 82s v1.24.3 . c co con cons const conste constel constell constella constellat constellati constellatio constellation constellation constellation t constellation te constellation ter constellation term constellation termi constellation termin constellation termina constellation terminat constellation terminate constellation terminate Terminating ...Your Constellation cluster was terminated successfully.~/constellation took 3m50s exit + \ No newline at end of file