웹사이트 검색

Ubuntu 16.04에서 SSH에 대한 Multi-Factor Authentication을 설정하는 방법


소개

인증 요소는 시스템 로그인과 같은 작업을 수행할 권한이 있음을 증명하는 데 사용되는 단일 정보입니다. 인증 채널은 인증 시스템이 사용자에게 요소를 전달하거나 사용자가 회신하도록 요구하는 방법입니다. 암호 및 보안 토큰은 인증 요소의 예입니다. 컴퓨터와 전화는 채널의 예입니다.

SSH는 기본적으로 인증에 암호를 사용하며 대부분의 SSH 강화 지침에서는 대신 SSH 키를 사용할 것을 권장합니다. 그러나 이것은 여전히 단일 요인일 뿐입니다. 악의적인 행위자가 컴퓨터를 손상시킨 경우 키를 사용하여 서버도 손상시킬 수 있습니다.

이 튜토리얼에서는 이를 방지하기 위해 다단계 인증을 설정합니다. 다단계 인증(MFA)은 인증하거나 로그인하기 위해 둘 이상의 요소가 필요합니다. 즉, 악의적인 행위자가 컴퓨터와 휴대전화와 같은 여러 항목을 손상시켜야 합니다. in. 다른 유형의 요소는 종종 다음과 같이 요약됩니다.

  1. 비밀번호나 보안 질문과 같이 알고 있는 정보
  2. 인증자 앱 또는 보안 토큰과 같은 소유물
  3. 당신의 지문이나 목소리와 같은 당신 자신

공통 요소 중 하나는 Google Authenticator와 같은 OATH-TOTP 앱입니다. OATH-TOTP(Open Authentication Time-Based One-Time Password)는 일반적으로 30초마다 재활용되는 6자리 숫자인 일회용 암호를 생성하는 개방형 프로토콜입니다.

이 문서에서는 SSH 키 외에 OATH-TOTP 앱을 사용하여 SSH 인증을 활성화하는 방법을 설명합니다. SSH를 통해 서버에 로그인하려면 두 채널에 걸쳐 두 가지 요소가 필요하므로 비밀번호나 SSH 키만 사용하는 것보다 더 안전합니다. 또한 MFA에 대한 몇 가지 추가 사용 사례와 몇 가지 유용한 팁 및 요령을 살펴보겠습니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 루트가 아닌 sudo 사용자, SSH 키 및 방화벽이 활성화된 Ubuntu 16.04 서버 1개. 이 초기 서버 설정 자습서를 따라 설정할 수 있습니다.
  • Google Authenticator(Android)와 같은 OATH-TOTP 앱이 설치된 스마트폰 또는 태블릿

1단계 - Google의 PAM 설치

이 단계에서는 Google의 PAM을 설치하고 구성합니다.

PAM은 Pluggable Authentication Module을 의미하며 Linux 시스템에서 사용자를 인증하는 데 사용되는 인증 인프라입니다. Google은 OATH-TOTP 앱을 만들었기 때문에 TOTP를 생성하고 Google Authenticator 또는 Authy와 같은 모든 OATH-TOTP 앱과 완벽하게 호환되는 PAM도 만들었습니다.

먼저 Ubuntu의 저장소 캐시를 업데이트합니다.

  1. sudo apt-get update

다음으로 PAM을 설치합니다.

  1. sudo apt-get install libpam-google-authenticator

PAM이 설치되면 PAM과 함께 제공되는 도우미 앱을 사용하여 두 번째 요소를 추가하려는 사용자에 대한 TOTP 키를 생성합니다. 이 키는 시스템 전체가 아니라 사용자별로 생성됩니다. 즉, TOTP 인증 앱을 사용하려는 모든 사용자는 자신의 키를 얻기 위해 로그인하고 도우미 앱을 실행해야 합니다. 모든 사람이 사용할 수 있도록 한 번만 실행할 수는 없습니다(그러나 이 자습서의 끝 부분에는 많은 사용자를 위해 MFA를 설정하거나 요구하는 몇 가지 팁이 있습니다).

