
인터넷에서 소프트웨어를 다운로드할 때는 개발자의 프로그램이 악성 코드가 아니라는 점을 믿어야 합니다. 하지만 해커의 위협도 걱정해야 합니다. 공격자가 웹사이트를 해킹해 정상 소프트웨어를 백도어가 심어진 버전으로 교체하면 얻을 수 있는 이득이 상당히 큽니다.
비트코인 지갑 유틸리티를 배포하는 사이트를 생각해 보세요. 공격자가 정상 버전을 악성 버전으로 교체하는 데 성공하면 수만 명의 사용자에게서 자금을 탈취할 수 있습니다. 운영체제 역시 백도어를 심기 좋은 표적입니다. 실제로 과거 리눅스 민트(Linux Mint)에서 이런 일이 발생한 바 있습니다.
그렇다면 어떻게 대비해야 할까요?
해시와 서명
보안에 신경 쓰는 개발자들은 설치 파일이나 아카이브에 검증 가능한 체크섬(checksum)을 함께 제공하는 경우가 많습니다. 윈도우나 리눅스에서 체크섬을 검증하는 방법은 별도의 가이드를 참고할 수 있습니다. 그러나 해시에는 한 가지 문제가 있습니다. 해커가 웹사이트의 파일을 교체하면 해시 값도 함께 바꿀 수 있다는 점입니다. 특히 해시가 프로그램과 같은 서버에 올라와 있다면 해시만으로는 거의 의미가 없습니다.
체크섬을 실질적으로 유용하게 만들려면 개발자가 공개 키와 개인 키 쌍을 이용해 디지털 서명을 추가해야 합니다. 개인 키를 소유한 사람만 서명을 생성할 수 있고, 서명은 인터넷에 공개된 해당 공개 키로만 검증할 수 있습니다. 검증이 통과하면 (거의 항상) 개인 키 소유자가 직접 소프트웨어에 서명했다고 확신할 수 있습니다.
해커가 이 보안 장치를 우회하려면 개인 키를 어떻게든 훔쳐야 하는데, 소유자가 적절히 보관하고 있다면 이는 훨씬 어렵습니다. 설령 키가 유출되더라도 소유자는 키를 폐기(revoke)하고 이를 공표함으로써 무효화할 수 있습니다. 이런 경우 공개 키를 내려받아 서명을 검증하려 할 때 해당 키가 이미 폐기되었다는 알림을 받게 됩니다.
GnuPG(GPG)로 서명 검증하기
gpg 유틸리티는 대부분의 배포판에 기본적으로 설치되어 있습니다. 어떤 이유로든 없다면 아래 명령으로 설치하세요. 일부 배포판에서 "gpg: failed to start the dirmngr '/usr/bin/dirmngr': No such file or directory" 같은 오류가 나타나면 dirmngr도 함께 설치해야 합니다.
데비안, 우분투 또는 데비안 계열 배포판에서는:
sudo apt install gnupg dirmngr
레드햇/CentOS에서는:
sudo yum install gnupg dirmngr
페도라에서는:
sudo dnf install gnupg dirmngr
아래 예제를 따라 하며 데비안 9.8.0 설치 ISO를 검증하는 과정을 연습해 볼 수 있습니다.
"SHA256SUMS", "SHA256SUMS.sign", "debian-9.8.0-amd64-netinst.iso" 세 파일을 다운로드하세요. 웹 브라우저에서 처음 두 파일은 마우스 오른쪽 버튼을 클릭해 "다른 이름으로 링크 저장" 등의 메뉴를 선택해야 할 수 있습니다. 그냥 클릭하면 자동으로 다운로드되지 않고 내용만 화면에 표시될 수 있습니다.
터미널 에뮬레이터를 열고 다운로드한 파일이 있는 디렉터리로 이동합니다.
cd Downloads/
체크섬 검증하기
ISO 다운로드가 끝날 때까지 기다린 후 SHA256 체크섬을 검증합니다.
sha256sum -c SHA256SUMS

