DB 권한과 격리의 실체
행 단위 보안은 스위치가 아니라 지도다
작은 조직 AI·서버 보안 기본기의 넷째 갈래입니다. 작은 조직이 많이 쓰는 클라우드 DB 서비스에서 「보안 경고를 따라 켰다」, 「프로젝트를 나눴으니 분리됐다」고 믿었다가 부딪힌 자리를 모았습니다. 예시는 수파베이스지만 다른 서비스에도 같은 원리가 통합니다.
1. 행 단위 보안은 「누가 어떤 키로 들어오나」를 그린 지도다
DB 서비스가 「표 24개에 행 단위 보안이 꺼져 있다」고 경고한 일이 있었습니다. 현장 기록에 따르면 그 상태에서는 공개 키 하나로 매장 판매 기록과 조합원 명부를 누구나 읽고 쓸 수 있었습니다. 그렇다고 경고를 따라 24개를 한꺼번에 켰다면 매장 앱이 그 자리에서 멈췄을 것입니다. 매장 앱이 바로 그 공개 키로 표를 직접 읽고 쓰고 있었기 때문입니다.
풀어 갈 실마리는 하나인데, 서버 쪽에서 쓰는 관리자 키는 행 단위 보안을 언제나 건너뜁니다. 그래서 먼저 표마다 두 가지를 확인합니다. 화면 코드가 이 표를 직접 건드리는가, 서버가 이 표에 관리자 키로만 접근하는가입니다.
화면이 직접 건드리지 않고 서버가 관리자 키로만 접근하는 표부터 켜면 서비스가 멈추지 않습니다. 그 사이에 걸리는 나머지 표는 앱을 로그인 기반으로 바꾸거나, 화면이 서버를 거쳐 읽도록 바꾼 뒤에 켭니다.
켤 때 걸리는 함정
- 저장한 뒤 그 결과를 돌려받는 코드는 쓰기 정책만으로 부족하고 읽기 정책도 필요합니다. 읽기 정책이 없으면 저장 자체가 실패합니다.
- 로그인한 화면은 익명 사용자가 아니라 로그인 사용자 역할로 들어옵니다. 정책을 익명 역할에만 걸면 로그인한 직원이 막힙니다.
- 직원이 매일 쓰는 흐름은 살리고 지난 자료는 막고 싶다면, 최근 며칠 치만 읽게 하는 정책이 쓸 만했습니다. 다만 익명 읽기 창을 여는 만큼, 그 기간의 자료는 공개 키를 가진 누구에게나 열린다는 점을 받아들이는 선택입니다.
관리자 키가 행 단위 보안을 통째로 건너뛰는 만큼, 여러 프로젝트를 한 곳에 모을수록 그 키 한 장이 닿는 범위가 넓어집니다. 모으는 편리함과 키 한 장의 무게를 같이 따져 봅니다.
2. 무료 요금제에서는 프로젝트를 나눠도 격리가 되지 않는다
급여나 개인정보 같은 민감 자료를 떼어 두려고 DB 프로젝트를 따로 판 일이 있었습니다. 그런데 서비스 문서를 확인해 보니 무료 요금제에서는 조직에 초대된 사람이 그 조직의 모든 프로젝트를 봅니다. 프로젝트 단위로 역할을 나누는 기능은 유료 요금제에만 있었습니다.
무료 요금제에서 쓸 수 있는 실질적인 수단은 셋입니다.
- 담당자를 DB 관리 화면에 초대하지 않고, 행 단위 보안이 걸린 업무 화면만 줍니다.
- 민감한 자료는 애초에 그 DB에 올리지 않습니다.
- 격리가 꼭 필요하면 유료 요금제로 옮깁니다.
3. 공개층과 기밀층을 가른다
한 조직의 모든 정보를 하나의 지식그래프로 잇되, 주민등록번호와 실명, 개인별 출자 명부는 따로 떼어 기밀 저장소에 둔 사례가 있습니다. 기록에 따르면 챗봇이 쓰는 계정에는 기밀 저장소를 읽을 권한 자체를 주지 않았고, 직접 읽기를 시도하면 인증 거부가 돌아오는 것으로 확인했습니다.
두 층은 같은 식별자로 이어 두는데, 그러면 권한 있는 사람은 두 층을 합쳐 볼 수 있고, 챗봇은 공개층만 봅니다. 자료를 넣기 전후로 공개층에 실명이 한 건도 없는지, 기존 자료가 하나도 바뀌지 않았는지를 셉니다.
처음에는 안전을 이유로 주민등록번호를 일부만 남기려 했으나, 서류 작업에 전체 번호가 필요하다는 요구가 있었습니다. 그래서 전체 원문을 기밀층에 두었습니다. 안전한 기본값보다 실제 업무의 요구가 앞서지만, 그만큼 격리는 확실해야 합니다.
4. 정적 위키에 등급별 열람을 무료로 붙이는 방법
정적 사이트로 만든 위키에도 문서마다 열람 등급을 붙일 수 있습니다. 유료 접근 관리 제품 없이 무료 요금제 안에서 됩니다.
- 문서 머리에 열람 등급을 적으면 빌드가 그 문서의 주소 앞에 등급 표시를 붙입니다.
- 호스팅이 제공하는 서버 함수가 등급 표시가 붙은 경로만 검사합니다. 로그인 토큰으로 사람을 확인하고 회원 표에서 그 사람의 등급을 찾습니다.
- 로그인은 이메일로 받는 일회용 링크로 합니다.
- 관리자 키는 서버 함수의 환경변수에만 둡니다.
등급 하나로 시작해 「등급과 소속」 두 축으로 넓힐 수 있습니다.
주소 앞 등급 표시로 거르는 방식은 그 표시 밖으로 나가는 사본을 따로 빼야 완성됩니다. 검색 색인, 사이트맵, RSS, 첨부 파일, 백업 파일이 그런 자리입니다.