02:40에 계정이 잠기는데 키보드 앞에는 아무도 없다. 선반 위의 클라이언트는 지난달 저장한 비밀번호를 계속 제시하고, 게이트웨이는 계속 그것을 거부하며, 잠금 뒤의 카운터는 사람의 개입 없이 올라간다. 이것은 공격이 아니라 재시도 루프이며, 계정을 복구할 수 있기 전에 멈춰야 한다.

이것을 정해진 순서의 두 문제로 다루어, 먼저 보내는 쪽을 멈추고 그다음 접근을 복구하라. 반대 순서로 하면 몇 분 안에 루프가 다시 시작된다.

어느 프로세스가 실패를 보내는지 찾아라

ID 시스템의 타임스탬프에서 시작해 계정을 가진 각 클라이언트와 맞춰 보라. 관리형 프로필, 무인 서비스, 서랍 속의 휴대폰, 오래된 자격 증명이 남은 예비 노트북 모두 같은 사람으로 인증할 수 있다. 몇 초마다 실패하는 것이 루프이고, 하루에 한 번 실패하는 것은 보통 잊어버린 사람이다. 둘 다 같은 카운터를 채우며, 여기에 함정이 있다.

확인하는 동안 거부와 연결할 수 없는 게이트웨이를 구분하라. 시간 초과, 이름 해석 실패, 닫힌 포트는 보통 실패 카운터를 올리지 않지만, 잘못된 자격 증명 결과를 반환하는 완료된 인증 교환은 올린다. 둘을 섞으면 잘못된 처방이 나오는데, 하나는 클라이언트를 멈춰야 하고 다른 하나는 경로를 고쳐야 하기 때문이다.

대응을 결정하는 세 가지 조건

세 가지 사실이 답을 하나로 좁힌다. 첫째, 기록이 명시적 거부를 보여주는지 전송 실패를 보여주는지. 둘째, 그 ID가 여러 기기나 서비스에 공유되는지. 셋째, 재시도하는 클라이언트가 당신이 관리하는 것인지 다른 누군가가 통제하는 것인지.

당신이 통제하는 단일 클라이언트의 명시적 거부라면 그 클라이언트를 멈추고, 승인된 경로로 잠금을 풀고, 의도적인 로그인을 한 번 하라. 공유 ID라면 답은 잠금 해제보다 프로비저닝 쪽으로 기우는데, 다른 기기가 다시 연결되는 순간 루프가 재개되기 때문이다. 전송 실패는 네트워크 계층을 가리키며, 거기서 계정 보호는 전혀 문제가 아니다.

어느 분기도 보호를 약화하지 않는다. 잠금 임계값과 속도 제한이 있는 이유는, 장애 중에 당신을 짜증나게 하는 그 신호가 비밀번호 추측 시도를 늦추는 신호이기 때문이다.

잠금 해제 전에 보내는 쪽을 멈춰라

계속 인증하는 유닛이나 연결을 멈추고, 재부팅 후에도 유지되는 방식으로 멈춰라. 서비스가 부팅 시 자동 시작으로 설정되어 있다면 클라이언트를 일시 중지하는 것으로는 부족하다.

# which unit is presenting the credential?
journalctl -u openvpn-client@home --since '20 min ago' | grep -i 'auth\|error'

# stop it, and keep it stopped across reboots
sudo systemctl stop openvpn-client@home
sudo systemctl disable openvpn-client@home
systemctl is-active openvpn-client@home

몇 분 기다린 뒤 실패 카운터가 움직이지 않는지 확인하라. 그 멈춤이 올바른 출처를 찾았다는 증거다. 실패가 계속되면 루프는 다른 곳에서 오는 것이고 잠금 해제 단계는 헛수고가 된다.

그때서야 운영자가 문서화한 잠금 해제나 복구 절차를 사용하고, 유지하려는 기기에서 정확히 한 번의 통제된 로그인으로 그것을 따라라. 정확한 임계값, 냉각 기간, 복구 문구는 서비스마다 다르므로 숫자를 추측하지 말고 읽어라.

원인을 제거해 다시 돌아오지 않게 하라

저장된 자격 증명은 운영체제 키링, 클라이언트 프로필, 또는 서비스 계정 구성 등 그것이 속한 곳에서 갱신하라. 한 곳에서 지우면서 다른 곳에 사본이 남아 있으면, 보통 오프라인이던 노트북이 돌아와 캐시된 값을 다시 재생할 때 루프가 일주일 뒤에 돌아온다.

자동화에는 고유한 ID를 주어라. 자체 자격 증명과 자체 한도를 가진 별도로 프로비저닝된 계정은 머신 장애가 사람을 이메일에서 잠그지 못하게 하고, 로그에서 장애를 귀속 가능하게 만든다. 클라이언트에 백오프를 추가하라 그래야 거부된 자격 증명이 재시도를 반복하는 대신 멈추고, 반복되는 인증 실패에 알람을 걸어 다음 루프가 02:40이 아니라 몇 분 안에 발견되게 하라.

보고서가 지원 팀으로 갈 때는 계정 식별자, 타임스탬프, 클라이언트 이름을 남겨라. 비밀번호와 복구 자료는 그 기록에 절대 들어가면 안 된다.

관련 글