노트북마다 별도의 인증서를 발급하니 VPN이 그것들을 구별할 수 있다고 가정한다. 구별하지 못한다. 클라이언트 인증서는 접속하는 사람이 일치하는 개인 키를 가지고 있음을 증명하며, 복사된 프로필도 그 키를 가지고 있다.

기기별 인증서는 여전히 좋은 생각이다. 다만 대부분이 기대하는 것과 다른 일을 할 뿐이다.

클라이언트 인증서가 실제로 증명하는 것

핸드셰이크 동안 클라이언트는 자신의 인증서와 일치하는 개인 키로 서명하고, 서버는 그 서명을 신뢰하는 CA에 대해 검증한다. 그 교환에는 기계를 설명하는 내용이 없다. 인증서와 키를 모두 가진 기기는 어떤 것이든 동일한 서명을 만들어 내므로, 두 번째 노트북으로 복사된 프로필은 원본과 똑같아 보인다. 인증서는 신원을 지명할 뿐 하드웨어를 지명하지 않는다.

기기별 고유성은 폐기를 정밀하게 만들기 때문에 여전히 값어치가 있다. 그것은 관리적 속성이지 기술적 잠금이 아니다.

키 보관의 세 단계

첫 번째 단계는 디스크의 키 파일이다. 설계상 휴대 가능하며, 대부분의 OpenVPN 프로필이 거기에 있다.

두 번째 단계는 운영 체제가 내보낼 수 없다고 표시한 키다. Windows는 인증서 저장소에 기기 키를 생성하고 일반 내보내기를 거부할 수 있어 우발적 복사를 막는다. 하드웨어 기반은 아니며, 기계에 충분히 접근하면 그런 키를 복구할 수 있으므로 벽을 세우기보다 수고를 늘릴 뿐이다.

세 번째 단계는 TPM, 스마트 카드, SIM 또는 PIV 토큰처럼 보안 하드웨어 내부에서 생성되는 키다. 그 모듈에는 자기가 만든 키를 내보내는 회로가 없고, 서명은 모듈 내부에서 이루어진다. 키는 누구든 복사할 수 있는 파일이 되지 않는다.

Where the key livesCopyableWhat it buys you
Key file inside the profileTriviallyRevocation granularity, nothing more
OS non-exportable key storeHard, not impossibleStops casual profile sharing
TPM or PIV tokenNoBinding the server can rely on

그 표가 세 줄로 된 논증의 전부다.

easy-rsa가 할 수 있는 것과 없는 것

기기별 인증서 발급은 간단하다. 같은 CA에 대해 기기마다 별도의 일반 이름을 만들고, 예를 들어 ./easyrsa build-client-full laptop-a nopass 를 실행한 뒤 기기마다 반복한다. 어떤 일반 이름이 어떤 사람과 기계에 속하는지 기록한다.

폐기도 마찬가지로 직접적이어서 ./easyrsa revoke laptop-a 를 실행하고, ./easyrsa gen-crl 로 CRL을 다시 생성하며, 서버가 crl-verify 를 통해 실제로 그것을 읽는지 확인한다.

CA가 할 수 없는 것은 이후에 개인 키가 어디에 있는지 검증하는 일이다. CA 호스트에서 키를 생성해 기기로 복사했다면 발급 시점에 두 번째 사본을 만든 것이다. 내보낼 수 없는 키는 기기에서 생성해야 하며, 그렇지 않으면 키를 넘겨주지 않는 하드웨어로 가져와야 한다.

복사된 프로필에서 살아남는 통제

프로필이 복사될 수 있다고 가정하고 설계한다. 계정을 두 번째 요소에 묶어 인증서만으로는 충분하지 않게 한다. 기기마다 자체 정책을 주어 한 신원의 범위가 제한되게 한다. 그리고 공유 프로필이 연결 로그에서 그렇게 보이므로, 같은 일반 이름이 두 주소에서 동시에 접속하는지 지켜본다.

빠르고 문서화된 폐기가 복사가 일어난 뒤에도 작동하는 통제다. 나머지는 모두 예방이다.

서버가 실제로 의지할 수 있는 주장

고유성은 CA에서 온다. 기기 바인딩은 키 보관에서 온다. 키를 내보낼 수 없는 하드웨어만이 기기별 인증서 하나를 모두가 따르기로 합의한 정책이 아니라 서버가 강제하는 주장으로 바꾼다.

관련 글