기본적으로 Canoncial Ubuntu 공식 홈페이지에서 제공하는 방법을 따른다.
다만 해당 Guideline 기준 다른점이 하나 존재하고,
몇몇 설정에 관해 설명이 필요할 듯 싶어 포스팅을 작성한다.
1. 사전에 알아두어야 사항
- Ubuntu 16.04 LTS 버전 이상을 구동할 수 있는 컴퓨터
- 안드로이드 또는 IOS 휴대폰
- 구성된 SSH 연결
- 비밀번호 도난의 위험성을 이해
- 2FA가 무엇인지, 어떻게 작동하는지 알 필요는 없다.
실질적인 준비물은 위에서 3가지 이며, 대부분 사용자가 충족할 것이라 생각된다.
'비밀번호 도난의 위험성을 이해' 에 대한 이야기를 하자면,
키보드 후킹으로 인해 비밀번호 노출위험이 있으며, 설사 키보드 후킹 방지가 되어 있더라도
CCTV, 엿보기, 실수 등으로 인해 평문 비밀번호는 상당히 쉽게 노출될 수 있다.
때문에 100자리 비밀번호를 지정한다고 해도 큰 의미가 없을 수 있기에
2FA를 모든곳에서 사용하는것을 권장한다.
2. 설치 방법
- Google Authenticator 모듈을 설치한다.
apt install libpam-google-authenticator
- `/etc/pam.d/sshd` 파일에 아래 문구 추가(최하단에 추가하면 된다)
auth required pam_google_authenticator.so
- sshd 재시작
systemctl restart sshd.service
- `/etc/ssh/sshd_config` 파일 내의 KbdInteractiveAuthentication(ChallengeResponseAuthentication) yes 로 수정
KbdInteractiveAuthentication yes
Ubuntu 24.04 버전 기준으로 ChallengeResponseAuthentication 옵션은 KbdInteractiveAuthentication 로 대체되었다. 때문에 둘중 확인된 하나의 옵션만 yes 로 변경해 주면 된다.
- 터미널에서 설치한 Google Authenticator를 실행한다.
google-authenticator
- 화면에 보이는 QR 코드를 스마트폰 Authenticator 앱에 인식시켜 등록 과정을 진행한다.
참고로 Ubuntu에 설치한 모듈이 Google Authenticator 라고 해서 반드시 스마트폰에서 Google Authenticator를 사용할 필요는 없다. Microsoft Authenticator 등도 원활히 작동한다.
또한 제공되는 emergency scratch codes는 가능하면 물리적으로 적어 서랍 등에 보관하는 것을 권장한다. 본인이 보안 전문가가 아닌이상 디지털 매체에 적어둘 경우, 어떤 매체에서 어떻게 보안이슈가 발생했는지 파악하기 어렵다. 하지만 내 집 서랍속에 기록된 scratch codes가 도난당할 경우, 어떻게 보안이슈가 발생했는지 파악하기 용이하다.
- 추가 옵션 지정
1. Do you want me to update your "/root/.google_authenticator" file? (y/n) y
2. 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
3. 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
4. If the computer that you are logging into is not 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
1.옵션은 Google Authenticator를 사용하기 위해 y로 지정한다.
2.옵션은 만약 로그인을 실패할 시 동일한 인증 토큰을 사용할 수 없게 지정한다.(y 권장)
3. 옵션은 시간동기화 기능을 느슨하게 한다. 이로 인해 보안 취약성이 '약간' 증가할 수 있다.(n 권장)
4. 30초마다 3회 이하의 로그인 시도로 제한한다.(y 권장)
3. 로그인
로그인 시 아래와 같이 Verification Code를 입력하는 창이 발생한다.
스마트폰에 설치한 Authenticator 앱을 통해 Verification 코드를 입력하면 로그인된다.
4. 추가사항
비밀번호를 Brute Force 공격에 안전할 만큼 길게 입력하고, 2FA를 지정했다면 물리적 접촉이 없는 해커의 공격에 웬만하면 뚫리지 않을것이다. 하지만 여기에 추가로, 만약의 상황을 대비하여 로그 `/var/log/auth.log`를 확인하는 습관을 가지자.
5. Public Key 방식과의 장단점
Public Key 방식으로 SSH를 인증하는 경우도 있는데, 보안상으로는 장단점이 있다. Public Key 방식은 통상적인 비밀번호 입력 과정이 없으므로 원천적으로 Brute Force 공격에 있어 안전하다. 2FA 방식이 정말 낮은 확률로 파훼가 가능한것과는 다르다.
그러나 Public Key 방식의 문제점은 Private Key를 누군가가 탈취했을 때 접근을 허용한다는 문제가 존재한다. 때문에 2FA 방식과 Public Key 방식은 서로 장단점이 존재하며, 최고의 보안을 위해서는 Public Key 방식 + 2FA 방식을 동시 운용하는것이 좋다.
개인적으로 Public Key 방식을 사용했을 때의 편리한 점은 Visual Studio Code 에서 Directory를 변경 할 때 추가적인 비밀번호 입력과정이 필요하지 않기에 편리함을 느꼇다.