[OSTEP] 스터디 21주차 Security

OSTEP의 최신? 버전에 포함된 Security를 학습하기로 스터디에서 결정했다. 내가 가진 책에는 포함된 내용이 아니라 https://pages.cs.wisc.edu/~remzi/OSTEP/ PDF에서 제공하는 자료로 학습을 진행한다.


1. 복숭아로 이해하는 보안의 3대 요소 (CIA)

OSTEP에서는 보안의 3대 요소를 복숭아에 비유해 설명한다. 우리가 가진 소중한 자원을 복숭아라고 생각한다면 보안은 다음 세가지를 지키는 것이라고 한다.

1. 기밀성 (Confidentiality)

  • 비유: 내가 잠시 고개를 돌린 사이, 누군가 내 복숭아를 훔쳐가는 것을 원치 않는 것.
  • 정의: 오직 인가된 사용자나 시스템만이 자산에 접근할 수 있도록 보장하는 것.
  • 컴퓨터에서: 개인의 비밀번호, 신용카드 정보, 민감한 개인 파일 등을 허락받지 않은 사람이 읽지 못하게 보호하는 기능이다.

2. 무결성 (Integrity)

  • 비유: 내가 잠시 고개를 돌린 사이, 누군가 내 싱싱한 복숭아를 맛없는 '순무'로 바꿔치기해 놓는 것을 원치 않는 것.
  • 정의: 자산이 인가되지 않은 방식으로 수정되거나 파괴되지 않도록 데이터의 정확성과 완전성을 보장하는 것.
  • 컴퓨터에서: 누군가 몰래 파일의 내용을 고치거나, 전송 중인 데이터를 변조하지 못하게 막는 것을 의미한다.

3. 가용성 (Availability)

  • 비유: 내가 복숭아를 먹으려고 손을 뻗을 때마다, 누군가 내 손을 때려서 방해하는 것을 원치 않는 것.
  • 정의: 인가된 사용자가 자산을 필요로 할 때 언제든지 지연 없이 사용할 수 있도록 보장하는 것.
  • 컴퓨터에서: 서비스 거부 공격(DoS)처럼 시스템을 마비시켜 정당한 사용자가 컴퓨터 자원을 쓰지 못하게 만드는 상황을 방지하는 것이다.

보안(Security) vs 신뢰성(Reliability)

많은 학생이 이 보안의 개념을 이전 장에서 배운 '신뢰성(Reliability)'과 혼동하곤 한다. 하지만 교수는 이 둘 사이에 결정적인 차이가 있다고 강조한다.

  • 신뢰성: "사고나 실수"에 관한 것다. 계획이 부족하거나 우연히 발생한 오류로부터 시스템을 보호하는 일.
  • 보안: "누군가 의도적으로 당신의 복숭아를 노리고 있다!"는 점이 다르다. 보안의 세계에는 단순한 오류가 아니라, 당신의 시스템을 망가뜨리려는 영리하고, 악의적이며, 끈질기고, 교활한 '인간 공격자(Adversary)'가 존재한다.

적대적 공격자(Adversary)의 특징

보안 설계가 어려운 이유는 우리가 상대해야 할 적이 다음과 같은 특성을 가졌기 때문이다.

  • 지능적(Clever): 시스템의 허점을 찾아내는 데 매우 영리하다.
  • 악의적(Malevolent): 분명히 해를 끼칠 의도를 가지고 있다.
  • 끈질김(Persistent): 한 번 실패해도 포기하지 않고 계속 시도한다.
  • 유연함(Flexible): 방어책이 생기면 새로운 공격 경로를 찾아낸다.

2. 운영체제 보안 입문(Introduction to Operating System Security)

운영체제 보안이 왜 중요한가?

 

  • 기초가 흔들리면 다 무너진다: 아무리 훌륭하고 안전한 애플리케이션을 만들었더라도, 그 밑바탕인 운영체제가 취약하면 공격자는 운영체제를 통해 정보를 훔치거나 프로그램을 중단시킬 수 있다.
  • 모든 것은 OS 위에서 실행된다: 파일 시스템, 메모리 관리, 네트워크 통신 등 모든 자원을 OS가 제어하기 때문에, OS 보안이 뚫리면 시스템 전체의 통제권을 잃게 된다.

보안의 3대 핵심 목표 (The Goals of Security)

  • 기밀성(Confidentiality): 인가되지 않은 사용자에게 정보가 노출되지 않도록 하는 것 (예: 파일 접근 권한 설정).
  • 무결성(Integrity): 인가되지 않은 사용자가 데이터를 수정하거나 파괴하지 못하도록 보장하는 것 (예: 시스템 파일 변조 방지).
  • 가용성(Availability): 정당한 사용자가 필요할 때 시스템 자원을 즉시 사용할 수 있도록 보장하는 것 (예: DoS 공격 방어).

