Hai câu hỏi quyết định khóa riêng VPN thuộc về đâu: vật liệu khóa có thể bị sao chép khỏi máy chủ hay không, và một tiến trình có thể dùng nó mà không cần ai bên bàn phím hay không. Nhãn tiếp thị của một kho không trả lời cả hai. Daemon đường hầm phải trở lại sau khi khởi động lại cần dùng không giám sát, điều này loại bỏ mọi thứ phụ thuộc PIN do người nhập.

Chọn giữa sao chép và sử dụng

Sao chép và sử dụng thất bại khác nhau, nên hãy coi chúng là hai yêu cầu chứ không phải một. Kẻ tấn công đọc được byte khóa sẽ mang danh tính sang máy khác, và máy gốc không hề hay biết. Kẻ tấn công không đọc được byte nhưng chạm được quy trình ký vẫn xác thực chừng nào quyền truy cập đó còn.

Khóa trong tệp có thể bị sao chép tầm thường, vì thế nó cũng dễ sao lưu và khôi phục nhất. Kho khóa phần mềm thay đổi API chứ không thay đổi ranh giới: nhà cung cấp từ chối chính lệnh xuất của mình, nhưng cùng ngữ cảnh quản trị đã cài khóa thường có đường khác tới vật liệu. Không thể xuất ở nhà cung cấp phần mềm là tuyên bố về các thao tác được hỗ trợ, không phải bằng chứng của bức tường phần cứng. Hãy coi đó là gờ giảm tốc chống sao chép tình cờ, không phải sự bảo vệ trước người đã giữ phiên của bạn.

TPM hoặc thẻ thông minh thực hiện thao tác ký bên trong phần cứng và chỉ trả về kết quả. Điều đó đóng đường sao chép và để đường sử dụng mở cho bất cứ thứ gì có thể yêu cầu chữ ký.

Khớp kho với daemon đường hầm

Daemon hạn chế điều này nhiều hơn chính sách bảo mật. WireGuard lấy khóa riêng base64 từ tệp hoặc từ đầu vào wg set và không có đường vào kho chứng chỉ, nên khóa giao diện dựa trên TPM không được xét. OpenVPN biên dịch với OpenSSL 3 có thể nạp khóa qua URI của nhà cung cấp, và strongSwan cung cấp plugin TPM bên cạnh hỗ trợ PKCS#11, nhưng cả hai phụ thuộc vào cách gói của bạn được biên dịch.

Daemon không chạm được kho đã chọn biến ranh giới phần cứng thành vật trang trí. Ai đó xuất khóa một lần, để nó trong tệp, và phần còn lại của thiết kế lặng lẽ chạy trên bản sao ấy.

Gia hạn là nửa còn lại của việc khớp, và đây là nơi phần lớn thiết kế sụp đổ. Một kho hoạt động ở lần đăng ký đầu nhưng đòi đăng nhập console mỗi lần cấp lại sẽ bị lách ngay lần đầu chứng chỉ hết hạn vào giờ bất tiện. Hãy thử đường cấp lại khi khóa hiện tại còn nhiều tháng.

Kiểm kê khóa trước khi di chuyển

Ghi lại khóa là gì trước khi đổi nơi nó sống, vì một cuộc di trú làm mất subject alternative names sẽ phá đường hầm theo cách đọc như lỗi định tuyến. Xuất chứng chỉ, xác nhận khóa riêng đọc được ở nơi daemon mong đợi và kiểm tra cặp thực sự khớp.

openssl x509 -in vpn.crt -noout -subject -ext subjectAltName
openssl pkey -in vpn.key -check -noout
openssl x509 -in vpn.crt -noout -pubkey | openssl sha256
openssl pkey -in vpn.key -pubout | openssl sha256

Hai bản tóm tắt cuối phải giống hệt nhau. Nếu không, daemon hoàn tất cấu hình rồi thất bại mọi lần thử với lỗi chứng chỉ hoặc chữ ký không chỉ tới đâu gần nguyên nhân thật. Bản tương đương WireGuard ngắn hơn, vì khóa công khai suy ra trực tiếp từ khóa riêng: wg pubkey < /etc/wireguard/wg0.key phải in ra khóa đồng đẳng mà máy chủ của bạn đã lưu.

