휴대폰 세 대, 라우터 한 대, 모니터링 검사 하나가 아직 옛 비밀번호를 들고 있고, 그중 하나는 구십 초마다 다시 연결한다. 계정 비밀번호는 십 분 전에 바뀌었으므로 그 클라이언트들 각각은 이제 서버가 거부하는 값을 제출하고 있다. 바로 그 지점에서 신화가 깨진다. 비밀번호 변경은 계정을 건드릴 뿐, 각 기기에 남아 있는 옛 값의 사본을 건드리지 않는다. 이어지는 것은 그 변경이 하지 않은 일이다.

신화: 한 번의 변경, 모든 곳에서 동시에

비밀번호를 바꾸면 모든 세션이 로그아웃되고 깨끗한 재로그인이 강제된다는 것이 통념이다. 그렇지 않다. 서버는 마지막으로 수락한 자격 증명만 추적하고, 클라이언트는 자기가 저장한 것을 그대로 들고 있기 때문이다. 저장된 비밀번호가 있는 기기는 자기 일정대로 다시 시도하고, 누군가 계정이 잠긴 것을 알아차릴 때까지 조용히 실패한다. 사본이 계정 밖에서 산다는 사실을 받아들이면, 교체는 더 이상 단일 작업처럼 보이지 않는다.

이 가운데 어느 것도 교체에 반대하지 않는다. 오히려 저장된 사본을 나중에 덧붙이는 생각이 아니라 변경의 일부로 다루자는 주장이다. 잠금은 대개 병렬 재시도에서 온다. 각 기기가 자기 일정대로 옛 값을 계속 제출하다가 카운터가 작동한다. 그러면 계정은 공격받는 것처럼 보이지만, 실제로는 아무도 교체하지 않은 자격 증명을 받고 있을 뿐이다. 이 구분이 중요한 이유는 해결책이 더 엄격한 잠금 정책이 아니라 기기 목록이기 때문이다.

교체 전에 사본을 목록화하라

비밀번호 양식을 열기 전에 목록을 쓰라. 이 계정으로 인증하는 모든 클라이언트, 스크립트, 자동화, 관리형 프로필을 나열하라. 스스로 연결하는 휴대폰, 이 년 전에 구성한 라우터, 월요일에만 깨어나는 노트북, 그리고 매 분 시도하는 모니터링 검사다. 각 항목마다 자격 증명이 어디에 저장되는지, 변경 중에 기기에 접근할 수 있는지, 다시 연결할 수 없을 때 어떤 복구 경로가 있는지 적으라. 그 목록이 위험한 변경을 계획된 변경으로 바꾸며, 옛 비밀번호가 작동을 멈추기 전에 존재해야 한다.

오프라인 기기는 전형적인 누락이다. 서랍 속 노트북이 삼 주 뒤에 돌아와 최악의 순간에 낡은 값을 제시한다. 그 위치와 일정도 적으라. 기다리는 것이 아니라 뒤쫓아야 하기 때문이다.

리눅스 함대에서는 탐색이 영리하기보다 기계적이다. 자격 증명 파일을 참조하는 프로필을 찾고, 그다음 자격 증명 파일 자체를 찾으라. 다시 써야 하는 것은 두 번째 목록이기 때문이다. 데스크톱 클라이언트와 휴대폰에서도 같은 작업을 반복하라. 거기서는 저장소가 경로가 아니라 프로필이나 키체인 항목이다. 목표는 작업할 수 있는 목록이지, 모든 사본을 찾았다고 주장하는 스캔이 아니다.

grep -rl auth-user-pass /etc/openvpn /etc/NetworkManager
grep -rl auth-user-pass ~/.config 2>/dev/null

사본을 그것을 소유한 사람과 견주어 보라. 아무도 주장하지 않는 기기는 아무도 갱신하지 않는 기기이며, 재시도를 계속할 가능성이 가장 높은 기기이기도 하다.

실제로 무엇을 교체하고 있는가

