Aug 222012
 

인증서 암호, 다시 생각하기

흔히 “인증서 암호”라고 부르지만, 실은 인증서 ‘개인키 암호’입니다. 인증서 자체는 누구나 읽을 수 있는 파일입니다.
인증서(개인키) 사용시에는 반드시 암호 입력을 요구해야 한다? 그럴까요? 인증서/개인키 파일은 보통의 파일과는 달리 “키 저장소”(key storage)에 저장된 상태에서만 이용이 가능하도록 원래 설계된 것입니다. 그럴 이유가 있습니다. 개인키를 달랑 암호화한 다음, 일반 파일처럼 저장해 둔 상태에서 인증서/개인키를 사용할 경우(우리 공인인증서가 바로 이런 식입니다), 유저는 (1)해당 파일을 선택하고 (2)그 개인키 파일을 읽어들이는데 필요한 암호를 입력해야 됩니다. 공인인증 플러그인이 바로 이런 식의 UI를 유저에게 제시하고 있지요(인증서를 선택하고, 인증서 암호를 입력하라는 식).

서버들이 “모두” 정직하면 이 방법도 별 문제는 없습니다. 유저가 선택한 개인키 파일, 유저가 입력한 암호값을 서버가 슬쩍 챙기는 못된 짓을 하지 않을 것이기 때문입니다. 하지만 정직하지 않은 서버라면 이런 UI를 이용해서 유저의 인증서/개인키와 개인키 암호를 챙기는 것은 너무나 쉽습니다. (

ㅋㅋ) 서버가 이짓을 하는지 유저가 확인하는 것도 어렵습니다. 인증서 암호를 입력하기 전에 “웹페이지 소스보기”를 매번 하는 유저도 없고, 서버가 플러그인 형태로 이짓을 하면 유저가 확인할 방법도 없습니다. 잔말 말고 “그냥 서버를 믿으라”는 황당한 설계 칸셉트.

반면에 “키 저장소”에 보관된 인증서 개인키를 이용할 경우, 유저가 개인키 암호를 입력할 일도 없고 유저 개인키가 유저의 컴퓨터를 떠나서 서버로 날아가는 일도 없습니다. 물론 키 저장소에 보관된 개인키를 사용하는 전(前) 단계로서 웹브라우저가 유저에게 암호를 요구하도록 유저가 스스로 설정할 수도 있지만, 이 암호(웹브라우저 암호)는 개인키 암호가 아닙니다.

키 저장소는 보안토큰이나 스마트카드에 하드웨어적으로 구현할 수도 있고(HSM), 소프트웨어적으로 구현할 수도 있습니다(MSCrypto Keystore, 애플 Keychain, Gnome keyring, 오페라의 key store 등). 이들 키 저장소는 세련된 방법으로 파일을 보호하며, 소프트웨어적으로 구현된 키 저장소 파일은 유저도 모르는 암호, 유저가 로그인 하는 순간 매번 새롭게 생성되어 시스템 memory 에 저장된 암호, 주기적으로 자동 변경되는 암호 등 각 키 저장소 유형마다 나름 훌륭한 방식으로 보호되고 있으므로 공격자가 그 파일을 복제해 가본들 이용할 수도 없습니다.

그러나 이처럼 시스템 어디엔가 “기계적으로 저장”된 암호보다는 유저의 머리 속에만 기억된 암호가 더 안전하다고 생각하실 분도 있겠지요. 그러나 과연 그럴까요? 기계적으로 저장된 암호는 유저가 입력할 필요가 없지만, 유저가 기억하는 암호는 유저가 입력해야 합니다. 바로 이것 때문에 유저 입력값을 가로채려는 키보드 해킹 시도가 있고, 이걸 막으려고 키보드 보안 플러그인 사용을 강제하려는 것입니다.

그러나, 모든 웹사이트가 키보드 보안 플러그인을 사용하는 것도 아니고, 이메일 암호, 온갖 웹사이트 회원가입 암호(이들 모든 암호 입력값은 키로거가 설치된 경우라면 모두 유출됩니다) 등과 인증서 암호가 동일한 경우가 대부분입니다. 그 뿐 아니라, 위에서 말씀드린 식으로 서버가 유저에게 “인증서를 선택하고 암호를 입력하세요”라는 UI를 태연하게 제시하고 post method로 개인키와 개인키 암호를 챙겨가는 사회공학적 공격 앞에는 모든 것이 무너져 내리게 되어 있습니다.

키 저장소에 저장된 상태에서만 인증서를 이용하게 하면 이런 여러 공격으로부터 더 나은 보호가 가능할 뿐 아니라, 키보드 보안 플러그인이 아예 필요 없게 됩니다(유저가 인증서 암호를 입력하지 않기 때문).

표준적 방법으로(인증서 암호 입력 없이) 인증서 로그인을 하게 할 경우, 서비스 제공자는 유저가 인증서 로그인에 성공했다고 해서 당장 계정 접근을 허용할 것이 아니라, 인증서와는 무관한 다른 암호를 “추가로” 요구하여 계정 접근을 허용하면 될 것입니다(진정한 의미의 2-factor authentication). https://openweb.or.kr/cert/auth 을 방문하시면, 이런 방법이 예시되어 있습니다. 공격자가 이 “추가적 암호”를 가로채 본들, 유저의 개인키 파일을 입수하지 못하면 소용이 없고, 키 저장소에 보관된 유저의 개인키 파일을 입수하는 일은 매우 어렵다는 점은 위에서 말씀 드렸습니다.

인증서 개인키를 암호화할 필요가 있는 유일한 경우는, 개인키를 키 저장소에서 끄집어 내어 다른 컴퓨터로 이동할 경우, 그 이동 과정에 필요한 인증서+개인키 통합 파일(*.p12 또는 *.pfx)을 보호하기 위한 경우 뿐입니다. 바로 이런 이유로 이들 양식의 파일을 생성할 경우에는 암호가 없으면 아예 이들 파일이 생성되지 않도록 spec 자체가 그렇게 설계되어 있는 것입니다.

인증서와 개인키를 (1)굳이 키 저장소 바깥에 꺼내 놓고 (2)개인키를 암호화한 다음, (3)인증서를 이용할 때 마다 개인키암호를 입력하게 하고, (4)그 입력값을 보호한답시고 키보드 보안플러그인 사용을 강요하는 “독특한” 한국방식이 “더 안전”할 거라는 발상은 재고의 여지가 있습니다. 키 저장소를 벗어나는 순간, 인증서 개인키/개인키 암호가 탈취될 위험은 대폭 증가됩니다. 인증서 개인키가 탈취될 위험에 대처하려고 설계된 것이 키 저장소인데, 왜 이것을 사용하지 않는지 잘 이해가 안되는 군요.

무슨 암호건, 자꾸 자주 입력하게 하면 더 안전해 질까요?

Comments

Powered by Facebook Comments

 Posted by at 7:48 PM

Sorry, the comment form is closed at this time.