[CentOS 7] 2차 인증 도구 Google Authenticator OTP 적용

mimic1995·2023년 12월 22일
0

패키지 설치

yum -y install google-authenticator

PAM 설정

cp -arp /etc/pam.d/sshd /etc/pam.d/sshd_ori
vi /etc/pam.d/sshd
===
#%PAM-1.0
auth       required     pam_google_authenticator.so nullok try_first_pass no_increment_hotp
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
===

nullok 설정을 넣으면 google authenticator 설정이 없는 계정의 경우 1차 인증인 비밀번호로만 로그인하도록 서용하고, 본 설정을 넣지 않으면 무조건 2차 인증이 있어야 로그인할 수 있으며, 없는 계정은 로그인이 불가하게 됩니다.
테스트 과정을 거쳐야 하기 때문에 모든 설정이 완료되면 그때 필요에 따라 해제하는 편이 좋습니다.

sshd 설정

cp -arp /etc/ssh/sshd_config /etc/ssh/sshd_config_ori
vi /etc/ssh/sshd_config
===
PasswordAuthentication yes
#ChallengeResponseAuthentication no # default가 no로 주석해제 되어 있어 확인하고 진행
ChallengeResponseAuthentication yes
UsePAM yes
===
systemctl restart sshd

sshd AllowUsers 설정

ssh 접근을 허용할 사용자 계정을 제한하여 접근 가능한 계정에 대해서만 OTP를 생성하면 효율적으로 관리할 수 있습니다.

vi /etc/ssh/sshd_config
===
# 설정한 계정만 sshd 접근 시 로그인이 허용되며, 띄어쓰기로 계정 명 구분
AllowUsers test1 test2
===
systemctl restart sshd

로그인 계정 otp 발급

# 테스트 계정 생성 후 진행하였습니다.
adduser otp
passwd otp

su - otp
cd ~/.ssh
# 없을 경우 mkdir ~/.ssh && chmod 700 ~/.ssh

google-authenticator

time-based 여부

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

OTP가 시간 기반(일정 시간 동안만 유효한)인지 아니면 카운터 기반(한 번 사용된 후 더 이상 유효하지 않음)인지를 묻는 것입니다. Google Authenticator는 일반적으로 시간 기반 TOTP(Time-based One-Time Password)를 사용하므로 대부분의 경우에는 "y" 또는 "yes"로 답하는 것이 일반적입니다.

여기서 "시간 기반"이란, 특정 시간 간격(예: 30초)으로 변경되는 키를 기반으로 하는 일회용 비밀번호를 의미합니다. 시간이 지남에 따라 새로운 비밀번호가 생성되므로, 사용자는 일정한 주기로 새로운 비밀번호를 입력해야 합니다.

이 과정만 지나면 바로 otp 생성되니 QR 코드를 찍어둡니다.

설정 파일 저장 여부

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

이 옵션은 google-authenticator 명령을 사용하여 Google Authenticator의 설정을 초기화하거나 업데이트할 때 출력되며, .otp 관련 설정을 파일에 저장할 것인지 체크합니다.

이 파일은 주로 시간 기반 (TOTP) 인증을 위한 QR 코드와 시드(seeds)값이 저장됩니다. QR 코드를 스캔하면 스마트폰 앱(Google Authenticator 등)에 계정이 추가되며, 해당 앱은 시드를 사용하여 일회용 비밀번호를 생성합니다.

30초 내 동일 토큰 중복 사용 가능 여부

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

동일한 일회용 비밀번호(authentication token)를 여러 차례 사용하는 것을 허용할 것인지에 대한 설정입니다. 이 옵션을 활성화하면, 동일한 일회용 비밀번호를 여러 번 사용하는 것이 금지되고, 일정한 주기(약 30초) 동안에는 하나의 로그인만 허용됩니다.

중간자 공격(man-in-the-middle attacks)은 공격자가 통신 경로에 중간에 위치하여 통신 내용을 가로채거나 조작하는 공격을 의미하는데 여러 번의 로그인 시도 중에 일회용 비밀번호가 중간에 가로채어질 경우, 해당 비밀번호는 이미 사용되었으므로, 공격자가 로그인을 시도하더라도 적용되지 않습니다.

시스템 시간 차 범위 설정

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) n

일회용 비밀번호 생성 주기와 서버 간의 시간 차이를 보상하기 위한 윈도우 크기(window size)에 대한 설정을 묻는 것입니다.
Google Authenticator 앱은 기본적으로 30초마다 새로운 일회용 비밀번호를 생성합니다. 클라이언트(앱)와 서버 간의 시간 차이를 보상하기 위해, 현재 시간 기준으로 이전과 이후에 추가로 하나의 토큰을 허용합니다. 이로써 최대 30초까지의 시간 차이를 허용합니다.
시간 동기화에 문제가 있을 경우, 윈도우 크기를 3개의 허용된 코드에서 (이전 코드 하나, 현재 코드, 다음 코드 하나) 17개의 허용된 코드로 늘릴 수 있습니다. 이 경우, (이전 8개 코드, 현재 코드, 다음 8개 코드)까지 허용되므로 클라이언트와 서버 간의 최대 4분까지의 시간 차이를 허용합니다.
이 옵션을 사용할 것인지 여부는 클라이언트 환경과 시스템의 시간 동기화 상태에 따라 다를 수 있습니다. 시간 동기화에 문제가 없다면 보통 기본 설정인 윈도우 크기 3을 사용하는 것이 일반적입니다. 만약 시간 동기화에 문제가 있어서 클라이언트와 서버 간의 시간 차이가 크다면, 'y' 또는 'yes'로 응답하여 윈도우 크기를 늘릴 수 있습니다.

30초 내 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) y

로그인 속도 제한(rate-limiting)을 설정하는 옵션으로 일정 시간 동안에 얼마나 자주 로그인을 시도할 수 있는지를 제어하는 목적입니다.
이 옵션을 사용할 것인지 여부는 보안 정책과 시스템의 민감도에 따라 다를 수 있습니다. 일반적으로, 브루트포스 공격에 대비하기 위해 로그인 속도 제한을 활성화하는 것이 안전합니다. 'y' 또는 'yes'로 활성화합니다.

적용 후 테스트

android 폰을 사용하고 있기 때문에 Google play store에서 아래 어플리케이션을 다운로드하였습니다.

https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=web_share

로그인 후 우측 하단 '+' 키를 눌러서 QR 코드 스캔으로 생성한 otp를 추가하였습니다.

2차 인증을 생성한 계정으로 로그인 시도 시 코드와 비밀번호 값을 입력하도록 출력됩니다.

2차 인증을 생성하지 않은 계정으로 로그인 시도 시 비밀번호 값만 입력하도록 출력됩니다.

유의사항

sftp는 otp 이용 계정으로는 불가하고 ftp는 가능합니다.

profile
Raiju Hantu Goryo Obake

0개의 댓글