컴퓨터 보안
컴퓨터 보안
보안과 프라이버시
위협 모델
- 보안이 필요한 대상 목록과 각 보안 대상에 가해질 수 있는 공격을 열거해 이런 공격을 방어할 방법을 설계할 수 있게 한다.
- 보안 수준과 위험도, 비용 등 여러 요소를 고려해 위협 모델에 적합한 방어를 설계해야 한다.
신뢰
- 현대에 많은 기술의 발전을 거치면서 다양한 대상과 공격 방법들이 생기면서 신뢰할 대상을 선택하는 것은 어렵다.
- 신뢰할 대상이 늘어날 때마다 보안이 감소한다는 딜레마도 있다.
- 서드파티도 사용은 해야하지만 보안이 떨어지는 딜레마가 존재한다.
- 의도적, 무능, 부정직 신뢰 위반을 고려해서 신뢰할 대상을 선택해야 한다.
물리적 보안
- 대상을 물리적으로 지키는 것이다.
- 대상에 접근할 수 있는 권한을 부여해 권한이 있는 경우만 접근할 수 있다.
- 물론 권한을 어떻게든 취득하거나 탈취해서 접근할 수도 있다.
- 접근을 편하게 하기 위해 다른 접근 방법을 열어두는 경우도 있는데 이런 경우를 활용해 접근하는 백도어도 있다.
통신 보안
- 통신에서는 인증 과정을 통해 대상에 접근할 수 있는지 확인한다.
- 인증을 위조해서 통과하는 공격 표면 외에도 정보를 가져간 후에 변경하거나 악의적으로 행동하는 경우도 있다. (신뢰성)
- 두 당사자의 중간에 공격자가 들어가 통신을 가로채거나 변경하는 중간자 공격이 있다.
- 이러한 상황들을 크립토그래피를 통해 해결할 수 있다.
- 수신자만 아는 비밀 코드로 내용을 암호화해서 전달하고, 수신자는 비밀 코드로 복호화해서 내용을 읽는다.
모던 타임즈
- 현재는 다양한 대상, 다양한 방식으로 공격이 발생한다.
- DoS/DDos 공격 같은 것들이 대표적이다.
- 프록시 때문에 공격자를 추적하기도 쉽지 않아졌다.
- 크립토그래피 시스템 공격은 잘 설계된 시스템을 공격하는 것이기에 어렵다.
- 사회적 공격이 쉽다.
메타데이터와 감시
- 내용을 직접적으로 살펴보지 않고 통신 패턴을 관찰하는 것만으로도 많은 정보를 얻을 수 있다.
- 데이터 자체에 대한 정보가 아닌 데이터에 대한 설명 등을 담고 있는 메타데이터 같은 것을 관찰할 수 있다.
사회적 맥락
- 보안은 사회적 문제이기도 하지만 나라마다 다른 문제이기도 하다.
- 통신은 국가 간의 통신을 쉽게 가능하게 발전했지만, 이러한 각기 다른 관습과 법으로 인한 문제가 복잡하다.
인증과 권한부여(인가)
- 인증은 대상이 일치하는 대상인지를 증명하는 과정이라면, 인가는 인증된 대상이 권한이 있는지를 확인해서 제한하는 과정이다.
- 최근에는 2단계 인증(2FA)을 많이 사용한다.
크립토그래피
- 정해진 수신자만 수신할 수 있게 해주는 것 외에도 위변조를 막거나 감지할 수도 있다.
스테가노그래피
- 내용을 다른 내용 속에 감추는 방식이다.
- 송/수신자 사이에 연결 기록이 남지 않는다.
치환 암호
- 각 문자를 다른 문자로 변환하는 표를 통해 메시지를 암호화하거나 복호화 한다.
- 원본 메시지를 평문, 암호화된 메시지를 암호문이라고 부른다.
- 암호화와 복호화에 같은 암호를 사용하는 대칭키 방식이다.
- 통계를 통해 치환 암호를 깰 수 있어서 취약하다.
전치 암호
- 문자 위치를 뒤섞는 방식이다.
- 스키테일, transposition cipher라고도 부른다.
- 마찬가지로 쉽게 풀 수 있어서 취약하다.
일회용 패드
- 중복되지 않는 유일한 치환 암호들의 모음이다.
- 제대로 사용하기만 하면 완전히 안전하다.
- 양쪽이 같은 패드를 써야 하고, 동기화돼야 한다.
- 패드가 메시지만큼 길어야 한다.
키 교환 문제
- 대칭 암호 시스템은 양쪽이 같은 키를 사용해야 한다.
- 중간에 가로채도 알 방법이 없다.
- 키가 망가지거나 손상 되면 쓸모가 없어진다.
- 즉, 중간자 공격에 취약하다.
공개키 암호
- 서로 연관된 키 쌍을 사용한다.
- 누구나 알고 있는 공개키로 암호화하고, 본인만 알고 있는 비밀키로만 복호화 할 수 있다.
- 공개키 암호는 트랩도어 함수에 의존한다.
- 트랩도어 함수는 한 방향으로 계산은 쉽지만, 비밀 정보를 알지 못하면 반대 방향으로 계산이 어렵다.
- 트랩도어 함수를 계산할 수 있는 정보를 공개키, 쉽게 풀 수 있게 해주는 비밀 정보가 비밀키다.
- 비대칭 암호화는 계산 비용이 많이 든다.
- 그래서 비용을 줄이기 위해 잠시 대칭 방식으로 계산하려고 대칭 세션 키를 사용한다.
- 대칭 세션 키 생성 방법으로는 디피-헬먼 키 교환이 있다.
전방향 안정성
- 대칭 암호 세션 키를 실제 통신에 사용하면, 키 유출 시 모든 메시지를 읽을 수 있다는 문제가 있다.
- 이를 피하기 위해 각 메시지마다 세션 키를 새로 만드는 전방향 안정성 암호화를 사용한다.
- 그래서 키를 알아내도 메시지를 하나 밖에 못푼다.
암호학적 해시 함수
- 모든 해시 함수를 사용할 수는 없고 몇몇 특성을 지닌 함수만 암호학적 해시 함수로 쓸 수 있다.
- 암호학적 해시 함수의 핵심 특성은 모두 단방향 함수라는 것이다.
- 또한 차이가 조금 있는 여러 입력 데이터에 해시 함수를 적용해 만든 해시값들은 서로 연관 관계가 없어야 한다.
- 그래서 비슷한 값들에 대한 유추가 어렵다.
- 즉 해시 충돌을 만들어내기가 어려워야 한다는 것이다.
디지털 서명
- 데이터가 진본임을 검증한다.
- 정합성, 부인방지, 인증을 제공한다.
- 정합성 검증은 메시지가 변조됐는지를 검증한다.
- 데이터의 암호학적 해시 값을 데이터 뒤에 추가하고, 이때 해시를 자신의 비밀키로 암호화해 메시지 뒤에 덧붙인다.
- 서명의 경우는 공개키와 비밀키 역할이 반대다.
- 부인방지는 메시지를 보낸 사람이 자신이 보낸 적이 없다고 주장할 수 없다는 것이다.
- 비밀키로 메시지에 서명하기 때문이다.
- 수신자는 메시지에 서명한 사람을 확신할 수 있고, 해시값으로부터 변조 여부를 확인할 수 있다.
- 그래서 수신자가 받은 메시지가 원본과 동일하다는 사실을 확인(인증)할 수 있는 것이다.
공개키 인프라
- 공개키가 신뢰할 수 있는 것인지 알기 위해 공개키 인프라스트럭처(PKI)를 사용한다.
- 신뢰할 수 있는 인증기관에서 키가 어떤 당사자의 것인지 인증해준다.
- 인증기관이 인증기관의 키로 서명된 인증서를 발행한다.
- 물론 인증기관도 만능은 아니라 신뢰 문제가 발생할 수도 있다.
블록체인
- 크립토그래피를 응용한 분야다.
- 데이터를 기록하는 레코드가 있고 이를 블록이라 한다.
- 새 블록을 만들 때는 이전 블록에 대한 암호학적 해시와 블록 생성 시간을 추가한다.
- 이렇게 연결된 블록의 체인이 생긴다.
- 블록을 변경하면 해시가 변경되어 다른 블록에 저장된 해시와 일치하지 않게 된다.
패스워드 관리
- 예전에는 패스워드를 평문 그대로 저장했지만, 이제는 암호화해서 저장한다.
보안을 위한 소프트웨어 예방 조치
올바른 대상을 보호하라
- 모든 대상을 안전하게 할 필요 없이 안전해야만 하는 대상만 안전하게 하면 된다.
- 안전할 필요가 없는 대상을 안전한 대상에 접근할 수 있는 사용자와 그렇지 않은 사용자가 모두 볼 수 있다.
- 그렇지 않은 사용자가 안전한 대상에 접근할 가능성이 커진다.
로직은 세 번 체크하라
- 로직에 오류가 있으면 공격당할 가능성이 높기 때문에 코드를 보고 또 보자
오류를 검사하라
- 오류와 경고 보고를 항상 활성화 하고 무시하지 말고 확인하자
공격 표면을 최소화하라
- 기능이 많을수록 그만큼 공격 표면이 많아진다.
- 코드를 가능한 간단하게 유지해 공격 표면을 줄이자
경계 내부에 머물러라
- 가정하지 말고 경계 내부에 머물 수 있게 주의하자
- 데이터의 경계 내부도 중요하지만 메모리 경계 내부에 머무는 것도 중요하다.
- 타이밍 경계도 주의하자
- 이러한 경계 버그를 잡을 때 도움이 되는 퍼징이라는 테스트 기법이 있다.
좋은 난수를 생성하기는 힘들다
- 크립토그래피에는 좋은 난수가 중요하지만 생성하기 힘들다.
- 가장 흔히 의사 난수 생성이 많이 쓰인다.
- 의사 난수는 같은 숫자에서 시작하면 같은 순서로 난수가 생성된다.
- 최근에는 무작위성을 높이기 위해 여러 가지 대상으로부터 엔트로피를 수집한다.
네 코드를 알라
- 큰 프로젝트일수록 서드파티 코드가 들어가는 경우가 많다.
- 제품에 쓰이지 않는 코드가 꽤 많이 제품에 포함되기도 한다.
- 오픈소스 같은 경우는 코드를 볼 수 있기에 보안상 오히려 더 좋을 수도 있다.
- 써드파티 패키지에서 실제 사용하는 코드의 크기와 전체 패키지 크기 사이의 비율을 주시하자.
- 출시 전에는 반드시 디버깅을 위한 코드를 제거하자
극단적인 영리함은 여러분의 적이다
- 벤더가 사용자가 적어 지원하지 않는 잡다한 기능은 가급적 사용하지 말자
눈에 보이는 것을 이해하라
- 프로그램 구현의 메타데이터나 부작용을 이용한 사이드 채널 공격을 조심하자
- 예를 들면 틀린 암호보다 올바른 암호 검사에 시간이 더 걸린다는 점을 이용한 타이밍 공격 같은 것들이 있다.
과다수집하지 마라
- 가장 안전한 방법은 안전해야 할 대상을 만들지 않는 것이다.
- 정말 필요한 경우가 아니라면 민감한 정보를 수집하지 말자
- 생년월일을 알고 있다면 나이를 굳이 수집할 필요가 없는 것처럼
모아두지 마라
동적 메모리 할당은 여러분의 친구가 아니다
- 동적 메모리 해제 시에는 민감한 정보를 지워야 한다.
가비지 컬렉션도 여러분의 친구가 아니다
코드 역할을 하는 데이터
- 코드도 결국 컴퓨터가 이해할 수 있는 데이터다.
- 데이터를 실행하는 프로그램은 코드와 데이터가 분리되어 있지 않고, 보호장치도 없다.
- SQL 인젝션 같은 대표적인 공격 방법이 있다.
- HTML의 게시글이나 댓글 같은 곳에 자바스크립트 등을 추가해 악용할 수도 있다.
- 이러한 부분들을 생각하며 코드를 작성해야 한다.
This post is licensed under CC BY 4.0 by the author.