체크섬이 일치하면 파일 이름 뒤에 "OK" 메시지가 표시됩니다. 다른 종류의 체크섬을 검증하려면 sha1sum, sha512sum, md5sum 명령을 사용할 수 있습니다. 다만 가능하다면 최소한 SHA256 이상의 해시를 사용하는 것이 좋습니다.
일부 사이트는 파일 이름과 체크섬을 묶어 놓은 SHA256SUMS 같은 파일을 제공하지 않습니다. 이런 경우 사이트에 표시된 해시 값과 파일의 해시를 다음과 같은 명령으로 직접 비교합니다.
sha256sum debian-9.8.0-amd64-netinst.iso
GPG로 서명된 체크섬 검증하기
이 예제에서 데비안 팀은 자신들의 개인 키로 "SHA256SUMS" 파일에 서명하고 그 결과를 "SHA256SUMS.sign" 파일에 저장했습니다. 다음 명령으로 서명을 검증합니다.
gpg --verify SHA256SUMS.sign SHA256SUMS
그러면 다음과 같은 메시지가 출력됩니다.
gpg: Signature made Sun 17 Feb 2019 05:10:29 PM EET gpg: using RSA key DF9B9C49EAA9298432589D76DA87E80D6294BE9B gpg: Can't check signature: No public key
이는 컴퓨터에 해당 공개 키가 없다는 뜻이며, 정상적인 상황입니다. 키서버에서 공개 키를 가져와야 합니다.
gpg --keyserver keyring.debian.org --recv-keys DF9B9C49EAA9298432589D76DA87E80D6294BE9B
키서버가 다운되어 있다면 다른 키서버를 사용할 수 있습니다. 예를 들어 keyring.debian.org를 keyserver.ubuntu.com으로 바꾸면 됩니다.
그런데 이 키가 진짜인지 어떻게 확신할 수 있을까요? 안타깝게도 100% 확신하려면 '신뢰의 웹(web of trust)'이라 불리는 신뢰망을 구축해야 합니다. 물론 지금 단계에서는 갖추기 어렵지만, 몇 가지 방법으로 확인할 수 있습니다.
먼저 키의 지문(fingerprint, DF9B9C49EAA9298432589D76DA87E80D6294BE9B)을 구글에서 검색해 보세요. 결과가 없으면 마지막 여덟 글자(6294BE9B)만 검색해 보세요. 정상적인 키라면 관련 소프트웨어를 다루는 여러 웹사이트에서 언급되며, 잘 보관된 키는 오랫동안 사용되므로 관련 게시물이 여러 해에 걸쳐 분포하는 경우가 많습니다.
정말 조심하고 싶다면 BitTorrent 이미지를 내려받은 뒤 체크섬과 서명을 검증하세요. 토렌트의 작동 방식상 수백 명의 서로 다른 사용자가 업로드한 파일을 통째로 교체하는 것은 불가능합니다. 또한 BitTorrent 자체에도 다운로드하는 모든 데이터 조각의 무결성을 검증하는 메커니즘이 내장되어 있습니다.
이제 공개 키를 확보했으니 드디어 서명을 검증할 수 있습니다.
gpg --verify SHA256SUMS.sign SHA256SUMS

"Good signature(올바른 서명)"라는 메시지가 보이면 모든 것이 정상이라는 뜻입니다. 경고 메시지는 걱정하지 않아도 됩니다. 앞서 말했듯이 해당 공개 키에 대한 신뢰의 웹이 구축되어 있지 않기 때문에 나타나는 정상적인 현상입니다.
결론
이미 알고 있겠지만, 인터넷에서 어떤 것도 100% 확실하다고 말하기는 어렵습니다. 그래도 예방 조치를 취하는 편이 훨씬 안전하며, 다운로드한 파일의 디지털 서명을 검증하면 악성 소프트웨어를 피하는 데 큰 도움이 됩니다. 사용자들이 백도어가 심어진 운영체제나 비트코인 지갑 프로그램을 다운로드해 피해를 입었던 많은 사례에서, 서명만 확인했어도 충분히 문제를 피할 수 있었습니다. 정상 파일의 서명은 변조되지 않았기 때문입니다.