초기화 앱을 실행합니다.

  1. google-authenticator

명령을 실행하면 몇 가지 질문을 받게 됩니다. 첫 번째는 인증 토큰이 시간 기반이어야 하는지 묻습니다.

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

이 PAM은 시간 기반 또는 순차적 기반 토큰을 허용합니다. 순차 기반 토큰을 사용한다는 것은 코드가 특정 지점에서 시작하여 사용할 때마다 코드를 증가시킨다는 것을 의미합니다. 시간 기반 토큰을 사용하면 특정 시간이 지나면 코드가 임의로 변경됩니다. Google Authenticator와 같은 앱이 예상하는 시간 기반이므로 y로 답하십시오.

이 질문에 답하고 나면 큰 QR 코드를 포함하여 많은 출력이 스크롤됩니다. 이 시점에서 휴대폰의 인증 앱을 사용하여 QR 코드를 스캔하거나 비밀 키를 수동으로 입력합니다. QR 코드가 너무 커서 스캔할 수 없는 경우 QR 코드 위의 URL을 사용하여 더 작은 버전을 얻을 수 있습니다. 추가되면 앱에서 30초마다 변경되는 6자리 코드를 볼 수 있습니다.

참고: 암호 관리자와 같은 안전한 장소에 비밀 키, 인증 코드 및 복구 코드를 기록해 두십시오. 복구 코드는 예를 들어 TOTP 앱에 대한 액세스 권한을 잃은 경우 액세스 권한을 다시 얻을 수 있는 유일한 방법입니다.

나머지 질문은 PAM이 작동하는 방법을 알려줍니다. 하나씩 살펴보겠습니다.

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

이렇게 하면 키와 옵션이 .google_authenticator 파일에 기록됩니다. 아니오라고 대답하면 프로그램이 종료되고 아무 것도 기록되지 않으므로 인증자가 작동하지 않습니다.

Output
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

여기에서 예라고 답하면 각 코드를 사용 후 즉시 만료시켜 재생 공격을 방지하는 것입니다. 이렇게 하면 공격자가 방금 사용한 코드를 캡처하여 로그인하는 것을 방지할 수 있습니다.

Output
By default, tokens are good for 30 seconds and 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

여기에서 예라고 대답하면 움직이는 4분 창에서 최대 8개의 유효한 코드가 허용됩니다. 아니오라고 대답하면 1분 30초 롤링 창에서 3개의 유효한 코드로 제한됩니다. 1분 30초 창에서 문제를 발견하지 않는 한 아니오라고 대답하는 것이 더 안전한 선택입니다.

Output
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

속도 제한은 원격 공격자가 차단되기 전에 특정 수의 추측만 시도할 수 있음을 의미합니다. 이전에 SSH에 직접 속도 제한을 구성하지 않았다면 지금 구성하는 것이 훌륭한 강화 기술입니다.

참고: 이 설정을 마친 후 비밀 키를 백업하려는 경우 ~/.google-authenticator 파일을 신뢰할 수 있는 위치에 복사할 수 있습니다. 여기에서 추가 시스템에 배포하거나 백업 후 재배포할 수 있습니다.

이제 Google의 PAM이 설치 및 구성되었으므로 다음 단계는 TOTP 키를 사용하도록 SSH를 구성하는 것입니다. PAM에 대해 SSH에 알리고 이를 사용하도록 SSH를 구성해야 합니다.

2단계 - OpenSSH 구성

SSH를 통해 SSH를 변경할 것이기 때문에 초기 SSH 연결을 닫지 않는 것이 중요합니다. 대신 두 번째 SSH 세션을 열어 테스트를 수행하십시오. 이는 SSH 구성에 실수가 있는 경우 서버가 잠기는 것을 방지하기 위한 것입니다. 모든 것이 작동하면 모든 세션을 안전하게 닫을 수 있습니다.

