라즈베리 파이는 우리 주변 어디에서나 찾아볼 수 있게 되었습니다. 이러한 보급률 증가는 사이버 범죄자들의 주요 관심 대상이 되고 있습니다. 따라서 이 글에서는 라즈베리 파이를 이중 인증으로 더욱 안전하게 보호하는 방법을 상세히 알아보겠습니다.
라즈베리 파이의 놀라운 가능성
라즈베리 파이는 단일 보드 컴퓨터로, 2012년 영국에서 어린이들이 코딩을 배우고 창작 활동을 할 수 있도록 고안되었습니다. 초기 모델은 신용카드 크기에 휴대폰 충전기로 전원을 공급받을 수 있었으며, HDMI 출력, USB 포트, 네트워크 연결을 지원하고 리눅스 운영체제를 실행했습니다.
이후에는 임베디드 시스템이나 헤드리스 시스템에 적합한 소형 버전들이 추가되었습니다. 가격은 파이 제로의 5달러부터 파이 4B/8GB의 75달러까지 다양합니다.
라즈베리 파이의 성공은 그야말로 놀랍습니다. 전 세계적으로 3천만 대 이상이 판매되었으며, 취미로 활용하는 사용자들은 라즈베리 파이를 풍선에 매달아 우주 근처까지 보내는 등 놀라운 프로젝트들을 진행했습니다.
그러나 모든 컴퓨팅 플랫폼과 마찬가지로, 라즈베리 파이의 인기 증가는 사이버 범죄자들의 관심을 끌고 있습니다. 많은 라즈베리 파이가 여전히 기본 사용자 계정과 비밀번호를 사용하고 있으며, SSH(Secure Shell)를 통해 인터넷에서 접근 가능하다는 점은 매우 우려스럽습니다. 따라서 라즈베리 파이의 보안을 강화해야 합니다.
라즈베리 파이 자체에 중요한 데이터나 소프트웨어가 없더라도, 라즈베리 파이가 사이버 공격의 발판으로 사용될 수 있기 때문에 보호해야 합니다. 일단 공격자가 네트워크에 침투하면, 다른 주요 장치로 이동할 가능성이 높습니다.
이중 인증이란?
인증은 시스템에 대한 접근 권한을 얻기 위해 하나 이상의 요소를 요구하는 절차입니다. 이러한 요소는 다음과 같이 분류됩니다.
- 알고 있는 것: 비밀번호 또는 암호 구문 등
- 소유하고 있는 것: 휴대폰, 물리적 토큰 또는 동글 등
- 자신이 곧 요소인 것: 지문이나 망막 스캔과 같은 생체 인식 정보
MFA(다단계 인증)는 비밀번호 외에 다른 범주의 요소 하나 이상을 요구합니다. 여기서는 비밀번호와 휴대폰을 조합하여 이중 인증을 설정하겠습니다. 휴대폰에는 Google 인증 앱을 설치하고, 라즈베리 파이에는 Google 인증 모듈을 설치합니다.
휴대폰 앱은 QR 코드를 스캔하여 라즈베리 파이와 연결됩니다. 이는 라즈베리 파이에서 휴대폰으로 시드 정보를 전달하여 양측에서 동일한 코드를 생성하는 알고리즘을 실행하게 합니다. 생성되는 코드는 시간 기반 일회용 비밀번호(TOTP)입니다.
연결을 시도하면 라즈베리 파이가 코드를 생성합니다. 휴대폰의 인증 앱을 사용하여 현재 코드를 확인하고, 라즈베리 파이에서 비밀번호와 인증 코드를 입력하면 연결이 완료됩니다. 즉, 비밀번호와 TOTP가 모두 정확해야 연결이 가능합니다.
라즈베리 파이 설정
일반적으로 라즈베리 파이에서 SSH를 사용하는 경우, 이는 헤드리스 시스템일 가능성이 높으며, SSH 연결을 통해 설정을 구성하게 됩니다.
가장 안전한 방법은 두 개의 SSH 연결을 생성하는 것입니다. 하나는 구성 및 테스트용으로, 다른 하나는 문제가 발생했을 때를 대비한 안전망으로 사용합니다. 이렇게 하면 구성 중에 스스로를 잠그더라도, 두 번째 연결을 통해 문제를 해결할 수 있습니다. SSH 설정을 변경해도 활성 연결에는 영향을 주지 않기 때문에, 두 번째 연결을 이용하여 변경 사항을 되돌리고 상황을 해결할 수 있습니다.
최악의 경우 SSH를 통해 완전히 연결이 끊기더라도, 라즈베리 파이를 모니터, 키보드 및 마우스에 연결하여 일반 세션에 로그인할 수 있습니다. 라즈베리 파이가 모니터를 구동할 수 있다면, 언제든지 다시 로그인할 수 있습니다. 하지만 만약 이렇게 할 수 없는 경우를 대비하여, 이중 인증이 정상적으로 작동하는지 확인할 때까지 안전망 SSH 연결을 열어두어야 합니다.
물론 최후의 수단은 라즈베리 파이의 마이크로 SD 카드에 운영 체제를 다시 설치하는 것이지만, 이러한 상황은 피하도록 노력해야 합니다.
우선, 라즈베리 파이에 두 개의 연결을 만들어야 합니다. 두 명령 모두 다음과 같은 형식을 사용합니다.
ssh [email protected]

