보안의 기초
무엇을 누구에게서 지키는지 정하고, 한 겹이 뚫려도 버티게 설계하는 원칙이다.
무엇을 지키나: CIA와 덧붙는 속성
"안전하다"는 말은 무엇이 지켜졌는지 말하지 않으면 뜻이 없다. 보안에서 지키려는 성질은 흔히 세 가지로 나눈다. 머리글자를 따 CIA라 부른다. 미국 연방 정보 시스템의 분류 기준인 FIPS 199도 이 셋을 기준으로, 각각이 깨졌을 때 피해가 얼마나 큰지로 시스템의 등급을 매긴다.
| 속성 | 뜻 | 깨지는 예 | 주로 지키는 수단 |
|---|---|---|---|
| 기밀성(confidentiality) | 허락된 사람만 읽는다 | 고객 명단 유출, 공용 와이파이에서 엿보기 | 암호화, 접근 통제 |
| 무결성(integrity) | 허락 없이 바뀌지 않았다 | 송금 금액 변조, 내려받은 파일에 악성 코드 끼워 넣기 | 해시·MAC·서명, 쓰기 권한 제한 |
| 가용성(availability) | 필요할 때 쓸 수 있다 | 서비스 거부 공격, 랜섬웨어로 잠긴 파일 | 여분 설비, 백업, 트래픽 흡수 |
여기에 둘을 더 붙이는 경우가 많다. 진본성(authenticity)은 메시지나 상대가 주장하는 그 출처가 맞다는 성질이고, 부인 방지(non-repudiation)는 어떤 일을 한 사람이 나중에 하지 않았다고 잡아뗄 수 없다는 성질이다. NIST 용어집은 부인 방지를 보낸 이와 받은 이 모두가 처리 사실을 증명받는 것으로 설명한다. 둘 다 주로 디지털 서명과 변조할 수 없는 기록으로 지킨다.
세 축은 서로 당긴다. 백업을 여러 곳에 두면 가용성은 오르지만 복사본마다 기밀성을 지켜야 할 곳이 늘고, 모든 요청을 깐깐하게 검사하면 무결성은 오르지만 느려져 가용성이 떨어질 수 있다. 그래서 "무엇을 얼마나 지킬지"를 먼저 정하는 일이 뒤의 모든 설계를 이끈다.
위협 모델링: 네 가지 질문과 STRIDE
위협 모델링(threat modeling)은 시스템을 만들기 전이나 고치기 전에, 무엇이 잘못될 수 있는지를 체계적으로 따져 보는 일이다. 업계 실무자들이 함께 쓴 Threat Modeling Manifesto는 이 일을 네 가지 질문으로 줄인다.
- 무엇을 만들고 있나? (구성 요소, 데이터 흐름, 신뢰 경계를 그린다)
- 무엇이 잘못될 수 있나? (위협을 찾는다)
- 그래서 무엇을 할 것인가? (대응을 정하거나, 위험을 받아들이기로 결정한다)
- 충분히 잘했나? (빠진 것이 없는지 점검한다)
첫 질문에 답하려면 지킬 자산(asset)과 맞설 공격자를 정해야 한다. 자산은 고객 정보, 돈, 평판, 서비스가 멈추지 않는 시간처럼 잃으면 아픈 것이다. 공격자는 누가, 무엇을 가지고, 왜 노리는지로 그린다. 호기심 많은 사용자, 자동화된 봇, 내부 직원, 국가 수준의 조직은 가진 시간과 도구가 다르고, 모두를 똑같이 막으려 하면 아무도 제대로 막지 못한다. OWASP 위협 모델링 치트 시트와 OWASP 위협 모델링 절차가 이 과정을 단계별로 정리해 둔다.
두 번째 질문에서 빠뜨림을 줄이려고 쓰는 체크리스트가 Microsoft가 만든 STRIDE다. 여섯 머리글자는 각각 앞에서 본 보안 속성 하나를 깨뜨리는 위협이다. 그림의 요소(사용자, 서버, 저장소, 흐름)마다 여섯 질문을 하나씩 던지면 된다. 분류는 Microsoft Threat Modeling Tool 문서를 따랐다.
| 위협 | 뜻 | 깨지는 속성 | 대응의 예 |
|---|---|---|---|
| S 사칭(Spoofing) | 남인 척한다 | 진본성(인증) | 다중 인증, 서명 |
| T 변조(Tampering) | 데이터나 코드를 몰래 바꾼다 | 무결성 | TLS, MAC, 쓰기 권한 제한 |
| R 부인(Repudiation) | 한 일을 안 했다고 한다 | 부인 방지 | 변조 불가능한 감사 로그, 서명 |
| I 정보 노출(Information disclosure) | 보면 안 되는 것을 본다 | 기밀성 | 암호화, 접근 통제, 오류 메시지 줄이기 |
| D 서비스 거부(Denial of service) | 쓰지 못하게 만든다 | 가용성 | 속도 제한, 여분 설비 |
| E 권한 상승(Elevation of privilege) | 허락보다 많은 일을 한다 | 인가 | 최소 권한, 입력 검증, 샌드박스 |
먼저 무엇을 만드는지 그린다. 사용자가 웹 서버에 로그인 요청을 보내고, 서버는 DB에 묻는다.
위협 모델은 완벽할 필요가 없다. 화이트보드에 상자 세 개를 그리고 30분 이야기하는 것만으로도 "관리자 페이지가 인터넷에 열려 있었다" 같은 큰 구멍이 먼저 보인다. 중요한 것은 설계가 바뀔 때마다 다시 보는 습관이다.
찾은 위협을 모두 같은 힘으로 막을 수는 없으므로 순서를 정한다. 이때 쓰는 말이 위험(risk)이다. NIST 용어집은 위험을 일이 벌어졌을 때의 피해 크기와 그 일이 벌어질 가능성의 함수로 정의한다. 가능성은 낮아도 피해가 치명적인 것과, 피해는 작아도 매일 일어나는 것을 같은 표 위에 놓고 비교하게 해 준다. 위험 평가 절차는 NIST SP 800-30 Rev. 1이 정리한다.
위험을 다루는 길은 대개 넷으로 나눈다. 통제를 더해 줄이고(완화), 그 기능을 아예 없애 피하고(회피), 보험이나 계약으로 남과 나누고(공유·전가), 비용이 이득보다 크면 알고서 받아들인다(수용). 흔한 오해는 위험을 0으로 만들 수 있다는 생각이다. 남는 위험은 늘 있고, 그것을 누가 받아들였는지 적어 두는 것까지가 위험 관리다.
최소 권한
최소 권한(least privilege)은 사람이든 프로그램이든 맡은 일에 꼭 필요한 권한만, 필요한 동안만 갖게 하라는 원칙이다. 1975년 Saltzer와 Schroeder의 논문 The Protection of Information in Computer Systems가 정리한 설계 원칙 여덟 가지 중 하나이고, 지금도 NIST 용어집에 같은 뜻으로 실려 있다.
원리는 피해 반경(blast radius)이다. 어떤 계정이든 언젠가 탈취될 수 있다고 가정하면, 그 계정이 닿는 범위가 곧 사고의 크기가 된다. 웹 앱이 DB 관리자 계정으로 접속하면 작은 버그 하나가 모든 표를 지우는 사고로 번지지만, 읽기만 하는 계정으로 접속했다면 같은 버그로도 지울 수는 없다.
- DB 계정을 용도별로 나누고, 조회 화면은 읽기 권한만 준다.
- 컨테이너와 서비스는 관리자(root)가 아닌 전용 사용자로 돌린다.
- API 토큰은 범위(scope)와 유효 기간을 좁게 발급한다. 인증과 인가 노트의 OAuth 절이 이 방식이다.
- 사람의 관리자 권한은 평소 계정과 분리하고, 필요할 때만 잠깐 올려 쓰며 그 사실을 기록한다.
최소 권한과 짝을 이루는 원칙이 직무 분리(separation of duties)다. 누구도 혼자서 시스템을 악용할 만큼의 권한을 갖지 않게, 위험한 일을 두 사람 이상에게 나눈다. 급여를 만드는 사람과 승인하는 사람을 나누고, 코드를 쓴 사람이 혼자 운영 서버에 배포하지 못하게 검토를 거치게 하는 식이다. 내부자의 잘못이나 한 계정의 탈취가 곧장 사고로 이어지지 않게 하는 장치다.
심층 방어
심층 방어(defense in depth)는 방어를 여러 겹으로 쌓아 한 겹이 뚫려도 다음 겹이 막게 하는 설계다. NIST 용어집은 이를 사람, 기술, 운영에 걸쳐 여러 방어선을 두는 전략으로 설명한다. 성의 해자와 성벽과 성문과 경비병이 모두 있는 것과 같다.
겹을 쌓는 이유는 어떤 방어도 완벽하지 않기 때문이다. 방화벽은 열어 둔 포트로 들어오는 공격을 모르고, 입력 검증은 개발자가 빠뜨린 한 곳에서 뚫리고, 비밀번호는 피싱으로 새어 나간다. 층마다 놓치는 것이 다르면 공격자는 모든 층의 약점을 한꺼번에 찾아야 한다.
다만 겹의 수보다 독립성이 중요하다. 다섯 층이 모두 같은 관리자 비밀번호로 잠겨 있다면 사실상 한 층이다. 또 막는 층만큼 알아채는 층(로그, 이상 탐지)과 되돌리는 층(백업, 사고 대응)이 필요하다. 막지 못한 공격을 빨리 알아채면 피해가 작아진다. 이 이야기는 사람과 운영 노트에서 이어진다.
공격 표면
공격 표면(attack surface)은 공격자가 시스템에 무언가를 넣거나 꺼낼 수 있는 모든 지점의 합이다. 로그인 화면, 공개 API, 파일 업로드, 열린 네트워크 포트, 관리자 페이지, 서드파티 라이브러리가 모두 여기에 들어간다. NIST 용어집의 정의도 같고, OWASP 공격 표면 분석 치트 시트는 입구를 목록으로 만들고 바뀔 때마다 다시 보라고 권한다.
입구가 하나 늘 때마다 지켜야 할 코드도 는다. 그래서 가장 싸고 확실한 방어는 입구를 없애는 것이다. 쓰지 않는 기능과 옛 API 버전은 끄고, 개발용 디버그 기능은 배포에서 빼고, 관리 기능은 인터넷이 아닌 사내망이나 VPN 뒤에 둔다. 남은 입구에는 인증과 입력 검증과 기록을 단다. 의존성도 입구다. 라이브러리 하나를 더할 때의 위험은 시스템·소프트웨어 보안 노트의 공급망 절에서 다룬다.
보안과 사용성
보안 장치는 사람이 쓴다. 너무 번거로우면 사람들은 우회한다. 비밀번호를 석 달마다 바꾸게 하면 "봄2025!"가 "여름2025!"로 바뀌고, 복잡한 비밀번호를 강요하면 모니터에 포스트잇이 붙는다. Saltzer와 Schroeder는 이것을 "심리적 수용성"(psychological acceptability)이라는 원칙으로 적었다. 보호 장치가 쓰기 쉬워야 사람들이 습관처럼 제대로 쓴다는 뜻이다.
실제 지침도 이 방향으로 바뀌었다. NIST의 디지털 신원 지침 SP 800-63B는 비밀번호를 주기적으로 강제로 바꾸게 하거나 문자 종류 조합을 강요하지 말라고 하고, 대신 길이를 넉넉히 허용하고 유출된 비밀번호 목록과 대조하라고 한다. 자세한 내용은 인증과 인가 노트에 있다.
좋은 해법은 보안과 편의를 저울질하는 대신 둘을 함께 올리는 설계다. 패스키는 비밀번호보다 편하면서 피싱에도 강하고, 처음부터 안전한 설정으로 출고하는 안전한 기본값(secure by default)은 사용자가 아무것도 하지 않아도 안전하게 만든다. 미국 CISA의 Secure by Design 캠페인은 이 부담을 사용자가 아니라 제품을 만드는 쪽이 져야 한다고 강조한다.
케르크호프스 원칙: 설계는 공개, 키만 비밀
1883년 네덜란드 출신 언어학자 Auguste Kerckhoffs는 논문 La cryptographie militaire에서 군용 암호가 갖춰야 할 조건을 적었다. 그중 둘째가 지금 케르크호프스 원칙(Kerckhoffs's principle)이라 불린다. 암호 체계는 비밀이어선 안 되고, 적의 손에 들어가도 문제가 없어야 한다는 것이다. 지켜야 할 비밀은 키 하나뿐이어야 한다. 정보 이론을 세운 Claude Shannon은 이를 "적은 시스템을 안다"는 말로 줄였다.
이유는 현실적이다. 설계는 소스 코드, 펌웨어, 퇴사한 직원, 역공학을 통해 결국 새어 나간다. 설계가 곧 비밀이면 한 번 새는 순간 그 설계를 쓰는 모두가 뚫리고, 바꾸려면 시스템 전체를 다시 만들어야 한다. 키만 비밀이면 새어 나간 키를 버리고 새 키를 쓰면 된다. 게다가 공개된 설계는 전 세계 연구자가 공격해 본 뒤에야 표준이 된다. AES와 SHA-3가 공개 공모전으로 뽑힌 이유다. 이 원칙의 현대적 결론이 "직접 만든 암호를 쓰지 말라"이고, 암호 노트에서 다시 다룬다.
숨기기가 쓸모없다는 뜻은 아니다. 관리자 페이지 주소를 알기 어렵게 두는 것은 자동 스캐너를 줄이는 한 겹이 될 수 있다. 다만 그것만 믿는 은폐에 의한 보안(security through obscurity)은 진짜 방어가 아니다. 숨기기와 암호화의 차이는 스테가노그래피 도구에서 직접 볼 수 있다. 숨긴 메시지는 있다는 것을 들키면 그대로 읽히지만, 암호화한 메시지는 들켜도 키 없이는 읽히지 않는다.
- Threat model — Wikipedia
- FIPS 199: Standards for Security Categorization — NIST
- Non-repudiation — NIST Glossary
- Threat Modeling Manifesto
- Threat Modeling Cheat Sheet — OWASP
- Threat Modeling Process — OWASP
- Microsoft Threat Modeling Tool threats (STRIDE) — Microsoft
- The Protection of Information in Computer Systems — Saltzer & Schroeder
- Least privilege — NIST Glossary
- Defense-in-depth — NIST Glossary
- Attack surface — NIST Glossary
- Attack Surface Analysis Cheat Sheet — OWASP
- Secure by Design — CISA
- La cryptographie militaire — Auguste Kerckhoffs (Fabien Petitcolas)
- Risk — NIST Glossary
- Risk response — NIST Glossary
- SP 800-30 Rev. 1: Guide for Conducting Risk Assessments — NIST
- Separation of duty — NIST Glossary