시작하려면 nano 또는 선호하는 텍스트 편집기를 사용하여 편집할 sshd 구성 파일을 여십시오.

  1. sudo nano /etc/pam.d/sshd

파일 맨 아래에 다음 행을 추가하십시오.

. . .
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

마지막 줄 끝에 있는 nullok 단어는 이 인증 방법이 선택 사항임을 PAM에 알려줍니다. 이를 통해 OATH-TOTP 토큰이 없는 사용자는 여전히 SSH 키를 사용하여 로그인할 수 있습니다. 모든 사용자가 OATH-TOTP 토큰을 가지고 있으면 이 줄에서 nullok를 제거하여 MFA를 필수로 만들 수 있습니다.

파일을 저장하고 닫습니다.

다음으로 이러한 종류의 인증을 지원하도록 SSH를 구성합니다. 편집을 위해 SSH 구성 파일을 엽니다.

  1. sudo nano /etc/ssh/sshd_config

ChallengeResponseAuthentication을 찾아 해당 값을 yes로 설정합니다.

. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
. . .

파일을 저장하고 닫은 다음 SSH를 다시 시작하여 구성 파일을 다시 로드합니다. sshd 서비스를 다시 시작해도 열려 있는 연결이 닫히지 않으므로 이 명령으로 자신을 잠글 위험이 없습니다.

  1. sudo systemctl restart sshd.service

지금까지 모든 것이 작동하는지 테스트하려면 다른 터미널을 열고 SSH를 통해 로그인해 보십시오. 이전에 SSH 키를 생성하여 사용 중인 경우 사용자 비밀번호나 MFA 확인 코드를 입력할 필요가 없다는 것을 알게 될 것입니다. 이는 SSH 키가 기본적으로 다른 모든 인증 옵션보다 우선하기 때문입니다. 그렇지 않으면 암호 및 확인 코드 프롬프트를 받았을 것입니다.

다음으로 SSH 키를 하나의 요소로 활성화하고 확인 코드를 두 번째 요소로 활성화하려면 SSH에 사용할 요소를 알려주고 SSH 키가 다른 모든 유형을 재정의하지 않도록 해야 합니다.

3단계 - SSH에서 MFA를 인식하게 만들기

sshd 구성 파일을 다시 엽니다.

  1. sudo nano /etc/ssh/sshd_config

파일 맨 아래에 다음 행을 추가하십시오. SSH에 필요한 인증 방법을 알려줍니다. 이 줄은 SSH에 SSH 키와 암호 또는 확인 코드(또는 세 가지 모두)가 필요함을 알려줍니다.

. . .
UsePAM yes
AuthenticationMethods publickey,password publickey,keyboard-interactive

파일을 저장하고 닫습니다.

그런 다음 PAM sshd 구성 파일을 다시 엽니다.

  1. sudo nano /etc/pam.d/sshd

@include common-auth 줄을 찾아 줄의 첫 번째 문자로 # 문자를 추가하여 주석 처리합니다. 이것은 PAM에게 암호를 묻지 않도록 지시합니다.

. . .
# Standard Un*x authentication.
#@include common-auth
. . .

파일을 저장하고 닫은 다음 SSH를 다시 시작합니다.

  1. sudo systemctl restart sshd.service

이제 다른 세션으로 서버에 다시 로그인해 보십시오. 지난 번과 달리 SSH는 인증 코드를 요청해야 합니다. 입력하면 로그인됩니다. SSH 키가 사용되었다는 표시가 보이지 않더라도 로그인 시도에는 두 가지 요소가 사용되었습니다. 확인하려면 SSH 명령 뒤에 -v(상세 정보용)를 추가할 수 있습니다.

Example SSH output\
. . . debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /Users/sammy/.ssh/id_rsa debug1: Server accepts key: pkalg rsa-sha2-512 blen 279 Authenticated with partial success. debug1: Authentications that can continue: password,keyboard-interactive debug1: Next authentication method: keyboard-interactive Verification code:

출력이 끝날 무렵 SSH가 SSH 키를 사용하는 위치를 확인한 다음 인증 코드를 요청합니다. 이제 SSH 키와 일회용 암호를 사용하여 SSH를 통해 로그인할 수 있습니다. 세 가지 인증 유형을 모두 시행하려면 다음 단계를 따르십시오.

4단계 - 세 번째 요소 추가(선택 사항)

3단계에서 sshd_config 파일에 승인된 인증 유형을 나열했습니다.

  1. publickey(SSH 키)
  2. 비밀번호 공개키(비밀번호)
  3. keyboard-interactive(인증 코드)

세 가지 요소를 나열했지만 지금까지 선택한 옵션으로는 SSH 키와 인증 코드만 허용됩니다. 세 가지 요소(SSH 키, 암호 및 인증 코드)를 모두 갖고 싶다면 한 번의 빠른 변경으로 세 가지 요소를 모두 활성화할 수 있습니다.

PAM sshd 구성 파일을 엽니다.

  1. sudo nano /etc/pam.d/sshd

이전에 주석 처리한 줄 #@include common-auth를 찾아 # 문자를 제거하여 줄의 주석 처리를 제거합니다. 파일을 저장하고 닫습니다. 이제 다시 한 번 SSH를 다시 시작합니다.

  1. sudo systemctl restart sshd.service

@include common-auth 옵션을 활성화하면 PAM은 이제 이전에 작업했던 SSH 키 확인 및 인증 코드 요청 외에도 암호를 묻는 메시지를 표시합니다. 이제 우리는 우리가 알고 있는 것(비밀번호)과 우리가 가지고 있는 두 가지 다른 유형(SSH 키 및 확인 코드)을 두 개의 서로 다른 채널을 통해 사용할 수 있습니다.

지금까지 이 문서에서는 SSH 키와 시간 기반 일회성 암호를 사용하여 MFA를 활성화하는 방법에 대해 설명했습니다. 이것이 필요한 전부라면 여기서 끝낼 수 있습니다. 그러나 이것이 다단계 인증을 수행하는 유일한 방법은 아닙니다. 다음은 다단계 인증을 위해 이 PAM 모듈을 사용하는 몇 가지 추가 방법과 복구, 자동화된 사용 등에 대한 몇 가지 팁과 요령입니다.

팁 1 - 액세스 복구

강화하고 보호하는 모든 시스템과 마찬가지로 해당 보안을 관리할 책임이 있습니다. 이 경우 SSH 키 또는 TOTP 비밀 키를 잃어버리지 않고 TOTP 앱에 액세스할 수 있는지 확인해야 합니다. 그러나 때로는 상황이 발생하여 필요한 키나 앱을 제어하지 못할 수 있습니다.

SSH 키 또는 TOTP 비밀 키 분실

SSH 키 또는 TOTP 비밀 키를 분실한 경우 복구를 몇 단계로 나눌 수 있습니다. 첫 번째는 인증 코드를 모른 채 다시 들어가는 것이고 두 번째는 정상적인 MFA 로그인을 위해 비밀 키를 찾거나 재생성하는 것입니다.

DigitalOcean Droplet에서 인증 코드를 생성하는 비밀 키를 분실한 후 로그인하려면 대시보드의 가상 콘솔을 사용하여 사용자 이름과 비밀번호를 사용하여 로그인하면 됩니다.

그렇지 않으면 sudo 액세스 권한이 있는 관리 사용자가 필요합니다. 이 사용자에 대해 MFA를 활성화하지 말고 SSH 키를 사용하십시오. 귀하 또는 다른 사용자가 비밀 키를 분실하여 로그인할 수 없는 경우 관리 사용자가 로그인하여 sudo를 사용하여 모든 사용자의 키 복구 또는 재생성을 도울 수 있습니다.

로그인하면 TOTP 암호를 얻는 데 도움이 되는 두 가지 방법이 있습니다.

  1. 기존 키 복구
  2. 새 키 생성

