본문으로 건너뛰기
보안

테넌트를 무엇이 지키는지, 있는 그대로.

보유하지 않은 인증도, 통제를 대신하는 형용사도 없습니다. 무엇이, 어디에서 강제되는지와 무엇이 빠져 있는지를 적었습니다.

열여섯 개의 워크스페이스, 그 사이엔 아무것도 없음4×4 격자로 배열된 워크스페이스 셀들이며, 각 셀은 운영자, 키, 설정 버전, 감사 로그를 담고 있습니다. 셀 사이의 간격은 실선으로 그려져 있고, 그림 어디에서도 그 선을 넘는 경로는 없습니다. 한 셀이 세 배 크기로 펼쳐져 있습니다. 워크스페이스 범위의 저장소, 각각 키 id를 가진 API 키와 웹훅 시크릿, 그리고 데이터베이스 트리거로 강제되는 추가 전용 감사 로그입니다.워크스페이스격리는 구조적입니다01020304050607080910111213141516하나의 워크스페이스workspace_id데이터 계층의 모든 질의가 하나를 받습니다api_key(kid)겹치는 기간에 걸쳐 교체됩니다webhook_secret(kid)같은 방식으로 교체됩니다audit_log추가 전용 — DB 트리거로 강제어떤 경로도 간극을 넘지 않습니다 — 없다는 것이 핵심입니다데이터 계층의 모든 질의는 워크스페이스를 요구합니다. 그것을 생략할 수 있는 호출부는 없습니다.
워크스페이스 열여섯. 두 칸 사이에는 아무 선도 그리지 않았습니다. 그 사이에는 아무것도 쓸 수 없기 때문입니다.
멀티테넌시

격리는 감시가 아니라 구조입니다.

워크스페이스 소유 데이터에 대한 모든 쿼리는 조건절에 워크스페이스 id를 담습니다. 쓰는 것을 잊어버릴 만한, 범위가 없는 접근 경로 자체가 없습니다.

이 설계가 없애는 실패는 가장 흔한 그것입니다. 올바르게 짜인 시스템에서, 급하게 쓴 새 엔드포인트 하나가 WHERE 절을 빠뜨리는 일 말입니다. 데이터 계층이 워크스페이스를 지목하지 않은 질문에 답하지 않는다면, 그 엔드포인트는 유출로 컴파일되지 않습니다 — 아예 컴파일되지 않습니다.

관행을 믿는 대신 적대적 유출 테스트가 이 성질을 고정합니다. 관행은 그 파일을 마지막으로 읽은 사람만큼만 믿을 수 있기 때문입니다.

internal/tenancy · migrations/0002

기록

감사 로그의 추가 전용은 애플리케이션이 아니라 데이터베이스에 있습니다.

수정이나 삭제가 일어나면 트리거가 예외를 던집니다. 역사를 고쳐 쓰지 않기로 정한 애플리케이션은 정책이고, 고쳐 쓰기를 거부하는 데이터베이스는 통제입니다.

감사인이 묻고 공급사가 대개 답하지 못하는 차이가 이것입니다. 소급 수정을 막는 유일한 근거가 “그런 코드 경로가 없다”라면, 지원 스크립트 하나, 마이그레이션 한 번, 콘솔을 쥔 운영자 한 명이 그것을 할 수 있고 로그는 알지 못합니다.

internal/tenancy · migrations/0002 audit_log_immutable()

자격증명

키는 중단 없이 교체됩니다. 로그인은 피싱에 강합니다.

점검 시간이 필요한 교체는, 실제로는 일어나지 않는 교체입니다.

두 부피와 그 사이의 평면각각 따로 떨어진 두 개의 격자 바닥 위에 서 있는 두 개의 등각 입체와, 그 사이를 모서리에서 바라본 수직 평면. 왼쪽 입체는 운영자의 것으로 네 칸으로 나뉩니다: Stripe, NOWPayments, 은행, 지갑. 오른쪽 입체는 플랫폼의 것으로 원장, 실행, 청구, 발신함으로 나뉩니다. 네 개의 선이 그 사이 평면을 가로지르며 평면 위에 이름이 붙어 있습니다: 이벤트, 지시, 영수증, 명령. 어떤 선도 돈을 나르지 않으며, 오른쪽 입체에는 잔액을 담을 수 있는 칸이 하나도 없습니다.두 부피 · 한 평면 · 문 없음STRIPE원장NOWPAYMENTS실행은행청구지갑아웃박스운영자XEX수탁 경계이벤트지시영수명령어떤 부피도 넘지 않음돈은 운영자의 칸에 있으며, 우리 쪽으로 복사되지 않습니다.네 가지가 이 평면을 넘습니다. 그중 어느 것도 잔액이 아니며, 키도 아닙니다.
두 개의 부피와 그 사이의 평면 하나. 그 평면에는 문이 없습니다.
  1. 01

    유효 기간이 겹치는 키 id

    워크스페이스별 API 키와 웹훅 서명 키는 키 id를 가집니다. 교체 기간에는 둘 다 유효하므로 당신의 일정에 맞춰 전환하고 그 뒤에 폐기하면 됩니다.

    internal/tenancy · internal/outbox/sign.go

  2. 02

    회원과 운영자 모두를 위한 패스키

    사용자 확인과 디스커버러블 자격증명을 필수로 하는 WebAuthn입니다 — 선택이 아닙니다. 이 토큰들은 자금 흐름 바로 앞에 서 있기 때문입니다. 디스커버러블 로그인은 자격증명에서 계정을 찾아내므로 입력할 것이 없고, 따라서 낚아챌 것도 없습니다.

    internal/passkey

  3. 03

    인증 앱 2단계, 올바른 방식으로 저장

    TOTP 시크릿은 해시할 수 없습니다 — 검증이 그것으로 코드를 다시 계산하기 때문입니다 — 그래서 회원 시크릿은 평문 대신 용도별 서브키 아래 AES-256-GCM으로 봉인합니다. 받아들인 코드의 카운터는 되기록되므로 같은 코드를 유효 구간 안에서 재사용할 수 없습니다.

    internal/membertotp · internal/secretbox

  4. 04

    해시할 수 있으면 해시, 못 하면 봉인

    비밀번호나 복구 코드는 해시합니다. 플랫폼은 “이것이 맞는가?”만 답하면 되기 때문입니다. 플랫폼이 다시 읽어야 하는 시크릿은 대신 봉인하며, 이 구조 이전에 만들어진 저장소는 그대로 두지 않고 옮기는 중입니다.

    internal/secretbox

