From 8b00dcdace63dd1a2785630f67cda9bb8b1a288d Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Tue, 4 Aug 2026 19:36:31 +0300 Subject: [PATCH 1/7] ci: move Harbor registry refs to repository variables, add .gitleaksignore The internal registry hostname now comes from the ASTERA_REGISTRY and SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE repository variables instead of workflow literals. The astera job fails fast when ASTERA_REGISTRY is unset, since login-action would otherwise default to Docker Hub and send the Harbor credentials there. Remaining README/Dockerfile.astera references are intentional docs for internal use; their historical scan fingerprints are listed in .gitleaksignore to quiet the warn-only internal-refs check. --- .github/workflows/docker.yml | 15 +++++++++++++-- .gitleaksignore | 29 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 .gitleaksignore diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index c799383f..de8349d8 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,11 +17,13 @@ env: # public registry path. PUBLIC_REGISTRY: ${{ vars.SAMPLEWORKS_PUBLIC_REGISTRY || 'docker.io' }} PUBLIC_IMAGE_NAME: ${{ vars.SAMPLEWORKS_PUBLIC_IMAGE || 'diffuseproject/pixi-with-checkpoints' }} - CHECKPOINTS_SOURCE_IMAGE: ${{ vars.SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE || 'harbor.astera.sh/library/sampleworks-checkpoints@sha256:ff1dd2b42c3afd593e034cf81df1bf1862c27ae491f46cc10e105629f1102781' }} + # No in-repo fallback: the digest-pinned Harbor ref lives in the repository + # variable so the internal registry hostname stays out of git. + CHECKPOINTS_SOURCE_IMAGE: ${{ vars.SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE }} CHECKPOINTS_DOCKERHUB_IMAGE: ${{ vars.SAMPLEWORKS_CHECKPOINTS_DOCKERHUB_IMAGE || 'docker.io/diffuseproject/sampleworks-checkpoints:latest' }} CUDA_BASE_IMAGE: ${{ vars.SAMPLEWORKS_CUDA_BASE_IMAGE || 'nvidia/cuda:12.4.1-devel-ubuntu22.04@sha256:da6791294b0b04d7e65d87b7451d6f2390b4d36225ab0701ee7dfec5769829f5' }} - ASTERA_REGISTRY: harbor.astera.sh + ASTERA_REGISTRY: ${{ vars.ASTERA_REGISTRY }} ASTERA_IMAGE_NAME: library/pixi-with-checkpoints SKOPEO_IMAGE: quay.io/skopeo/stable@sha256:c7d3c512612f52805023cd38351081dad7e2729fc13d14b701e47c7c8bdd6615 @@ -191,6 +193,15 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4 + - name: Validate Astera registry configured + run: | + # login-action with an empty registry defaults to Docker Hub and + # would send the Harbor credentials there; fail fast instead. + if [ -z "${ASTERA_REGISTRY}" ]; then + echo "ASTERA_REGISTRY repository variable must be set." + exit 1 + fi + - name: Login to Harbor uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4 with: diff --git a/.gitleaksignore b/.gitleaksignore new file mode 100644 index 00000000..6c2487d2 --- /dev/null +++ b/.gitleaksignore @@ -0,0 +1,29 @@ +# Internal Astera references intentionally kept while this repo is private +# (README/Dockerfile docs for Astera-internal usage). Per the going-public +# runbook the repo gets republished as a fresh single-commit repo anyway, +# so these historical fingerprints only silence the warn-only scan. +21f51bdfe62805e30e61a72d8d9ca74a861ddecb:README.md:astera-internal-hostname:161 +2da1e2dffb9ab646a8189b189aed03b9693222b0:Dockerfile:astera-internal-hostname:11 +2da1e2dffb9ab646a8189b189aed03b9693222b0:Dockerfile:astera-internal-hostname:111 +2da1e2dffb9ab646a8189b189aed03b9693222b0:Dockerfile:astera-internal-hostname:59 +535c66566162b4a693055e34b0777cb55cbb9c78:README.md:astera-internal-hostname:161 +57f3beceb44da3d751cd16d8afb61dd2d10f50de:README.md:astera-internal-hostname:161 +95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:11 +95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:112 +95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:59 +95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:16 +95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:4 +95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:49 +95b5b3a49ae45eac48d4075204620ab37ba5b803:README.md:astera-internal-hostname:167 +aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:12 +aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:16 +aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:20 +aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:24 +aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:28 +aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:263 +aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:264 +aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:303 +cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:21 +cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:25 +cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:29 +e56d1f1199de7e0238f013a58b8d0f2b4a4962ee:README.md:astera-internal-hostname:161 From ddb21e38efb37e612cde9dd05006b5ed9e62051c Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Wed, 5 Aug 2026 20:08:47 +0300 Subject: [PATCH 2/7] ci: drop .gitleaksignore, genericize pending sampleworks is a public repo, so suppressing the internal-reference warning is the wrong response: the alert is reporting real disclosure, not noise. --- .gitleaksignore | 29 ----------------------------- README.md | 5 +++-- 2 files changed, 3 insertions(+), 31 deletions(-) delete mode 100644 .gitleaksignore diff --git a/.gitleaksignore b/.gitleaksignore deleted file mode 100644 index 6c2487d2..00000000 --- a/.gitleaksignore +++ /dev/null @@ -1,29 +0,0 @@ -# Internal Astera references intentionally kept while this repo is private -# (README/Dockerfile docs for Astera-internal usage). Per the going-public -# runbook the repo gets republished as a fresh single-commit repo anyway, -# so these historical fingerprints only silence the warn-only scan. -21f51bdfe62805e30e61a72d8d9ca74a861ddecb:README.md:astera-internal-hostname:161 -2da1e2dffb9ab646a8189b189aed03b9693222b0:Dockerfile:astera-internal-hostname:11 -2da1e2dffb9ab646a8189b189aed03b9693222b0:Dockerfile:astera-internal-hostname:111 -2da1e2dffb9ab646a8189b189aed03b9693222b0:Dockerfile:astera-internal-hostname:59 -535c66566162b4a693055e34b0777cb55cbb9c78:README.md:astera-internal-hostname:161 -57f3beceb44da3d751cd16d8afb61dd2d10f50de:README.md:astera-internal-hostname:161 -95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:11 -95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:112 -95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:59 -95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:16 -95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:4 -95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:49 -95b5b3a49ae45eac48d4075204620ab37ba5b803:README.md:astera-internal-hostname:167 -aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:12 -aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:16 -aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:20 -aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:24 -aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:28 -aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:263 -aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:264 -aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:303 -cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:21 -cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:25 -cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:29 -e56d1f1199de7e0238f013a58b8d0f2b4a4962ee:README.md:astera-internal-hostname:161 diff --git a/README.md b/README.md index 7b901e09..a83dd5e3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Currently, each structure prediction model has a different implementation, requi ## Citation If you use **sampleworks**, please cite: - + Chrispens, K., Collins, M., Mai, D., Wankowicz, S. A., Fraser, J. S., & van den Bedem, H. (2026). sampleworks: A Modular Platform for Experimentally Guided Biomolecular Ensemble Generation. https://doi.org/10.82153/jkxj-tw08 ## Installation @@ -319,7 +319,8 @@ CI configuration variables: |---|---| | `SAMPLEWORKS_PUBLIC_REGISTRY` | Public registry host; defaults to `docker.io` | | `SAMPLEWORKS_PUBLIC_IMAGE` | Public image path; defaults to `diffuseproject/pixi-with-checkpoints` | -| `SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE` | Optional private/source checkpoint image that CI mirrors to Docker Hub; defaults to the current digest-pinned Harbor image | +| `SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE` | **Required.** Digest-pinned private/source checkpoint image that CI mirrors to Docker Hub; no in-repo default so the internal registry hostname stays out of git | +| `ASTERA_REGISTRY` | **Required.** Internal registry host for the Astera overlay image; the astera CI job fails fast when unset | | `SAMPLEWORKS_CHECKPOINTS_DOCKERHUB_IMAGE` | Optional public Docker Hub checkpoint mirror destination tag; defaults to `docker.io/diffuseproject/sampleworks-checkpoints:latest` | | `SAMPLEWORKS_CUDA_BASE_IMAGE` | Optional digest-pinned CUDA base override | From 977aeaa927be6b5db3e9dad6945b31f6e55629a0 Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Wed, 5 Aug 2026 20:24:56 +0300 Subject: [PATCH 3/7] docs: use the actl sampleworks image alias, drop internal registry refs The actl image catalog already resolves the `sampleworks` alias to a digest-pinned Harbor ref, so the README no longer needs to spell out the internal registry. That also pins the image the docs point at, which the mutable tag did not. Maintainer-only local builds take the registry host from ASTERA_REGISTRY, the same variable CI uses. --- Dockerfile.astera | 5 +++-- README.md | 13 +++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Dockerfile.astera b/Dockerfile.astera index c159a837..166fb431 100644 --- a/Dockerfile.astera +++ b/Dockerfile.astera @@ -5,11 +5,12 @@ # private image adds Astera-only tooling (EXT, rsync, editor conveniences) and is # pushed to Harbor. It intentionally does not duplicate the public build. # -# Build locally: +# Build locally (ASTERA_REGISTRY = the internal registry host, same value as +# the CI repository variable): # docker build --platform linux/amd64 \ # -f Dockerfile.astera \ # --build-arg PIXI_WITH_CHECKPOINTS_IMAGE=diffuseproject/pixi-with-checkpoints:local \ -# -t harbor.astera.sh/library/pixi-with-checkpoints:local \ +# -t "${ASTERA_REGISTRY}/library/pixi-with-checkpoints:local" \ # . ARG PIXI_WITH_CHECKPOINTS_IMAGE diff --git a/README.md b/README.md index a83dd5e3..511ceb47 100644 --- a/README.md +++ b/README.md @@ -167,10 +167,10 @@ setting equivalent local paths for `DATA_DIR`, `PROTEINS_CSV`, `RESULTS_DIR`, `MSA_CACHE_DIR`, and model checkpoints. Start an 8-GPU ACTL machine named `sampleworks` with the private Astera -`pixi-with-checkpoints:sampleworks` image and the shared data volume mounted: +`sampleworks` image alias and the shared data volume mounted: ```bash -actl pod up sampleworks --profile 8x --image harbor.astera.sh/library/pixi-with-checkpoints:sampleworks --storage shared --pvc-size 200Gi --mount diffuse-shared --yes +actl pod up sampleworks --profile 8x --image sampleworks --storage shared --pvc-size 200Gi --mount diffuse-shared --yes ``` Keep that terminal open; it maintains sync and SSH. From another terminal: @@ -299,8 +299,7 @@ Image names: | Purpose | Image | |---|---| | Public Sampleworks runtime | `diffuseproject/pixi-with-checkpoints` | -| Astera/ACTL runtime | `harbor.astera.sh/library/pixi-with-checkpoints` | -| ACTL scientist tag | `harbor.astera.sh/library/pixi-with-checkpoints:sampleworks` | +| Astera/ACTL runtime | `sampleworks` alias; run `actl pod images` for the resolved, digest-pinned ref | CI publishes these tags: @@ -333,13 +332,15 @@ docker build --platform linux/amd64 \ . ``` -Build the Astera overlay locally after a public image is available: +Build the Astera overlay locally after a public image is available. Set +`ASTERA_REGISTRY` to the internal registry host (same value as the CI +repository variable): ```bash docker build --platform linux/amd64 \ -f Dockerfile.astera \ --build-arg PIXI_WITH_CHECKPOINTS_IMAGE=diffuseproject/pixi-with-checkpoints:local \ - -t harbor.astera.sh/library/pixi-with-checkpoints:local \ + -t "${ASTERA_REGISTRY}/library/pixi-with-checkpoints:local" \ . ``` From d7f2905aa8bbe843c590a93c3ca345dfc12d5a23 Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Thu, 6 Aug 2026 21:19:49 +0300 Subject: [PATCH 4/7] ci: make only the registry host a secret, keep path and digest public Repository variables are not masked in Actions logs, and this repo is public, so the registry host would have been printed by login-action and metadata-action on every run. Making the bare host a secret masks it everywhere it appears, since masking is substring-based, while leaving image paths and digests readable for debugging a failed build. The source-image guard now checks the parts rather than the composed ref: an unset host still yields a non-empty, digest-pinned-looking string. --- .github/workflows/docker.yml | 33 ++++++++++++++++++++++++--------- README.md | 10 ++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index de8349d8..101ae938 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,13 +17,16 @@ env: # public registry path. PUBLIC_REGISTRY: ${{ vars.SAMPLEWORKS_PUBLIC_REGISTRY || 'docker.io' }} PUBLIC_IMAGE_NAME: ${{ vars.SAMPLEWORKS_PUBLIC_IMAGE || 'diffuseproject/pixi-with-checkpoints' }} - # No in-repo fallback: the digest-pinned Harbor ref lives in the repository - # variable so the internal registry hostname stays out of git. - CHECKPOINTS_SOURCE_IMAGE: ${{ vars.SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE }} CHECKPOINTS_DOCKERHUB_IMAGE: ${{ vars.SAMPLEWORKS_CHECKPOINTS_DOCKERHUB_IMAGE || 'docker.io/diffuseproject/sampleworks-checkpoints:latest' }} CUDA_BASE_IMAGE: ${{ vars.SAMPLEWORKS_CUDA_BASE_IMAGE || 'nvidia/cuda:12.4.1-devel-ubuntu22.04@sha256:da6791294b0b04d7e65d87b7451d6f2390b4d36225ab0701ee7dfec5769829f5' }} - ASTERA_REGISTRY: ${{ vars.ASTERA_REGISTRY }} + # Only the registry HOST is secret (repo secret ASTERA_REGISTRY); image paths + # and digests stay plain variables. This repo is public, so its Actions logs + # are public and only secrets are masked. Masking is substring-based, so + # keeping the secret to the bare host masks it inside every longer image ref + # while leaving digests readable when a build fails. It is set per job because + # workflow-level env cannot read the secrets context. + CHECKPOINTS_SOURCE_PATH: ${{ vars.SAMPLEWORKS_CHECKPOINTS_SOURCE_PATH }} ASTERA_IMAGE_NAME: library/pixi-with-checkpoints SKOPEO_IMAGE: quay.io/skopeo/stable@sha256:c7d3c512612f52805023cd38351081dad7e2729fc13d14b701e47c7c8bdd6615 @@ -35,6 +38,9 @@ jobs: runs-on: diffuse-sh-builder permissions: contents: read + env: + ASTERA_REGISTRY: ${{ secrets.ASTERA_REGISTRY }} + CHECKPOINTS_SOURCE_IMAGE: ${{ secrets.ASTERA_REGISTRY }}/${{ vars.SAMPLEWORKS_CHECKPOINTS_SOURCE_PATH }} outputs: checkpoints_digest: ${{ steps.verify_checkpoints.outputs.checkpoints_digest }} @@ -46,12 +52,19 @@ jobs: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} run: | - if [ -z "${CHECKPOINTS_SOURCE_IMAGE}" ] || [ -z "${CHECKPOINTS_DOCKERHUB_IMAGE}" ]; then - echo "Checkpoint source and Docker Hub destination image refs must be set." + # Check the parts, not the composed ref: an unset ASTERA_REGISTRY + # still yields a non-empty "/library/...@sha256:..." that would pass + # both the emptiness and the digest-pinned checks below. + if [ -z "${ASTERA_REGISTRY}" ] || [ -z "${CHECKPOINTS_SOURCE_PATH}" ]; then + echo "ASTERA_REGISTRY secret and SAMPLEWORKS_CHECKPOINTS_SOURCE_PATH variable must be set." exit 1 fi - if [ "${CHECKPOINTS_SOURCE_IMAGE}" = "${CHECKPOINTS_SOURCE_IMAGE%@*}" ]; then - echo "CHECKPOINTS_SOURCE_IMAGE must be digest-pinned." + if [ -z "${CHECKPOINTS_DOCKERHUB_IMAGE}" ]; then + echo "Docker Hub destination image ref must be set." + exit 1 + fi + if [ "${CHECKPOINTS_SOURCE_PATH}" = "${CHECKPOINTS_SOURCE_PATH%@*}" ]; then + echo "SAMPLEWORKS_CHECKPOINTS_SOURCE_PATH must be digest-pinned." exit 1 fi if [ -z "${HARBOR_USERNAME}" ] || [ -z "${HARBOR_PASSWORD}" ]; then @@ -183,6 +196,8 @@ jobs: needs: public permissions: contents: read + env: + ASTERA_REGISTRY: ${{ secrets.ASTERA_REGISTRY }} steps: - name: Checkout code @@ -198,7 +213,7 @@ jobs: # login-action with an empty registry defaults to Docker Hub and # would send the Harbor credentials there; fail fast instead. if [ -z "${ASTERA_REGISTRY}" ]; then - echo "ASTERA_REGISTRY repository variable must be set." + echo "ASTERA_REGISTRY repository secret must be set." exit 1 fi diff --git a/README.md b/README.md index 511ceb47..a0840123 100644 --- a/README.md +++ b/README.md @@ -318,10 +318,16 @@ CI configuration variables: |---|---| | `SAMPLEWORKS_PUBLIC_REGISTRY` | Public registry host; defaults to `docker.io` | | `SAMPLEWORKS_PUBLIC_IMAGE` | Public image path; defaults to `diffuseproject/pixi-with-checkpoints` | -| `SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE` | **Required.** Digest-pinned private/source checkpoint image that CI mirrors to Docker Hub; no in-repo default so the internal registry hostname stays out of git | -| `ASTERA_REGISTRY` | **Required.** Internal registry host for the Astera overlay image; the astera CI job fails fast when unset | | `SAMPLEWORKS_CHECKPOINTS_DOCKERHUB_IMAGE` | Optional public Docker Hub checkpoint mirror destination tag; defaults to `docker.io/diffuseproject/sampleworks-checkpoints:latest` | | `SAMPLEWORKS_CUDA_BASE_IMAGE` | Optional digest-pinned CUDA base override | +| `SAMPLEWORKS_CHECKPOINTS_SOURCE_PATH` | **Required.** Digest-pinned path of the private checkpoint image CI mirrors to Docker Hub, without the registry host (e.g. `library/foo@sha256:...`) | + +One CI secret, `ASTERA_REGISTRY`, holds the internal registry host. It is a +secret rather than a variable because this repo is public, which makes its +Actions logs public, and only secrets are masked there. Log masking is +substring-based, so keeping the secret to the bare host masks it inside every +longer image ref while leaving paths and digests readable when a build fails. +The CI jobs fail fast when it is unset. Build the public image locally: From 3051d3b8beed1db94480524e8345b6b699fe4ce0 Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Thu, 6 Aug 2026 21:44:09 +0300 Subject: [PATCH 5/7] ci: accept the 18 historical internal-hostname findings Records a deliberate risk acceptance rather than hiding a finding: the host resolves only on the tailnet, so the exposure is reconnaissance -only, and removal would rewrite 81 commits and 22 tags while our forks would keep the objects regardless. Fingerprints are commit-scoped, so new occurrences still alert. Taken from the CI run's own report so they match the org rule config exactly. --- .gitleaksignore | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .gitleaksignore diff --git a/.gitleaksignore b/.gitleaksignore new file mode 100644 index 00000000..df8cfadd --- /dev/null +++ b/.gitleaksignore @@ -0,0 +1,28 @@ +# Accepted internal-reference findings (ENG-597). +# +# Internal registry hostnames present in history from May-June 2026. These are +# accepted, not suppressed in error: the host resolves only on the tailnet, so +# the disclosure is reconnaissance-only, and removing it would mean rewriting 81 +# commits and moving 22 tags while our forks would retain the objects anyway. +# +# Fingerprints are commit-scoped, so a NEW occurrence of an internal hostname +# still alerts. This file accepts these specific historical findings only; it +# does not disable the check. +95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:11 +95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:112 +95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:59 +95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:16 +95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:4 +95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:49 +95b5b3a49ae45eac48d4075204620ab37ba5b803:README.md:astera-internal-hostname:167 +aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:12 +aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:16 +aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:20 +aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:24 +aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:28 +aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:263 +aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:264 +aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:303 +cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:21 +cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:25 +cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:29 From 92f22085292e28ba693ea1f13e1830bd66ad75f1 Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Thu, 6 Aug 2026 21:56:48 +0300 Subject: [PATCH 6/7] ci: reject public registries in ASTERA_REGISTRY, fix secret wording The Harbor credentials are passed to whatever host ASTERA_REGISTRY names, as skopeo --src-creds and as the login-action registry, so pointing it at Docker Hub would hand them to a third party. The empty case was already guarded; this covers the explicitly-public case. Also corrects the local build docs, which still called the value a repository variable after it became a secret. --- .github/workflows/docker.yml | 17 +++++++++++++++-- Dockerfile.astera | 2 +- README.md | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 101ae938..a4b757b8 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -59,6 +59,13 @@ jobs: echo "ASTERA_REGISTRY secret and SAMPLEWORKS_CHECKPOINTS_SOURCE_PATH variable must be set." exit 1 fi + # skopeo receives HARBOR_USERNAME/PASSWORD as --src-creds for this + # host, so a public registry here would leak them to a third party. + case "${ASTERA_REGISTRY}" in + docker.io|index.docker.io|registry-1.docker.io|"${PUBLIC_REGISTRY}") + echo "ASTERA_REGISTRY must be the internal registry, not a public one." + exit 1 ;; + esac if [ -z "${CHECKPOINTS_DOCKERHUB_IMAGE}" ]; then echo "Docker Hub destination image ref must be set." exit 1 @@ -210,12 +217,18 @@ jobs: - name: Validate Astera registry configured run: | - # login-action with an empty registry defaults to Docker Hub and - # would send the Harbor credentials there; fail fast instead. + # The Harbor credentials are sent to whatever host this names, so an + # empty value (login-action then defaults to Docker Hub) or a public + # registry would hand them to a third party. Fail fast on both. if [ -z "${ASTERA_REGISTRY}" ]; then echo "ASTERA_REGISTRY repository secret must be set." exit 1 fi + case "${ASTERA_REGISTRY}" in + docker.io|index.docker.io|registry-1.docker.io|"${PUBLIC_REGISTRY}") + echo "ASTERA_REGISTRY must be the internal registry, not a public one." + exit 1 ;; + esac - name: Login to Harbor uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4 diff --git a/Dockerfile.astera b/Dockerfile.astera index 166fb431..c5da3c29 100644 --- a/Dockerfile.astera +++ b/Dockerfile.astera @@ -6,7 +6,7 @@ # pushed to Harbor. It intentionally does not duplicate the public build. # # Build locally (ASTERA_REGISTRY = the internal registry host, same value as -# the CI repository variable): +# the CI repository secret): # docker build --platform linux/amd64 \ # -f Dockerfile.astera \ # --build-arg PIXI_WITH_CHECKPOINTS_IMAGE=diffuseproject/pixi-with-checkpoints:local \ diff --git a/README.md b/README.md index a0840123..cb529354 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,7 @@ docker build --platform linux/amd64 \ Build the Astera overlay locally after a public image is available. Set `ASTERA_REGISTRY` to the internal registry host (same value as the CI -repository variable): +repository secret): ```bash docker build --platform linux/amd64 \ From d989c430c4c306527a23bc028e3e0a24ac4f0856 Mon Sep 17 00:00:00 2001 From: Abdelsalam Date: Thu, 6 Aug 2026 22:52:59 +0300 Subject: [PATCH 7/7] ci: hold the ignore list pending a decision on where it lives The 18 accepted fingerprints are recorded in ENG-597. Whether they live in-repo or in a central private repo is still open, so this PR ships only the registry cleanup. The internal-ref check stays red meanwhile, which is the status quo, not a regression. --- .gitleaksignore | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 .gitleaksignore diff --git a/.gitleaksignore b/.gitleaksignore deleted file mode 100644 index df8cfadd..00000000 --- a/.gitleaksignore +++ /dev/null @@ -1,28 +0,0 @@ -# Accepted internal-reference findings (ENG-597). -# -# Internal registry hostnames present in history from May-June 2026. These are -# accepted, not suppressed in error: the host resolves only on the tailnet, so -# the disclosure is reconnaissance-only, and removing it would mean rewriting 81 -# commits and moving 22 tags while our forks would retain the objects anyway. -# -# Fingerprints are commit-scoped, so a NEW occurrence of an internal hostname -# still alerts. This file accepts these specific historical findings only; it -# does not disable the check. -95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:11 -95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:112 -95b5b3a49ae45eac48d4075204620ab37ba5b803:Dockerfile:astera-internal-hostname:59 -95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:16 -95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:4 -95b5b3a49ae45eac48d4075204620ab37ba5b803:.github/workflows/docker.yml:astera-internal-hostname:49 -95b5b3a49ae45eac48d4075204620ab37ba5b803:README.md:astera-internal-hostname:167 -aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:12 -aa4cdcf141962491211afa63b0a7174d35b42c30:Dockerfile.astera:astera-internal-hostname:16 -aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:20 -aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:24 -aa4cdcf141962491211afa63b0a7174d35b42c30:.github/workflows/docker.yml:astera-internal-hostname:28 -aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:263 -aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:264 -aa4cdcf141962491211afa63b0a7174d35b42c30:README.md:astera-internal-hostname:303 -cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:21 -cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:25 -cf5873a3aff314755107278226bc4ec49edc083b:.github/workflows/docker.yml:astera-internal-hostname:29