# 보안 및 개인정보 보호 Frost는 무엇이든 저장하기 전에, 사용자만 가진 키로 사용자의 컴퓨터에서 백업을 암호화합니다. 키가 없으면 클라우드 제공업체도, Permafrost 운영자도, 서버나 드라이브에 접근할 수 있는 다른 사람도, Frost 개발자도 그 내용을 읽을 수 없습니다. Frost에는 계정이 없으며, 사용자나 사용 방식에 관한 어떤 정보도 수집하지 않습니다. Frost가 연결하는 곳은 사용자의 스토리지, 그리고 업데이트를 확인하고 내려받기 위한 GitHub뿐입니다. ## 암호화되는 것 Frost는 파일 내용, 파일 이름, 폴더 구조, 각 스냅샷의 세부 정보 등 백업 안의 모든 것을 암호화합니다. 설정 도우미는 작은 평문 테스트 객체도 전송한 뒤 삭제합니다. 이 객체에는 파일, 이름, 암호화 키가 들어 있지 않습니다. Frost는 키를 서버로 보내거나 복구용 사본을 대신 보관하지 않습니다. | 구성 요소 | 방식 | | --- | --- | | 키 | `frost init`이 컴퓨터에서 만드는 무작위 256비트 | | 복구 문구 | 키 자체를 24개의 BIP39 단어로 적은 것 | | 암호화 | XChaCha20-Poly1305. 객체마다 새 무작위 nonce를 씁니다 | | 청크 이름 | 청크 내용에 대해 사용자의 키로 계산한 HMAC-SHA256 | | 압축 | zstd. 암호화 전에, 크기가 줄어들 때만 압축합니다 | ## 스토리지가 볼 수 있는 것 스토리지를 운영하거나 읽을 수 있는 쪽은 다음을 볼 수 있습니다. 클라우드 제공업체나 Permafrost이고, 셀프 호스팅 서버나 드라이브라면 그곳에 접근할 수 있는 모든 사람입니다. - 객체의 개수, 각 객체의 크기, 업로드된 시각. - 어떤 객체가 청크, 스냅샷 헤더, 파일 목록 색인인지. - 언제 백업하고 복원하는지, 그리고 어떤 IP 주소에서 하는지. - 백업마다 업로드한 새 데이터 양. 이를 통해 얼마나 바뀌었는지 짐작할 수 있습니다. 새 내용이 없는 백업은 스냅샷을 저장하지 않으므로, 새 스냅샷이 생기면 무언가 바뀌었다는 것을 알 수 있습니다. - 작은 파일의 압축 후 대략적인 크기. 하지만 그 파일이 무엇인지, 이름이 무엇인지는 알 수 없습니다. 큰 파일은 크기가 제각각인 청크로 나뉘므로, 원래 크기의 객체 하나로 나타나지 않습니다. 제공업체는 사용자가 특정한 알려진 파일을 가지고 있는지 확인할 수 없습니다. 청크 이름과 분할 위치 모두 사용자의 키에 따라 정해지기 때문입니다. ## Frost가 막아 주는 것 - 스토리지를 운영하거나 스토리지에 접근할 수 있는 쪽이 파일을 읽는 것. 버킷, 서버의 폴더, 드라이브의 사본을 손에 넣은 사람도 포함됩니다. - 사용자와 스토리지 사이의 네트워크에 있는 사람. 연결에는 TLS나 SSH를 쓰지만, S3 엔드포인트를 `http://`로 지정하거나 스킴을 지정하지 않은 엔드포인트에 `storage.s3.insecure`를 켜면 쓰지 않습니다. Permafrost는 사용자의 컴퓨터에서만 `http://`를 허용합니다. 암호화하지 않은 HTTP는 로컬 테스트에만 쓰세요. 어느 쪽이든 모든 백업 객체는 인증됩니다. - 셀프 호스팅 서버인 척하는 사람. SSH는 서버의 호스트 키를 확인하고, 바뀐 키는 거부합니다. 자세한 내용은 [셀프 호스팅](#self-hosted)을 참고하세요. - 변조. 수정되거나, 바꿔치기되거나, 잘린 객체는 복호화에 실패하며, Frost는 이를 조용히 받아들이지 않습니다. - 복원이 사용자가 고른 폴더 밖에 파일을 쓰는 것. - 변조된 Frost 다운로드. 모든 릴리스에는 서명이 있으며, 설치 프로그램과 npm의 `getfrost` 패키지, `frost update`는 설치 전에 서명을 확인합니다. ## Frost가 막을 수 없는 것 - **사용자의 컴퓨터에 접근할 수 있는 사람.** 예약된 백업이 실행될 수 있도록 키 파일이 컴퓨터에 있으며, 셀프 호스팅용 Frost의 SSH 키도 마찬가지입니다. 키 파일을 읽을 수 있거나 사용자 권한으로 프로그램을 실행할 수 있는 사람은 백업을 읽을 수 있습니다. 디스크 전체 암호화와 화면 잠금을 사용하세요. - **스토리지의 데이터 손실.** 스토리지를 관리하는 쪽이 객체를 삭제하거나 내주지 않을 수 있고, 드라이브가 고장 나거나 없어질 수도 있습니다. 표본 검사로 알아챌 수는 있지만, Frost가 막을 수는 없습니다. 잃어서는 안 되는 것은 컴퓨터 옆의 드라이브가 아닌 다른 곳에 독립된 사본을 하나 더 두세요. - **숨겨진 스냅샷.** 스토리지가 최신 스냅샷을 숨기고 예전 것만 내줄 수 있습니다. 최신 스냅샷을 본 적이 있는 컴퓨터는 사라졌다고 보고하지만, 새 컴퓨터는 알아챌 방법이 없습니다. 그래도 내주는 스냅샷은 모두 진짜입니다. - **시각과 크기.** 앞에서 설명했듯이 언제, 얼마나 백업하는지는 드러납니다. ## 컴퓨터에 있는 파일 macOS와 Linux에서 Frost는 사용자 본인만 접근할 수 있는 권한으로 개인 파일을 만듭니다. 기존 파일이나 스케줄러가 만든 로그의 권한은 다를 수 있습니다. Windows에서는 사용자 프로필의 권한을 상속합니다. 단, Frost의 SSH 키는 예외로, 그 폴더는 사용자 계정만 열 수 있습니다. 설정과 캐시는 다른 사용자가 읽을 수 없는 폴더에 두세요. | 파일 | 내용 | | --- | --- | | `key` | 복구 문구(평문) | | `config.toml` | 설정과 스토리지 자격 증명 | | `ssh/frost_ed25519` | 셀프 호스팅용 Frost의 SSH 키 | | `manifest-*.jsonl` | 청크 ID, 파일 경로, 크기, 수정 시각. 컴퓨터 밖으로 나가지 않습니다 | | `frost.log` | 예약된 백업의 출력. 읽지 못한 경로도 포함됩니다 | 위치는 [파일 및 폴더](#files-and-folders)에 정리되어 있습니다. ## 권장 사항 - 복구 문구는 종이나 믿을 수 있는 비밀번호 관리자에 오프라인으로 보관하세요. - 가끔 `frost key verify`를 실행해 적어 둔 복구 문구가 맞는지 확인하세요. - Frost에는 전용 버킷에만 접근할 수 있는 스토리지 자격 증명이나, 다른 중요한 것을 바꿀 수 없는 서버 계정을 주세요. - 가끔 `frost status`를 확인하고, 상태에 문제가 있으면 바로 살펴보세요. ## 보안 문제 신고하기 공개 issue는 열지 마세요. Frost GitHub 저장소의 [Security 탭](https://github.com/whatithasisandalwayswillbe/frost/security)에서 **Report a vulnerability**로 비공개 신고해 주세요. 발견한 내용, 재현 방법, 공격자가 얻을 수 있는 것을 적어 주세요. 일주일 안에 답변을 드립니다.