서버에 접속할 땐 SSH를 많이 사용하게 된다. SSH를 통해 로그인을 하는 방법은 크게 두 가지가 있는데 하나는 패스워드를 입력하는 것이고 하나는 비대칭 키를 이용하는 것이다. 비대칭 키를 이용하는 방법은 패스워드를 입력하는 것보다 더 안전하기도 하고 편리하기도 한데 가끔 다른 컴퓨터에서 접속해야 할 때가 있어서 패스워드 방식을 사용해야 할 때가 있다.

문제는 이럴 때 내가 입력한 패스워드를 누가 훔쳐가지 않는다는 걸 장담할 수가 없다. 그럴 때 OTP를 이용한 2FA가 유용한데 이걸 설정해 봤다. 우분투 기준으로 설정을 했지만 다른 OS도 패키지만 다를 뿐 똑같을 것이다.

1. 관련 패키지 설치

$ sudo apt install libpam-google-authenticator

2. PAM 설정

/etc/pam.d/sshd 파일을 열어 맨 윗줄에 아래와 같은 한 줄을 넣어 준다.

auth required pam_google_authenticator.so nullok

마지막의 nullok 부분은 OTP를 설정하지 않은 사용자는 그냥 그 상태로 사용할 수 있게 해 준다. 만약 모든 사용자가 OTP를 이용할거라면 지워줘도 된다.

3. SSHD 설정

/etc/ssh/sshd_config 파일을 열어 ChallengeResponseAuthentication no라고 되어있는 부분을 찾아 noyes로 바꿔 주면 된다. 만약 없다면 그냥 추가해 준다.
다 했으면 sudo service ssh restart 혹은 sudo systemctl restart ssh를 입력해서 sshd를 재시작 해 주자.

4. OTP 설정

OTP를 사용할 유저의 계정에서 google-authenticator 명령을 사용하면 설정파일을 만들어 준다. 늘 하던대로 QR코드를 입력하든 코드를 직접 타이핑 하든 OTP 앱에 코드를 등록하고 리커버리 코드를 백업하면 되는데 추가적으로 몇 가지 설정이 더 있다. 이미 사용한 코드를 재사용하지 못하게 할 지(이러면 30초 안에 두 번 로그인을 하지는 못 한다), 타임윈도우를 3개에서 7개로 변경할 지의 유무를 선택하면 ~/.google_authenticator 파일이 생성된다. 이제 다른 SSH 세션을 열어 패스워드 로그인을 시도해 보면 추가적인 인증을 하라고 메시지가 뜨는 걸 확인할 수 있다.

재밌는 건 우린 TUI 환경에 있지만 텍스트를 잘 활용하여 QR코드를 띄워주고 있다는 점이다.

5. 추가 설정

위와 같은 방법을 사용하면 패스워드 로그인에만 OTP가 적용 되고 비대칭 키를 이용해 로그인 할 때는 OTP 없이 로그인이 가능하다. 비대칭 키를 이용했어도 OTP 인증을 거치게 하고 싶다면 설정을 더 하면 된다.

  1. /etc/ssh/sshd_config 파일에 AuthenticationMethods publickey,keyboard-interactive라고 한 줄을 추가해 준다.
  2. /etc/pam.d/sshd 파일에서 @include common-auth 부분을 주석 처리해 준다.

이렇게 설정한 뒤에 sshd를 재시작 하고 다시 로그인을 해 보면 비대칭 키를 사용해도 OTP 인증을 거치게 된다.