각 사용자의 홈 디렉토리에서 비밀 키와 Google Authenticator 설정은 ~/.google-authenticator에 저장됩니다. 이 파일의 첫 번째 줄은 비밀 키입니다. 키를 얻는 빠른 방법은 google-authenticator 파일(예: 비밀 키)의 첫 번째 줄을 표시하는 다음 명령을 실행하는 것입니다. 그런 다음 해당 비밀 키를 가져와 TOTP 앱에 수동으로 입력합니다.

  1. head -n 1 /home/sammy/.google_authenticator

기존 키를 사용하지 않는 이유가 있는 경우(예: 영향을 받는 사용자와 보안 키를 쉽게 공유할 수 없는 경우) ~/.google-authenticator 파일을 완전히 제거할 수 있습니다. 이렇게 하면 MFA를 적용하지 않았다고 가정할 때 사용자가 단일 요소만 사용하여 다시 로그인할 수 있습니다. 그런 다음 google-authenticator를 실행하여 새 키를 생성할 수 있습니다.

TOTP 앱에 대한 액세스 권한 상실

서버에 로그인해야 하지만 인증 코드를 받기 위해 TOTP 앱에 액세스할 수 없는 경우 처음 비밀 키를 생성할 때 표시된 복구 코드를 사용하여 계속 로그인할 수 있습니다. 이러한 복구 코드는 일회용입니다. 한 번 로그인에 사용되면 다시 인증 코드로 사용할 수 없습니다.

팁 2 - 인증 설정 변경

초기 구성 후 MFA 설정을 변경하려는 경우 업데이트된 설정으로 새 구성을 생성하는 대신 ~/.google-authenticator 파일을 편집하면 됩니다. 이 파일은 다음과 같은 방식으로 배치됩니다.

<secret key>
<options>
<recovery codes>

이 파일에 설정된 옵션은 옵션 섹션에 라인이 있습니다. 초기 설정에서 특정 옵션에 "아니오\라고 답한 경우 해당 라인이 파일에서 제외됩니다.

이 파일에서 변경할 수 있는 사항은 다음과 같습니다.

  • 시간 기반 코드 대신 순차적 코드를 활성화하려면 \ TOTP_AUTH 줄을 \ HOTP_COUNTER 1로 변경합니다.
  • 단일 코드를 여러 번 사용할 수 있도록 하려면 \ DISALLOW_REUSE 줄을 제거하십시오.
  • 코드 만료 기간을 4분으로 연장하려면 \ WINDOW_SIZE 17 줄을 추가하세요.
  • 여러 번의 로그인 실패(속도 제한)를 비활성화하려면 \ RATE_LIMIT 3 30 줄을 제거하십시오.
  • 속도 제한 임계값을 변경하려면 \ RATE_LIMIT 3 30 줄을 찾아 숫자를 조정합니다. 원본의 3은 일정 기간 동안의 시도 횟수를 나타냅니다. 30은 기간을 초 단위로 나타냅니다.
  • 복구 코드 사용을 비활성화하려면 파일 하단에 있는 8자리 코드 5개를 제거하세요.

팁 3 - 일부 계정에 대한 MFA 방지

MFA가 활성화되지 않은 상태에서 단일 사용자 또는 소수의 서비스 계정(즉, 사람이 아닌 애플리케이션에서 사용하는 계정)이 SSH 액세스를 필요로 하는 상황이 있을 수 있습니다. 예를 들어 일부 FTP 클라이언트와 같이 SSH를 사용하는 일부 애플리케이션은 MFA를 지원하지 않을 수 있습니다. 애플리케이션에 확인 코드를 요청할 방법이 없는 경우 SSH 연결 시간이 초과될 때까지 요청이 중단될 수 있습니다.

/etc/pam.d/sshd의 몇 가지 옵션이 올바르게 설정되어 있는 한 사용자별로 사용되는 요소를 제어할 수 있습니다.

