비밀번호를 안전하게 저장하는 현실적인 아키텍처
이번에 네이트(싸이월드) 해킹 사건을 계기로 주민등록번호나 비밀번호와 같은 것을 안전하게 저장하는 방법에 대해서 생각 해보았습니다. 물론 완전히 안전하게라는 것은 불가능한 이야기입니다. 상대적으로 안전하게 저장하는 방법만을 고민 해 볼 수 있겠습니다.
규모가 있는 업체라면 HSM과 같은 물리적인 보안 장치를 이용 할 수도 있겠지만, 비용을 절감해야 하는 대부분의 스타트업에서는 선택 할 수 없는 해결책입니다. 그렇다면 제일 손쉽게 선택 할 수 있는 것은 소프트웨어적으로 암호화 해서 저장하는 것일겁니다.
우선 복호화가 필요한 데이터라면 AES와 같은 방식을 사용하고 키를 안전하게 보관하는 것이 좋겠지만, 이 경우는 키가 털릴 경우 모든 데이터가 그 즉시 풀리는 문제가 있습니다. 주민등록번호나 패스워드는 사실 복호화 할 필요가 없는 데이터이므로 AES와 같은 암호화는 오히려 보안에 더 안 좋다고 생각됩니다.
다른 방법으로 MD5나 SHA-1과 같은 단방향 해쉬 함수를 사용하는 방법이 있는데, 이 둘 다 오래된 것이고 이미 취약점이 많이 알려진 상태입니다. 그러므로 현재로서는 SHA-2를 사용하는 것이 낫습니다. 또한 현재 SHA-3가 준비 중이고, 충분히 사용 할만한 구현이 시장이 나온다면 이것을 사용해야 할 것입니다.
이제 SHA-2와 같은 단방향 해쉬 함수를 사용하는 것으로 충분한가라는 의문이 남습니다.
비밀번호는 조금 낫지만 주민등록번호는 워낙 형식이 고정되어 있어 무작위 대입 공격(Brute-force attack)이 쉽게 통합니다. 아무리 복잡한 단방향 해쉬 함수를 사용해도 이 부분은 피할 수 없습니다. 그러므로 적절한 값을 더한 후 해쉬 함수를 적용시켜 무작위 대입 공격에 좀 더 잘 견딜 수 있도록 해야 합니다. 물론 이 값(Salt)은 사용자별로 할당된 무작위 값이어야 합니다. 안 그렇다면 값이 유출 됐을 때 키가 유출됐을 때처럼 쉽게 무너질 수 있습니다.
그렇다면 사용자별로 무작위로 생성된 값을 어떻게 관리해야 할까요?
우선 온라인으로 접근이 불가능한 서버를 한 대 마련합니다. 이 서버는 SSH 데몬조차 띄워놓지 않고 직접 콘솔로만 접근하도록 합니다. 그리고 https 프로토콜을 통해서 사용자별 값을 생성하고, 가져가고, 삭제하는 기능만을 제공하도록 합니다. RESTful 하게 만든다면 깔끔 할 것 같습니다. 물론 IP를 통한 접근 제어는 방화벽과 로직 레벨에서 완전히 최소화 하여 운영합니다. 거기에 특정 계정에 대한 접근 빈도 등에 대한 제한이나 경보를 할 수 있는 로직을 추가적으로 달아주는 것도 고민 해 볼만 합니다.
이렇게 키와 같은 값을 관리하는 서버를 물리적으로 분리하여 접근을 어렵게 하는 것은 어떤 암호화 방식을 사용하더라도 해커들이 데이터를 해석하는 것을 어렵게 합니다. 서버 값이 많이 저렴해졌으니 보안을 위해 별도의 서버 한대 정도 마련하는 것은 대부분 가능하리라 여겨집니다.
완벽한 보안이란 존재하지 않습니다. 그러므로 데이터건 키건 유출될 수 있다고 가정을 하고, 유출 후에 해독을 어렵게 하거나 유출되는데 시간이 오래걸리도록 만들어 그 사이에 탐지될 확율을 높이는 것이 현실적인 대안책이라고 생각합니다.
보다 높은 보안을 위한 패스워드 관리 방법
요즘처럼 인터넷이 발달한 상황에서 인터넷을 많이 사용하는 분이라면 패스워드 관리 때문에 고민을 해보신 기억이 있을 겁니다.
패스워드 관리에 있어 몇 가지 원칙이 있는데 그 중 하나는 하나의 패스워드를 여러 사이트에서 사용하지 말라는 것입니다. 하지만 무슨 암기력의 천재도 아니고 그 많은 사이트의 패스워드를 따로 만들어 기억한다는게 쉬운 일이 아닙니다.
그렇다고 두 세가지 종류의 패스워드만을 사용하다가는 매우 큰 보안 위험에 처할 수 있습니다. 가끔 특정 사이트에서 정보가 유출 될 경우 다른 사이트에 가입한 계정도 다 피해를 입을 수 있기 때문입니다.
이런 문제는 해결하기 위해서 제가 사용하는 방법은 이렇습니다.
우선 사용하는 컴퓨터에 있는 암호 목록을 동기화 하기 위한 도구를 준비합니다. 저는 xmarks를 사용하고 있습니다. 이런 도구를 사용 할 경우 한 컴퓨터에서 입력하여 저장한 암호는 다른 컴퓨터에서도 손쉽게 동기화하여 이용 할 수 있습니다. 즉, 복잡한 패스워드를 사용하여도 굳이 각 컴퓨터마다 입력하여 저장 할 필요가 없어집니다. 저는 이렇게 해서 집, 회사, 노트북 3대의 컴퓨터 패스워드를 동기화 하고 저장하여 사용하고 있습니다.
단, 패스워드가 컴퓨터에 저장되어 있기 때문에 꼭 컴퓨터를 패스워드로 보호하시기 바랍니다. 잠시 자리를 비운 사이에 저장된 패스워드를 이용해서 당신의 계정을 누군가 사용 할 수도 있으니까요.
자. 이제 패스워드를 저장하고 동기화 하는 문제는 해결했습니다. 하지만 이것만으로는 뭔가 부족합니다. 컴퓨터 자체에 걸린 패스워드나 금융권에서 사용하는 패스워드와 같은 것은 저장을 하기도 위험하고 저장이 되지도 않으니까요.
이런 문제는 보완하기 위해서 저는 eWallet이라는 소프트웨어를 사용합니다. 이 소프트웨어는 강력한 암호화로 패스워드 등을 관리 저장하는 것입니다. 다만 특이한 점은 PDA나 iPhone으로 동기화 할 수 있다는 점입니다. 즉, 패스워드를 기억하지 못하여도 언제나 PDA나 iPhone을 휴대함으로서 복잡한 패스워드를 외우지 않고도 입력 할 수 있게 됩니다.
xmarks와 eWallet을 통해 패스워드 관리에 대한 부담은 한결 덜었습니다. 그렇다면 각 사이트 별로 사용 할 패스워드는 어떻게 만들면 좋을까요?
이를 도와줄 수 있는 기능이 eWallet에 포함되어 있습니다. eWallet의 Build password 기능을 사용하면 손쉽게 무작위 패스워드를 만들 수 있습니다. 이 기능에는 영어 대소문자, 숫자, 특수 기호, 길이 등을 설정 할 수 있고 기억을 돕기 위한 문구 생성 및 발음이 가능한 패스워드, 사전 단어를 이용한 패스워드 등이 있습니다.
그러면 실제 패스워드를 만드는 과정을 정리 해보겠습니다.
- 우선 사용자 가입 페이지에서 패스워드 부분만 빼고 다 입력합니다.
- eWallet을 이용해서 새로운 카드를 만들고 Build password 기능을 통해서 패스워드를 만듭니다. 아마도 0c32767k35tf 과 비슷한 패스워드가 만들어질 겁니다.
- 이 패스워드를 넣고 계정을 생성한 후에 로그인 ID와 이 패스워드를 입력하면 브라우저가 저장을 하겠냐고 물어봅니다.
- 저장을 하고 xmarks를 동기화 시키면 됩니다.
- 이렇게 저장된 패스워드는 다른 컴퓨터에서도 외울 필요 없이 동일하게 사용이 가능합니다.
- 만약 패스워드를 분실하였다면 다시 xmarks를 동기화 하거나 xmarks가 없는 경우 PDA나 iPhone의 eWallet을 통해 확인하고 입력 할 수 있습니다.
최근 들어 각종 개인 정보 유출 등 컴퓨터 범죄가 증가하고 있습니다. 앞으로는 편리 보다는 좀 더 높은 보안 수준으로 만약에 대비를 하는 것이 좋을 듯 싶습니다.
