5. Users (Console / API / Mobile)

2 user type · 9 role · mobile device 의 secure enclave host

User Type 2 종

user-roles.md, p.1: 사용자 유형은 Console user / API user 2 종. 권한 매트릭스는 동일한 9 role 사용. 인증·자격증명·자동화 표면이 다름.

Console UserAPI User
인증email + (password 또는 SSO via IdP) + TOTP 2FA 필수CSR/X.509 (RSA 4096) + API key
인터페이스Fireblocks Console (Web)REST API / SDK / API Co-signer
Mobile device 의존일부 role (Owner/Admin/NSA/Signer/Approver/Security Admin)
IP 제한workspace-level IP allowlisting (Owner-only)per-API-user IP allowlist (/32 CIDR)

Unified users 테이블

CREATE TABLE users (
  id              BINARY(16) PRIMARY KEY,
  workspace_id    BINARY(16) NOT NULL,
  type            ENUM('console', 'api') NOT NULL,
  role_id         VARCHAR(32) NOT NULL,                -- 9 role
  status          ENUM('pending', 'active', 'deleted') NOT NULL,
  first_name      VARCHAR(64),
  last_name       VARCHAR(64),
  email           VARCHAR(255),                        -- workspace 내 UNIQUE
  created_by_user_id BINARY(16) NOT NULL,
  created_at      DATETIME(6) NOT NULL,
  activated_at    DATETIME(6),                          -- initial setup 완료
  deleted_at      DATETIME(6),                          -- soft delete (audit 위해 row 유지)
  UNIQUE KEY (workspace_id, email),
  KEY (workspace_id, type, status)
);

-- Console user 의 SSO / password 정보는 외부 (IdP / Auth0). DB 는 email + type 만.
-- 본 테이블에는 password hash 저장 X. SSO 사용 시 IdP 가 password 관리.

API User Lifecycle (Stage 4)

EventActor승인비고
AddO / A / NSAOwner + Admin Quorum (Console user 와 same flow)CSR 생성 (RSA 4096) → Console 에서 upload + Co-signer setup
Re-enroll"Admin-level users"Owner approval + key share approvalTrigger: 초기 Co-signer setup 오류 / 페어링 / Callback Handler 변경. Pairing token 1시간 유효
Rename"Admin-level users"Owner + Admin QuorumAPI key 불변
DeleteOwner 단독즉시, mobile approval 불요API key 즉시 invalid → in-flight tx 실패, 새 서명 거부. Co-signer 페어링 잔존 (별도 unpair 작업)

Mobile Device — Primary MPC Share Host (★ Stage 5)

about-the-fireblocks-mobile-app.md, p.1: MPC key share 는 device 의 secure enclave 에 보관 (hardware-encrypted). iCloud / Google Cloud 백업 불가.

CREATE TABLE mobile_devices (
  id                BINARY(16) PRIMARY KEY,
  user_id           BINARY(16) NOT NULL,
  device_uuid       VARCHAR(128) NOT NULL,
  platform          ENUM('ios', 'android') NOT NULL,
  enclave_pubkey    BLOB NOT NULL,                     -- secure enclave attested pubkey
  app_version       VARCHAR(32) NOT NULL,
  registered_at     DATETIME(6) NOT NULL,
  re_enrolled_at    DATETIME(6),
  uninstalled_at    DATETIME(6),                       -- 비가역적 (recovery 필요)
  KEY (user_id),
  UNIQUE KEY (device_uuid)
);

-- mobile device 의 lifecycle 이벤트 (append-only)
CREATE TABLE mobile_device_events (
  id                BINARY(16) PRIMARY KEY,
  device_id         BINARY(16) NOT NULL,
  event_type        ENUM('registered', 're-enrolled', 'migrated',
                          'uninstalled', 'biometric-changed') NOT NULL,
  owner_approval_at DATETIME(6),                       -- 2-day window 1
  user_approval_at  DATETIME(6),                       -- 2-day window 2
  occurred_at       DATETIME(6) NOT NULL
);

3 비밀 Layer

  • PIN: mobile app 잠금 해제
  • Mobile app passphrase: app-level 추가 잠금
  • Recovery passphrase: cloud backup 의 암호화 키 (→ 12. Recovery)

Device Migration (Stage 5)

device-migration.md, p.2: 사용자 본인 self-service, 관리자 승인 없이 PIN + passphrase + biometric 3중 인증.

Linked Users / Linked Workspaces

한 mobile device 에 multiple users / workspaces 가 linked 가능. 각각 별도 재등록 필요.

CREATE TABLE device_user_links (
  device_id    BINARY(16) NOT NULL,
  user_id      BINARY(16) NOT NULL,
  workspace_id BINARY(16) NOT NULL,
  linked_at    DATETIME(6) NOT NULL,
  PRIMARY KEY (device_id, user_id),
  KEY (workspace_id)
);

Uninstall 비가역성

  • 일반 user: re-download + re-enroll 로 회복
  • Owner: Key Share Recovery 필수 (단순 재설치로 회복 불가)