Truy vết gói điều khiển OpenVPN: tls-auth trước TLS
HMAC của tls-auth nằm trên phong bì điều khiển, không phải bên trong bắt tay TLS. Khớp khóa, hướng và digest, rồi xác minh mà không gỡ bỏ bảo vệ.
Lỗi tls-auth thường được báo cáo như một vấn đề bắt tay, trong khi nó chưa bao giờ như vậy. HMAC được kiểm tra trên gói điều khiển trước khi bất kỳ xử lý TLS nào diễn ra, nên khóa hoặc hướng không khớp tạo ra lỗi trông giống vấn đề chứng chỉ và được quyết định sớm hơn hai lớp. Coi phong bì là một đối tượng riêng giúp chẩn đoán ngắn gọn: đọc các trường, xác nhận việc kiểm tra diễn ra sớm, rồi so sánh ba thứ mà hai đầu phải thống nhất.
Đọc phong bì theo thứ tự nó được dựng
Gói điều khiển mang một định danh phiên, HMAC tls-auth tùy chọn, thông tin lặp lại và xác nhận, và một định danh thông điệp đáng tin cậy, sau đó là tải trọng của loại thông điệp. Khi thông điệp là thông điệp bắt tay, tải trọng tình cờ là bản mã TLS. Đó là toàn bộ mối quan hệ: vật liệu TLS đi bên trong một thông điệp mà phong bì đã bảo vệ. Xem tài liệu tham chiếu giao thức mạng của OpenVPN liệt kê các trường của kênh điều khiển theo thứ tự đó.
Lớp tin cậy dễ bị nhầm là mật mã. Các xác nhận, truyền lại và định danh thông điệp tồn tại để thông điệp điều khiển đến một lần và đúng thứ tự trên một đường truyền không đáng tin cậy. Chúng không phải xác thực, và một định danh thông điệp đúng không chứng minh gì về việc ai đã gửi gói.
Hãy giữ cách nhóm này ở mức khái niệm. Đây không phải sơ đồ thứ tự byte và không đủ để tính một thẻ, vì các trường đi vào HMAC phụ thuộc vào cách triển khai, phiên bản và chế độ.
Chứng minh việc kiểm tra diễn ra trước bắt tay
Bên nhận có khóa chia sẻ có thể xác minh HMAC và loại bỏ ngay một gói giả mạo, mà không cấp phát trạng thái bắt tay hay thực hiện công việc khóa công khai. Việc bảo vệ bao gồm cả các gói bắt tay đầu tiên, và chính vì thế một khóa sai xuất hiện như kết nối thất bại chứ không phải lỗi xác thực muộn.
Tăng mức chi tiết của daemon và theo dõi kênh điều khiển thay vì thiết bị tun:
openvpn --config /etc/openvpn/server.conf --verb 6
Điều bạn đang tìm là lỗi xác minh HMAC của kênh điều khiển được báo ở mức gói, trước bất kỳ cảnh báo TLS nào. Một cảnh báo TLS trong nhật ký nghĩa là phong bì đã được chấp nhận và lỗi đã dịch vào bên trong, đó là một cuộc điều tra khác với cách khắc phục khác.
Việc xử lý hướng cũng ở đây. Khi một tệp khóa tĩnh được dùng với tls-auth, hai đầu nhận các hướng khóa ngược nhau, và giao thức dùng cách chia đó để một gói bị bắt không thể bị phản xạ trở lại người gửi. Đảo hướng giữ nguyên khóa và vẫn làm mọi gói thất bại. Đổi một đầu mỗi lần, rồi khởi động lại cả hai daemon để cặp được nạp cùng nhau.
Khớp khóa, hướng và digest ở cả hai đầu
Ba giá trị phải khớp và chỉ một trong số đó là tệp. Nội dung khóa tĩnh phải giống nhau ở hai đầu, hướng phải ngược nhau, và digest dùng cho HMAC phải khớp. Kiểm tra cấu hình trước khi chạm vào vật liệu khóa, vì một hướng bị đảo giải thích nhiều lỗi hơn một tệp bị hỏng:
grep -E 'tls-auth|tls-crypt|key-direction|auth ' /etc/openvpn/server.conf
Tạo bí mật chia sẻ bằng công cụ chứ không bằng trình soạn thảo, và giữ quyền truy cập chặt chẽ:
openvpn --genkey secret /etc/openvpn/ta.key
chmod 600 /etc/openvpn/ta.key
Các bản phát hành cũ chấp nhận thứ tự tùy chọn hơi khác cho việc tạo khóa, và các hồ sơ viết cho những bản đó vẫn còn lưu hành. Tệp được tạo là cùng loại đối tượng trong cả hai trường hợp, nên việc kiểm tra là hai đầu có giữ byte giống nhau hay không, chứ không phải cách viết nào đã tạo ra chúng.
Đừng nhầm tls-auth với tls-crypt. Cả hai đều bảo vệ kênh điều khiển, nhưng tls-crypt còn mã hóa nó và giấu bắt tay khỏi người quan sát, và nó thay cách chia hướng bằng cách xử lý khóa riêng. Một hồ sơ dùng cái này sẽ không tương tác với một đối tác được cấu hình cho cái kia, và không mức tinh chỉnh digest nào lấp được khoảng cách đó.
Chỉ tái tạo thẻ từ định dạng thật
Tái tạo chính xác đến từng byte là một việc tách biệt với vận hành VPN, và nó chỉ hoạt động với đầu vào thật: cách triển khai và phiên bản đã dựng gói, digest đã chọn, hướng, và các byte thực tế bao gồm định danh phiên và mảng xác nhận. Một bản trình bày bằng văn bản của danh sách trường không phải là những byte đó.
Độ dài thẻ suy ra từ digest, nên giả định độ dài cố định vỡ ngay khi ai đó thay đổi nó. Băm gói theo cách triển khai làm, không theo cách một bảng trong bài blog trình bày, và so sánh với bản ghi lấy từ cùng đối tác thay vì với kỳ vọng bạn tự suy ra bằng tay.
Giữ bài tập đó xa các hồ sơ sản xuất. Không có gì trong việc tái tạo thẻ cho bạn biết liệu một triển khai có nên bật bảo vệ hay không.
Hoàn tác một sự không khớp mà không gỡ bỏ bảo vệ
Phép thử hấp dẫn là xóa tls-auth, thấy kết nối thành công và kết luận khóa đã sai. Câu trả lời đó khiến bạn mất bảo vệ và không dạy gì về việc giá trị nào trong ba giá trị đã không khớp. Thay vào đó, lấy cấu hình khớp đã được phê duyệt từ phía máy chủ và so sánh với nó.
Chuẩn bị thay đổi sao cho có thể hoàn tác. Giữ cấu hình và tệp khóa trước đó của máy chủ, áp dụng cặp đã sửa, xác minh rằng một máy khách hoàn tất bắt tay, và chỉ sau đó mới xóa bản sao lưu. Nếu máy khách thất bại sau thay đổi, hãy khôi phục các tệp trước đó thay vì tự chế một biến thể thứ ba trong lúc sự cố. Việc khôi phục nên là một lệnh bạn đã biết trước khi bắt đầu.
Cuối cùng, hãy nhớ một lần kiểm tra đã qua nghĩa là gì. Nó chứng minh đối tác giữ khóa chia sẻ, không phải chứng chỉ hay tài khoản của họ được ủy quyền, và nó không nói gì về mật mã kênh dữ liệu đã thương lượng. Việc ủy quyền và bảo vệ dữ liệu được thiết lập sau đó, nên một lần kiểm tra phong bì sạch là điểm khởi đầu chứ không phải phán quyết.