본문 바로가기
IT/리눅스

AWS EC2 MFA 적용(feat.Google-Authenticatior)_파일별 코드 첨부

by IT 과학정복 2024. 6. 19.
반응형

AWS EC2 서버를 생성하고, 서버 보안 강화 방법을 생각해봤습니다.
허용된 PC에 ID만 치면 들어 갈 수 있는 SSH 방식은 사람마다 설정해주는 것도 귀찮고,
개인키가 노출되면 서버를 공격받을 수 있어서 꺼려졌습니다.

반응형


제가 택한 방식은 구글OTP( Google Authenticator )를 이용한 다중인증 (MFA: Multi-Factor Authentication)방식입니다.
PAM (Pluggable Authentication Modules) 방식 중 하나이며,
OTP 이외에도 키 배이스인 Kerberos 등 다양한 인증방법을 사용할 수 있습니다.

우리가 궁극적으로 하고 싶은 설정

1단계: EC2 인스턴스(리눅스 서버)에 연결

먼저 EC2 인스턴스에 SSH나 AWS콘솔을 사용하여 연결해야 합니다.
저는 우분투 리눅스 환경으로 진행하였습니다.
 

2단계: 시스템 업데이트(선택 사항이지만 권장)

시스템의 패키지 리스트를 업데이트하고 설치된 패키지를 최신 버전으로 업그레이드합니다.

sudo apt-get update && sudo apt-get upgrade -y


또는 Red Hat 기반 시스템(예: Amazon Linux)을 사용하는 경우:
sudo yum update -y

3단계: Google OTP( Google-Authenticatior ) 설치

Google OTP 패키지를 설치합니다.

  • 데비안/우분투에서:
  • sudo apt-get install libpam-google-authenticator -y

  • Red Hat 기반 시스템(Amazon Linux, CentOS):
  • sudo yum install google-authenticator -y

 

4단계: 사용자에 대한 Google OTP( Google-Authenticatior ) 구성

Google Authenticator 설치가 완료되었다면 프로그램 실행 및 
사용자(서버 로그인 계정)의  새 비밀 키를 만듭니다.

 

google-authenticator
 
해당 명령어를 입력하면 아래와 같은 메세지들이 출력되고, 세부 설정을 마치면 완료됩니다.

 

4-1번 질문. 시간 기반 토큰 설정

인증 토큰을 시간 기반(y/n)으로 하시겠습니까?

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

  • 의미: 30초마다 변경되는 시간 기반 일회용 비밀번호(TOTP)를 사용할지 여부를 묻습니다. 
  • 권장 응답: 시간 기반 토큰의 경우 'y'(예)입니다. 사용할 때마다 변경되는 카운터 기반 일회용 비밀번호(HOTP)보다  더 일반적으로 사용되고 안전하기 때문입니다.

4-2 질문. 비밀 키 입력

Your new secret key is: JBSWY3DPEHPK3PXP

  • 의미: Google Authenticator 앱을 설정하는 데 사용할 비밀 키를 표시합니다. 
  • 조치: 이 키를 Google Authenticator 앱에 직접 입력하거나, 화면에 출력되는 QR 코드를 스캔하시면 됩니다.

4-3 질문. 인증 코드 입력

Enter code from app (-1 to skip):

  • 의미: 비밀키를 기반으로 생성된 인증코드를 입력해야 합니다. 이 코드는 Google OTP 앱이 올바르게 구성되었는지 확인하는 데 사용됩니다.
  • 작업: Authenticator 앱에서 메시지가 표시되면 이 코드를 사용하여 즉시 설정을 확인할 수 있습니다.

4-4 질문. 긴급 일회용 코드 저장

Your emergency scratch codes are:

  • 의미: 긴급 일회용 코드를 보여줍니다. Google Authenticator 앱을 사용할 수 없는 경우 로그인하는 데 사용하는 코드입니다.
  • 조치: 각 코드는 한 번만 사용할 수 있으며, 안전한 장소에 보관해야 합니다. 

 

4-5 번 질문. 설정 파일 업데이트

"/home/[user]/.google_authenticator" 파일을 업데이트하시겠습니까(y/n)?

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

  • 의미: 이는 시스템이 홈 디렉토리에 위치한 '.google_authenticator' 파일을 새로운 비밀 키와 설정으로 업데이트하거나 생성할 것인지 묻는 것입니다.
  • 권장 응답: 2단계 인증(2FA)을 활성화하고자 한다면 '예'를 선택합니다.

 

4-6번 질문. 토큰 재사용 방지

