로렌은 디지털 인증서의 창시자로서 지금까지 정보 보안에 엄청난 공헌을 했다. 그리고 이 책에서 그 여정을 이어간다.
- 마틴 헬먼(Martin Hellman) / 스탠포드 대학 명예 교수, ACM 튜링상 수상자
여러분이 방금 읽기 시작한 이 책은 여러 면에서 특이하다. 방대하지는 않지만 진중하게 쓰였으며, 거의 코드 없이도 기술적인 내용을 훌륭히 다루는 책이다. 그리고 보안 전문가가 아닌 ‘일반 개발자를 위한 보안 책’이다. 저자 로렌이 직접 언급했듯이, 이 책은 대규모 상업용 제품을 출시하고 중요한 보안 기술을 창안했으며 제품 보안 분야에서 광범위하게 작업해온 이가 보안 기술에 대해 지극히 개인적 관점을 피력한 책이다.
이 책은 존중과 배려가 필요한 이들, 즉 보안에 새로이 입문한 IT 전문가를 위한 책이다. 보안 분야에 발을 내디딘 여러분을 환영한다. 이 책을 읽다 보면 알겠지만, 여러분이 다루는 시스템에 대해 내리는 개개의 선택은 곧바로 보안에 영향을 미칠 수 있다. 그러나 선택을 잘 내리기 위해 반드시 보안 전문가가 될 필요는 없다. 이 책에서는 다양한 주제를 다룬다. 만일 여러분이 여기서 더 깊이 들어가고 싶다면, 더 읽을 만한 자료들이 많다. 하지만 그냥 여기서 배운 것만 적용해도 잘 해낼 수 있을 것이다.
- 애덤 쇼스택(Adam Shostack) / 『보안 위협 모델링』 저자, 워싱턴대학교 폴 앨런 컴퓨터공학대학 겸임교수
1996년 유럽 우주국에서 70억 달러를 투자해 10년간 구축한 로켓이 채 1분도 되기 전에 비행 경로를 이탈하면서 폭발한 사고가 있었습니다(이 책의 13장 참조). 사고 원인은 놀랍게도 정수 오버플로(9장 참조)라는 소프트웨어 설계의 결함 때문이었습니다. 안전한 소프트웨어를 설계하는 작업은 복잡한 건축물이나 때로는 인공위성 발사만큼 실로 매우 까다롭습니다. 이 글을 쓰기 직전인 지난 주에도 xz라는 리눅스 압축 유틸리티가 사용되는 라이브러리에서 백도어가 존재할 가능성이 발견되어 전 세계가 발칵 뒤집힐 만큼 시끄러웠습니다. 왜냐하면 수많은 시스템에서 사용하고 있는 소프트웨어의 공급망에 결함이 있는 코드가 존재할 경우 그 영향력은 상상을 초월하기 때문이죠. 로켓 사고 이후 30년 가까이 지난 지금도 여전히 안전한 소프트웨어를 설계하고 구현하는 작업의 난이도는 코드의 규모와 복잡성 때문에 별반 다르지 않거나 오히려 더 높아졌습니다.
이 책은 안전한 소프트웨어를 설계하기 위한 여러 주제를 크게 3가지 측면에서 잘 다루고 있습니다. 우선 기본 개념으로서, 고전적인 정보 보안의 원칙, 위협과 완화, 암호화, 일반적인 원칙 등을 다룹니다. 다음으로 설계 관점에서, 소프트웨어 설계 시점에 보안이라는 요소를 고려하는 방식을 설명하며, 마지막으로, 구현 관점에서 안전한 프로그래밍, 소프트웨어 결함의 종류와 입력값 통제, 보안 테스팅과 모범사례까지 폭넓게 다룹니다. 한마디로, 좀 더 큰 관점에서 나무를 볼 수 있도록 소프트웨어 설계와 구현 프로세스 전체에서 보안을 고려할 수 있는 방법을 여러 예시와 함께 안내하는 좋은 기본서입니다. 모든 내용을 한 권에 종합해 다루므로 이를 바탕으로 각자 궁금한 주제에 대해 세부내용을 더 찾아보고 익힐 수 있는 좋은 나침반 역할을 해줄 것입니다.
- 구형준 / 성균관대학교 소프트웨어융합대학 소프트웨어학과 교수
이 책은 20여 년이 넘는 로렌 콘펠더의 경험을 토대로 작성된 보안에 관한 실전 가이드로, 소프트웨어 설계 초기에 보안을 구축하고 팀 전체를 참여시키는 것을 강조합니다. 핵심 개념인 ‘신뢰, 위협, 완화, 보안 설계 패턴, 암호화’ 등을 집중해 다루며, 보안 고려사항을 염두에 두고 소프트웨어를 설계하고 검토하는 프로세스를 다룹니다. 또한, 취약점을 만드는 일반적인 코딩 결함을 자세히 설명하고, 보안 테스트를 통해 취약점을 사전에 식별하는 방법을 소개합니다. 소프트웨어 공학의 전반적인 개발생명주기에서 보안이라는 특별한 관점에서 유의사항을 친절히 안내하므로 보안이라는 설계 요인을 고려한 개발에 실질적인 도움을 받을 수 있습니다.
마이크로소프트와 구글에서 지낸 저자의 경력을 토대로 쓰여진 이 책은 모든 수준의 소프트웨어 엔지니어가 안전한 소프트웨어를 만드는 데 필요한 보안 사고방식과 도구를 제공합니다. 또한, 소프트웨어 제작과 관련된 모든 사람에게도 잠재적인 영향을 미치며, 특히 IT 프로젝트 관리자는 코드 수준의 상세 내용까지 뛰어들지 않아도 되기 때문에 많은 도움을 받을 수 있습니다.
실제로 해본 사람만이 다룰 수 있는 다양한 얘기들이기에 소프트웨어 엔지니어와 관리자들에게 훌륭한 리소스를 제공하리라 기대합니다.
- 김진태 / 서강대 정보통신대학원 대우교수, (주)스펙트라 CTO
다년간 보안 컨설턴트 및 개발 조직장으로서 개발 팀과 긴밀하게 함께 일하며 다양한 소프트웨어 코드 분석과 구현에 참여해왔다. 그 과정 중에 가장 큰 아쉬움이라면 개발과 보안이 아직까지 완벽한 조화를 이루지 못한다는 점이다. 개발자와 이용자 모두 안전하고 신뢰할 수 있는 소프트웨어를 원하지만, 촉박한 일정, 부족한 리소스로 인해 보안이 후순위로 밀리거나, 부족한 보안 설계 및 구현 경험과 지식으로 인해 원하지 않는 결과물이 도출되는 경우가 많다.
이 책은 20년 넘게 보안 전문가, 개발 조직장으로서 일해온 저자가 평소 전하고 싶었던 개발과 보안에 대한 소신과 경험, 지식을 잘 담아 냈으며, 경험이 부족한 개발자나 보안 담당자가 알아야 하는 기본 개념과 현장에서 마주할 수 있는 다양한 문제들을 다룬다. 이에 독자는 다양한 취약 코드를 살펴봄으로써 문제의 원인을 이해하고 개선하는 데 도움을 얻을 수 있다.
완벽한 소프트웨어를 개발하고자 하는 개발자, 보안 취약점을 이해하고자 하는 보안 담당자, 그리고 핸드북으로 활용하고자 하는 보안 전문가에게 이 책을 추천한다.
- 여성구 / 하이브(HYBE) CISO, CPO, DPO
이 책은 보안 분야가 전문가만의 영역이 아니라 프로젝트에 참여하는 인력 모두가 고민해야 하는 핵심 개념이라는 인식을 심어 줍니다. 특히 1부 ‘안전한 소프트웨어를 위한 기본 개념’은 막연하게 이해하고 있던 보안이라는 개념을 쉽게 이해시키며 용어부터 정확하게 알려주기에 인력 간/부서 간에 나타나는 다양한 보안 이슈를 쉽게 해결할 수 있는 기초를 제공해 줍니다. 이 책의 각 장에는 개발 단계별로 항상 옆에 두고 참고해야 하는 체크리스트와 같은 곱씹을 내용이 많이 담겨 있습니다. 특히, 부록으로 수록된 용어집은 미리 알고 있던 내용이더라도 다시 한번 개념을 정리해주므로 본문을 읽기에 앞서 미리 읽어 보기 바랍니다.
최근 대두되는 보안 이슈가 고민인 분이라면 이 책이 좋은 길잡이가 될 것을 믿어 의심치 않습니다.
- 이호상 / 삼성전자 네트워크사업부 SE 그룹, SW 개발 프로세스 담당 수석
보안과 품질은 어쩌면 닮은 면이 많은 것 같습니다. 제품이 성공적으로 출시되면 크게 티가 나지 않지만, 출시 이후 보안이나 품질 관련 이슈들이 드러나기 시작하면 그제서야 개발 단계에서 챙기지 못했던 것들, 아쉬웠던 것들을 복기하고 한발 늦게 미래를 대비하는 전략을 세우곤 합니다. 항상 마음은 먼저 앞서지만 현실적으로 실행은 쉽지 않다는 측면에서 보안과 품질에 종사하는 사람들은 늘 비슷한 아쉬움을 가지고 있을 겁니다.
이 책은 오랫동안 소프트웨어 보안 업무에 종사한 저자의 경험과 노하우가 그대로 드러나는 책입니다. 소프트웨어 보안에 대한 기본적인 개념과 방법론뿐만 아니라, 실무에 바로 적용할 수 있는 코드 작성법과 테스팅 방법론 등은 소프트웨어 보안과 관련된 업무를 수행하는 사람들이라면 반드시 읽어봐야 할 내용이라 생각됩니다. 소프트웨어의 품질을 관리하고 있는 저는 특히 12장의 보안 테스팅에서 많은 도움을 얻었습니다. 12장의 내용들은 보안 테스팅을 새롭게 시작하거나, 기존 보안 테스팅을 리뉴얼해야 하는 QA들에게 매우 유용하리라 생각합니다.
보안과 관련된 업무에 익숙하지 않은 분들은 부록에 수록된 용어집을 참고하시면서 천천히 책을 정독하시길 추천해 드립니다. 저자의 실전 경험은 물론이고, 다양하고 쉽게 이해할 수 있는 예제들 덕분에 다소 어렵게 느껴지던 소프트웨어 보안이라는 분야가 한 편의 흥미로운 다큐멘터리를 보듯이 잘 정리되는 느낌을 받을 수 있을 겁니다. 모쪼록 독자 여러분들도 이 책을 통해 소프트웨어 보안을 먼저 챙기지 못하던 아쉬움을 덜어내고, 좀 더 단단해진 소프트웨어를 개발하고 출시할 수 있기를 바라 봅니다.
- 진석준 / 데브시스터즈 기술본부 SQA
오늘날 수많은 소프트웨어 제품들이 오픈소스를 포함하거나 기반으로 개발되고 있으며 COTS 서버 기반의 소프트웨어 제품으로 변경되고 있습니다. 이렇듯 오픈소스 사용이 증가함에 따라 보안에 대한 위협이나 요구 또한 급증하고 있음에도, 여전히 소프트웨어 개발자들은 보안을 그저 특정 보안 인력이 전담해야 하는 것으로 인식하거나 끊임없이 제기되는 취약점의 특성에도 불구하고 보안 취약점을 일시에 보완하면 될 뿐이라고 한정해서 생각하는 경향이 큽니다. 그러다 보니 보안 취약점에 대한 처리를 미루고 미루다가 출시 마지막 단계에서 수습하거나 출시 후에 보완하는 경우가 많이 발생합니다.
이 책은 소프트웨어 개발자들에게 보안의 중요 개념은 무엇이며 보안이 왜 필요한지를 알려주며, 개발 초기 계획과 설계 시점에서는 위협 모델링부터 시작해야 함을 강조하고, 개발 프로세스 전반에 걸쳐 보안을 각 단계에 통합해 지속적으로 유지하고 개선해야 한다는 점을 일깨워줍니다. 개발자뿐 아니라 보안 담당자에게도 보안 관련 핵심 개념들을 다시 각인시켜 줄 뿐 아니라 실질적인 해결책을 찾도록 가이드하기에, 보안 관련 종사자들(감사, 회계, 컨설팅 등)이나 각종 자격증에 도전하는 독자들에게도 보안 관련 지식과 용어들에 대한 이해의 폭을 넓혀 줄 것입니다. 이에 이 책은 무엇보다도, 모두가 보안에 대한 공통의 이해와 언어를 갖고 서로 소통하는 데 커다란 역할을 해줄 것이라 기대가 큽니다.
- 황철훈 / 삼성전자 네트워크사업부 시큐리티 랩, 보안 담당 수석, CISSP
이 책은 14개 장으로 구성돼 있으며, 전체 내용은 개념, 설계, 구현을 다루는 3개 부로 나뉘어 있다.
[1부, 안전한 소프트웨어를 위한 기본 개념]
1부에서는 이 책에 대한 개념적 기반을 제공한다. 1장 ‘보안의 기초’는 정보 보안과 개인정보보호 기본사항을 개괄한다. 2장 ‘위협 모델링’에서는 위협 모델링을 소개하고 공격 표면과 신뢰 경계에 대한 핵심 개념을 자산 보호 맥락에서 구체화한다. 이어지는 3개 장은 안전한 소프트웨어를 구축하기 위해 독자들이 이용할 수 있는 귀중한 도구들을 소개한다. 3장 ‘보안 위협의 완화’에서는 식별된 위협을 방어적으로 완화하기 위해 일반적으로 사용되는 전략을 설명하고, 4장 ‘보안 설계 패턴’에서는 여러 가지 효과적인 보안 설계 패턴을 제시하고 피해야 할 안티 패턴 몇 가지를 살펴본다. 5장 ‘암호화 기법’에서는 일반적인 위험을 완화하기 위해 표준 암호 라이브러리를 사용하는 방법을 설명하는 복합적 기법을 다루되, 기반이 되는 수학까지는 다루지 않는다(실제로 거의 필요하지 않기도 하다).
[2부, 안전한 소프트웨어 설계]
2부에서는 가장 독특하면서도 이 책의 대상 독자들에게 가장 도움이 될 만한 내용을 다룬다. 6장 ‘보안 설계 원칙’과 7장 ‘보안 설계 리뷰’에서는 안전한 소프트웨어 설계와 이를 달성하기 위한 실제 기법에 대한 가이드를 제공하며, 각각 설계자와 리뷰어 관점에서 주제에 접근한다. 이를 통해 소프트웨어 설계 초기부터 보안을 내재화하는 것이 왜 중요한지도 설명한다.
2부에서는 1부에서 살펴본 아이디어를 보안 설계에 통합시키기 위한 구체적인 방법론을 알아본다. 리뷰 방법론은 나의 업계 경험에 바탕을 둔 것으로, 여러분의 작업에 적용할 수 있는 단계별 프로세스도 다룬다. 이런 아이디어를 실행에 옮기는 방법의 예로서 부록 A의 샘플 설계 문서를 함께 살펴보자.
[3부, 보안 구현]
8장에서 14장까지는 구현 단계에서의 보안을 다루며 배포, 운영, 수명 종료 단계를 살펴본다. 안전한 설계 이후의 단계로서, 이 책의 3부에서는 취약점의 추가적인 발생을 방지하면서 소프트웨어를 개발하는 방법을 알아본다. 3부의 각 장에는 코드가 포함되어 있으며, 취약점이 코드에 침투하는 방식과 취약점을 방지하는 방법을 설명한다.
8장 ‘안전한 프로그래밍’에서는 프로그래머가 직면하게 될 보안 문제와 실제 취약점이 코드에서는 어떻게 보이는지를 소개한다. 9장 ‘로우레벨 코딩의 취약점 사례’에서는 컴퓨터 산술의 약점과 동적 메모리 할당에 대한 C 언어 스타일의 명시적인 관리가 보안을 어떻게 훼손하는지를 다룬다. 10장 ‘신뢰할 수 없는 입력의 보안 위협’과 11장 ‘웹 보안’에서는 오랫동안 잘 알려져 있지만, 여전히 해결되지 않은 다양하고도 일상적인 버그(인젝션 공격, 경로 탐색, XSS, CSRF 취약점 등)를 다룬다. 12장 ‘보안 테스팅’에서는 제대로 활용되고 있지는 않지만, 코드 안전성을 보장해 줄 수 있는 테스트 기법들을 다룬다. 13장 ‘안전한 개발 모범사례’는 몇 가지 모범사례와 흔히 빠지기 쉬운 함정을 다룸으로써 안전한 구현 가이드를 마무리한다.
3부에서 다루는 코드부는 일반적으로 피해야 하는 취약점을 보여준 후, 뒤이어 이 코드를 안전하게 만드는 방법을 보여주는 패치 버전을 제시한다(각각 ‘취약한 코드’와 ‘수정된 코드’로 표시된다). 따라서 이 책에 있는 코드는 운영 환경의 소프트웨어에 바로 복사해서 사용하라고 만든 것이 아니다. 심지어 수정된 코드라도 환경이 달라지면 다른 문제가 생겨 취약점이 생길 수 있기 때문에, 이 책에 제시된 코드가 모든 애플리케이션에서 안전하다고 생각해서는 안 된다.
마지막으로, 14장 ‘끝나지 않는 보안의 여정’에서는 이 책이 긍정적인 영향을 미치게 될 것으로 기대하는 몇 가지 방안에 대해 설명한다. 이 책에서 다뤄진 핵심 포인트를 요약하고 미래까지 전망해 본다. 아울러, 이 책이 어떤 식으로 소프트웨어 보안 향상에 기여할 수 있는지 그 비전을 설명하는 것으로 시작해서, 소프트웨어 보안을 점진적으로 개선하는 데 도움이 될 만한 실험적인 아이디어까지 이야기한다.
[부록]
부록 A는 실제 보안을 고려한 설계를 보여주는 샘플 설계 문서다. 부록 B는 이 책 전반에 걸쳐 쓰인 소프트웨어 보안 용어를 정리한 용어집이다. 부록 C에는 의욕적인 독자들이 기꺼이 연구해볼 만한 개방형 연습 문제와 질문 몇 가지가 들어 있다. 부록 D는 핵심 개념과 과정을 요약한 자료 모음이다.