보안 점수를 만드는 일을 오래 하다 보면 민망한 지점에 도달한다. 점수를 안 믿게 된다.
측정 자체를 안 믿는다는 게 아니다. 수치를 세는 건 괜찮다. 도메인을 보고 TLS 인증서가 만료됐다, DMARC가 없다, SSH 배너가 구식이다, 관리 포트가 열려 있다 — 이런 건 전부 실제 신호다. 관찰 가능하고, 의미가 있다.
내가 안 믿게 된 건 마지막 단계다. 그 모든 신호를 숫자 하나로 뭉개놓고 누군가 진지한 표정으로 묻는 순간. “그래서 이거 얼마나 안전해?”
그 숫자는 가짜다. 랜덤이라는 뜻은 아니다. 모든 면에서 쓸모없다는 것도 아니다. 답할 수 없는 질문에 답하는 척한다는 의미에서 가짜다.
위생과 보안은 다르다
도메인이 100점 만점에 95점을 받을 수 있다. HSTS 활성화, DNSSEC 서명, DMARC p=reject, 모든 헤더 완비. 완벽하다. 그리고 다음 주에 VPN 어플라이언스 제로데이로 뚫린다. 어떤 점수 시스템도 그걸 잡지 못했을 것이다. 한편 공유 호스팅에서 돌아가는 개인 블로그는 40점이지만 10년째 무사하다. 아무도 공격하지 않는다. 관심 대상이 아니니까.
점수는 위생을 측정한다. 보안이 아니다.
건강검진이랑 비슷하다. 혈압, 콜레스테롤, BMI 전부 정상. 훌륭한 수치다. 병원 나와서 버스에 치인다. 검진은 기초 건강을 측정했을 뿐이다 — 그날 살아남을 수 있는지는 아무것도 안 알려줬다.
실제로 뚫리느냐 마느냐를 결정하는 것들 — 패치 안 된 내부 서비스, 약한 크리덴셜, RDP 열어둔 협력업체 노트북, 한 명이 클릭한 피싱 이메일 — 이런 건 DNS 조회나 HTTP 헤더 스캔에 나타나지 않는다. 나타날 수가 없다. 외부에서는 보이지 않는다. 공개 인터넷은 문구멍을 보여준다. 점수는 누군가 문구멍을 건물 전체로 착각할 때 생기는 것이다.
계수 하나로 인터넷 절반을 움직일 수 있다
밤에 잠 못 들게 하는 부분이 이거다.
모든 점수 시스템은 가중치를 부여한다. HTTPS 강제가 15점. DNSSEC가 10점. DMARC가 12점. 만료된 인증서는 몇 점을 깎아야 할까? DMARC의 p=none은? DNSSEC 미적용이 심각한 감점인가, 무시해도 되는 건가? 이걸 정하는 RFC도 없고, 수학적 정리도 없다. MTA-STS 미적용이 4점이고 약한 SPF 정책이 7점이라고 알려주는 공식 같은 건 없다.
가중치를 이리저리 조정해서 결과가 그럴듯해 보일 때까지 만진다. 이게 더러운 비밀이다. 모델을 큰 도메인 세트에 돌리고 분포를 쳐다보고, 곡선이 그럴듯하게 불편해 보이는지 확인한다. A 등급이 너무 많으면 페널티를 높인다. 인터넷이 갑자기 방사성 폐기장처럼 보이면 노브 하나를 풀어준다.
계수 하나를 바꾸면 인터넷 절반이 B에서 C로 떨어진다.
직접 봤다. Content-Security-Policy 미적용 페널티를 -5에서 -10으로 바꾸면 수천 개 도메인이 한 등급 떨어진다. 하룻밤 사이에 보안이 나빠졌나? 아니다. 슬라이더를 움직인 것뿐이다. 계수 변경 한 번이 데이터셋 절반을 재분류하는 걸 보고 나면, 결과 점수가 도메인의 속성이라고 말하기 어려워진다. 부분적으로 내 기분의 속성이다.
“이 도메인이 얼마나 안전한가?”라는 질문은 객관적으로 들린다. 아니다. 근본적으로 주관적인 작업을 소수점으로 포장해서 사람들이 불일치를 정밀도 문제로 취급하게 만들었다. 실은 철학 문제인데.
그래도 사람들은 숫자를 원한다
당연하다.
47페이지짜리 보안 감사 보고서를 보여주면 눈이 풀린다. “B+“를 보여주면 즉시 자기 위치를 안다. 안다고 생각한다. 점수는 복잡하고 미묘한 현실을 대시보드에 들어가는 크기로 압축하는 알고리즘이다.
심리학에서 이걸 맥나마라 오류라고 부른다. 측정할 수 있으면 중요한 거고, 측정할 수 없으면 중요하지 않은 거다. 베트남전에서 로버트 맥나마라는 사살 수로 성과를 측정했다. 숫자가 있으니까. 전쟁의 결과를 실제로 결정한 것들 — 사기, 정치적 의지, 현지 지지 — 은 스프레드시트에 없었다.
보안 점수는 사살 수다. 얻을 수 있는 지표이지, 의미 있는 지표가 아닐 수 있다.
아이러니하게도 보안 점수가 살아남는 건 정확해서가 아니라 감정적으로 효율적이기 때문이다. 수치화는 통제의 환상을 만든다. B-가 나쁜 소식이긴 하지만, 적어도 읽을 수 있는 나쁜 소식이다.
왜곡된 인센티브
점수가 생기면 사람들은 실제 보안 대신 점수를 최적화한다.
조직이 몇 주를 들여 잘 안 쓰이는 HTTP 헤더를 추가해서 등급을 B에서 A로 올리는 걸 봤다. 내부 서브넷에서 3년째 돌아가는 Apache Struts는 그대로 두고. 헤더는 보인다. 스캐너가 확인한다. 등급이 올라간다. 실제 리스크는 전혀 안 변한다. 그 시간에 테이블탑 훈련도 안 하고, IAM 감사도 안 하고, 애플리케이션 로직 결함 헌팅도 안 한다.
굿하트의 법칙이다. 측정 지표가 목표가 되면 좋은 측정 지표이기를 그만둔다. “A 등급이 필요합니다”라고 결정하는 순간, 점수는 보안 상태 반영을 멈추고 점수 최적화 노력 반영을 시작한다.
요새 바깥쪽만 측정하는 산업을 만들어놨는데, 안쪽 경비원은 뒷문을 환기하려고 열어두고 있다.
점수가 실제로 쓸모 있는 곳
솔직한 답은 누구나 원하는 것보다 좁고 화려하지 않다.
보안 점수가 잘하는 일이 하나 있다. 외부에서 보이는 위생 문제들을 큐로 만드는 것. 어디를 먼저 봐야 하는지 알려준다. 벤더 50개를 평가할 때 점수 하위 20개를 먼저 빼는 건 합리적인 휴리스틱이다. DMARC 적용이 마이그레이션 후 사라졌으면 점수가 퇴보를 잡아낸다. 변경 탐지기로, 운영 부주의의 대략적 정렬 메커니즘으로 쓸 만하다.
“침해 가능성”의 대리 지표로 쓰는 순간, 점쟁이짓으로 돌아간다.
내가 생성하는 모든 점수에 면책 조항을 붙일 수 있다면 이렇게 쓰겠다: 이 숫자는 누군가 기본적인 설정을 했는지 알려줍니다. 기본적이지 않은 것 — 실제로 침해가 일어나는 곳 — 에 대해서는 아무것도 말해주지 않습니다. 하지만 아무도 그걸 읽고 싶어하지 않는다. 등급을 원한다. 초록색 체크마크를 원한다.
초록색 체크마크를 만드는 건 나다. 다만 당신만큼 믿지는 않는다.