Initial pack: Peergos EU audit verification and DataCube audit-ready checklist
Some checks are pending
ci / markdown (push) Waiting to run
Some checks are pending
ci / markdown (push) Waiting to run
Cure53 Berlin 2019 and ROS Amsterdam 2024 are pentests, not HIPAA/SOC2/ISO certificates. BAA/DPA guidance for ciphertext-at-rest on cryptree+IPFS.
This commit is contained in:
commit
afa270a141
9 changed files with 392 additions and 0 deletions
19
.forgejo/workflows/ci.yml
Normal file
19
.forgejo/workflows/ci.yml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
name: ci
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
jobs:
|
||||
markdown:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: required files
|
||||
run: |
|
||||
test -f README.md
|
||||
test -f LICENSE
|
||||
test -f PEERGOS-VERIFICATION.md
|
||||
test -f BAA-DPA.md
|
||||
test -f CHECKLIST.md
|
||||
grep -q "not a HIPAA" README.md
|
||||
grep -q "Cure53" PEERGOS-VERIFICATION.md
|
||||
grep -q "Radically Open Security" PEERGOS-VERIFICATION.md
|
||||
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
.venv/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
keys/
|
||||
*.pem
|
||||
*.sk
|
||||
85
BAA-DPA.md
Normal file
85
BAA-DPA.md
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
# BAAs and DPAs when ciphertext has no host keys
|
||||
|
||||
This is **guidance for an evidence pack**, not legal advice.
|
||||
|
||||
## The operator statement
|
||||
|
||||
Data at rest lives in the **encrypted Peergos cryptree**. Restore uses
|
||||
**distributed, hash-verified, encrypted IPFS blocks**. Hosts and backup
|
||||
media see **opaque blobs** (and random CHAMP labels), not filenames, not
|
||||
PHI, not social graph — if keys never leave the client / customer HSM.
|
||||
|
||||
That is **true of the Peergos design** (see `PEERGOS-VERIFICATION.md`).
|
||||
It **changes the BAA/DPA conversation**. It does **not** auto-delete the
|
||||
need for contracts.
|
||||
|
||||
## HIPAA (US) — Business Associate
|
||||
|
||||
A Business Associate is a person who **creates, receives, maintains, or
|
||||
transmits ePHI** for a covered entity.
|
||||
|
||||
**Technical argument you can make (and should document):**
|
||||
|
||||
1. ePHI is encrypted **before** it leaves the endpoint (Peergos client /
|
||||
DataCube writer).
|
||||
2. The storage node, IPFS, disk, and backup hold **ciphertext + hashes**.
|
||||
3. Private keys **do not** reside on the storage host (customer HSM /
|
||||
client). Hash verification detects tampering.
|
||||
4. Therefore the host **cannot maintain ePHI in intelligible form**.
|
||||
|
||||
HHS has long distinguished **conduits** and parties that never have
|
||||
access to ePHI. Many security programs still **sign a BAA anyway** when
|
||||
a vendor touches infrastructure, because:
|
||||
|
||||
- misconfiguration could later expose keys or plaintext logs;
|
||||
- support staff might be asked to handle a decrypted export;
|
||||
- OCR looks at **your** risk analysis, not only crypto papers.
|
||||
|
||||
**Practical pack:** risk analysis memo citing cryptree + IPFS hash
|
||||
checks + key custody (`HSM-CUSTODY` in system-git-sync); BAA **or**
|
||||
written determination that the vendor is **not** a BA because they
|
||||
cannot decrypt; list every party with disk/backup (ns1, IPFS cluster,
|
||||
offsite replica).
|
||||
|
||||
## GDPR (EU/UK) — processor vs technical measure
|
||||
|
||||
Encrypted data can still be **personal data** if it is reasonably
|
||||
attributable (usernames, IPs, invoice identity). GDPR **Art. 32**
|
||||
explicitly lists encryption as a security measure.
|
||||
|
||||
**Technical argument:**
|
||||
|
||||
- Peergos is designed so the **server is an adversary** for content and
|
||||
most metadata.
|
||||
- EU-based **independent pentests** (Cure53 DE, ROS NL) evaluated that
|
||||
design.
|
||||
- Processing location for **self-host** is *your* ns1 / customer region,
|
||||
not peergos.net’s Germany hosting, unless you use peergos.net.
|
||||
|
||||
You may still need a **DPA (Art. 28)** with anyone who **processes**
|
||||
personal data (even usernames, logs, billing). Ciphertext-only storage
|
||||
**narrows** the DPA’s technical annex (they never see PHI bodies) but
|
||||
rarely deletes the contract if they run the VM.
|
||||
|
||||
## NATS operators
|
||||
|
||||
NATS is an **untrusted broker**. Content is HPKE; destinations and
|
||||
subjects are in the clear. A NATS operator:
|
||||
|
||||
- **cannot** read message bodies if they lack endpoint private keys;
|
||||
- **can** see routing metadata (who talks to which inbox, sizes, timing);
|
||||
- **can** drop/delay/copy **ciphertext**.
|
||||
|
||||
Treat NATS like a **transit provider**: DPA/BAA depends on whether
|
||||
routing metadata is personal data in your jurisdiction. Document
|
||||
passthrough + HPKE in the data-flow diagram.
|
||||
|
||||
## What “making yourself audit-ready” means here
|
||||
|
||||
You are **not** buying Peergos’s Cure53/ROS reports as *your* SOC 2.
|
||||
You are **reusing** those public evaluations as **vendor/component
|
||||
assurance** (like using an audited TLS library), then adding:
|
||||
|
||||
- your scope, RoPA, key-custody, inspect k-of-n, admin-history;
|
||||
- evidence *your* instance ran those controls;
|
||||
- contracts that match who can actually see plaintext.
|
||||
54
CHECKLIST.md
Normal file
54
CHECKLIST.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Audit-ready checklist (Verae DataCubes + Peergos)
|
||||
|
||||
Use this as a working list. Check items only when **evidence exists**
|
||||
(screenshot, log export, signed policy, ticket). This list is not a
|
||||
certificate.
|
||||
|
||||
## A. Scope and data map
|
||||
|
||||
- [ ] Named legal entity and systems in scope (console, Drive, NATS, IPFS, ns1)
|
||||
- [ ] Data-flow diagram: endpoint → HPKE/NATS → cryptree/IPFS
|
||||
- [ ] What is PHI / personal data vs ciphertext vs routing metadata
|
||||
- [ ] Peergos verification file attached (`PEERGOS-VERIFICATION.md`)
|
||||
|
||||
## B. Keys and encryption
|
||||
|
||||
- [ ] Customer holds Peergos/Drive keys; not on storage host
|
||||
- [ ] NPE/HPKE endpoint keys in directory; private 0600; no xor content
|
||||
- [ ] Signed Ed25519 config; unsigned rejected; admin-history prev+new+diff
|
||||
- [ ] HSM or documented lab-to-HSM path (`HSM-CUSTODY.md` in system-git-sync)
|
||||
|
||||
## C. Access
|
||||
|
||||
- [ ] Console `PFC_REQUIRE_AUTH=1`, TOTP; Drive login separate
|
||||
- [ ] Inspect k-of-n; author is not an officer; log-before-reveal
|
||||
- [ ] Joiner / mover / leaver for console users
|
||||
- [ ] Google SSO does **not** unwrap cubes
|
||||
|
||||
## D. Integrity and backup
|
||||
|
||||
- [ ] Cube chain append-only JSONL; dual hash
|
||||
- [ ] Hash registry: first SHA-256 and receipt win
|
||||
- [ ] Peergos/IPFS: hash-verified encrypted blocks (restore = re-fetch CIDs)
|
||||
- [ ] Restore test: recover a cube from content-addressed ciphertext without
|
||||
plaintext backup tapes
|
||||
|
||||
## E. Logging
|
||||
|
||||
- [ ] Inspect audit events
|
||||
- [ ] SM summaries: codes + lookup_id only (no bodies)
|
||||
- [ ] Admin-history cube for config
|
||||
|
||||
## F. Contracts (counsel)
|
||||
|
||||
- [ ] Written BA / not-a-BA determination for disk, VM, backup, IPFS
|
||||
- [ ] DPA Art. 28 where usernames/logs/IPs are processed
|
||||
- [ ] NATS operator: metadata vs content in the annex
|
||||
- [ ] Peergos component assurance: attach Cure53 2019 + ROS 2024 PDFs
|
||||
(public; not your org’s ISO/SOC report)
|
||||
|
||||
## G. Independent audit of *you*
|
||||
|
||||
- [ ] SOC 2 Type I/II engagement **or** ISO 27001 registrar **or** HIPAA
|
||||
risk analysis + policies (pick the program you actually need)
|
||||
- [ ] Evidence window (Type II / surveillance) if applicable
|
||||
22
HOWTO.md
Normal file
22
HOWTO.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# How to use this pack
|
||||
|
||||
1. Read `PEERGOS-VERIFICATION.md` so you do not over-claim Peergos audits.
|
||||
2. Fill `CHECKLIST.md` with **your** instance evidence (ns1, keys, users).
|
||||
3. Give `BAA-DPA.md` to counsel with the data-flow from `README.md`.
|
||||
4. Point auditors at live technical surfaces (do not give them private keys):
|
||||
|
||||
- https://pfc.georgelambert.org/health
|
||||
- https://pfc.georgelambert.org/v1/npe/keys (public keys only)
|
||||
- https://docs.pfc.georgelambert.org/controls.html
|
||||
- https://docs.pfc.georgelambert.org/custody.html
|
||||
- Peergos Drive (cryptree) on your host
|
||||
|
||||
5. Attach the two **public** Peergos pentest PDFs from
|
||||
https://github.com/Peergos/Peergos/tree/master/audits as **vendor
|
||||
security evaluations**, labeled “not our SOC 2 / ISO certificate”.
|
||||
|
||||
Related code/docs:
|
||||
|
||||
- https://git.georgelambert.org/marchon/peergos-for-compliance
|
||||
- https://git.georgelambert.org/marchon/system-git-sync
|
||||
- https://git.georgelambert.org/marchon/secure-messaging
|
||||
19
LICENSE
Normal file
19
LICENSE
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
Copyright 2026 Verae / George Lambert
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
33
MODULE.md
Normal file
33
MODULE.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# MODULE — peergos-making-yourself-audit-ready-with-verae-datacubes
|
||||
|
||||
Git: https://git.georgelambert.org/marchon/peergos-making-yourself-audit-ready-with-verae-datacubes
|
||||
|
||||
This is **not** a HIPAA/SOC 2/ISO certificate.
|
||||
|
||||
## What this module is
|
||||
|
||||
Documentation pack: how an organization uses Verae DataCubes on Peergos
|
||||
to **prepare for** an audit. Includes sourced verification of Peergos’s
|
||||
EU security evaluations and a BAA/DPA discussion for ciphertext-at-rest.
|
||||
|
||||
## Who calls this module and why
|
||||
|
||||
Compliance, counsel, and auditors. No runtime NATS publisher.
|
||||
|
||||
## Messages — from / to
|
||||
|
||||
None. Static git + rendered docs.
|
||||
|
||||
## Filters / security
|
||||
|
||||
Do not claim Peergos pentests are your ISO/SOC certificate. Do not commit
|
||||
private keys. Public key directory URLs only.
|
||||
|
||||
## Errors and timeouts
|
||||
|
||||
n/a
|
||||
|
||||
## Where data is stored
|
||||
|
||||
This repo on git.georgelambert.org. Live cubes remain on Peergos cryptree
|
||||
+ IPFS; NATS carries HPKE content.
|
||||
81
PEERGOS-VERIFICATION.md
Normal file
81
PEERGOS-VERIFICATION.md
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
# Peergos verification (what was actually audited)
|
||||
|
||||
This file records **sourced** facts. It does **not** turn Peergos, Verae, or
|
||||
DataCubes into a HIPAA, SOC 2, or ISO 27001 certificate.
|
||||
|
||||
## Claim to check
|
||||
|
||||
> Data at rest is stored in an encrypted append-only Peergos filesystem;
|
||||
> backup/restore is managed via a distributed, hashed, encrypted Peergos
|
||||
> IPFS system, designed and evaluated in the EU as an audited secure
|
||||
> filesystem.
|
||||
|
||||
## Verified
|
||||
|
||||
### Independent security audits (Europe)
|
||||
|
||||
| Year | Firm | Where | What | Outcome (as published) | Primary sources |
|
||||
|---|---|---|---|---|---|
|
||||
| 2019 | **Cure53** | Berlin, Germany | Pentest, source-code audit, **crypto/design review** of Peergos (May–June 2019) | Peergos: no fundamental architectural or cryptographic problems found; reported issues fixed. Cure53 concluded the platform **passed this evaluation**. | [peergos.org/posts/security-audit](https://peergos.org/posts/security-audit); [cure53.de/pentest-report_peergos.pdf](https://cure53.de/pentest-report_peergos.pdf); [github.com/Peergos/Peergos/tree/master/audits](https://github.com/Peergos/Peergos/tree/master/audits) |
|
||||
| 2024 | **Radically Open Security B.V.** | Amsterdam, Netherlands | Crystal-box pentest + code audit of Peergos web-ui (Sep–Nov 2024), report dated 18 Nov 2024 | **0** extreme / high / elevated findings; **2** moderate, **6** low; Peergos states all fixed; none resulted in data exposure or integrity compromise (mostly UI crashes). | [peergos.org/posts/security-audit-2024](https://peergos.org/posts/security-audit-2024); ROS PDF in the same GitHub `audits/` tree |
|
||||
|
||||
Both firms are **EU-based**. Both full reports are **public**. That is a
|
||||
**security evaluation of the Peergos protocol/implementation**, not a
|
||||
HIPAA/SOC 2/ISO management-system certificate.
|
||||
|
||||
### EU funding / NLNet
|
||||
|
||||
- Peergos received funding from the **European Union Horizon 2020** programme
|
||||
under **NGI-POINTER**, grant **871528** (stated on the 2024 audit post).
|
||||
- The 2024 audit was supported by **NLnet** (Netherlands).
|
||||
|
||||
### Hosted instance location (peergos.net, not necessarily your self-host)
|
||||
|
||||
Peergos’s hosted privacy notice states the hosted instance uses servers in
|
||||
**Germany** and encrypted object storage, with backups that may use other
|
||||
providers (e.g. Backblaze S3). **Self-hosted ns1 / customer cryptree is a
|
||||
different processing location** and must be documented in *your* RoPA / BAA
|
||||
pack.
|
||||
|
||||
Source: [peergos.net/privacy.html](https://peergos.net/privacy.html)
|
||||
|
||||
### Encrypted filesystem + hashed IPFS (design)
|
||||
|
||||
Documented Peergos design (matches “encrypted, hashed, distributed”):
|
||||
|
||||
- **Cryptree**: tree of symmetric keys; fine-grained read/write caps; sibling
|
||||
names hidden from a cap-holder of one file. Writes are **signed**.
|
||||
[book.peergos.org/security/cryptree.html](https://book.peergos.org/security/cryptree.html)
|
||||
- **Chunks**: up to 5 MiB, padded, independently encrypted
|
||||
(Salsa20-Poly1305 / TweetNaCl); random 256-bit keys (not convergent).
|
||||
[book.peergos.org/security/encryption.html](https://book.peergos.org/security/encryption.html)
|
||||
- **IPFS**: content-addressed blocks. Peergos **verifies the hash** of every
|
||||
block read from or written to IPFS (server cannot silently swap bytes).
|
||||
Client verifies hashes and signatures of data from a Peergos server.
|
||||
[book.peergos.org/security/trust.html](https://book.peergos.org/security/trust.html)
|
||||
- **CHAMP**: encrypted cryptree nodes under **random 32-byte labels**; server
|
||||
cannot deduce file size or directory shape from the label graph.
|
||||
- Sharing: hybrid **X25519 + ML-KEM-1024** (post-quantum hybrid) for follow
|
||||
requests.
|
||||
|
||||
That is an **append-mostly / capability / content-addressed** encrypted
|
||||
filesystem. “Append-only” in Verae DataCubes is the **cube chain JSONL**
|
||||
(application integrity). Peergos itself uses signed updates and immutable
|
||||
blocks; directory pointers move forward. Do not conflate the two layers in
|
||||
an audit interview.
|
||||
|
||||
## Not verified / do not claim
|
||||
|
||||
| Phrase | Status |
|
||||
|---|---|
|
||||
| “Peergos is HIPAA certified” | **False.** HIPAA is not a product certificate. |
|
||||
| “Peergos is SOC 2 / ISO 27001 certified” | **Not shown** in the public materials above. The published work is **security pentest/code audit**, not a Type II or ISO registrar certificate. |
|
||||
| “EU evaluated Peergos as a certified secure filesystem under a government FS standard” | **Overstated.** What exists: EU **grant funding**, NLNet-funded **ROS pentest**, Cure53 **Berlin** design+code audit. |
|
||||
| “Hosts with disk/backup never need a BAA/DPA” | **Legal conclusion — not a technical fact.** See `BAA-DPA.md`. Encryption + no keys at the host is a **strong Art. 32 / HIPAA Security Rule argument**; counsel still decides. |
|
||||
|
||||
## How Verae uses this
|
||||
|
||||
Verae DataCubes sit **on** Peergos cryptree (Drive) plus a **console** identity
|
||||
plane (TOTP, k-of-n inspect). Backup of cubes is **content-addressed encrypted
|
||||
blocks** (Peergos/IPFS), not a plaintext dump. That is the technical story to
|
||||
hand an auditor, with the sources in this file.
|
||||
73
README.md
Normal file
73
README.md
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# Making yourself audit-ready with Verae DataCubes
|
||||
|
||||
How to **prepare an organization** for HIPAA-aligned, SOC 2, or ISO 27001
|
||||
work using Verae DataCubes on **Peergos** (encrypted cryptree + hashed
|
||||
IPFS) and HPKE on an **untrusted NATS** broker.
|
||||
|
||||
**This repository is not a HIPAA, SOC 2, or ISO certificate.**
|
||||
Peergos’s public pentests are **not** your Type II or ISO registrar
|
||||
certificate. They are **component security evaluations** you can attach.
|
||||
|
||||
## What we verified about Peergos (EU)
|
||||
|
||||
Full sources: [`PEERGOS-VERIFICATION.md`](PEERGOS-VERIFICATION.md).
|
||||
|
||||
| Fact | Verified? |
|
||||
|---|---|
|
||||
| Encrypted client-side filesystem (cryptree); keys not on the storage server | Yes — Peergos book + Cure53 design review |
|
||||
| IPFS blocks content-addressed; Peergos verifies hashes (tamper-evident restore) | Yes — [trust-free layers](https://book.peergos.org/security/trust.html) |
|
||||
| Independent **EU** security audits, reports published | **Yes — two:** Cure53 **Berlin** (2019); Radically Open Security **Amsterdam** (2024, NLnet; EU Horizon 2020 NGI-POINTER mentioned on the post) |
|
||||
| “Peergos is HIPAA/SOC 2/ISO certified” | **No.** Those audits are pentest/code/design reviews, not management-system certificates |
|
||||
|
||||
So: Peergos **was designed as a trust-minimized encrypted filesystem**,
|
||||
**evaluated in Europe** by two specialist firms, with **public reports**.
|
||||
That supports the **at-rest / backup** story. It does **not** finish
|
||||
*your* audit.
|
||||
|
||||
## Architecture (audit interview in one page)
|
||||
|
||||
```
|
||||
Endpoint (keys stay here / HSM)
|
||||
│ HPKE content (NPE suite)
|
||||
│ routing: dest + subject in the clear
|
||||
▼
|
||||
Untrusted NATS (cannot read bodies)
|
||||
│
|
||||
▼
|
||||
Verae DataCube chain (append-only hashes)
|
||||
│ written through Peergos client
|
||||
▼
|
||||
Peergos cryptree (encrypted names, sizes, graph)
|
||||
│ chunks → CID / hash
|
||||
▼
|
||||
IPFS (distributed, hash-verified ciphertext)
|
||||
```
|
||||
|
||||
- **At rest:** Peergos cryptree + IPFS. Hosts with disk/backup see
|
||||
**opaque hashed ciphertext**, not PHI, if they lack keys.
|
||||
- **In transit (NATS):** HPKE-Base to directory public keys. Broker is
|
||||
honest-but-curious: destinations yes, bodies no.
|
||||
- **Integrity:** cube JSONL chain + dual hash + IPFS CID check on
|
||||
restore (re-fetch blocks, re-verify hashes — not a plaintext tape).
|
||||
|
||||
## BAAs / DPAs
|
||||
|
||||
Ciphertext-without-keys **narrows** who is a Business Associate or
|
||||
GDPR processor for **content**. It does **not** automatically delete
|
||||
contracts for VMs, usernames, or logs. See [`BAA-DPA.md`](BAA-DPA.md).
|
||||
|
||||
## Pack
|
||||
|
||||
| File | Use |
|
||||
|---|---|
|
||||
| `PEERGOS-VERIFICATION.md` | Sourced Peergos/EU audit facts |
|
||||
| `BAA-DPA.md` | Counsel briefing |
|
||||
| `CHECKLIST.md` | Evidence list |
|
||||
| `HOWTO.md` | How to hand this to an auditor |
|
||||
| `MODULE.md` | Callers / non-runtime |
|
||||
|
||||
Live technical surfaces (ns1): https://pfc.georgelambert.org/health ·
|
||||
https://pfc.georgelambert.org/v1/npe/keys ·
|
||||
https://docs.pfc.georgelambert.org/controls.html
|
||||
|
||||
Related: https://git.georgelambert.org/marchon/system-git-sync
|
||||
Loading…
Add table
Add a link
Reference in a new issue