일부 계정에 대해 MFA를 허용하고 다른 계정에 대해 SSH만 허용하려면 /etc/pam.d/sshd에서 다음 설정이 활성화되어 있는지 확인하십시오.

# PAM configuration for the Secure Shell service

# Standard Un*x authentication.
#@include common-auth

. . .

# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

여기서 @include common-auth는 암호를 비활성화해야 하므로 주석 처리됩니다. 일부 계정에서 MFA를 비활성화하려는 경우 MFA를 강제 적용할 수 없으므로 마지막 줄에 nullok 옵션을 그대로 둡니다.

이 구성을 설정한 후 MFA가 필요한 모든 사용자로 google-authenticator를 실행하고 SSH 키만 사용할 사용자에 대해서는 실행하지 마십시오.

팁 4 - 구성 관리로 설정 자동화

많은 시스템 관리자는 Puppet, Chef 또는 Ansible과 같은 구성 관리 도구를 사용하여 시스템을 관리합니다. 이와 같은 시스템을 사용하여 새 사용자 계정이 생성될 때 비밀 키를 설치하고 싶다면 그렇게 할 수 있는 방법이 있습니다.

google-authenticator는 단일 비대화형 명령으로 모든 옵션을 설정하는 명령줄 스위치를 지원합니다. 모든 옵션을 보려면 google-authenticator --help를 입력하면 됩니다. 다음은 1단계에서 설명한 대로 모든 것을 설정하는 명령입니다.

  1. google-authenticator -t -d -f -r 3 -R 30 -W

이것은 우리가 수동으로 답변한 모든 질문에 답하고 파일에 저장한 다음 비밀 키, QR 코드 및 복구 코드를 출력합니다. (플래그 -q를 추가하면 출력이 없습니다.) 이 명령을 자동화된 방식으로 사용하는 경우 비밀 키 및/또는 복구를 캡처하도록 입력해야 합니다. 코드를 만들고 사용자가 사용할 수 있도록 합니다.

팁 5 - 모든 사용자에게 MFA 강제 적용

첫 번째 로그인에서도 모든 사용자에 대해 MFA를 강제 적용하고 싶거나 사용자가 자신의 키를 생성하는 데 의존하지 않으려는 경우 쉽게 처리할 수 있는 방법이 있습니다. 파일에 저장된 사용자별 데이터가 없으므로 각 사용자에 대해 동일한 .google-authenticator 파일을 사용할 수 있습니다.

이렇게 하려면 구성 파일을 처음 만든 후 권한이 있는 사용자가 파일을 모든 홈 디렉토리의 루트에 복사하고 해당 권한을 적절한 사용자로 변경해야 합니다. 파일을 /etc/skel/에 복사하여 생성 시 새 사용자의 홈 디렉토리에 자동으로 복사되도록 할 수도 있습니다.

경고: 모든 사람이 동일한 두 번째 요소를 공유하기 때문에 이는 보안 위험이 될 수 있습니다. 즉, 유출되면 모든 사용자가 하나의 요소만 가진 것과 같습니다. 이 방법을 사용하려면 이 점을 고려하십시오.

사용자의 비밀 키 생성을 강제하는 또 다른 방법은 다음과 같은 bash 스크립트를 사용하는 것입니다.

  1. TOTP 토큰 생성,
  2. Google Authenticator 앱을 다운로드하고 표시될 QR 코드를 스캔하라는 메시지를 표시하고
  3. .google-authenticator 파일이 이미 있는지 확인한 후 google-authenticator 애플리케이션을 실행합니다.

사용자가 로그인할 때 스크립트가 실행되도록 하려면 이름을 .bash_login로 지정하고 홈 디렉토리의 루트에 배치할 수 있습니다.

결론

즉, 두 개의 채널(컴퓨터 + 전화)에 걸쳐 두 가지 요소(SSH 키 + MFA 토큰)를 가짐으로써 외부 에이전트가 SSH를 통해 무차별 대입 공격을 가하는 것을 매우 어렵게 만들었고 크게 증가했습니다. 당신의 기계의 보안.