친구에게 비밀 글이나 비밀 파일을 보내야 할 때 여러분은 어떤 방식을 사용하고 계신가요? 아마도 파일을 압축하고 비밀번호를 설정한 후, 이 비밀번호를 메신저나 이메일을 통해 전송하고 있을 것입니다. 하지만 이 방식은 암호가 유출될 위험이 있으므로 보안상의 문제가 발생할 수 있습니다. 그렇다면 어떤 방법을 사용해야 할까요?
본 포스팅에서는 안전한 컴퓨팅 방법인 PGP를 소개하고자 합니다. PGP는 ‘Pretty Good Privacy’의 약어로, 개인정보와 데이터를 안전하게 암호화하고 전자 서명을 생성하는 데 사용되는 암호화 프로토콜 및 소프트웨어입니다. PGP는 높은 수준의 암호화를 누구나 쉽게 수행할 수 있는 유용한 소프트웨어입니다. PGP를 사용하기 위해 키를 생성하면 공개키(Public Key)와 개인키(Private Key)가 쌍으로 생성됩니다. 다른 사람이 나의 공개키를 이용하여 암호화할 수 있으며 암호화된 파일은 나의 개인키로만 복호화를 할 수 있습니다. 그러므로 PGP의 서비스를 원활하게 이용하기 위해서는 공개키를 공유하는 것이 중요합니다. 그렇다면 PGP에서는 안전하고 효율적으로 키를 공유하기 위해 어떤 방법을 제공할까요?
Web of trust
PGP를 안전하게 사용하기 위해서는 공개키에 대한 신뢰가 중요합니다. 신뢰할 수 없는 공개키에 암호화를 하면 중요한 정보가 유출될 수 있습니다. 이러한 신뢰 문제를 해결하고 안전하게 공개키를 공유하기 위해 제안된 개념이 Web of trust입니다. Web of trust는 중앙 집중식 인증기관(PKI) 없이도 사용자 간에 신뢰 관계를 형성하고 키를 교환하는 방법을 제공하는 신뢰 모델입니다. 예를 들어, [그림 1]과 같이 A가 B를 신뢰하고 B가 C를 신뢰할 때 A는 C를 알지 못하지만, B와의 연결을 통해서 A가 C를 신뢰할 수 있도록 설계한 관계가 Web of trust입니다. 이처럼 내가 직접적으로 알지 못하지만, 제삼자를 통해 연결된 신뢰 관계를 간접 신뢰(Indirect Trust)라고 합니다. 간접 신뢰는 Web of trust를 확장하는 중요한 역할을 합니다.

[그림 1] 간접 신뢰 (Indirect Trust)
그러나 Web of trust도 올바르게 활용하지 못하면 오히려 문제가 발생할 수 있는데, 이 모델의 중요한 가치인 ‘신뢰’의 기준이 주관적이기 때문입니다. 사용자마다 신뢰 수준을 평가하는 기준이 다르므로 때에 따라서는 키를 안전하게 관리하지 못하는 사람의 키도 신뢰 망에 연결되어 있어 신뢰하는 키가될 수 있습니다. 그렇다면 신뢰 수준의 구체적인 의미는 무엇이고 주관적인 기준 때문에 어떠한 문제가 발생할 수 있는지 알아보도록 하겠습니다.
신뢰 수준 (Trust Level)
신뢰 수준(Trust Level)이란 키 소유자의 키 관리 능력을 신뢰할 수 있는지 평가하는 기준입니다. 예를 들어, 아무에게나 쉽게 키에 서명하는 키의 소유자는 신뢰하기 어렵지만, 신중하게 키에 서명하는 키의 소유자는 신뢰할 수 있습니다. 이러한 신뢰도는 다음과 같이 다섯 단계의 신뢰 수준으로 표현됩니다.
1 = I don't know or won't say // 신뢰 수준을 판단할 수 없음
2 = I do NOT trust // 신뢰하지 않음
3 = I trust marginally // 제한된 신뢰
4 = I trust fully // 완전한 신뢰
5 = I trust ultimately // 최고 수준의 신뢰로 자신의 키에 해당
1 과 2는 잘 모르는 사람이거나 신뢰할 수 없는 상황에 해당합니다. 그리고 3 또는 4는 신뢰가 있지만, 신뢰 정도에 따라서 구분하여 선택할 수 있습니다. 5는 최고 수준의 신뢰로 자신일 경우 해당합니다.
신뢰 수준의 문제
앞에서 언급한 바와 같이, Web of trust는 ‘신뢰’라는 주관적인 기준을 기반으로 평가하기 때문에 문제가 발생할 가능성이 있습니다. 이러한 문제를 이해하기 위하여 [그림 2]와 같은 상황을 가정해보도록 하겠습니다.

