Các hook báo thành công, và cùng đường dẫn đó vẫn trông trống khi nhìn từ shell. Cả hai câu có thể đúng cùng lúc, vì một dịch vụ systemd có thể sống trong không gian tên mount riêng với thư mục tạm thời riêng tư. Khi hiểu được điều đó, câu hỏi thú vị trở thành liệu việc ghi có thành công hay không.

Hai thư mục tạm thời, một đường dẫn

Cấu hình cô lập cho unit một góc nhìn riêng về các thư mục tạm thời thay vì biến chúng thành chỉ đọc. Các tiến trình bên ngoài unit không thể thấy những gì nó ghi ở đó, và mọi thứ nó để lại bị bỏ đi khi unit dừng. Vì vậy, một đường dẫn do hook in ra và một đường dẫn được kiểm tra từ shell có thể trỏ đến những đối tượng khác nhau có cùng tên.

Đây là một vấn đề về khả năng nhìn thấy, và nó trông giống vấn đề mất dữ liệu. Không có gì bị xóa, vì tệp chỉ đơn giản nằm trong một không gian tên mà shell không phải là thành viên. Cùng lệnh đó cư xử khác đi khi chạy bên trong unit, và đó là quan sát thường giải quyết cuộc tranh luận. Đọc cấu hình của unit trước khi kết luận bất cứ điều gì về việc ghi.

Tách cái vô hình khỏi cái không thể ghi

Ghi thành công và mở thất bại tạo ra bằng chứng khác nhau, và sự khác biệt đó quyết định việc sửa chữa. Nếu hook nói tệp đã được tạo nhưng một trình đọc bên ngoài không tìm thấy nó, bạn có câu hỏi về không gian tên. Nếu hook báo lỗi quyền hoặc mở thất bại, tệp chưa bao giờ được ghi và không thay đổi không gian tên nào sẽ giúp được.

systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-state

Đường dẫn qua gốc tiến trình phơi bày góc nhìn hệ thống tệp của chính dịch vụ, phụ thuộc vào các kiểm tra quyền trên tiến trình đó khi nó còn đang chạy. Đọc nhật ký của unit trong cùng phiên, vì lỗi ghi và tệp mất tích rất dễ bị nhầm lẫn khi ai đó đã quyết định nguyên nhân.

Cho dữ liệu chia sẻ một vị trí rõ ràng

Dữ liệu mà chỉ dịch vụ cần thuộc về thư mục tạm thời riêng tư của nó. Dữ liệu mà tiến trình khác phải đọc cần một đường dẫn được định nghĩa cho cả hai, với chủ sở hữu, chế độ và thời hạn được nêu rõ. Hãy quyết định bạn thuộc trường hợp nào trước khi sửa unit. Hầu hết các sự cố này đến từ việc coi một tệp riêng tư như tệp chia sẻ.

[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750

Thư mục thời gian chạy đặt thư mục dưới vùng thời gian chạy của hệ thống, tạo nó cho người dùng và nhóm đã cấu hình của unit và xóa nó khi unit dừng. Thêm nó qua một drop-in để unit của gói vẫn nguyên vẹn, sau đó tải lại trình quản lý và khởi động lại phiên bản đó, chấp nhận rằng các máy khách của nó sẽ kết nối lại.

Giữ lại bất kỳ thư mục thời gian chạy nào mà unit đã cài đặt yêu cầu. Thay thế danh sách thay vì thêm vào nó là cách phổ biến để làm hỏng một tính năng không liên quan mà không ai kết nối với thay đổi.

Hai lớp đặc quyền có thể không đồng ý

Trình quản lý dịch vụ tạo thư mục cho người dùng đã cấu hình của unit, trong khi daemon VPN có thể riêng rẽ hạ xuống tài khoản của chính nó trước khi chạy hook kết nối. Đó là những lớp khác nhau, và chúng có thể nêu tên những danh tính khác nhau.

Một thư mục thuộc sở hữu root với chế độ hạn chế hoàn toàn hiển thị với một daemon đã từ bỏ đặc quyền, và vẫn không thể ghi bởi nó. Lỗi sau đó được đọc như vấn đề quyền dù đường dẫn tồn tại đúng nơi bạn mong đợi. So sánh chủ sở hữu thư mục với danh tính mà hook báo cáo. Khi chúng khác nhau, chế độ chưa bao giờ là câu hỏi.

Kiểm tra danh tính mà hook thật sự chạy dưới đó trước khi thay đổi quyền sở hữu. Thay đổi người dùng thực thi của dịch vụ để sửa một thư mục có thể thay đổi quyền truy cập thiết bị và đặc quyền mạng ở nơi khác, đó là cái giá cao cho một vấn đề nhỏ.

Xác minh toàn bộ việc bàn giao

Xác nhận bốn điều cùng lúc: hook ghi dưới danh tính thật của nó, trình đọc dự định có thể dùng tệp, người dùng không liên quan không thể, và việc dừng unit dọn dẹp đúng như thiết kế. Một tệp xuất hiện trong thư mục tạm thời chia sẻ của máy chủ không phải là yêu cầu, và thường là dấu hiệu rằng việc trao đổi chưa bao giờ có đường dẫn riêng. Kiểm tra trình đọc sau khi khởi động lại, không chỉ trong lần chạy đầu tiên. Hành vi dọn dẹp là một phần của thiết kế, vì vậy hãy quan sát thay vì giả định.

Trạng thái bền vững thuộc về một nơi có vòng đời tương ứng, vì thư mục thời gian chạy được tạo ra để biến mất. Chọn vị trí theo vòng đời thay vì theo sự tiện lợi. Thói quen đó ngăn phiên bản tiếp theo của chính cuộc điều tra này.

Bài viết liên quan