Tạm dừng một máy khách OpenVPN: vì sao thu hồi là đòn bẩy sai
Giết phiên là việc có thể đảo ngược; thu hồi chứng chỉ thì không. Hãy quyết định trường hợp cần đòn bẩy nào, và chỉ dựng lại CRL khi thật phù hợp.
Tạm dừng quyền truy cập của một máy khách và loại bỏ nó vĩnh viễn trông giống cùng một việc cho đến khi bạn thử hoàn tác một trong hai. Thu hồi chứng chỉ ghi một bản ghi mà máy chủ coi là cuối cùng, và đảo ngược nó nghĩa là sửa cơ sở dữ liệu của nhà phát hành bằng tay. Bỏ rơi đường hầm đang chạy là một lệnh quản trị không thay đổi gì trong niềm tin. Chọn đòn bẩy bằng cách hỏi liệu khóa còn đáng tin hay không, chứ không phải hỏi yêu cầu có vẻ khẩn cấp đến đâu.
Niềm tin: đã thu hồi và đã tạm dừng là một
Một nhà thầu bị tạm dừng một tuần và phản xạ là thu hồi, vì thu hồi nghe như tắt một thứ gì đó. Nó trông gọn gàng, mất mười giây, và để lại việc sửa cơ sở dữ liệu là con đường duy nhất để quay lại. Phản xạ đó dễ hiểu và nó gần với đốt hộ chiếu hơn là đóng cửa. Một thiết bị bị tạm dừng và một khóa bị lộ cần cách xử lý khác nhau, và chỉ một trong hai là rẻ để đảo ngược.
Sự khác biệt nằm ở thông tin xác thực chứ không phải ở con người. Một khóa còn trong tay đúng người có thể bị tạm dừng và tiếp tục mà không mất niềm tin. Một khóa có thể đã bị sao chép thì không bao giờ nên được khôi phục, vì khôi phục khẳng định rằng bản sao không tồn tại.
Hãy viết câu trả lời trước khi chạm vào một trong hai hệ thống. Nếu bạn không thể nói khóa đã bị lộ hay chưa, câu trả lời thận trọng là thay thế.
Bỏ phiên đang chạy bằng giao diện quản trị
OpenVPN cung cấp một giao diện quản trị có thể liệt kê các phiên và giết một trong số đó theo tên chung. Bật nó trên localhost, giữ nó xa giao diện công cộng, và gửi lệnh giết khi một phiên phải biến mất ngay. Lệnh chỉ đóng đường hầm đó, và mọi máy khách khác vẫn tiếp tục hoạt động.
Đây là phản ứng với một vấn đề đang hoạt động, không phải chính sách tạm dừng. Cùng một hồ sơ có thể kết nối lại trong một phút, vì không có gì trong thông tin xác thực của nó thay đổi. Dùng nó khi phiên phải rời đi và quyết định lâu dài vẫn đang được đưa ra.
Xác nhận rằng phiên đã được kết nối trước khi giết nó, để không săn lùng một máy khách chưa từng kết nối. Lệnh trạng thái bên dưới in ra những gì đang kết nối ngay lúc này.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Nếu lệnh giết báo rằng không có máy khách như vậy, tên chung trong chứng chỉ không phải chuỗi bạn đã gõ. Hãy đọc đầu ra trạng thái thay vì tên tệp hồ sơ.
CRL thực sự kiểm soát điều gì
Máy chủ không tra cứu một cờ thu hồi được lưu trên chứng chỉ. Nó đọc danh sách thu hồi chứng chỉ được nêu trong crl-verify ở mỗi kết nối mới, và từ chối chứng chỉ có số sê-ri xuất hiện trong danh sách đó. Từ đó có hai hệ quả, và cả hai đều quan trọng về mặt vận hành. Tệp phải đọc được bởi tài khoản mà máy chủ hạ quyền xuống, và một máy khách đã kết nối vẫn chạy cho đến khi nó kết nối lại.
Hệ quả thứ hai khiến người ta bất ngờ trong các sự cố. Thu hồi chứng chỉ không đóng đường hầm đang dùng nó ngay lúc này. Hãy ghép việc thu hồi với một lệnh giết quản trị nếu phiên phải kết thúc ngay, và coi hai hành động đó là hai bước riêng trong sổ tay.
Hãy xem danh sách để thấy máy chủ thực sự sẽ áp đặt điều gì, thay vì tin vào dấu thời gian của tệp cuối cùng bạn đã sao chép. Phần quan trọng là số lượng số sê-ri.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemMột danh sách không có mục nào và một danh sách có đúng các mục trông giống hệt nhau trong phần liệt kê thư mục, vì thế đáng để in ra số lượng số sê-ri. Dòng quyền cũng quan trọng không kém, vì một tệp mà daemon không đọc được sẽ tạo ra lỗi trông như một máy khách bị từ chối.
Khôi phục một bản ghi, một cách cẩn thận
Khôi phục một chứng chỉ nghĩa là đảo ngược một bản ghi trong cơ sở dữ liệu cấp phát và công bố một danh sách mới. easy-rsa 3 giữ cơ sở dữ liệu đó dưới dạng index.txt trong thư mục PKI, trong khi các bố cục cũ hơn dùng cách sắp xếp khác. Một dòng bắt đầu bằng chữ cái trạng thái và ngày hết hạn. Một dòng bị thu hồi chèn dấu thời gian thu hồi trước khi tiếp tục với số sê-ri, tên tệp chứng chỉ và tên phân biệt. Đưa một dòng trở lại nghĩa là xóa dấu thời gian đó và đảo chữ cái, còn mọi thứ khác để yên.
Hãy sao lưu tệp trước, và thực hiện chỉnh sửa bằng script thay vì gõ trong trình soạn thảo văn bản. Một lỗi đánh máy làm thay đổi số trường trên một dòng sẽ phá hỏng việc cấp phát cho mọi chứng chỉ được thêm sau đó. Đó là lý do nên tự động hóa thay đổi và sao chép tệp trước khi chạm vào nó.
Lần thu hồi thứ hai của cùng một tên cũng thường thất bại, vì lần chạy đầu đã chuyển chứng chỉ đó và khóa của nó ra khỏi các thư mục mà công cụ mong đợi tìm thấy. Khi đó công cụ không tìm thấy thứ được yêu cầu thu hồi, và thông báo lỗi không phải lúc nào cũng nói rõ vì sao.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlCông bố danh sách mới, sửa quyền sở hữu của nó, và khiến máy chủ đọc nó. Tải lại là đủ trên hầu hết các bản cài đặt, nhưng xác nhận phải đến từ một kết nối mới, vì phiên hiện có chưa từng kiểm tra lại điều gì.
Kiểm tra xem trường hợp xứng đáng với đòn bẩy nào
Hãy đặt câu hỏi duy nhất quyết định toàn bộ sổ tay: khóa riêng tư còn chỉ nằm ở nơi nó nên nằm hay không. Nếu còn, việc giết phiên cùng một khoảng tạm dừng có ghi chép sẽ bao trùm trường hợp và không để lại bản ghi vĩnh viễn. Nếu không, câu trả lời an toàn duy nhất là một khóa mới và chứng chỉ cũ vẫn bị thu hồi.
Sau đó xác minh kết quả bằng một lần thử kết nối chứ không phải bằng chênh lệch cấu hình. Chênh lệch cho bạn biết bạn định làm gì, và kết nối cho bạn biết máy chủ áp đặt điều gì.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Khi một máy khách được khôi phục kết nối và xuất hiện trong đầu ra trạng thái, việc sửa bản ghi đã hiệu quả. Khi một máy khách bị thu hồi bị từ chối và nhật ký nêu tên CRL, việc thu hồi đã hiệu quả. Bất cứ điều gì ở giữa là vấn đề về quyền hoặc tải lại, và đáng để sửa trước khi yêu cầu tiếp theo đến.