[그림 2] 간접 신뢰 예시
Case1은 A가 B를 제한적으로 신뢰하고, B 또한 C를 제한적으로 신뢰합니다.Case2는 A가 B를 완전하게 신뢰하고, B는 C를 제한적으로 신뢰합니다.Case3은 A가 B를 완전하게 신뢰하고, B 또한 C를 완전하게 신뢰합니다.
[그림 2]와 같이 A가 C를 알지 못하는 다양한 간접 신뢰 상황에서 A는 C에 대한 신뢰 수준을 각각 어떻게 설정하는 것이 바람직할까요?
Case1에서는 간접 신뢰의 의미를 관대하게 해석하면 A가 C를 신뢰할 수 있습니다. 그러나 보수적으로 해석하면 A가 C를 신뢰할 수 없습니다. Case2에서는 A가 B를 완전하게 신뢰하기 때문에 C에 대한 신뢰도를 Case1보다는 더 높게 평가할 수 있습니다. 그러나 보수적으로 해석하면 여전히 A가 C를 신뢰할 수 없습니다. 다음으로 신뢰가 가장 높은 상황인 Case3을 살펴보겠습니다. A가 B를 완전하게 신뢰하고, B가 C를 완전하게 신뢰할 때는 간접 신뢰이지만 신뢰도가 높은 상황이므로 A가 C를 신뢰할 수 있습니다. 그러나 이러한 경우에도 A는 C를 알지 못하는 상황에서 오로지 B의 키 관리 능력에 의지해서 신뢰망을 구축하게 되어 신뢰의 균열을 만들 수 있습니다. 그러므로 Web of trust를 안전하게 사용하기 위해서는 신뢰의 기준을 명확하게 설정할 필요가 있습니다.
보안 vs. 확장

[그림 3] 간접 신뢰의 평가
보안의 관점에서는 모든 정책은 보수적이어야 합니다. 따라서 신뢰 수준의 평가 역시도 보수적이어야 합니다. 가장 안전한 신뢰 수준 설정 방법은 내가 아는 사람만 신뢰하는 것입니다. 만난 적이 없다면 신뢰할 수 없다는 기준을 세워야 합니다. 그러므로 간접 신뢰의 상황에서는 2 수준인 Not trust를 설정해야 합니다. 물론 이와 같은 기준을 세우게 되면 Web of trust가 확장될 수 없다고 생각할 수 있습니다. 그러나 PGP를 사용하는 목적에 대해 생각해보시기 바랍니다. PGP는 안전한 컴퓨팅을 목적으로 사용하고 있습니다. 안전을 위협할 수 있는 요소가 있다면 보수적인 관점으로 접근하여 신중하게 사용할 필요가 있습니다. 따라서 나를 기준으로 직접 신뢰(Direct Trust)만 신뢰 수준을 설정하고 그 외에는 모두 신뢰하지 않음(2, Not Trust)으로 설정하는 편이 좋습니다. 또한, 직접 신뢰의 경우도 3 수준인 Marginally를 기본적으로 사용해야 합니다. [그림 4]는 A를 중심으로 신뢰 수준을 설정한 예제입니다.

[그림 4] 다양한 신뢰 관계 예제
PGP를 안전하게 사용하기 위해서는 Web of trust의 확장보다 안전한 신뢰망 형성을 우선으로 생각해야 합니다. 함께 일하는 회사 동료, 팀원들과 같이 직접 만나는 관계에서 안전한 신뢰망을 구축하는 것부터 시작해야 합니다. Web of trust는 누구나 인증기관(Certificate Authority)이 될 수 있습니다. PGP를 안전하게 사용하기 위해서 PGP의 키 관리 시스템과 절차를 정확하게 이해하고 신중하게 키에 서명하고 관리한다면 견고하고 안전한 PGP 사용이 가능할 것입니다.
PGP 사용의 생활화
PGP를 일상생활에서 사용하면 더욱 안전한 컴퓨팅 환경을 구축할 수 있습니다. 다음과 같은 상황에서 PGP의 사용을 적용할 수 있습니다.
파일 암호화 전송
다양한 업무를 수행하는 과정에서 암호화가 필요한 상황이 때때로 발생합니다. 연구계획서를 작성하거나 특허 또는 소프트웨어 등록을 위해 주민등록번호, 주소 등 개인정보가 요구될 때가 있습니다. 또는 연구 관련 비용을 집행하기 위해 신용카드 번호 및 CVC(Card Verification Code) 정보가 요구되기도 합니다. 그 외에도 연구 장비에 접속하기 위해 계정 정보의 공유가 필요한 상황이 발생합니다. 이처럼 업무 수행 중 다양한 형태의 민감한 정보를 공유해야 하는 상황이 발생할 때 안전하게 정보를 공유하기 위하여 PGP로 암호화하여 안전하게 정보를 공유할 수 있습니다.
Git 커밋 서명
소프트웨어 개발 시 GitHub와 GitLab에 공개키를 등록하여, 커밋할 때마다 코드에 서명을 진행할 수 있습니다. 신원이 확인되지 않은 악의적인 공격자가 공개 소프트웨어 저장소에 악성 코드를 업로드할 수 있습니다. 이러한 문제를 해결하기 위하여 커밋시 서명을 진행하면 개발자의 신원을 보증하여 안전한 환경을 만들 수 있습니다. [그림 5]와 같이 커밋시 서명이 정상적으로 완료되면 원격저장소에서 개발자의 신원이 확인되었음을 나타내는 Verified를 확인할 수 있습니다.

