이 글은 Crash Course의 Computer Science를 보고 정리한 글입니다.
사이버 보안의 범위는 컴퓨팅 기능만큼 빠른 속도로 진화했다. 일반적으로 사이버 보안을 컴퓨터 시스템 및 데이터의 기밀성, 무결성 및 가용성을 위협으로부터 보호하기 위한 일련의 기법으로 생각할 수 있다.
이 세 가지 목표를 풀어보면 기밀성 또는 비밀성이란 권한이 부여된 사용자만이 컴퓨터 시스템 및 데이터를 읽고 접근할 권리를 가진다. 해커가 사람들의 신용 카드 정보를 공개하는 데이터 유출은 기밀성에 대한 공격이다.
무결성이란 승인된 사람만이 데이터와 시스템을 사용하거나 수정할 수 있는 것이다. 패스워드를 알아내서 사용자인 것처럼 가장하여 전자 메일을 사용하거나 사용자 정보를 수정하는 것은 무결성 공격이다.
가용성은 권한이 부여된 사람들이 항상 시스템에 액세스 할 수 있어야 함을 의미한다. DDos 공격을 생각해보면, 해커가 웹 사이트에 가짜 요청을 보내 과부하를 걸어 느려지거나 다른 사람에게 도달할 수 없도록 한다. 이것은 서비스의 가용성을 공격하는 것이다.
이 세 가지 일반적인 목표를 달성하기 위해, 보안 저문가는 "적"이 누구인지를 추상적 수준에서 명시해야 한다. 이를 위협 모델(Threat Model)이라고 한다. 모델의 프로필은 공격자의 능력, 목표 및 가능한 공격 수단을 보여준다. 공격 벡터(Attack Vector)라고 한다. 위협 모델을 사용하면 특정 위협에 대비하여, 해커가 시스템 및 데이터에 접근할 수 있는 모든 방법에 압도당하지 않을 수 있다. 그리고 다른 많은 방법들이 있다.
먼저 노트북에 접근하기 위한 물리적인 "보안"을 원한다고 가정해보자. 위협 모델은 참견하기 좋아하는 룸메이트로 가정하겠다. 비밀, 무결성 및 가용성을 유지하기 위해 노트북을 침대 밑이나 옷장에 숨겨둘 수 있다. 그러나 위협 모델이 노트북을 숨긴 장소를 알고 있는 장난꾸러기 동생이라면 더 많은 것을 할 필요가 있다. 아마 금고에 넣고 잠가야 할 것이다.
다시 말해서, 시스템이 어떻게 보호되는지는 누구에 대항하여 보안이 되는지에 대해 크게 의존한다.
물론 위협 모델은 일반적으로 룸메이트나 동생보다 더 형식적으로 정의되어있다. 종종 위협 모델이 기술적인 측면에서 지정된 것을 볼 수 있다. 예를 들어, "무제한 시간과 함께 노트북에 물리적으로 액세스 할 수 있는 사람"이다. 주어진 위협 모델을 사용하여 보안 설계자는 아무도 자신의 암호를 밝히지 않는 것처럼 특정 가정이 충족되는 한에서 시스템을 안전하게 유지하는 솔루션을 제시해야 한다.
컴퓨터 시스템과 네트워크, 데이터를 보호하는 데에는 여러 가지 방법이 있다. 많은 보안 문제는 두 가지 질문에 달려 있다.
두 가지 주요 보안 질문
1. 당신은 누구입니까?
2. 무엇에 접근하려고 합니까?
분명히, 액세스 권한을 옳은 사람에게 부여하고 잘못된 사람들을 거부해야 한다. 은행 직원은 ATM을 열어 돈을 재보급할 수 있어야 하며, 저에게 그런 권한이 주어진다면 저는 모두 가져갈 것이다. ㅎㅎ
따라서 옳은 것과 나쁜 것을 구별하기 위해 사람들은 인증(Authentication)을 사용한다. 이것은 컴퓨터가 상호작용하는 사람이 누구인지 이해하게 하는 과정이다. 일반적으로 세 가지 유형이 있으며 각각 장단점이 있다.
인증의 3 가지 유형
1. 사용자가 알고 있는 것.
2. 사용자가 가진 것.
3. 사용자가 무엇인가.
1. 인증은 실제 사용자와 컴퓨터만 알 수 있는 비밀 정보(예:ID와 암호)를 기반으로 한다. 오늘날 가장 널리 사용되는 이유는 구현하기가 가장 쉽기 때문이다. 그러나 해커가 추측에 성공할 경우 해킹당하거나, 그렇지 않더라도 회원의 비밀을 알게 될 수 있다. 일부 암호는 123456이나 qwerty처럼 사람이 쉽게 알아낼 수 있다.
그러나, 컴퓨터에게 쉬운 것들이 또 있다. PIN번호 2580에 대해 생각해보자. 인간이 이것을 추측하기는 꽤 어렵다. 하지만 4자리 PIN으로 구성된 가능한 조합 수는 1만 개 정도에 불과하다. 컴퓨터는 단시간에 0000을 입력한 다음 0001, 0002 그리고 9999까지 시도해 볼 수 있다. 1초도 안 걸릴 것이다. 이것을 무차별 공격(Brute Force Attack)이라고 한다. 단순하게 모든 것을 시도하는 것이다. 영리한 알고리즘이 필요하지 않다.
일부 컴퓨터 시스템은 사용자를 잠그거나 세 번의 잘못된 시도 후에 조금 기다리도록 하고 있다. 이것은 일반적이고 합리적인 전략이며 덜 정교한 공격자에게는 해킹을 어렵게 만든다. 그러나 해커가 이미 수만 대의 컴퓨터를 인수하여 봇넷을 형성하면 어떻게 되는지 생각해 보자. 이 모든 컴퓨터를 사용하여, 2580과 같은 PIN을 수 만의 은행 계좌에서 동시에 시도할 수 있다. 계정당 단 하나의 시도만 하더라도 해커는 2580을 PIN번호로 사용하는 하나 이상의 계정에 들어갈 가능성이 크다.
PIN 및 암호 길이를 늘이는 것은 도움이 되지만, 8자리 PIN번호도 쉽게 깨진다. 이 때문에 많은 웹 사이트가 대문자와 소문자, 특수문자 등을 혼합해 사용하도록 요구한다. 이렇게 하면 가능한 암호 조합의 수가 폭발적으로 증가한다. 8자리 숫자 PIN은 1억 가지 조합이 가능하다. 컴퓨터에게는 아침 식사 거리다. 그러나 모든 펑키한 것들을 혼합한 8글자 암호는 600조 이상의 조합을 가지고 있다.
물론, 이러한 암호는 단순한 인간이 기억하긴 어렵다. 따라서 더 나은 접근법은 웹 사이트가 우리에게 3 단어가 함께 결합된 것처럼 더 기억에 남는 것을 고를 수 있게 하는 것이다. "녹색 형제 바위" 또는 "피자 맛있다 냠냠"처럼 영어는 약 10만 단어가 사용되므로 3개를 함께 쓰는 것은 대략 1조 개의 암호를 사용 가능하게 한다. 또한 사전이 아닌 단어를 사용하는 것이 더 정교한 공격에 대해 더 우수하다는 것을 주목해야 한다. 더 자세하게 알고 싶다면 dooblydoo의 암호 선택에 대한 영상을 추천한다.
2. 한편으로, 인증받는 것이란 실제 사용자만 가지고 있는 비밀 토큰을 소유하고 있다는 것이다. 예를 들어, 실제 키와 자물쇠가 있다. 키를 가지고 있어야 자물쇠를 열 수 있다. 이것은 "짐작할 수 있는" 문제를 피할 수 있다. 또한 일반적으로 물리적인 존재가 필요하므로 원격 공격자가 액세스 하기가 훨씬 더 어려워진다. 다른 나라의 누군가는 먼저 플로리다에 가지 않고서는 플로리다에 있는 현관문을 이용할 수 없다. 그러나 공격자가 물리적으로 가까운 경우 인증을 얻는 것이 손상될 수 있다. 키는 복사할 수 있고, 스마트폰은 도난당하며 자물쇠는 풀린다.
3. 마지막으로, 다음 인증 기준은 바로 사용자다. 사용자 자신을 컴퓨터에 나타내어 인증한다. 지문 판독기 및 홍채 스캐너와 같은 생체 인식 인증기가 전형적인 예이다. 하지만, 센서의 데이터는 시간이 지나면서 달라지기도 한다. "알고 있는 것"과 "가지고 있는 것" 인증은 결정론적(Deterministic)이라는 좋은 속성이 있다. - 맞거나 틀리거나, 이것은 누구나 비밀을 알거나 그 열쇠를 갖고 있으면, 100% 접근이 가능하다. 반대로 그렇지 않다면 0%로 접근 가능하다.
그러나 생체 인식 인증은 확률적(Probabilistic)이다. 시스템에서 사용자를 인식하지 못할 가능성이 있다. 모자나 조명이 나빠서 인증이 안될 수도 있다. 더 나쁜 것은 시스템이 사람을 잘못 인식할 수도 있다는 점이다. 악마 같은 쌍둥이가 있다면 시스템을 구분할 수 없다.
생체 인증과 관련된 또 다른 문제는 초기화할 수 없다는 것이다. 공격자가 지문 데이터를 손상시키는 경우에 인증은 어떻게 될까? 이것은 인생에서 큰 문제가 될 수 있다. 그리고 고화질 카메라가 발달하면서 당사자가 SNS에 올린 사진을 이용해서 홍채를 위조할 수도 있다.
기본적으로 모든 형태의 인증은 장단점이 있으며 모든 것이 하나 또는 다른 방식으로 손상될 수 있다. 따라서 보안 전문가는 중요한 계정에 대해 두 가지 이상의 다양한 인증 양식을 사용할 것을 권장한다. 이것을 2중 요소(two-factor) 또는 다중 요소 인증(multi-factor authentication)이라고 한다. 공격자가 암호를 추측하거나 회원의 핸드폰을 도용할 수 있지만 둘 다 하는 건 훨씬 어렵다.
인증 후에는 액세스 제어(Access Control)가 제공된다. 당신이 누구인지를 시스템이 알게 되면, 당신이 무엇에 접근할 수 있어야 하는지를 알아야 하며, 그걸 위해 누가 볼 수 있고, 수정하고 사용할 수 있어야 하는지에 대한 사양이 있다. 이 작업은 사용 권한(Permission) 또는 액세스 제어 목록(ACL ; Access Control List)을 통해 수행된다. 액세스 제어 목록(ACL)은 컴퓨터의 모든 파일, 폴더 및 프로그램에 대해 각 사용자의 액세스 권한을 설명한다. "읽기 Read"권한으로 사용자는 파일의 내용을 볼 수 있고, "쓰기 Write"권한으로 내용을 수정할 수 있으며 "실행 Exeute"권한은 사용자가 프로그램처럼 파일을 실행할 수 있도록 해준다.
Spy Agency와 같이 서로 다른 수준의 액세스 권한을 가진 사용자가 있는 조직의 경우, 기밀성, 무결성 및 가용성 보장을 위해 액세스 제어 목록을 올바르게 구성하는 것이 특히 중요하다.
공개, 비밀 및 일급비밀의 세 가지 액세스 수준이 있다고 가정해 보자.
일반적인 경험 법칙의 첫 번째는 사람들이 "읽을 수 read up" 있어야 한다는 것이다. 사용자가 비밀 파일을 읽기 전용으로만 하면, 그들은 일급비밀을 읽을 수 없어야 하지만 공개 파일 및 비밀 파일에는 접근할 수 있어야 한다.
일반적인 경험 법칙의 두 번째는 사람들이 "적어 wirte down"둘 수 없다는 것이다. 회원이 일급비밀 허가를 받은 경우, 그들은 일급비밀 파일을 쓰거나 수정할 수 있어야 한다. 하지만 비밀 파일이나 공개 파일은 제외된다. 가장 높은 허가를 가지고도 하위 비밀 파일을 수정할 수는 없다는 것이 이상하게 보일 수 있다. 하지만 이는 공개 또는 공개 파일에 일급비밀 정보가 우발적으로 유출되지 않도록 보장한다.
이 "no read up, no wirte down" 접근법을 Bell-LaPadula 모델이라고 한다. 이것은 미 국방부의 다단계 보안 정책을 위해 형성되었다. 액세스 제어를 위한 중국의 Wall 모델, Biba 모델과 같은 다른 많은 모델이 있다. 어떤 모델이 가장 적합한지는 사용 경우에 달려있다.
인증 및 액세스 제어는 컴퓨터가 사용자가 누구인지, 그리고 접근할 대상을 판단하는 것에 도움이 되지만, 사이버 보안의 성공은 인증 및 액세스 제어 프로그램을 실행하는 하드웨어 및 스프트웨어를 신뢰할 수 있는지 여부에 달려있다. 이것은 큰 의존이다.
침입자가 맬웨어(Malware)라고 불리는 악성 소프트웨어를 설치해 호스트 컴퓨터의 운영 체제를 손상시키는 경우 보안 프로그램에 침입자를 들여보내는 뒷문이 없다는 것을 어떻게 확신할 수 있을까? 짧게 대답한다면 할 수 없다고 말할 수 있다.
우리는 여전히 프로그램 또는 컴퓨팅 시스템의 보안을 보장할 방법이 없다. 이유는 보안 소프트웨어가 이론적으로는 안전해도 구현 시에는 버그로 인해 여전히 취약점이 발생할 수 있다. 그러나 버그의 가능성을 줄이기 위한 기술이 있다. 버그가 발생했을 때 빠르게 버그를 찾아서 정정하고, 프로그램이 손상되었을 때 대미지를 완화한다.
대부분의 보안 오류는 구현 오류에서 비롯된다. 구현 오류를 줄이려면 구현을 줄이면 된다. 시스템 레벨 보안의 성배 중 하나는 "보안 커널 Security Kernel" 또는 "신뢰 컴퓨팅 기반 Trusted Computing Base"이다. 안전성이 보장되는 운영 체제 소프트웨어의 최소 집합이다. 이러한 보안 커널 구축에 대한 도전은 그 안에 무엇이 들어갈지 결정하는 것이다. 코드가 적을수록 좋다는 것을 기억하라!
코드 팽창을 최소화한 후에도, 작성된 코드가 안전하다는 것을 "보장"하는 것이 좋다. 공식적으로 코드의 보안을 검증하는 것이 연구의 활발한 영역 중 하나이다.
현재?의 최선책은 독립 검증(Independent Verification) 및 비준(Validation)이라고 하는 프로세스이다. 이는 보안을 염두에 둔 개발자들이 코드를 감사함으로써 작동합니다. 이것이 보안 코드가 거의 항상 오픈소스인 이유이다. 버그를 찾는 원본 코드를 쓴 사람에겐 종종 어렵지만, 신선한 눈과 다른 전문 지식으로, 외부 개발자들은 문제를 발견할 수 있다.
또한 같은 생각을 가진 해커와 보안 전문가가 아이디어를 공유하고 공유할 수 있는 회의가 있다. 가장 큰 회의는 라스베이거스에서 매년 개최되는 DEFCON이다.
마지막으로, 코드를 줄이고 감사한 후에도 똑똑한 공격자는 자신을 안으로 들여보낼 속임수를 찾아낸다. 이를 염두에 두고, 훌륭한 개발자는 피해가 제한되고 포함되어야 하지만, 프로그램이 훼손되지 않았을 때 컴퓨터에서 실행되는 다른 작업을 손상시키지 않는 방식으로 접근해야 한다. 이 원리를 고립(Isolation)이라고 한다.
고립을 달성하기 위해 "샌드 박스" 응용 프로그램을 사용할 수 있다. 이것은 화가 난 아이를 샌드 박스에 배치하는 것과 같다. 아이가 분통이 터졌을 때 그 아이는 자신의 상자에 있는 모래성만 파괴할 수 있고, 다른 샌드 박스에 있는 아이들은 계속 놀 수 있다.
운영 체제는 다른 프로그램이 만질 수 없는 각각의 메모리 블록을 제공하여 샌드 박스 응용 프로그램을 시도한다. 또한 단일 컴퓨터가 여러 개의 가상 컴퓨터(Vritual Machine), 본질적으로 시뮬레이트 된 컴퓨터를 실행할 수도 있다. 각 컴퓨터는 각각의 샌드 박스에 있다고 할 수 있다. 프로그램이 잘못되었다면 최악의 경우는 실행 중인 가상 컴퓨터만 충돌하거나 손상된다. 다른 모든 가상 컴퓨터는 격리돼있어 영향을 받지 않는다.
여기까지는 컴퓨터 보안 주제의 몇 가지 핵심에 대한 폭넓은 개요였다. 이 외의 방화벽과 같은 심지어 네트워크 보안은 언급하지도 못했다.
'컴퓨터공학 > 기초' 카테고리의 다른 글
암호화(Cryptography) (0) | 2022.11.20 |
---|---|
해커 및 사이버 공격 (0) | 2022.11.13 |
월드 와이드 웹( WWW ; World Wide Web) (0) | 2022.10.30 |
컴퓨터 네트워크 (0) | 2022.10.09 |
3D 그래픽 (0) | 2022.10.02 |
댓글