SSH 2단계 TOTP 인증

July 1, 2019
    SSH 로그인 보안을 강화하기 위해 구글 Authenticator (OTP) 앱을 이용한 시간 기반 OTP (TOPT) 인증을 설정할 수 있다.

    모바일 앱 준비

    먼저 사용하는 모바일 기기에 구글 Authenticator (OTP) 앱을 설치한다. 안드로이드 / iOS

    서버측 설치

    sudo apt update
    sudo apt install libpam-google-authenticator
    

    우분투 서버에서, 패키지 저장소 정보를 먼저 업데이트 한 다음, sudo apt install 명령으로 구글 Authenticator PAM (Pluggable Authentication Module) 을 설치한다.

    구글 Authenticator 설정

    google-authenticator

    우분투 서버에서 이 명령을 실행하면 몇 가지 질문을 통해 구글 Authenticator를 설정하게 된다.

    Do you want authentication tokens to be time-based? (y/n)

    y를 입력해서 시간 기반 OTP를 활성화하면 아래와 같은 형태로 URI와 QR 코드가 출력된다.

    URI 또는 화면에 출력된 QR 코드를 모바일 기기의 구글 Authenticator (OTP) 앱으로 스캔해서 TOPT 연결을 완료한다. QR 코드 아래에 출력된 응급 복구 코드는 별도로 기록해서 보관해둔다.

    Do you want me to update your "/home/varins/.google_authenticator" file? (y/n)

    y를 입력해서 google-authenticator가 설정 파일을 업데이트하도록 한다.

    Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n)
    

    y를 입력해서 인증 토큰을 재사용하지 않도록 한다.

    By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server.
    Do you want to do so? (y/n)
    

    시간 동기화가 부정확할 때를 대비해서 현재 시각 및 전후 기본 3개의 코드가 허용되는 것을 17개 까지로 늘리는 설정인데, 서버 컴퓨터의 시간 설정에 문제가 없다면 n을 입력해서 기본 3개의 코드만 허용하는 것으로 설정한다.

    If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.
    Do you want to enable rate-limiting? (y/n)
    

    무차별 로그인 시도를 막기 위해서 30초간 3번의 로그인 시도만 허용하는 것으로 제한하는 설정이다. 특별한 사정이 없다면 y를 입력해서 제한하도록 한다.

    SSH 설정

    sudo nano /etc/pam.d/sshd

    PAM의 SSH 설정 파일을 nano 편집기로 연다.

    auth required pam_google_authenticator.so nullok

    이 내용을 파일의 맨 마지막 부분에 기록한다. SSH 로그인 시에 구글 Authenticator를 사용하도록 하는 설정이며, nullok는 우분투 서버의 각 사용자가 구글 Authenticator 사용 여부를 직접 결정하도록 하는 옵션이다. 우분투 서버의 모든 사용자가 TOPT 연결을 완료했다면 nullok를 삭제해도 된다.

    설정을 완료했으면 nano 편집기에서 빠져나오기 위해서 Ctrl키와 x키를 동시에 누르면 수정한 내용을 저장하겠냐고 물어오는데, y를 입력하고, 저장할 위치를 물어오면 표시된 위치에 그대로 엔터키를 눌러서 저장한다.

    sudo nano /etc/ssh/sshd_config

    그다음 SSH 설정 파일을 nano 편집기로 연다.

    ChallengeResponseAuthentication yes
    
    UsePAM yes
    

    위 항목을 찾아서 yes로 설정한다. SSH 로그인 방법으로 구글 Authenticator를 허용하는 설정이다. (만일 이 항목 앞에 주석으로 설정해두기 위한 #이 있다면 이 #을 제거해야 한다.)

    설정을 마쳤으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo systemctl restart sshd

    SSH를 재시작한다.

    SSH 클라이언트 설정

    SSH 로그인에 구글 Authenticator를 사용하려면 SSH 접속 클라이언트 프로그램에서도 이를 지원해야 한다.

    Putty의 경우에는 Connection → SSH → Auth의 Authentication methods 영역에서 Attempt "keyboard-interactive" auth (SSH-2) 항목이 체크되어 있어야 한다.

    Mac의 터미널에서는 별도의 설정 없이 바로 접속할 수 있다.

    SSH 로그인

    login as: varins
    Using keyboard-interactive authentication.
    Password:
    Using keyboard-interactive authentication.
    Verification code:
    

    Putty로 접속할 경우 위와 같은 내용이 출력되며, Password: 항목에 계정의 비밀번호를 입력하고, Verification code: 항목에 구글 Authenticator (OTP) 모바일 앱에 출력되는 코드를 입력한다.

    다른 사용자 설정

    google-authenticator

    우분투 서버의 다른 사용자 계정에도 구글 Authenticator를 적용하려면 해당 사용자로 로그인 한 다음 google-authenticator 명령으로 위에 설명한 설정 절차를 진행한다.

    구글 Authenticator 중지

    구글 Authenticator를 사용하지 않으려면 위의 설정 사항을 역순으로 되돌리면 된다.

    sudo nano /etc/ssh/sshd_config

    SSH 설정 파일을 nano 편집기로 연다.

    ChallengeResponseAuthentication no
    

    ChallengeResponseAuthentication 항목을 no로 설정하고, 설정을 마쳤으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo nano /etc/pam.d/sshd

    PAM의 SSH 설정 파일을 nano 편집기로 연다.

    #auth required pam_google_authenticator.so nullok

    이 항목 앞에 #을 붙여서 주석 처리하거나 이 항목을 아예 삭제하고, 설정을 마쳤으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo systemctl restart sshd

    SSH를 재시작한다.

    트러블 슈팅

    본 설정은 SSH 접속에 대한 설정이므로, 설정 오류 등으로 로그인이 불가능한 때에는 서버 컴퓨터에 물리적으로 모니터와 키보드를 연결하고 접속해서 오류를 수정할 수 있다.

     

    본 글의 저작권은 작성자 Varins에게 있습니다.
    Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.
    

Comments (2)

  • NEMOMO

    July 30, 2019 at 11:33 pm

    와… 이거 참 좋네요…
    일반 계정이야 비밀번호 3회 오류 넘으면 잠기는 설정 걸면 되지만 root 계정은 ssh 접속하다 잠겨버리면 곤란해서 설정하지 못했었는데.. root 계정은 이걸로 설정하면 되겠어요
    선생님이라 부르겠습니다 ㅠ-ㅠ 감사합니다

    1. Varins

      July 31, 2019 at 1:58 am

      안녕하세요, 도움이 되었으면 좋겠습니다. 말씀 감사합니다.

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.