[그림 5] 서명을 사용한 커밋
KAIST CSRC가 제안하는 새로운 PGP 활용법
우리 센터에서는 PGP 활용을 더욱 장려하기 위해 다양한 방법을 모색하고 있습니다. 그 일환으로 PGP를 활용한 롤링페이퍼를 설계하였습니다.
누구나 학창 시절에 롤링페이퍼를 한 번쯤은 사용해보셨을 것입니다. 롤링페이퍼란 한 장의 종이에 여러 사람이 메시지를 작성하여 전달하는 것입니다. 이와 같은 작성 방식은 다른 사람이 작성한 메시지를 누구나 확인할 수 있습니다. 이러한 이유로 때로는 깊이 있는 마음을 전하기 어려울 수 있습니다. 이를 개선하기 위하여 기존의 롤링페이퍼에 PGP를 사용하여 편지의 최종 수신자(주인공)만 확인할 수 있는 메커니즘을 제안하였습니다.

[그림 6] PGP를 활용한 롤링페이퍼
[그림 6]의 상황은 X가 최종 수신자이고, A, B, C가 메시지 작성자입니다. A, B, C는 X의 공개키를 소유하고 있습니다. 처음 시작은 A가 A.txt에 메시지를 작성하여 rolling.enc로 압축 후 X의 공개키로 암호화하여 B에게 보냅니다. B는 B.txt에 메시지를 작성 후 A에게 받은 rolling.enc와 B.txt를 rolling.enc로 압축 후 X의 공개키로 암호화하여 C에게 보냅니다. 여기까지 과정을 살펴보면 rolling.enc는 메시지가 다른 사람에게 전달되면서 덮어쓰기가 되어 파일 내용은 변경되지만 이름은 동일한 것을 알 수 있습니다. C도 동일하게 메시지 작성 후 압축 및 암호화하여 X에게 보냅니다. X는 받은 rolling.enc를 자신의 개인키로 복호화와 압축 해제를 반복하면 A, B, C의 메시지 파일을 모두 확인할 수 있습니다.
이러한 방식을 통해 안전한 롤링페이퍼 구현이 가능하며, 파일이 암호화되어 있으므로 메시지 전달을 위해 메신저, 메일, 파일 공유 서비스 등 다양한 매체를 활용할 수 있습니다. PGP를 활용한 롤링페이퍼는 사내에서 안전하고 재미있는 의사소통 도구로 활용될 수 있습니다.
글을 마치며
지금까지 PGP의 의미와 PGP를 안전하게 사용하기 위한 신뢰 수준 설정 방법에 관해 알아보았습니다. 또한, PGP를 사용하여 파일 암호화 등 다양한 활용 방법에 관해서 이야기하였습니다. 그리고 우리 센터에서 PGP의 다양한 활용 방안을 고민하여 제안한 ‘PGP를 활용한 롤링페이퍼’를 소개하였습니다. 본 포스팅을 통해서 편리하고 안전한 PGP 사용이 일상생활에 자리 잡고 다양한 형태로 발전하여 대중화되기를 기대해봅니다.
Reference
[1] https://en.wikipedia.org/wiki/Pretty_Good_Privacy
[2] https://www.gnupg.org
[3] https://en.wikipedia.org/wiki/Web_of_trust

KAIST 사이버보안연구센터 바이너리분석 팀장. 바이너리 분석 플랫폼인 B2R2 핵심 개발자로 활동 중이다. 2015년부터 강력한 타입 시스템과 직관적인 프로그래밍이 가능한 F#을 주 개발언어로 사용하고 있으며, F# Korea의 멤버로도 활약하고 있다.