IPsec, OpenVPN, WireGuard에서 사전 공유 키가 하는 일
공유 비밀은 피어를 인증하거나 보호 계층을 더할 수 있으며, 그 역할은 프로토콜에 따라 달라집니다. 사용자 비밀번호와 혼동하지 마십시오.
사전 공유 키라는 말은 IPsec, OpenVPN, WireGuard 문서에 등장하지만 가리키는 대상은 세 가지로 서로 다릅니다. 하나는 인증용 비밀, 하나는 제어 채널을 보호하는 값, 또 하나는 이미 신원을 가진 핸드셰이크에 재료를 더하는 값입니다. 이들을 서로 바꿔 쓸 수 있다고 보면 아무도 예상하지 못한 단계에서 실패하는 연결이 됩니다. 값을 복사하기 전에 해당 프로토콜에서 이 필드가 무엇을 하는지 읽어 보십시오.
세 가지 프로토콜, 세 가지 의미
각 프로토콜은 자기 규격에서 키의 역할을 정의하며, 그 역할들은 겹치지 않습니다.인증용 비밀은 두 피어가 같은 값을 안다는 것을 증명합니다. 제어 채널 키는 뒤따르는 협상을 보호합니다. 핸드셰이크 부가 요소는 피어가 누구인지는 바꾸지 않고 키 스케줄만 바꿉니다.
이 역할 중 어느 것도 사람 사용자를 인증하지 않으며, 가장 많은 시간을 잡아먹는 혼동이 바로 여기서 생깁니다. 사전 공유 키는 교환 전에 장치나 게이트웨이에 배포되므로, 보유자는 누구든 상대편에게 똑같이 보입니다. 이 성질은 두 라우터 사이의 사이트 간 연결에서는 장점이고, 이름이 있는 직원을 두는 원격 접속 서비스에서는 부담입니다. 배포를 설명하는 문서에서 계정 자격 증명과 암호학적 비밀을 서로 다른 열에 두십시오.
IPsec과 OpenVPN은 이 말을 다르게 쓴다
IKEv2는 인증서 대신 사전 공유 비밀로 피어를 인증할 수 있으며, 그 값은 양쪽에서 일치해야 합니다. 같은 비밀이 보통 여러 피어에 한꺼번에 설정되므로 보유자는 누구든 다른 피어를 사칭할 수 있고, 이 교환은 애초에 없던 신원 키로부터 전방 비밀성을 얻지 못합니다.
OpenVPN의 tls-auth와 tls-crypt 옵션은 제어 채널에 정적 키를 붙여 HMAC 서명을 더하거나 협상 자체를 암호화합니다. 이 키는 사용자 비밀번호가 아니며 클라이언트 인증서를 대신하지도 않습니다. 둘을 구분하는 일은 비밀번호를 바꿔도 제어 채널 키가 그대로 남기 때문에 갱신 시점에 중요합니다.
WireGuard의 PSK는 더할 뿐, 식별하지 않는다
WireGuard 피어는 이미 Curve25519 공개 키와 개인 키를 가지고 있고, 핸드셰이크는 그 신원을 인증합니다. 선택적인 사전 공유 키는 연결 키에 섞여 들어가 공개 키 교환 위에 대칭 재료를 더합니다.
그 자체로는 신원도 사용자 계정도 제공하지 않으므로, 운영자는 PSK로 두 보유자를 구분할 수 없습니다. 양쪽이 같은 값을 가져야 하며, 그렇지 않으면 핸드셰이크가 도움이 되는 오류 없이 실패합니다. 그래서 교체는 파일 하나를 고치는 일이 아니라 양쪽을 동시에 계획해야 하는 작업입니다.
배포와 교체, 제거를 점검한다
배포는 하나의 비밀을 여러 곳에서 쓰는 모든 설계의 약점입니다. 채팅 창에 붙여 넣거나 저장소에 보관하거나 환경 간에 재사용한 값은 아무도 셀 수 없는 사본을 만들어 내고, 그 사본마다 조용히 피해 범위를 넓힙니다.
Base64 텍스트는 암호화가 아닙니다. 같은 디렉터리에서 공개 인증서 옆에 둔 비밀은 여전히 평문 비밀입니다.
openssl rand -base64 32
sudo wg show wg0 preshared-keys
sudo grep -R -n 'psk' /etc/ipsec.d/ 2>/dev/null
일정에 따라, 그리고 노출이 의심된 뒤에는 교체하되, 옛 값을 폐기하기 전에 예정된 모든 피어를 갱신하십시오. 그다음, 키가 맞지 않으면 핸드셰이크에서 실패해 방화벽 문제와 똑같이 보이므로 양쪽 끝에서 연결을 시험하십시오.
어떤 비밀이 어느 단계를 보호하는지 기록해 두면 비밀번호 재설정이 암호 키 갱신으로 오해될 일이 없습니다. 이 한 줄이 누군가 배포를 감사할 때마다 한 시간을 아껴 줍니다.