Quyền nằm trong cùng bản kiểm kê. stat -c '%a %U:%G' /etc/wireguard/wg0.key phải trả về 600 root:root, và bất cứ thứ gì nhóm hoặc thế giới đọc được nghĩa là khóa đã từng sẵn cho những tiến trình bạn không hề dự tính.

Kiểm tra kho và đường sử dụng

Kiểm tra có ba phần, và phần thứ ba là phần bị bỏ qua. Xác nhận khóa có trong kho đã chọn, xác nhận daemon nạp đúng khóa đó chứ không phải bản sao còn sót, rồi xác nhận nó vẫn khởi động khi artefact xuất đã biến mất.

certutil -store -user My
certutil -csp "Microsoft Platform Crypto Provider" -key -user
certutil -verifykeys -user My
ipsec listcerts

Trên Windows lệnh đầu liệt kê kho cá nhân và in nhà cung cấp khóa cạnh mỗi mục, và đó là nơi một chứng chỉ trông như được phần cứng hậu thuẫn nhưng lại ngồi trong nhà cung cấp phần mềm xuất hiện. Lệnh thứ hai liệt kê khóa do nhà cung cấp mật mã nền tảng giữ, nên một danh tính VPN vắng ở đó trong khi chứng chỉ vẫn có nghĩa là nửa riêng tư sống ở nơi khác. Trên cổng Linux, ipsec listcerts báo cáo strongSwan đã nạp gì, kể cả khóa đến từ plugin TPM. Hãy so dấu vân tay hoặc băm khóa công khai với bản kiểm kê thay vì tin số mục.

Phép thử âm tính là thứ chứng minh thiết kế. Di chuyển khóa đã xuất ra khỏi thư mục cấu hình của daemon, khởi động lại dịch vụ và đọc nhật ký xem nó trình danh tính nào. Một đường hầm vẫn lên nghĩa là đang dùng kho; khởi động thất bại nghĩa là thiết kế thật sự chạy trên bản sao.

Ghi lại gia hạn và khôi phục

Việc khôi phục khác biệt mạnh giữa hai họ, và khác biệt đó thuộc ghi chú thiết kế chứ không phải cuộc gọi sự cố. Khóa trong tệp có thể sao lưu mã hóa và phục hồi, nên một cuộc di trú thất bại là đảo ngược được. Khóa không thể xuất thì không sao lưu được chút nào, khiến cấp lại và đăng ký lại thành con đường phục hồi duy nhất khi thiết bị chết.

Kiểm tra hạn trước khi nó thành gián đoạn: openssl x509 -in vpn.crt -noout -checkend 2592000 kết thúc với mã khác không khi chứng chỉ hết hạn trong ba mươi ngày, nên nó vào thẳng một kiểm tra giám sát. Chạy hằng tuần dòng đó bắt được lần gia hạn mà không ai lên lịch.

Việc xóa diễn ra trên máy chủ: xóa đồng đẳng hoặc thu hồi số sê-ri, rồi xác nhận đường hầm thất bại, vì máy khách giữ phiên trong bộ nhớ đệm có thể che một lần thu hồi dở dang một thời gian. Thu hồi cũng phải tới đường CRL hoặc OCSP của bộ tập trung, không chỉ cơ sở dữ liệu CA. Chứng chỉ là tài liệu công khai, và hồ sơ RFC 5280 bao quát cách nó được xác thực; không phần nào của việc xác thực đó bảo vệ một khóa riêng bị sao chép trước khi luân chuyển.

Viết quyết định vào một chỗ: kho nào giữ khóa, tiến trình nào được dùng, ai có thể cấp lại và khôi phục là gì. Đoạn đó là thứ kiểm toán viên hỏi, và là thứ sống sót qua thay đổi nhân sự.

Bài viết liên quan