동일한 인증 토큰을 여러 번 사용할 수 없도록 하시겠습니까? 이는 약 30초마다 한 번만 로그인하도록 제한하지만 중간자 공격을 발견하거나 예방할 가능성도 높아집니다. (y/n)

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

  • 의미: 이 설정은 30초의 유효 기간 동안 토큰이 두 번 이상 사용되는 것을 방지함으로써 보안을 강화합니다.
  • 권장 응답: 보안 강화를 위한 y(예).

 

4-7 번 질문. 시간 동기화 보완

기본적으로 모바일 앱에서는 30초마다 새 토큰이 생성됩니다. 그러나 분산 시스템의 시간차로 인해 현재 시간 전후에 추가 토큰을 허용합니다. 이를 통해 인증 서버와 클라이언트 사이에 최대 30초의 시간차가 허용됩니다. 시간 동기화가 제대로 이루어지지 않는 문제가 발생하는 경우 창을 기본 크기인 1:30분에서 약 4분으로 늘릴 수 있습니다. 그렇게 하시겠습니까(y/n)?

By default, tokens are good for 30 seconds.
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.
If you experience problems with poor time synchronization,
you can increase the window from its default size of 1:30min to about 4min.
Do you want to do so (y/n) n

  • 의미: 이 기능은 서버와 장치 사이의 시간 차이를 고려하여 토큰의 유효 기간을 연장합니다.
  • 권장 응답: 시간 동기화 문제가 없다면 '아니요'를 선택하세요. n(아니요).

 

4-8 번 질문. 로그인 속도 제한

로그인 중인 컴퓨터가 무차별 로그인 시도에 대해 강화되지 않은 경우 인증 모듈에 대해 속도 제한을 활성화할 수 있습니다. 기본적으로 이는 공격자가 30초마다 로그인 시도를 3회 이하로 제한합니다. 속도 제한을 활성화하시겠습니까(y/n)?

  • 의미: 이 옵션은 2FA 코드를 맞추려는 빠른 무차별 공격을 방지하기 위한 이 기능으로, 30초 동안 로그인 시도를 3회 이하로 속도 제한을 추가합니다.
  • 권장 응답: 무차별 대입 공격을 완화하기 위해서는 '예'를 선택하시면 됩니다.

 

5단계: Google OTP를 사용하도록 SSH 구성

 Google Authenticator 모듈을 포함하도록 PAM SSHD 구성 파일을 편집합니다.

 

sudo nano /etc/pam.d/sshd
파일 끝에 다음 줄을 추가합니다.

auth required pam_google_authenticator.so

해당 명령어 뒤에 nullok 옵션(비밀번호가 없는 계정도 로그인 허용)도 가능하지만, 
특별한 상황이 아닌 이상, 보안상 이 옵션은 사용하지 않는 것이 좋습니다.

 

6단계: SSH 데몬 구성 업데이트

사용자에게 추가 확인을 요구하도록 SSHD 구성 파일을 편집합니다.
sudo nano /etc/ssh/sshd_config
 
다음 행이 설정되어 있는지 확인합니다(필요한 경우 주석 처리를 해제하고 그에 따라 값을 변경합니다).

 

ChallengeResponseAuthentication yes
UsePAM yes


ChallengeResponseAuthentication yes 옵션은 Challenge-Response 인증을 사용할 수 있음을 의미합니다. Challenge-Response 인증은 서버가 사용자에게 질문을 하고 사용자가 답변을 입력하는 방식으로 작동합니다. Google OTP는 Challenge-Response 인증의 일종입니다.
 
UsePAM yes 옵션을 설정 안하면 아래와 같은 메세지가 출력되게 됩니다.

 
 
 
7단계: SSH 서비스 다시 시작

SSH 서비스를 다시 시작하여 변경 사항을 적용합니다.
sudo systemctl restart sshd
sudo systemctl restart ssh
 
또는 systemctl이 없는 이전 시스템에서는:
sudo service sshd restart
sudo service ssh restart
 
SSH 설정 파일을 직접 편집한 경우:

  • sshd_config 파일을 직접 편집하여 설정을 변경한 경우, 데몬을 다시 시작해야 새 설정이 적용됩니다

 

8단계: 구성 테스트

  • 새 SSH 세션을 열고 EC2 인스턴스에 접속 시도
  • SSH 키 암호 입력 후, Google OTP 애플리케이션에서 생성된 확인 코드 입력 요구

우리가 궁극적으로 하고 싶은 설정

 

AWS_EC2_MFA_요약 다운로드

AWS_EC2_MFA_요약.txt
0.00MB

반응형