글쓴이가 근무하는 곳에서 작년쯤 Yubikey라고 하는 USB 형태의 키를 주문했다.

이게 무슨 물건이냐하면, 가운데에 있는 동그란 센서에 손가락을 잠시 갖다대면 AES 알고리즘에 의한 알파벳 30자리를 무작위로 생성해준다. OTP라고 부르는데, 일명 One-TIme Password, 그러니까 1회용 비밀번호라는 의미. 심지어, 저 안에 펌웨어가 들어있어서 어떠한 방식으로 어떻게 암호화된 문자열을 생성할건지 직접 프로그래밍도 가능한데다, 2개의 메모리가 있어서 살짝 터치하는 것과, 약 2-3초간 터치하는 것에 따라서 다른 암호를 생성하게 할 수 있다. 이 패스워드를 생성해내는 구조와 알고리즘은 이미 오픈소스로 공개가 되어있으며, 파이썬/루비/PHP등 여러 언어에서 사용할 수 있도록 각종 예제와 프로그램 등을 무상으로 제공해준다. 관심이 있으신 분은 여길 보시면 되겠다.
http://www.yubico.com/products/yubikey-hardware/yubikey/technical-description/

많은 소프트웨어들이 이 Yubikey를 지원하고있는데, 특히 각종 웹사이트의 비밀번호를 저장해주는 인기 앱인 LastPass의 경우 프리미엄 회원은 Yubikey를 쓸 수 있게 해준다. 하지만, 여기서는 우분투가 설치된 컴퓨터에서 이 Yubikey로 로그인하는 것을 다뤄본다. 물론 당연하지만, Yubikey를 구매해야하며, 키가 없더라도 한 번쯤 포스팅을 읽어보면서 이게 대충 뭐하는 건지는 알 수 있도록 간단하게 설명하도록 했다.

관련 라이브러리를 설치한다.

sudo apt-get install libpam-yubico

이제 키를 USB에 꼽고 내 키가 가진 ModHex값(키 ID)을 알아내야한다. 두 가지 방법이 있는데, 가장 쉬운건 http://demo.yubico.com/php-yubico/Modhex_Calculator.php 사이트에 가서 Source Format에 OTP를 선택하고 String에는 키를 터치해서 패스워드를 입력해넣는 방법이다. 그러면 대략 14자리의 ModHex값을 보여준다. 또 다른 방법으로는 텍스트 편집기 하나를 열고 키의 센서를 터치해서 대략 3-4개 정도의 OTP를 생성하면, 맨앞 대략 14자리 정도의 문자열이 일치하는 것을 알 수 있는데, 이것이 바로 이 키의 ModHex 값이다.
예)
vvfvegvbtudalvegfjhtcdrghbljrhccuttgetifjgvr
vvfvegvbtudalcjcvhlcnutdgtcejftudbjdfrjbhfkh
vvfvegvbtudallilgekrilhnnekibdbrjhurbfgjrldd
Modhex: vvfvegvbtudal

이제 Yubikey로 로그인할 사람들의 명단을 생성한다. 편의상 /etc/yubikey_mappgins라고 하자. 형식은
user1:ModHex
user2:ModHex

형태로 저장하면 되겠다.

따라서, 글쓴이의 경우는
sysadmin:vvfvegvbtudal
라고 저장했다.

이제 마지막 작업만 남았다. 간단하다.
SSH로 로그인하는 경우에 키를 요구할 것인지, sudo 명령어를 사용할 때만 요구할 것인지, 혹은 GUI (LightDM)으로 로그인하는 사용자에게 요구할 것인지에 대한 “정책”을 세워야한다. 이 정책은 다들 아시다시피 /etc/pam.d에서 설정할 수 있다. 본 포스팅에서는 sudo 사용자들을 대상으로 해본다.

형태는 다음과 같다. 여기서 sufficientrequired로 바꾸면, 반드시 Yubikey의 OTP를 넣어야하고, sufficient로 두면 계정 패스워드만 넣어도 sudo가 가능하다. 주의할 점은, sufficient로 원할 경우는 아래의 라인을 /etc/pam.d/sudo 파일의 최상단에 넣어야한다.

auth    sufficient pam_yubico.so id=16 authfile=/etc/yubikey_mappings

sudo 명령 사용시 Yubikey의 OTP를 요구할 때, 사용자의 비밀번호로만 sudo를 사용하고 싶으면 Yubikey 입력부분에서는 그냥 엔터키만 치면 된다. 맨 뒤에 debug 를 추가하면 다양한 메시지를 출력해준다.
더 많은 옵션은 https://github.com/Yubico/yubico-pam 페이지를 참고하시면 되겠다.

sysadmin@ubuntu:~$ sudo -i
Yubikey for `sysadmin': 
[sudo] password for sysadmin: 
root@ubuntu:~# 

이런 식으로 나온다. 이것으로, 서버관리자 입장에서 다양한 활용이 가능할 것 같다. 예를 들어서 콘솔로 직접 로그인하려는 시도를 원천적으로 차단하기 위해서도 쓸 수 있고 (즉 인가된 사용자만 콘솔 사용), SSH 사용자들에게도 마찬가지로 키가 없으면 아예 로그인을 막거나하는 식의 비록 다양하진 않지만 강력한 보안정책을 세울 수 있다고 본다. 최근 정보유출이나 보안의식 부재로 인한 문제가 많다. 비록 살짝 터치만으로 랜덤 비밀번호를 생성해주는 것은 편하긴 하지만, 이걸 들고다니면서 매번 USB에 꽂았다뺐다 하는 것도 어지간히 귀찮긴 하지만, 일단 누군가가 OTP 중 하나를 외우는건 거의 불가능하고 (44자리 문자열을 한 번 잠깐 보고 외울 수 있을까) 키가 없으면 안된다는 점에서는 집 대문 열쇠나 마찬가지라고 볼 수 있겠다.

윈도우와 맥에서도 지원되니, 관심 있으면 꼭 써보시길 권해드린다.