RSA authentication with Putty

suapapa의 이미지

KLDP의 메인화면에 중국발 brute force attack 에 대한 wkpark님의 글(http://kldp.org/node/73105) 이 연일 올라와 있네요.
많은 분들이 관심을 가지고 계신가 봅니다.

저 또한 관리하고 있는 서버가 있는지라..
pam_abl를 설치하려 하니 데비안 stable에 패키지가 없길래. 바로 포기하고.. -_-;;
위 글의 추천 링크인 http://la-samhna.de/library/brutessh.html 를 읽어봤습니다.

brute force attack 을 막기위한 여러가지 방법과 각 방법의 장 단점을 소개하고 있네요.
각 방법의 단점들을 (-_-;;) 요약해 보면 아래와 같습니다.

  • Strong passwords : 운없으면 뚤림.
  • Using 'iptables' to block the attack : 관리힘듬? 커널패치 필요?
  • Using the sshd log to block attacks : 데비안 stable에 fail2ban 패키지 없음. -_-;;
  • Using tcp_wrappers to block attacks : 관리힘듬? 블럭된걸 풀기 힘듬?
  • RSA authentication : 추후설명

여러 가지 방법으로 막을 수 있었네요. 하지만 뭐가 더 좋은지 잘 모르겠기에,
현재 사용중인 RSA authentication(인증키 사용)만을 계속 사용하기로 결정하였습니다.

제 경우 사용자들은 윈도에서 Putty를 사용하여(PuttyGen으로 만든 개인키로) 리눅스서버에 접근합니다.
하지만, 대부분의 인증키 사용에 관한 링크들이 리눅스(유닉스)에서 접근하는 법만을 다루고 있었습니다. :P

인증키 사용에 대해서는 http://wiki.kldp.org/wiki.php/DocbookSgml/SSH-KLDP#AEN87 여기에 잘 설명이 되어 있습니다만,
많은 분들이 사용하고 계시는? Putty에 대한설명이 없고,
지리즈님이 쓰신 http://kldp.org/node/28907 에선 리눅스(유닉스) 머신에서 만든 개인키를 Putty로 변환하는데,
실제 Putty를 쓸 사용자들이 리눅스 머신을 가지고 있다는게 논센스가 아닌가 싶습니다.
(관리자가 일일히 생성해 줄 수도 없고..)



서론이 길었네요.
Putty키를 이용해 인증키 사용(패스워드 사용 안함)하여 접속하는 방법에 대해 나름의 노하우를 알려드리겠습니다.

우선 개인키/공개키의 개념을 잡아보면..

  • 개인키 : 각 사용자들만 가지고 있는 키. 유출하면 안됨(인터넷 뱅킹의 인증서)
  • 공개키 : 서버에 심을 키. 맘대로 유출해도 됨.

각 사용자는 개인키/공개키(한쌍임)를 만들어 사용하며 공개키만을 서버에 복사해 두면 개인키로 접근할 수 있습니다.
공개키는 유출해도 상관이 없으므로 아무렇게나 서버에 복사해 넣으시면 됩니다. :)

PuttyGen을 실행시키시고, Generate를 눌러 키를 생성합니다.
Key pasphrase에는 이 키의 암호를 입력합니다.
만약 개인키가 유출되었을때 아무나 이 키를 사용하지 못하게 하기 위함이며,
이는 인터넷 뱅킹 인증서로 접근시 암호를 입력하는 것과 같습니다.

Save public key, Save private key를 한번씩 눌러 공개키, 개인키를 저장합니다.
기본 옵션으로 키 타입은 SSH-2RSA입니다.

개인키의 기본 확장자는 ppk이며, 공개키의 경우 기본 확장자가 없습니다.
그냥 id.pub등으로 저장합니다.

저장된 공개키를 텍스트 에디터로 열어보면 아래와 같습니다.

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20060828"
AAAAB3NzaC1yc2EAAAABJQAAAIEAxq2AnAAVlWACLGhfx/sPmjQMAMcaBlRax5ES
111
222
333
KbXcd8=
---- END SSH2 PUBLIC KEY ----

이 키를 전달 받은 서버 담당자는
.ssh/authorized_keys 파일을 연 후 아래와 같이 추가합니다.

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAxq2AnAAVlWACLGhfx/sPmjQMAMcaBlRax5ES111222333KbXcd8=

.ssh/authorized_keys 의 한 줄에는 한 사람의 키가 위치하며 처음 등장하는 ssh-rsa 는 키 타입,
그 뒤의 실제 키는 putty공개키의 가운데 부분에서 줄바꿈을 제거하여 한줄로 만든다음에 추가하면됩니다. :)

이제 사용자가 자신의 ppk파일을 더블클릭하여 암호를 넣으면 시스템 트레이에 putty아이콘이 나타납니다.
인증키가 메모리에 상주된 상태입니다.
사용자가 자신의 공개키가 추가된 서버의 계정에 접근하면
암호(서버의 계정암호)없이 접속이 됩니다. 짜잔~

잘 되는걸 확인하셨다면, 링크를 참조하여 패스워드를 통한 입력을 아예 막아 버려
brute force search for a valid password will obviously be useless.
하게 만듭니다. :)



참고로, 위 링크에서 RSA authentication 의 단점으로 지적한 것은
  • 사용자가 암호없이 개인키를 만들경우 개인키 유출시 보안위험
  • 사용자가 개인키 공개키를 만들기 어려움
  • 항상 개인키를 가지고 다녀야 함
이정도 인데,

아래와 같이 대처하시면 되겠습니다. =3

  • 사용자 교육을 잘 시킴
  • 사용자 교육을 잘 시킴 - PuttyGen사용법을 알려주면 혼자서 잘 만듬 :)
  • 사용자 교육을 잘 시킴

이상입니다.
글 중 보안에 문제가 생길만한 부분이 있으면 가르침 부탁드립니다.

즐거운 하루 보내세요 :)

김정균의 이미지

키만 사용하는 것이 좋기는 하겠지만,

Using 'iptables' to block the attack : 관리힘듬? 커널패치 필요?

의견에 대해서는 잘못된 견해라서.. 일단 iptables 로 막는 방법은 크게 geoip extension을 이용하는 방법과 recent extension 을 이용해서 초당 접속비율을 이용하여 특정시간 block 을 하는 식입니다.

geoip extension 의 특정 국가 대역을 막거나 또는 특정 국가만 열어주는 식으로 접근 범위를 국가를 기준으로 하여 막습니다. 하지만 국내에서의 시도 또한 많기 때문에 좀 의미가 없기는 합니다. 물론 범위는 많이 줄어들지만..

그래서 나온것이 recent 를 이용한 방법입니다. 저 또한 이 방법을 선호하는데,

1. 계정이 많을 경우 모두 key 를 이용하라고 하기 힘듬
2. pam_abl 과 같이 user level 의 경우 process 가 뜨게됨 (resource 낭비.. 얼마나?)

이러한 이유로 tcp/ip level 에서 막는 것을 선호합니다. 특히, boute force attack 은 일종의 dictionary attack 이기 때문에 초당 10회의 접속정도만 막으면 크게 문제는 없어 보인다는 개인적인 견해를 가지고 있습니다.