이 라즈베리 파이의 이름은 “watchdog”이지만, 본인의 라즈베리 파이 이름을 대신 입력해야 합니다. 기본 사용자 이름을 변경했다면, 해당 사용자 이름도 사용해야 합니다. 이 예에서는 사용자 이름이 “pi”입니다.
안전을 위해 이 명령을 다른 터미널 창에 두 번 입력하여 라즈베리 파이에 두 개의 연결을 생성합니다. 그런 다음 그 중 하나를 최소화하여 방해가 되지 않도록 하고, 실수로 닫히지 않도록 합니다.
연결이 완료되면, 환영 메시지가 표시됩니다. 프롬프트에는 사용자 이름(이 예에서는 “pi”)과 라즈베리 파이의 이름(이 예에서는 “watchdog”)이 나타납니다.

이제 “sshd_config” 파일을 수정해야 합니다. 이를 위해 nano 텍스트 편집기를 사용합니다.
sudo nano /etc/ssh/sshd_config

파일을 아래로 스크롤하여 다음 줄을 찾습니다.
ChallengeResponseAuthentication no
“no”를 “yes”로 변경합니다.

Ctrl+O를 눌러 변경 사항을 nano에 저장하고, Ctrl+X를 눌러 파일을 닫습니다. 그런 다음, 다음 명령을 사용하여 SSH 데몬을 다시 시작합니다.
sudo systemctl restart ssh

이제 Google 인증기를 설치해야 합니다. 이는 PAM(플러그형 인증 모듈) 라이브러리입니다. 응용 프로그램(SSH)은 Linux PAM 인터페이스를 호출하고, 이 인터페이스는 요청된 인증 유형을 처리하는 적절한 PAM 모듈을 찾습니다.
다음 명령을 입력합니다.
sudo apt-get install libpam-google-authenticator

앱 설치
Google OTP 앱은 iOS 및 Android 기기에서 사용할 수 있습니다. 휴대폰에 적절한 버전을 설치하기만 하면 됩니다. Authy 등 이러한 유형의 인증 코드를 지원하는 다른 앱을 사용할 수도 있습니다.

이중 인증 구성
SSH를 통해 라즈베리 파이에 연결할 때 사용할 계정에서 다음 명령을 실행합니다(sudo 접두사는 포함하지 않음).
google-authenticator
인증 토큰을 시간 기반으로 할 것인지 묻는 메시지가 나타납니다. Y를 입력하고 Enter 키를 누릅니다.
QR 코드가 생성되는데, 80열 터미널 창보다 넓어서 깨져서 보일 수 있습니다. 코드를 제대로 보려면 창을 더 넓게 드래그해야 합니다.
QR 코드 아래에는 여러 보안 코드도 표시됩니다. 이 코드는 ‘.google_authenticator’ 파일에 저장되지만, 분실에 대비하여 백업해두는 것이 좋습니다. 휴대폰을 잃어버려 TOTP를 얻을 수 없게 된 경우, 이 코드를 사용하여 인증할 수 있습니다.
다음 네 가지 질문에 답해야 합니다. 첫 번째 질문은 다음과 같습니다.
Do you want me to update your "/home/pi/.google_authenticator" file? (y/n)
Y를 입력하고 Enter 키를 누릅니다.

