Thời gian hoạt động dài chỉ chứng minh rằng lần khởi động đã thành công với những đặc quyền mà tiến trình nền có tại thời điểm đó. Những lỗi quan trọng ở đây đến sau: một máy khách mới kết nối, danh sách thu hồi bị thay thế, một script phụ trợ cần ghi tệp. Mỗi trường hợp là một lần mở mới do tài khoản không có đặc quyền thực hiện, với câu hỏi quyền riêng và thông báo lỗi riêng. Ba quyết định tách cấu hình tiếp tục hoạt động khỏi cấu hình hỏng ở sự kiện tiếp theo.

Tách phần được nạp sớm khỏi phần được mở sau

Bộ mô tả là một tay nắm trên phần mô tả tệp đang mở, và chế độ truy cập đã được cố định khi phần mô tả đó được tạo. Đổi người dùng của tiến trình sau đó không đóng tay nắm, vì thế tệp khóa đọc bằng root vẫn hoạt động sau khi hạ quyền. Chế độ cũng không đổi: tay nắm mở để đọc không trở thành ghi được, và tay nắm ghi được không bị thu hồi chỉ vì tài khoản mất quyền trên đường dẫn. Hai sự thật này giải thích phần lớn hành vi đáng ngạc nhiên trong các báo cáo này.

Nửa còn lại là bộ nhớ. Tiến trình nền có thể phân tích một chứng chỉ, giữ lại vật liệu đã phân tích và đóng tệp; thứ còn được dùng là dữ liệu, không phải tệp đang mở. Vì vậy lưu lượng liên tục không chứng minh bộ mô tả đang mở hay tên đường dẫn có thể tiếp cận. Nó chỉ chứng minh vật liệu cần cho phiên hiện tại đã được lấy từ trước.

Lần mở sau là một giao dịch khác. Nó chạy dưới thông tin xác thực hiện tại, ngữ cảnh bảo mật hiện tại và góc nhìn gắn kết hiện tại, nên một đường dẫn đọc được lúc khởi động có thể bị từ chối ở kết nối tiếp theo. Việc luân chuyển thêm một cái bẫy: ghi tệp mới đè lên cùng tên đường dẫn để lại bộ mô tả hiện có gắn với đối tượng cũ, nên lần nạp lại có thể trông thành công trong khi tiến trình nền vẫn dùng nội dung trước đó. Hãy so inode mà tiến trình giữ với inode trên đĩa trước khi tin rằng việc luân chuyển đã có hiệu lực.

Gọi tên ba lần đọc thời gian chạy và thời điểm mỗi lần xảy ra

Ba tài nguyên thường được mở rất lâu sau khi khởi tạo, và chúng hỏng ở những thời điểm khác nhau. Tệp cấu hình của một máy khách cụ thể được đọc khi máy khách đó kết nối, nên nó có thể hỏng với một người dùng trong khi những người khác vẫn chạy. Dữ liệu thu hồi được tra trong lúc xác thực đối tác và tra lại khi tệp được thay thế. Một thư mục tạm chỉ bị chạm tới khi script hoặc tiện ích ghi thứ gì đó.

Không cái nào trong ba thuộc đường khởi động, vì thế một máy chủ khỏe suốt nhiều tuần vẫn có thể hỏng ở kết nối tiếp theo. Phạm trù này cũng gọi tên chủ sở hữu của cách khắc phục: hai cái đầu là quyền đọc trên cấu hình dưới tài khoản tiến trình nền, và cái thứ ba là một vị trí ghi được với mục đích hẹp.

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key trả lời một câu hỏi hẹp hơn phần lớn người ta tưởng. Nó giữ tệp khóa mở qua các lần đặt lại SIGUSR1 và ping-restart đã được ghi tài liệu, và nó không làm gì cho tệp CCD, dữ liệu thu hồi, tệp thực thi trợ giúp hay việc khởi động lại toàn bộ tiến trình. Những thứ đó vẫn đi theo đường mở riêng của chúng, dưới bất kỳ tài khoản nào đang chạy lúc đó.

Xác nhận tài khoản và góc nhìn mà nó thực sự có