계정 비밀번호는 VPN 배포에서 하나의 자격 증명일 뿐이다. 키 암호 문구, 인증서 신원, 선택적 피어 비밀은 각자 고유한 교체 경로와 소유자를 가진다. 계정 비밀번호를 바꿔도 인증서로 인증하는 기기에는 아무 효과가 없고, 인증서를 다시 발급해도 저장된 비밀번호를 가진 클라이언트에는 아무 효과가 없다. 해결책을 부르기 전에 비밀을 먼저 부르라.

교체가 정책이 아니라 의심 때문에 이루어진다면, 사고 절차가 편의 계획보다 우선한다. 증거가 요구하는 것을 폐기하고 기기 목록의 추가 작업을 받아들이라. 그 결정은 사고 책임자의 것이지, 우연히 비밀번호 재설정 양식을 들고 있는 사람의 것이 아니다.

저장된 값이 사는 곳에서 교체하라

서비스가 문서화한 방식으로 자격 증명을 바꾼 뒤, 저장된 사본을 갱신하거나 유지하려는 모든 기기에서 로그인 흐름을 실행하라. 그것을 다시 쓰는 관리자 뒤의 생성된 구성을 편집하지 마라. 관리자는 다음 실행에서 더 오래된 값을 복원하고, 편집은 지연된 고장이 된다. 관리자가 읽는 원본을 갱신하거나 클라이언트 자체의 자격 증명 저장소를 쓰라. 어느 쪽이든 기기는 클라이언트가 실제로 읽는 곳에 새 값을 가지고 끝나야 한다.

비밀번호 파일을 저장하는 클라이언트는 파일을 다시 써야 하고, 묻는 클라이언트는 완료된 로그인이 필요하다. NetworkManager는 연결 프로필 안에 비밀을 두므로, 변경은 텍스트 편집기가 아니라 nmcli를 거친다:

nmcli connection modify work vpn.secrets "password=NEW"
nmcli connection up work

자격 증명 파일을 읽는 프로필은 세 번째 경우다. 그 파일의 내용을 교체하고, 권한은 닫아 두고, 그것을 가리키는 프로필을 편집하는 대신 클라이언트를 다시 불러오라. 프로필은 바뀌지 않았다. 그것이 읽는 비밀만 바뀌었다.

의도한 각 기기를 한 번씩 일부러 다시 연결하고 어느 것이 실패하는지 보라. 기기가 계속 실패하면 비밀번호를 다시 바꾸기 전에 그 기기가 가리키는 계정과 읽는 저장소를 보라. 두 번째 변경은 갱신해야 할 사본을 배로 늘린다. 두 번 실패하는 기기는 보통 잘못된 계정을 가리키거나 아직 찾지 못한 저장소를 읽는다. 그것을 고친 뒤 다시 연결하라.

세션과 토큰은 비밀번호보다 오래 산다

비밀번호를 바꿔도 기존 세션이나 별도 인증서가 폐기되었다는 증거는 되지 않는다. 일부 서비스는 세션이 만료되거나 명시적으로 종료될 때까지 살려 두고, 발급된 토큰은 자체 수명을 가진다. 변경이 전역적이었다고 가정하지 말고 서비스가 실제로 무엇을 하는지 확인하라. 의심 때문에 이루어진 변경이라면 세션을 명시적으로 종료하고 결과를 확인하라.

NIST SP 800-63B의 자격 증명 수명 주기 지침은 인증기와 세션을 별도 범주에 둔다. 그래서 비밀번호 변경과 전역 로그아웃은 서로 다른 작업이다. 두 가지 완료 기준을 가진 두 작업으로 다루라. 첫 번째는 새 값이 작동할 때 끝나고, 두 번째는 옛 세션이 사라질 때 끝난다.

새 비밀번호를 기록에 쓰지 않고 완료를 기록하라. 자격 증명을 담은 교체 로그는 공유 드라이브에서 기다리는 새로운 사고다. 날짜, 갱신한 기기, 아직 남은 기기를 적으라.

관련 글