보안 아키텍처
믿지 마시고, 검증하십시오.
이 페이지의 모든 주장은 지키겠다고 약속한 정책이 아니라 설계의 성질입니다. 정책은 경영진이 바뀌면 함께 바뀌지만 수학은 그렇지 않습니다. Keyvaci에 저장한 비밀에 정확히 무슨 일이 일어나는지 설명합니다.
핵심 원리
비밀이 지나는 전 과정
키는 사용자의 기기에서 태어납니다
최초 설정 시 마스터 비밀번호가 Argon2id(메모리 64 MiB, 무차별 대입에 의도적으로 비싼 설정)를 거쳐 마스터 키를 만들고, 이 키가 개인용 X25519 암호화 키쌍과 Ed25519 서명 키쌍을 보호합니다. 마스터 비밀번호와 마스터 키는 브라우저를 벗어나지 않습니다.
조직이 연대 서명합니다
관리자가 다른 경로로 본인과 키의 대조 코드를 확인한 뒤 조직 서명 키로 연대 서명합니다. 그때부터 조직의 모든 기기는 무언가를 맡기기 전에 그 키가 정말 본인의 것인지 검증할 수 있습니다.
항목은 클라이언트에서 봉인됩니다
보관함마다 고유한 키가 있습니다. 보관함 이름을 포함한 모든 항목은 사용자의 기기에서 XChaCha20-Poly1305 인증 암호화로 암호화됩니다. 저희에게 전달되고 저희가 저장하는 것은 그 암호문입니다.
공유는 서명된 암호 연산입니다
보관함을 공유하면 연대 서명을 검증한 뒤 보관함 키를 수신자의 공개 키로 암호화하고, 그 권한 부여(그랜트)에 서명해 다른 키로 우회될 수 없게 합니다. 권한을 회수하면 보관함은 새 키로 다시 암호화됩니다.
정직한 목록
저희 서버가 보유하는 것
제로 지식 주장은 그 목록만큼만 신뢰할 수 있습니다. 아래가 저희의 목록입니다.
| 데이터 | 실제로 저장하는 것 | Keyvaci가 읽을 수 있는가 |
|---|---|---|
| 보관함 항목(비밀번호, 메모) | XChaCha20-Poly1305 암호문 | 아니요 |
| 보관함 이름 | 항목과 동일하게 암호화된 암호문 | 아니요 |
| 사용자의 마스터 비밀번호 | 없음. 전송되지 않습니다 | 아니요 |
| 개인 키 | 사용자의 마스터 키로 봉인된 암호문 | 아니요 |
| 조직 복구 키와 서명 키 | 없음. 고객 측에서 생성하고 보관합니다 | 아니요 |
| 공개 키와 연대 서명 | 평문(설계상 공개되는 값입니다) | 예 |
| 구성원의 이름과 이메일 | 평문. 계정 운영에 필요합니다 | 예 |
| 감사 이벤트(누가 언제 무엇을 했는지) | 평문 메타데이터, 추가만 가능 | 예 |
| 로그인 링크(이메일 로그인 전용) | SHA-256 다이제스트만 저장하며, 한 번만 쓸 수 있고 보낸 지 5분 뒤 죽습니다. 보유할 로그인 비밀번호가 없습니다 | 다이제스트만 |
결론을 있는 그대로 말하면, Keyvaci 데이터베이스가 완전히 탈취되어도 나오는 것은 암호문과 공개 키, 메타데이터뿐입니다. 보관함을 복호화하는 데 필요한 재료는 애초에 훔쳐 갈 자리에 없습니다.
다층 방어
암호 기술을 둘러싼 장치들
표시할 때 재인증
자격 증명을 읽으려면 최근에 이루어진 인증이 필요하며, TOTP를 선택할 수 있습니다. 세션 토큰만으로는 보관함 항목이 열리지 않습니다.
목적이 분명한 속도 제한
표시와 보관함 열기에는 사용자별 속도 제한이 걸립니다. 탈취되어 재인증까지 통과한 세션이라도 조직의 비밀을 한꺼번에 내보낼 수 없습니다.
엣지 보호
모든 트래픽은 API 앞단의 WAF(관리형 규칙 세트, IP 평판, 속도 규칙)를 통과하며, API 원본은 그곳을 거치지 않은 요청을 거부합니다.
테넌트 격리
모든 레코드는 조직 단위로 구분되어 매 요청마다 확인되며, CI에서 실행되는 교차 테넌트 격리 테스트가 이를 검증합니다.
추가만 가능한 감사 기록
감사 서비스의 데이터베이스 권한 자체가 새 이벤트 쓰기만 허용합니다. 위변조는 정책 위반이 아니라 권한 오류입니다.
엄격한 세션
복호화 키는 메모리에만 존재하며 잠글 때, 15분간 사용하지 않을 때, 탭이 숨겨질 때 지워집니다. 로그인 시점의 최신성과 대상은 매 요청마다 IdP의 키로 검증합니다.
앱이 늘어도 규칙은 그대로
확장과 휴대폰에 허용하지 않은 것
브라우저 확장과 모바일 앱을 더하는 지점이야말로 대부분의 보관함이 자기 규칙을 슬며시 느슨하게 만드는 곳입니다. 무언가가 대신 키를 들고 있어 주면 비밀번호 입력은 훨씬 편해지기 때문입니다. 아래는 저희가 느슨해지기를 거부한 지점과, 그 거부가 치르는 대가입니다.
| 규칙 | 어떻게 강제되는가 |
|---|---|
| 암호화 구현은 하나뿐 | 확장과 휴대폰은 웹 앱과 같은 암호화와 같은 검증 체인을 소스로 그대로 씁니다. 어긋날 두 번째 사본도, 매개변수가 더 약한 클라이언트도 없습니다. 휴대폰에서 키 파생을 64 MiB 그대로 네이티브로 돌리는 이유가 바로 이것입니다 |
| 서명 검증을 통과하지 못한 항목은 버린다 | 웹 앱은 의심스러운 항목 옆에 경고를 띄울 여유가 있습니다. 자동 완성 메뉴에는 그런 대화를 할 자리가 없습니다. 그래서 조직 서명, 권한 부여 서명, 작성자 서명 중 하나라도 통과하지 못하면 버려지고 결코 제시되지 않습니다. 검증되지 않은 출처에서 비밀번호를 채워 넣는 일만큼은 이 클라이언트들이 절대 해서는 안 됩니다 |
| 모든 열람은 감사에 남는다 | 보기, 복사, 채워 넣기 모두 콘솔과 동일한 감사 기록형 열람을 거치며, 휴대폰에서 다른 앱으로 채워 넣는 경우도 포함됩니다. 두 번째 클라이언트는 이 제품이 내세우는 로그를 우회하는 길이 아닙니다 |
| 사람 없이는 자동 완성이 동작하지 않는다 | iOS 공급자는 시스템이 제공하는 무인 경로를 거부하고, 매번 자신의 프로세스에서 마스터 비밀번호를 요구합니다. 그 요청에 조용히 답할 수 있다는 것은 어딘가에 키가 보관되어 있다는 뜻입니다 |
| 메뉴는 지금 열린 사이트만 안다 | 일치 판정은 정확한 호스트 또는 진짜 상하위 관계로만 하며, 부분 문자열로는 절대 하지 않습니다. 페이지의 출처는 페이지의 주장이 아니라 브라우저에서 가져옵니다. 악의적인 사이트에서 유도된 잘못된 클릭은 원래 그 사이트의 것이던 자격 증명만 채울 수 있습니다 |
| 키는 유휴 시간이 아니라 기한으로 만료된다 | 잠금 해제 10분 뒤, 확장과 휴대폰은 사용자가 돌아왔든 아니든 키를 지웁니다. 휴대폰은 앱이 화면을 벗어나는 즉시에도 지우므로 앱 전환기가 열린 보관함을 담고 있는 일이 없습니다 |
| 보관함은 회사 비밀번호를 결코 보지 않는다 | Microsoft 로그인은 브라우저나 운영체제가 소유한 창에서 이루어지며, 확장은 그 창을 스크립트로 조작할 수도 읽을 수도 없습니다 |
정직한 예외가 하나 있고, 그 결정은 읽는 분의 몫입니다. Face ID를 켜면 마스터 비밀번호가 그 기기 한 대에 저장됩니다. 기기의 보안 하드웨어가 지키며, 등록된 생체 정보가 바뀌면 자동으로 무효가 됩니다. 기본은 꺼짐이고, 동의하는 화면에서 이 거래를 그대로 설명하며, 마스터 비밀번호는 30일마다 그리고 비밀번호가 바뀐 직후에 반드시 다시 요구됩니다. 생체 인증만이 유일한 입구가 되는 상태는 결코 없습니다.
분명히 밝히는 한계
제로 지식이 해 주지 않는 것
장점만 나열하는 보안 페이지는 마케팅입니다. 아래는 이 모델의 경계선이며, 각각에 대해 저희가 한 조치입니다.
기기 보안은 고객의 몫입니다
복호화는 고객의 기기에서 일어나므로, 구성원의 기기에 악성코드가 있으면 그 구성원이 보는 것을 함께 볼 수 있습니다. 자동 잠금, 자동 숨김, 클립보드 삭제, 표시 기록은 그 틈을 좁힐 뿐 없애지는 못합니다.
복구는 실제로 강력한 권한입니다
조직 복구 키는 어떤 구성원의 키든 복원할 수 있고, 따라서 그 사람의 보관함을 읽을 수 있습니다. 저희는 최초 설정 단계에서 모든 구성원에게 이 사실을 분명한 말로 알리며, 모든 복구는 감사 기록에 남습니다. 이 키트는 그 이름값 그대로 최고 등급의 비밀로 지키십시오.
키를 잃으면 데이터를 잃습니다
구성원이 마스터 비밀번호를 잊고 조직도 복구 키트를 잃어버리면 그 데이터는 사라집니다. 저희를 포함해 누구도 되돌릴 수 없습니다. 가입 단계에서 이 경고를 반복하는 이유는, 데이터를 읽을 수 없는 서버가 치러야 할 정직한 대가이기 때문입니다.
이 아키텍처를 실제로 써 보십시오
14일, 모든 기능, 카드 불필요. 검토 중에 어려운 질문이 있으시면 보안 담당자가 keyvaci@xnorgroup.com으로 언제든 문의하셔도 좋습니다.