Hỏi tiến trình nền đang chạy xem nó dùng tài khoản nào thay vì tin tệp unit, rồi so câu trả lời với điều unit đặt ra. Sự khác biệt là việc đầu tiên cần giải quyết, vì mọi lần kiểm tra quyền sau đó chạy dưới danh nghĩa người mà tiến trình thực sự là. Sau đó đi dọc đường dẫn từng thành phần; việc đi qua được đánh giá ở mỗi cấp, nên một tệp đọc được bên trong thư mục không đi qua được vẫn không đọc được. Chế độ tệp cuối cùng là câu hỏi cuối, không phải câu đầu.

Không gian tên và hộp cát dịch vụ thêm những ranh giới mà quyền sở hữu và bit chế độ không mô tả. Một đường dẫn nhìn thấy trong shell của bạn có thể không tồn tại hoặc chỉ đọc bên trong chroot, không gian tên gắn kết hay unit giấu thư mục nhà. Mô-đun bảo mật thêm một lớp nữa, nên tệp trông như đọc được vẫn có thể bị từ chối khi mở.

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

Một lần đọc thành công trong shell của quản trị viên không kiểm tra bất kỳ điều kiện kết hợp nào ở trên. Hãy chạy kiểm tra với tài khoản tiến trình nền, cùng không gian tên và hộp cát, hoặc chấp nhận rằng kết quả mô tả shell của bạn chứ không phải máy chủ. Lệnh thứ ba là bản rẻ tiền của phép thử đó: nó in chế độ của từng thành phần và hỏng ở thành phần đầu tiên mà tài khoản tiến trình nền không đi qua được.

Cho việc ghi thời gian chạy một thư mục riêng

Đọc chỉ là một nửa bản kiểm kê. Một script trợ giúp có thể cần tạo tệp trạng thái, một tiện ích có thể cần ghi trạng thái bên cạnh cấu hình của nó, và những lần ghi đó không được che bởi việc làm cho cây cấu hình ghi được. Hãy cho thư mục cụ thể quyền ghi mà chức năng của nó cần, với chủ sở hữu và chế độ bạn có thể giải thích. Ưu tiên truy cập chỉ đọc cho mọi thứ chỉ được đọc.

Giữ quyền của khóa riêng tách khỏi các tệp chính sách. Một khóa phải đọc lại sau khi đặt lại có yêu cầu khác tệp máy khách được đọc ở mỗi kết nối, và một chế độ dễ dãi cho cả hai trao nhiều quyền truy cập hơn vấn đề đòi hỏi. Một tài khoản tiến trình nền chuyên dụng với quyền sở hữu hẹp dễ kiểm toán hơn một nhóm rộng. Khi khóa phải sống sót qua các lần đặt lại, persist-key nó loại bỏ việc đọc lại thay vì mở rộng thư mục.

Quyết định từ sự kiện bạn có thể tái tạo

Một đường hầm đang sống chỉ chứng minh một đường trong mã. Sự kiện cần tệp là phép thử duy nhất bao trùm lần mở mà bạn quan tâm, dù đó là kết nối máy khách mới, tệp thu hồi được thay, lần đặt lại mềm được phép hay lần khởi động lại đã lên kế hoạch. Hãy chọn sự kiện, chạy nó, và giữ lỗi đầu tiên thay vì lỗi cuối cùng.

Với một lần đặt lại mềm, một tín hiệu và nhật ký của unit cho thấy khóa có được đọc lại hay không. Gửi tín hiệu, rồi đọc những dòng cuối mà unit đã ghi:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

Đừng kết luận rằng một tiến trình nền bị xâm nhập không thể sửa tệp nữa chỉ vì đặc quyền đã bị hạ. Điều nó còn làm được phụ thuộc vào thông tin xác thực còn lại, năng lực của nó, những thư mục nó có thể ghi và bất kỳ bộ mô tả ghi được nào nó còn giữ. Việc giảm đặc quyền thu hẹp thẩm quyền, và bản kiểm kê các lần mở thời gian chạy cho thấy đến đâu. Hãy ghi ranh giới đó bên cạnh cấu hình để người tiếp theo không phải khám phá lại.

Bài viết liên quan