아웃바운드

당신이 설정한 URL로는 아무것도 새어 나가지 않습니다.

웹훅 목적지는 구조상 공격자가 영향을 줄 수 있는 입력입니다 — 테넌트가 타이핑한 URL이고, 플랫폼은 그것을 자기 네트워크 안에서 호출합니다.

디스패처는 호스트명을 믿는 대신 요청 전에 아웃바운드 가드를 돌립니다. 도움이 되는 순서는 이것뿐입니다. 이름 해석 뒤에 하는 검사나, 주소가 아니라 문자열에 대고 하는 검사는 DNS 리바인딩이 통과하도록 설계된 바로 그 검사입니다. 루프백과 사설 목적지는 샌드박스와 종단 간 테스트에서만 허용되며, 그 완화는 환경을 눈치로 판별하는 것이 아니라 명시적 플래그입니다.

internal/outbox/ssrf.go · internal/outbox/dispatcher.go

수탁

우리는 수탁자가 아니며, 코드가 수탁자가 되기를 거부합니다.

회원 자금 없음. 개인키 없음. 테넌트의 결제 수단 안에 플랫폼 자격증명 없음.

회원은 당신에게 냅니다

모든 수단은 테넌트 자신의 자격증명으로, 테넌트 자신의 계좌 위에 설정됩니다.

internal/rails

설정이 우리 것을 거부합니다

플랫폼 자체의 자격증명과 일치하는 값을 저장하는 것은 거부됩니다. 이 검사가 있는 이유는 “일단 우리 걸로”가 소프트웨어 공급자가 얼떨결에 지급결제 기관이 되는 경로이기 때문입니다.

internal/rails

청구는 지시할 뿐, 옮기지 않습니다

청구는 정확한 원장 라인을 선점하고 지시를 내보냅니다. 집행은 당신의 것이고, 집행 대상이 되는 돈도 당신의 것입니다.

internal/claims

신원

서류를 보관하지 않는 신원 확인.

제공자 세션은 당신의 계정 위에서 돕니다. 돌아오는 것은 판정과 되돌릴 수 없는 핸들입니다.

그 핸들은 “한 사람에 한 자리”를 강제하기에 충분하고, 그 이상은 아닙니다. 신원을 복원하기에는 부족한데 바로 그것이 요점입니다. 여권 스캔본을 가장 안전하게 보관하는 방법은 보관하지 않는 것이고, 유출은 애초에 저장되지 않은 데이터를 드러낼 수 없습니다.

internal/verification

주장하지 않는 것

우리가 주장하지 않는 것.

공급사 평가 설문을 채우는 중이라면, 우리가 떨어질 항목은 아래와 같습니다. 넉 달째에 아는 것보다 여기서 아는 편이 낫습니다.

SOC 2 보고서를 보유하고 있지 않습니다. 제3자 침투 테스트를 받은 적이 없습니다. 가용성 약속은 게시하지 않습니다. 아직 그것을 측정하는 장치가 없기 때문입니다. XEX는 통제 수단과 기록을 제공합니다. 인가를 주지는 않으며, 법률 자문도 아닙니다. 당신의 보상 플랜이 마케팅하는 나라에서 적법한지는 당신이 확인할 몫이고, 플랫폼 약관도 그렇게 요구합니다.
취약점 신고
현재 버그 바운티 프로그램은 없고 신고에 대한 보상도 지급하지 않습니다. 연락처 페이지의 보안 경로로 취약점을 신고해 주세요. 접수를 확인하고 어떻게 처리하는지 알려 드립니다. 실제 테넌트의 워크스페이스를 대상으로 테스트하지는 말아 주세요 — 제품 전체인 무료 샌드박스를 받아 거기서 테스트해 주세요.

See /contact#security

다음

설문을 보내시거나, 샌드박스를 받아 직접 확인하세요.

둘 다 괜찮습니다. 하나가 더 빠를 뿐입니다.