Google OTP
자신이 사용하는 리눅스 머신이 있다면 SSH 로그인 시 OTP (One Time Password) 인증을 추가하여 2 factor authentication 를 적용해 보면 어떨까요? 일단 저는 해보았습니다. 실제로 필자가 다니는 회사에서는 98%이상이 윈도우 기반의 운영체제를 사용합니다. 그리고 나머지 운영체제 중 필자가 포렌식 분석업무를 위해 Ubuntu 를 사용하고 있는 것이 있는데 어제는 그 머신 중 Ubuntu 에 Google OTP 를 적용하여 SSH 로그인 시 2 factor authentication 을 하도록 해 두었습니다.
아래 URL은 구현을 위해 참고한 곳인데 너무 설명이 잘 되어 있어서 내가 따로 이런 글을 쓰는데 많은 망설임을 준 곳이기도 합니다.
http://www.linux.org/threads/google-authenticator-for-ssh.4590/
정상적으로 설치한 경우 아래 그림과 같이 기본적인 인증을 마치고 Verification code 를 물어봅니다. 이 때 핸드폰에 설치한 어플을 이용하여 Verification code 를 부여받아 입력하면 인증에 성공하게 됩니다.
그래서 이 글에서는 Google OTP 를 설치하면서 기본적으로 알아야 하는 개념들에 대해 적어보려고 합니다. 사실 OTP 를 개발하려고 하는 분들에게도 도움이 되었으면 하는 바람이다.
Time-based
OTP 의 인증 코드를 만들어 내는 방식을 이야기 합니다. 일반적으로 HMAC 방식(rfc4226)과 Time-Based 방식(rfc6238)이 있는데 간단하게 차이점을 이야기 하면, HMAC 은 메시지와 키를 입력으로 하여 고유한 값을 얻는 반면 Time-Based 방식은 특정 시간에 따라 유일한 값을 얻는 방식입니다.
Multiple uses
OTP에 의해서 생성된 키값을 한 곳에서만 사용할 수 있을지 또는 다른 곳에서도 사용하게 할 지에 대한 여부 입니다. 보다 안전을 위한다면 한번 사용된 키는 만료되어야 하겠지요.
Time window
위에서 언급한 Time-Based 방식에서 동일한 키가 유효한 시간을 얼마로 할 것인지에 대해 말하는 것 입니다. Man-in-the-middle-attack 을 완벽히 차단할 수는 없지만 "보안 비용"을 높이기 위해 Time window 를 알맞게 설정해야 합니다. 참고로 2012년 TTA에서 제정한 "일회용 패스워드 알고리즘 프로파일" 문서에서 금융권일 경우 OTP 비밀번호를 30~60초 이내에서만 유효하도록 권고 하고 있습니다.
Rate-limiting
Brute force attack 과 같이 악의적인 목적으로 여러번 시도 하는 것을 대비하기위해 일정 기간 동안 로그인 시도 횟수를 제안하는 것입니다. 구글 OTP는 기본적으로 30초 동안 3번 이상 틀렸을 때 일정기간 로그인 시도를 하지 못하도록 되어 있습니다.