다음 질문은 30초 창 내에서 동일한 코드를 여러 번 사용하는 것을 방지할 것인지 묻습니다.
Y를 입력하고 Enter 키를 누릅니다.

세 번째 질문은 TOTP 토큰에 대한 승인 창을 넓힐 것인지 묻습니다.
N을 입력하고 Enter 키를 누릅니다.

마지막 질문은 “속도 제한을 활성화하시겠습니까?”입니다.
Y를 입력하고 Enter 키를 누릅니다.

명령 프롬프트로 돌아갑니다. 필요하면 터미널 창을 더 넓게 드래그하거나, 터미널 창에서 위로 스크롤하여 전체 QR 코드를 볼 수 있도록 합니다.
휴대폰에서 인증 앱을 열고, 화면 오른쪽 하단의 더하기 기호(+)를 누릅니다. “QR 코드 스캔”을 선택한 후, 터미널 창의 QR 코드를 스캔합니다.
라즈베리 파이의 호스트 이름을 딴 새 항목이 인증 앱에 나타나고, 그 아래에 6자리 TOTP 코드가 표시됩니다. 읽기 쉽게 3자리 두 그룹으로 표시되지만, 입력할 때는 6자리 숫자를 모두 입력해야 합니다.
코드 옆의 애니메이션 원은 코드의 유효 시간을 나타냅니다. 완전한 원은 30초, 반원은 15초를 의미합니다.
모든 것을 함께 연결
편집해야 할 파일이 하나 더 있습니다. SSH에 사용할 PAM 인증 모듈을 알려야 합니다.
sudo nano /etc/pam.d/sshd

파일 상단 근처에 다음 줄을 추가합니다.
#2FA auth required pam_google_authenticator.so

TOTP를 요청할 시기를 선택할 수도 있습니다.
비밀번호를 입력한 후: 위 이미지처럼 “@include common-auth” 아래에 이전 줄을 추가합니다.
비밀번호를 묻기 전에: “@include common-auth” 위에 이전 줄을 추가합니다.
모듈을 설치하기 위해 이전에 apt-get 명령에서 사용한 하이픈(-) 대신 “pam_google_authenticator.so”에 사용된 밑줄(_)에 유의하십시오.
Ctrl+O를 눌러 변경 사항을 파일에 저장하고, Ctrl+X를 눌러 편집기를 닫습니다. 마지막으로 SSH를 다시 시작하면 설정이 완료됩니다.
sudo systemctl restart ssh

이 SSH 연결을 닫고, 다음 단계를 확인하기 전까지 다른 안전망 SSH 연결을 실행 상태로 유지합니다.
휴대폰의 인증 앱을 열어 준비한 다음, 라즈베리 파이에 대한 새로운 SSH 연결을 시도합니다.
ssh [email protected]

비밀번호를 입력한 다음 코드를 입력해야 합니다. 휴대폰에 표시되는 코드를 공백 없이 입력합니다. 비밀번호와 마찬가지로 화면에 표시되지는 않습니다.
모든 설정이 정상적으로 완료되었다면, 라즈베리 파이에 연결할 수 있어야 합니다. 그렇지 않은 경우에는 안전망 SSH 연결을 사용하여 이전 단계를 다시 확인해야 합니다.
주의 사항
이제 라즈베리 파이에 연결하는 것이 이전보다 더 안전해졌지만, 100% 안전한 방법은 없습니다. 이중 인증을 우회하는 다양한 방법들이 존재합니다. 여기에는 사회 공학, 중간자 공격, 엔드포인트 공격, SIM 스와핑 등 고급 기술들이 사용됩니다.
완벽하지 않다면, 왜 이러한 노력을 기울여야 할까요? 이는 집을 나설 때 현관문을 잠그는 이유와 같습니다. 누군가는 자물쇠를 딸 수 있지만, 대부분의 사람들은 그렇지 못하기 때문입니다.