보안 정책(Policy) vs 보안 메커니즘(Mechanism)

  • 보안 정책(Policy): "무엇을 보호해야 하는가?"에 대한 결정 (예: "관리자만 이 파일을 수정할 수 있다.")
  • 보안 메커니즘(Mechanism): 정책을 실행하기 위한 구체적인 방법 (예: 액세스 제어 리스트(ACL), 암호화 등)
  • 결론: 훌륭한 운영체제는 다양한 정책을 유연하게 수용할 수 있는 강력한 메커니즘을 제공해야 한다.

보안 설계 원칙 (Design Principles for Security)

Saltzer와 Schroeder가 제안한 고전적이지만 여전히 유효한 원칙들을 소개한다

  • 최소 권한의 원칙 (Least Privilege): 사용자나 프로세스는 업무 수행에 꼭 필요한 최소한의 권한만 가져야 한다.
  • 경제적 설계 (Economy of Mechanism): 보안 메커니즘은 단순하고 작아야 검증하기 쉽다.
  • 개방적 설계 (Open Design): 시스템의 보안이 설계의 비밀에 의존해서는 안 된다 (알고리즘은 공개되어도 안전해야 함).
  • 완전한 중재 (Complete Mediation): 모든 자원 접근은 반드시 보안 검사를 거쳐야 하며, 예외가 있어서는 안 된다.

적대적 환경 (The Adversarial Environment)

보안이 일반적인 소프트웨어 공학(Reliability)과 다른 점은 바로 '인간 공격자(Adversary)'의 존재다.

  • 공격자는 시스템의 허점을 찾아내기 위해 수단과 방법을 가리지 않으며, 방어자가 생각하지 못한 창의적인 방식으로 접근한다.
  • 따라서 보안 설계는 "실수로 발생할 오류"뿐만 아니라 "악의적인 의도를 가진 공격"을 가정한 상태에서 이루어져야 한다.

3. 인증(Authentication): 시스템의 첫 번째 관문

운영체제가 보안 정책을 실행하기 위해 가장 먼저 알아야 할 것은 "요청을 보낸 주체가 누구인가?"다. 관리자가 보낸 요청은 허용해야 하지만, 이름 모를 해커의 요청은 거부해야 하기 때문이다. 이 확인 과정을 인증(Authentication)이라고 한다.

인증의 핵심: 맥락(Context)

운영체제는 요청 그 자체보다 '누가' 요청했는지를 중요하게 여긴다.

  • 예시: 가족이 우유를 사 오라고 하면 사 오지만, 길 가던 모르는 사람이 시키면 거절하는 것과 같다.
  • OS에서의 적용: 시스템 관리자가 프로그램을 설치하면 허용하지만, 출처 불명의 스크립트가 설치를 시도하면 차단해야 한다.

무엇을 통해 증명하는가? (Three Factors)

인증은 보통 다음 세 가지 중 하나 이상의 요소를 통해 이루어진다.

  1. 지식(Something you know): 비밀번호, PIN 번호 등.
  2. 소유(Something you have): 스마트카드, 보안 키(Yubikey), OTP 생성기 등.
  3. 존재(Something you are): 지문, 홍채, 얼굴 인식 등 생체 인식.

비밀번호(Password) 방식의 명암

가장 보편적이지만 가장 취약한 방식이기도 하다.

  • 취약점: 사용자는 외우기 쉬운 짧은 비번을 선호하고, 여러 사이트에서 돌려쓰는 경향이 있다.
  • 공격 방식:
    • 사전 공격(Dictionary Attack): 흔히 쓰이는 단어를 대입.
    • 무차별 대입(Brute-force): 모든 조합을 시도.
    • 사회 공학(Social Engineering): 속임수를 써서 비번을 알아냄.

운영체제의 비밀번호 보호: 해싱(Hashing)과 솔팅(Salting)

운영체제는 비밀번호를 그대로 저장하지 않는다.

  • 해싱(Hashing): 비번을 복구 불가능한 암호문으로 변환하여 저장한다. 서버가 뚫려도 원래 비번은 알 수 없게 하기 위함이다.
  • 솔팅(Salting): 같은 비번이라도 사용자마다 고유의 '소금(Salt)' 값을 추가해 해싱한다. 이는 미리 계산된 해시 테이블(Rainbow Table)을 이용한 공격을 무력화한다.

다중 요소 인증 (MFA / 2FA)

비밀번호(지식)가 뚫리더라도 다른 요소(소유 또는 존재)가 필요하게 설계하여 보안성을 획기적으로 높이는 방식이다. 현대의 모든 보안 시스템이 지향하는 표준이다.