운영체제/Linux

[Linux] Centos7에 Google OTP 설치 (2 Factor인증)

louky 2020. 11. 11. 13:24
반응형

2 factor 인증을 위한 설정 방법이다. 

 

구글 OTP인증이 아닌 다른 방식을 찾아 봤으나 대부분 구글 OTP를 이용하여 2Factor 인증을 하는 것으로 가이드가 되어 있다. 

다른 블로그에도 상세 설명이 되어 있겠지만 

 

필자는 필자의 기억을 위해 오늘도 끄적 거리는 거니 딴지는 사양하겠다.

물론 잘못 된 부분이 있을 경우에 대한 지적은 언제나 환영한다. 

 

구글 OTP설정환경은 아래와 같다. 

 

설정 환경
OS : CentOS 7.8 (3.10.0-1127.10.1.el7.x86_64)
비고 : NCP 내  인스턴스에서 사용 

 

 

먼저 구글 OTP인증 패키지(google-authenticator)를 위한 EPEL repository를 설치 한다. (설치가 되어 있따면 skip한다.)

[root@test ~]# yum install epel-release -y

 epel repository를 설치 하지 않은 경우 google-authenticator 를 설치 할 수 없다. 

 

google-authenticaot PKG를 설치한다. 설치는 간단하다

[root@test ~]# yum install google-authenticator
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: nrt.edge.kernel.org
Resolving Dependencies
--> Running transaction check
---> Package google-authenticator.x86_64 0:1.04-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================================================================================================
 Package                                          Arch                               Version                                  Repository                        Size
=====================================================================================================================================================================
Installing:
 google-authenticator                             x86_64                             1.04-1.el7                               epel                              48 k

Transaction Summary
=====================================================================================================================================================================
Install  1 Package

Total download size: 48 k
Installed size: 97 k
Is this ok [y/d/N]: y
Downloading packages:
warning: /var/cache/yum/x86_64/7/epel/packages/google-authenticator-1.04-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Public key for google-authenticator-1.04-1.el7.x86_64.rpm is not installed
google-authenticator-1.04-1.el7.x86_64.rpm                                                                                                    |  48 kB  00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-11.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Is this ok [y/N]: y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : google-authenticator-1.04-1.el7.x86_64                                                                                                            1/1
  Verifying  : google-authenticator-1.04-1.el7.x86_64                                                                                                            1/1

Installed:
  google-authenticator.x86_64 0:1.04-1.el7

Complete!

 

 

패키지 설치가 끝나면 SSH인증을 위한 PAM모듈 설정을 한다. 

 

[root@test ~]# vi /etc/pam.d/sshd

#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin

#### Google Authenticator ( Google OTP Set) #### 추가 
auth       required    pam_google_authenticator.so nullok    

# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

 

** 참고 - PAM Option 
nullok : 리눅스 내 모든 사용자 각각의 "Secret Key" 를 생성 (동일한 Secret key를 사용하고자 할 경우 해당 옵션은 삭제한다.)
             ~/.google_authenticator 있어야만 2FA인증이 되고 해당 파일이 없을 경우 2FA 인증이 되지 않고
             그냥 패스워드인증이 된다.

PAM설정이 끝나면 ssh config 도 수정한다. 

 

/etc/ssh/sshd_config  내 아래 항목에 대해 주석을 해제하거나 수정한다. 

항목 Description
PermitEmptyPasswords no
비어있는 사용자 암호 허용여부 
PasswordAuthentication no
패스워드 인증 사용 여부
(OTP인증시에는 사용하지 않는다고 함)
ChallengeResponseAuthentication yes
시도-응답 인증 방식을 사용 여부
(2FA인증을 위해서 필요)
UsePAM yes 인증 PAM모듕 사용여부

 

주석 해제 또는 수정이 되었다면 ssh를 재시작 한다. 

[root@test ~]# systemctl restart sshd

 

google authenticator인증 파일 생성

[root@test ~]# google-authenticator

## 인증 토큰을 시간 기반(Time-based)할지 여부

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

 

Time-based를 선택하고 나면  OTP에 등록 할 수 있는 QR코드가 생성된다. 

 

QR코드 밑에 Secret Key와 백업 코드가 출력된다. 

Your new secret key is: NK6L#####6RWV#####BGK#####
Your verification code is 8####8
Your emergency scratch codes are:
  6#29602#
  30#1335#
  412#502#
  8273#46#
  4537#08#

 

## Secret Key 및 백업 코드 저장 file 위치 확인 

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

해당 경로의 파일에 위의 Secret Key 및 백업코드가 저장 된다. 

[root@test ~]# cat /root/.google_authenticator
NK6L#####6RWV#####BGK#####
" RATE_LIMIT 3 30
" WINDOW_SIZE 17
" DISALLOW_REUSE
" TOTP_AUTH
6#29602#
30#1335#
412#502#
8273#46#
4537#08#

 

