|
| 1 | +# ctlog-tiles |
| 2 | + |
| 3 | +<!-- This README.md is generated. Please edit README.md.gotmpl --> |
| 4 | + |
| 5 | +   |
| 6 | + |
| 7 | +Tiles-based certificate log (TesseraCT) |
| 8 | + |
| 9 | +**Homepage:** <https://sigstore.dev> |
| 10 | + |
| 11 | +## Quick Installation |
| 12 | + |
| 13 | +To install the helm chart with default values run following command. |
| 14 | +The [Values](#values) section describes the configuration options for this chart. |
| 15 | + |
| 16 | +```shell |
| 17 | +helm dependency update . |
| 18 | +helm install [RELEASE_NAME] . |
| 19 | +``` |
| 20 | + |
| 21 | +## Uninstallation |
| 22 | + |
| 23 | +To uninstall the Helm chart run following command. |
| 24 | + |
| 25 | +```shell |
| 26 | +helm uninstall [RELEASE_NAME] |
| 27 | +``` |
| 28 | + |
| 29 | +## Specifying Fulcio roots |
| 30 | + |
| 31 | +Unlike the ctlog chart, there is no createctconfig job that runs and fetches Fulcio's roots from the rootCert endpoint. The roots need to be known ahead of time and specified directly in values.yaml: |
| 32 | + |
| 33 | +``` |
| 34 | +server: |
| 35 | + ... |
| 36 | + fulcio: |
| 37 | + rootPEM: |- |
| 38 | + -----BEGIN CERTIFICATE----- |
| 39 | + ... |
| 40 | +``` |
| 41 | + |
| 42 | +## Using the POSIX backend |
| 43 | + |
| 44 | +In values.yaml, set `image.flavor` to `"posix"` (default). |
| 45 | + |
| 46 | +Create a secret for the private key: |
| 47 | + |
| 48 | +``` |
| 49 | +openssl ecparam -name prime256v1 -genkey -noout -out /path/to/privkey.pem |
| 50 | +kubectl -n ctlog-tiles-system create secret generic ctlog-signing-key --from-file=signing-key=/path/to/privkey.pem |
| 51 | +``` |
| 52 | + |
| 53 | +Encrypted secret keys are not supported. |
| 54 | + |
| 55 | +Configure the private key and storage directory in values.yaml: |
| 56 | + |
| 57 | +``` |
| 58 | +server: |
| 59 | + ... |
| 60 | + posix: |
| 61 | + privateKey: |
| 62 | + path: /etc/ctfe/signer.pem |
| 63 | + secret: |
| 64 | + name: signing-key |
| 65 | + key: signing-key |
| 66 | + mountPath: /etc/ctfe |
| 67 | + mountSubPath: signer.pem |
| 68 | + storageDir: |
| 69 | + path: /storage |
| 70 | + name: ctlog |
| 71 | + volume: |
| 72 | + hostPath: |
| 73 | + path: /data/ctlog-storage |
| 74 | + type: Directory |
| 75 | +``` |
| 76 | + |
| 77 | +## Using the GCP backend |
| 78 | + |
| 79 | +The deployment needs to be running in a GKE cluster with workload identity |
| 80 | +enabled and with permission to access secrets, storage objects, and Spanner |
| 81 | +databases. |
| 82 | + |
| 83 | +In values.yaml, set `image.flavor` to `"gcp"`. |
| 84 | + |
| 85 | +Create a Spanner instance and database in GCP: |
| 86 | + |
| 87 | +``` |
| 88 | +gcloud spanner instances create tesseract \ |
| 89 | + --config=regional-us-west1 \ |
| 90 | + --description="test" --nodes=1 |
| 91 | +gcloud spanner databases create sequencer --instance tesseract |
| 92 | +# If using antispam, create the antispam database too: |
| 93 | +# gcloud spanner databases create antispam --instance tesseract |
| 94 | +``` |
| 95 | + |
| 96 | +Create a GCS bucket: |
| 97 | + |
| 98 | +``` |
| 99 | +gcloud storage buckets create gs://unique-tesseract-bucket-name |
| 100 | +``` |
| 101 | + |
| 102 | +Create secrets in Secret Manager for both the private and public keys: |
| 103 | + |
| 104 | +``` |
| 105 | +gcloud secrets create tesseract-private --data-file=/path/to/privkey.pem |
| 106 | +gcloud secrets create tesseract-public --data-file=/path/to/pubkey.pem |
| 107 | +``` |
| 108 | + |
| 109 | +Configure the Spanner path, bucket, and signer keys in values.yaml: |
| 110 | + |
| 111 | +``` |
| 112 | +server: |
| 113 | + ... |
| 114 | + gcp: |
| 115 | + spanner: projects/my-project/instances/tesseract/databases/sequencer |
| 116 | + bucket: unique-tesseract-bucket-name |
| 117 | + signer: |
| 118 | + privateKey: projects/1234/secrets/tesseract-private/versions/1 |
| 119 | + publicKey: projects/1234/secrets/tesseract-public/versions/1 |
| 120 | +``` |
| 121 | + |
| 122 | +## Maintainers |
| 123 | + |
| 124 | +| Name | Email | Url | |
| 125 | +| ---- | ------ | --- | |
| 126 | +| The Sigstore Authors | | | |
| 127 | + |
| 128 | +## Source Code |
| 129 | + |
| 130 | +* <https://github.com/transparency-dev/tesseract> |
| 131 | + |
| 132 | +## Values |
| 133 | + |
| 134 | +| Key | Type | Default | Description | |
| 135 | +|-----|------|---------|-------------| |
| 136 | +| affinity | object | `{}` | | |
| 137 | +| fullnameOverride | string | `""` | | |
| 138 | +| image.flavor | string | `"posix"` | | |
| 139 | +| image.gcpSHA | string | `"sha256:17d3788b736de01ab0586359626c01789910a6e2981e7b90014fbda8689f5017"` | | |
| 140 | +| image.posixSHA | string | `"sha256:767c2dbe4a83be9243246564244aa381322f08f2a864371f62b880c465033815"` | | |
| 141 | +| image.pullPolicy | string | `"IfNotPresent"` | | |
| 142 | +| image.registry | string | `"ghcr.io"` | | |
| 143 | +| image.repository | string | `"sigstore/scaffolding/tesseract"` | | |
| 144 | +| image.version | string | `"v0.1.1"` | | |
| 145 | +| imagePullSecrets | list | `[]` | | |
| 146 | +| lifecycle.preStop.exec.command[0] | string | `"sleep"` | | |
| 147 | +| lifecycle.preStop.exec.command[1] | string | `"15"` | | |
| 148 | +| livenessProbe.httpGet.path | string | `"/healthz"` | | |
| 149 | +| livenessProbe.httpGet.port | int | `6962` | | |
| 150 | +| nameOverride | string | `""` | | |
| 151 | +| namespace.create | bool | `false` | | |
| 152 | +| namespace.name | string | `"ctlog-tiles-system"` | | |
| 153 | +| neg.http.name | string | `""` | | |
| 154 | +| neg.http.port | int | `80` | | |
| 155 | +| nodeSelector."iam.gke.io/gke-metadata-server-enabled" | string | `"true"` | | |
| 156 | +| podAnnotations | object | `{}` | | |
| 157 | +| podLabels | object | `{}` | | |
| 158 | +| podSecurityContext | object | `{}` | | |
| 159 | +| readinessProbe.httpGet.path | string | `"/healthz"` | | |
| 160 | +| readinessProbe.httpGet.port | int | `6962` | | |
| 161 | +| replicaCount | int | `1` | | |
| 162 | +| resources | object | `{}` | | |
| 163 | +| securityContext.allowPrivilegeEscalation | bool | `false` | | |
| 164 | +| securityContext.capabilities.drop[0] | string | `"ALL"` | | |
| 165 | +| securityContext.readOnlyRootFilesystem | bool | `true` | | |
| 166 | +| securityContext.runAsNonRoot | bool | `true` | | |
| 167 | +| securityContext.runAsUser | int | `65533` | | |
| 168 | +| server.antispam | object | `{}` | | |
| 169 | +| server.extraArgs | list | `[]` | | |
| 170 | +| server.fulcio.configMap.key | string | `"fulcio"` | | |
| 171 | +| server.fulcio.configMap.mountPath | string | `"/etc/fulcio"` | | |
| 172 | +| server.fulcio.configMap.mountSubPath | string | `"roots.pem"` | | |
| 173 | +| server.fulcio.configMap.name | string | `"fulcio-roots"` | | |
| 174 | +| server.fulcio.path | string | `"/etc/fulcio/roots.pem"` | | |
| 175 | +| server.fulcio.rootPEM | string | `""` | | |
| 176 | +| server.gcp | object | `{}` | | |
| 177 | +| server.hostname | string | `"localhost"` | | |
| 178 | +| server.http.port | string | `"6962"` | | |
| 179 | +| server.logLevel | string | `"1"` | | |
| 180 | +| server.posix | object | `{}` | | |
| 181 | +| server.serverConfig | object | `{}` | | |
| 182 | +| server.tesseraLivecycle | object | `{}` | | |
| 183 | +| server.witnessing | object | `{}` | | |
| 184 | +| service.ports[0].name | string | `"6962-tcp"` | | |
| 185 | +| service.ports[0].port | int | `80` | | |
| 186 | +| service.ports[0].protocol | string | `"TCP"` | | |
| 187 | +| service.ports[0].targetPort | int | `6962` | | |
| 188 | +| service.type | string | `"ClusterIP"` | | |
| 189 | +| serviceAccount.annotations | object | `{}` | | |
| 190 | +| serviceAccount.automount | bool | `true` | | |
| 191 | +| serviceAccount.create | bool | `true` | | |
| 192 | +| serviceAccount.name | string | `""` | | |
| 193 | +| terminationGracePeriodSeconds | int | `65` | | |
| 194 | +| tolerations | list | `[]` | | |
0 commit comments