Một nhật ký tiếp tục lớn lên sẽ ngừng lớn ngay khi có thứ gì đó tạo lại nó, và lỗi báo rằng quyền đã bị từ chối. Kết luận hấp dẫn là bản thân tệp nhật ký cần thêm quyền, nhưng tệp có thể đã ghi được bởi cùng tài khoản. Ghi thêm vào tên đã tồn tại và tạo tên mới là hai kiểm tra khác nhau, và chỉ kiểm tra thứ hai mới hỏi thư mục.

Ghi thêm và tạo là hai kiểm tra khác nhau

Mở tệp đã tồn tại để ghi thêm cần quyền ghi trên tệp đó cùng quyền tìm kiếm dọc mọi thư mục trên đường dẫn của nó. Tạo tệp cần quyền ghi và tìm kiếm trên thư mục chứa nó, vì thao tác thêm một tên vào đó. Thay thế tệp bằng cách đổi tên cũng chạm vào cả hai thư mục và các quy tắc sticky bit của chúng.

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission denied or operation not permitted

Một bộ mô tả đã mở thêm trường hợp thứ tư. Tiến trình có thể giữ một tay cầm ghi được mở trước khi nó từ bỏ đặc quyền và vẫn thất bại khi mở lại cùng đường dẫn dưới danh tính sau này của nó. Các lần ghi thêm thành công và lần tạo thất bại có thể cùng đúng, tại cùng thời điểm, cho cùng tiến trình.

ACL mặc định được kế thừa, chúng không cấp quyền

Một mục bắt đầu bằng tiền tố mặc định mô tả những gì các đối tượng mới kế thừa từ thư mục. Nó không cấp gì cho bản thân thư mục, và nó không sửa ACL của một tệp đã tồn tại.

namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log

Đọc các mục truy cập tách biệt khỏi các mục mặc định, và đọc mặt nạ. Một mục có tên liệt kê đầy đủ quyền vẫn có thể bị mặt nạ giới hạn, vì thế chú thích hiệu lực quan trọng hơn các chữ cái ở dòng đầu.

Dùng đường dẫn đã phân giải thay vì đường dẫn trong cấu hình. Một liên kết tượng trưng, một điểm gắn kết hoặc một thư mục đã xoay có thể đặt tệp thật ở nơi mà quyền bạn cấp không bao giờ tới. Trước hết hãy đi dọc đường dẫn bằng công cụ tên, rồi so sánh từng cấp với tài khoản liên quan. Đoán thư mục cấp cao nhất chính là cách một bản sửa đáp xuống cao hơn một cấp.

Xác định ai ghi tại thời điểm đó

Kiểm tra đơn vị dịch vụ, các drop-in của nó và cài đặt tài khoản của chính daemon trước khi thay đổi bất cứ điều gì. Tiến trình ghi thêm và tiến trình tạo lại có thể khác nhau: một trình trợ giúp luân chuyển, một trình ghi trạng thái và một trình đọc web hiếm khi chia sẻ danh tính.

Một lần chạy thử từ shell root không tái tạo được dịch vụ bị hạn chế, và nó sẽ thành công trong khi dịch vụ vẫn tiếp tục thất bại. Tái tạo thao tác thất bại dưới cùng đơn vị, với cùng tài khoản và cùng cài đặt sandbox. Nếu không thể, hãy khởi động đơn vị với một shell tạm thời và kiểm tra danh tính mà nó báo cáo. Bất cứ điều gì khác đang đo terminal của bạn, không phải dịch vụ.

Nếu thật sự cần tạo, hãy cấp cho trình ghi quyền truy cập thư mục nhật ký chuyên dụng và giữ quyền đọc cho người tiêu thụ tách riêng. Làm cho một tài khoản chia sẻ hoặc toàn bộ cây ứng dụng ghi được để thỏa mãn một lời gọi ghi nhật ký là đổi một vấn đề nhỏ lấy một vấn đề lớn.

Luân chuyển mà không đưa nó trở lại

Người tạo lại tệp quyết định chủ sở hữu và chế độ của nó cho chu kỳ tiếp theo, vì vậy hãy phối hợp bản sửa với cấu hình luân chuyển. Một bản thay thế được tạo dưới tài khoản khác, hoặc với ACL mới, mang lỗi trở lại sau một bản sửa thành công.

Đặt chế độ và nhóm lúc tạo, không phải sau đó, và xác minh lần luân chuyển tiếp theo thay vì lần ghi thêm tiếp theo. Ghi thêm chỉ lặp lại bài kiểm tra đã qua. Nếu công cụ luân chuyển cung cấp cài đặt chế độ tạo, hãy dùng nó thay vì chmod sau khi tạo. Khoảng trống giữa lúc tạo và chmod chính là thời điểm lần ghi tiếp theo có thể thất bại.

Khi việc cắt bớt vẫn thất bại, hãy ngừng thêm quyền

Việc cắt bớt một tệp mà bạn có thể ghi không được giải thích bằng quyền của thư mục, và thêm nhiều quyền hơn sẽ không giúp. Thay vào đó hãy xem các thuộc tính và sự hạn chế: thuộc tính append-only chỉ cho phép ghi ở chế độ ghi thêm, và một lần gắn kết chỉ đọc hoặc sandbox dịch vụ có thể từ chối một thao tác mà ACL cho phép.

Kiểm tra các hạn chế hệ thống tệp của đơn vị và các tùy chọn gắn kết cho đường dẫn, rồi tái tạo chính xác thao tác đã thất bại. Mở rộng một quyền chưa từng được hỏi chỉ che giấu hạn chế nào là thật. Loại bỏ từng hạn chế một trong một đơn vị dùng một lần, và khôi phục nó trước khi thay đổi bất cứ điều gì lâu dài.

Bài viết liên quan