## Man-in-middle-attack에 대한  옵션 

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

*** 중간자 공격(man in the middle attack, MITM)은 네트워크 통신을 조작하여 통신 내용을 도청하거나 조작하는 공격 기법이다. 중간자 공격은 통신을 연결하는 두 사람 사이에 중간자가 침입하여, 두 사람은 상대방에게 연결했다고 생각하지만 실제로는 두 사람은 중간자에게 연결되어 있으며 중간자가 한쪽에서 전달된 정보를 도청 및 조작한 후 다른 쪽으로 전달한다. (위키백과 내용)

 

 

## 시간상 오차 또는 왜곡 방지에 대한 옵션

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

*** 생성되는 OTP 토큰의 이전 토큰/현재 토큰/생성될 토큰 에 대해 모두 입력이 가능하도록 하는 옵션으로 예를 들어 이전토큰(만료된 토큰) 123 456 , 현재 토큰(OTP상에 보여지는 토큰) 456 789, 다음에 발생될 토큰 789 234 에 대해 모두 입력이 가능하도록 하는 옵션이며, 내용을 번역하면 아래와 같다. 

기본적으로 모바일 앱은 30 초마다 새 토큰을 생성합니다.
클라이언트와 서버 간의 가능한 시간차를 보상하기 위해
현재 시간 전후에 추가 토큰을 허용합니다. 이것은
인증 서버와 클라이언트 사이에 최대 30 초의 시간차. 만약 너라면
잘못된 시간 동기화 문제가 발생하면 창을 늘릴 수 있습니다.
허용되는 코드 3 개 (이전 코드 하나, 현재
코드, 다음 코드) ~ 17 개의 허용 코드 (이전 8 개 코드, 현재
코드 및 8 개의 다음 코드). 이것은 최대 4 분의 시간차를 허용합니다.
클라이언트와 서버 사이.
그렇게 하시겠습니까? (y / n) y

 

### 무차별 대입공격 방지 옵션 (brute-force login attempts)

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

*** 공격자가 30 초마다 3 번 이상 로그인을 시도하지 못하도록 제한 옵션이며 3회 이상 인증 실패시 일시적으로 로그인을 차단한다.

 

아래는 위의 과정을 캡쳐해 놓은 화면이다.

 

설정이 완료 되었으면 스마트폰에서 google OTP앱을 설치 한다. 

 

설치하고 나서 생성된 QR코드를 이용하여 OTP를 등록 한다. 

 

 

등록이 되었으면....

등록한 계정으로 ssh로그인을 해본다. 

 

[root@test ~]# ssh root@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:wuBYmo3VCNYfKc0gg4I6QxctajzhYod2bwcFbX7Lzr0.
ECDSA key fingerprint is MD5:e6:68:1b:79:b8:18:ba:70:6e:53:ae:1c:3a:b0:a0:fa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Password: ***********
Verification code:  ***OTP에서 발생한 CODE입력***
Last login: Wed Nov 11 13:50:46 2020

 

 

root사용자가 아닌 일반 사용자 google OTP인증 방법은 동일한다. 

 

먼저 일반 사용자 계정을 생성하고  패스워드를 생성한다. 

[root@test ~]# passwd testuser
Changing password for user testuser.
New password:
[root@test ~]# passwd testuser
Changing password for user testuser.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.

해당 계정으로 로그인한다. 

*** google OTP설정이 되어 있지 않기에  패스워드로 바로 로그인이 된다. 

[root@test ~]# ssh testuser@localhost
Password:
[testuser@test ~]$

일반계정으로 로그인한 상태에서 google OTP를 등록한다.  (등록 방법은 위와 동일하다.)

test만 하고 삭제할 계정이기에 숨김없이 보이겠다... ㅎㅎ

google OTP를 등록하면 계정별로 ~/.google_authenticator파일이 생성된다. 

secret key를 이용한 OTP등록도 잘된다.... 

다만.... 입력이 귀찮을수 있다. 

 

 

 

정상적으로 2FA인증이 되었다. 

 

패스워드랑 OTP code를 조합하여 한번에 입력하고자 할 경우 아래 블로그 페이지를 참조 한다. 

2020/11/11 - [운영체제/Linux] - [Linux] Linux PW + Google OTP 한번에 같이 입력하기....(Password & verification code)

 

[Linux] Linux PW + Google OTP 한번에 같이 입력하기....(Password & verification code)

CentOS에  2FA인증을 위해 Google OTP를 설정한 후 패스워드와 OTP Code를 따로 입력하는 방법이 아닌 결합하여 한번에 입력하는 방법이다. Google OTP설치 방법은 아래 필자의 블로그를 참조 한다. 2020/11/1

louky0714.tistory.com

 

반응형