기기마다 인증서를 하나씩 발급해도 키가 기기에 묶이는 것은 아니다
기기별 인증서는 관리자의 선택이며 기기에 대한 바인딩이 아니다. 바인딩을 결정하는 것은 개인 키가 어디에 있는가이며, 복사 가능한 파일에서 TPM까지 다양하다.
노트북마다 별도의 인증서를 발급하니 VPN이 그것들을 구별할 수 있다고 가정한다. 구별하지 못한다. 클라이언트 인증서는 접속하는 사람이 일치하는 개인 키를 가지고 있음을 증명하며, 복사된 프로필도 그 키를 가지고 있다.
기기별 인증서는 여전히 좋은 생각이다. 다만 대부분이 기대하는 것과 다른 일을 할 뿐이다.
클라이언트 인증서가 실제로 증명하는 것
핸드셰이크 동안 클라이언트는 자신의 인증서와 일치하는 개인 키로 서명하고, 서버는 그 서명을 신뢰하는 CA에 대해 검증한다. 그 교환에는 기계를 설명하는 내용이 없다. 인증서와 키를 모두 가진 기기는 어떤 것이든 동일한 서명을 만들어 내므로, 두 번째 노트북으로 복사된 프로필은 원본과 똑같아 보인다. 인증서는 신원을 지명할 뿐 하드웨어를 지명하지 않는다.
기기별 고유성은 폐기를 정밀하게 만들기 때문에 여전히 값어치가 있다. 그것은 관리적 속성이지 기술적 잠금이 아니다.
키 보관의 세 단계
첫 번째 단계는 디스크의 키 파일이다. 설계상 휴대 가능하며, 대부분의 OpenVPN 프로필이 거기에 있다.
두 번째 단계는 운영 체제가 내보낼 수 없다고 표시한 키다. Windows는 인증서 저장소에 기기 키를 생성하고 일반 내보내기를 거부할 수 있어 우발적 복사를 막는다. 하드웨어 기반은 아니며, 기계에 충분히 접근하면 그런 키를 복구할 수 있으므로 벽을 세우기보다 수고를 늘릴 뿐이다.
세 번째 단계는 TPM, 스마트 카드, SIM 또는 PIV 토큰처럼 보안 하드웨어 내부에서 생성되는 키다. 그 모듈에는 자기가 만든 키를 내보내는 회로가 없고, 서명은 모듈 내부에서 이루어진다. 키는 누구든 복사할 수 있는 파일이 되지 않는다.
| Where the key lives | Copyable | What it buys you |
|---|---|---|
| Key file inside the profile | Trivially | Revocation granularity, nothing more |
| OS non-exportable key store | Hard, not impossible | Stops casual profile sharing |
| TPM or PIV token | No | Binding 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에서 온다. 기기 바인딩은 키 보관에서 온다. 키를 내보낼 수 없는 하드웨어만이 기기별 인증서 하나를 모두가 따르기로 합의한 정책이 아니라 서버가 강제하는 주장으로 바꾼다.