Trong thiết kế này, hai quyền khác nhau bị nhầm lẫn: ai được dùng một thư mục và những địa chỉ nào được kết nối. Viết danh sách tài khoản bên cạnh danh sách nguồn trông giống như ghép cặp, nhưng Samba đánh giá hai danh sách như hai vị từ độc lập. Ai thỏa mãn cả hai đều được chấp nhận, và đó là quy tắc rộng hơn điều hầu hết quản trị viên dự định. Cách khắc phục là một bố cục chia sẻ khác hoặc một lớp chính sách có thể diễn đạt cặp đó.

Huyền thoại: hai danh sách tạo thành một quy tắc

Tài liệu tham chiếu smb.conf định nghĩa valid users và hosts allow là hai tham số không liên quan, và chính việc đặt cả hai trên một chia sẻ là nơi sự nhầm lẫn bắt đầu. Đặt valid users = mira, tomas và hosts allow = 10.77.0.21, 10.77.0.22 thì bốn tổ hợp được chấp nhận: Mira từ một trong hai địa chỉ, Tomas từ một trong hai địa chỉ. Không gì trong cấu hình gắn tên đầu tiên với địa chỉ đầu tiên, và thứ tự xuất hiện của các tên không có ý nghĩa. Sắp xếp lại chúng, thêm dòng hosts allow thứ hai hay đặt mỗi dòng một tên không thay đổi gì. Kết quả là tích của hai danh sách, không phải ánh xạ giữa chúng.

Điều hầu hết mọi người thực sự muốn thì hẹp hơn: Mira chỉ từ một địa chỉ, Tomas chỉ từ địa chỉ khác. Một định nghĩa chia sẻ không có cú pháp cho sự ràng buộc đó, và không thứ tự thông minh nào tạo ra nó. Đó là một dạng chính sách mà Samba không diễn đạt trong một chia sẻ, và chính ở đó huyền thoại tồn tại.

Samba đánh giá điều gì, và theo thứ tự nào

Các giai đoạn chạy theo thứ tự cố định, và sai thứ tự cho chẩn đoán sai. Máy khách mở kết nối; kiểm tra host toàn cục chạy nếu có cấu hình; thiết lập phiên xác thực tài khoản; sau đó máy khách kết nối tới một chia sẻ, nơi danh sách host riêng của chia sẻ đó, valid users và thiết lập chỉ đọc được áp dụng; và chỉ khi một tệp được mở thì quyền của hệ thống tệp của danh tính đã xác thực mới quyết định. Mỗi giai đoạn có thể tự từ chối yêu cầu, và việc vượt qua một giai đoạn không nói gì về giai đoạn tiếp theo. Hệ quả quan trọng là tài khoản đã được biết khi danh sách host của chia sẻ được đánh giá, và danh sách host vẫn chưa có cách gọi tên tài khoản đó.

Đó là lý do một chia sẻ không thể gắn một người dùng với một địa chỉ: hosts allow và valid users là hai vị từ riêng áp dụng ở cùng giai đoạn kết nối cây, và mỗi vị từ trả lời câu hỏi của nó. Vị từ host không bao giờ lấy tên tài khoản làm đầu vào, nên không thể viết theo từng người dùng. Chỉ một chia sẻ thứ hai hoặc một lớp chính sách ngoài Samba mới diễn đạt được cặp đó.

Các giá trị toàn cục quan trọng vì cách kế thừa. Một chia sẻ bỏ qua hosts allow sẽ kế thừa giá trị toàn cục, và một chia sẻ đặt giá trị riêng sẽ dùng giá trị đó thay cho giá trị toàn cục, không phải thêm vào. Vì vậy một danh sách toàn cục rộng sẽ mở rộng những chia sẻ không bao giờ đặt tham số và không làm gì với chia sẻ tự định nghĩa giá trị. Chạy testparm -s và đọc các giá trị theo từng chia sẻ mà nó in ra, vì đầu ra đó chính là chính sách hiệu lực, còn tệp trên đĩa thì không.

Thu hẹp một chia sẻ cũng không làm gì cho phần còn lại của máy chủ. Các chia sẻ khác, hàng đợi máy in và kết nối IPC giữ quy tắc riêng, nên một thiết kế dựa vào danh sách địa chỉ của một chia sẻ chỉ bảo vệ một đường đi chứ không bảo vệ host.

Hai tên chia sẻ trên một thư mục

Khi cùng một thư mục phải tiếp cận được bởi hai người từ hai địa chỉ, hãy công bố nó hai lần dưới các tên khác nhau. Mỗi khối mang một tài khoản và một nguồn, điều này biến cặp đó thành thứ mà cấu hình có thể cưỡng chế. Cái giá là mỗi người dùng một tên chia sẻ khác để tới cùng những tệp, và đó phải là thay đổi có chủ ý ở phía máy khách.

[shared-mira]
    path = /srv/shared
    guest ok = no
    read only = yes
    valid users = mira
    hosts allow = 10.77.0.21
    hosts deny = ALL

[shared-tomas]
    path = /srv/shared
    guest ok = no
    read only = yes
    valid users = tomas
    hosts allow = 10.77.0.22
    hosts deny = ALL

Cổng chia sẻ không phải quyền của hệ thống tệp. Cả hai danh tính vẫn cần truy cập thư mục qua ACL bên dưới, và thiết lập chỉ đọc là lớp thứ hai chứ không phải lớp duy nhất. Chỉ cấp quyền ghi nếu quy trình làm việc yêu cầu, sau đó kiểm tra rằng tệp do một danh tính tạo ra vẫn dùng được cho danh tính kia.

Cả hai khối cùng trỏ tới một đường dẫn, nên thay đổi trong thư mục ảnh hưởng tới cả hai chia sẻ. Thường đó chính là mục đích, nhưng cũng có nghĩa là một lỗi quyền hiện ra với cả hai người dùng cùng lúc.

Địa chỉ nguồn có thể chứng minh điều gì

Địa chỉ mà Samba thấy là địa chỉ đã tới máy chủ, không phải địa chỉ mà máy khách tưởng mình có. Một cổng VPN chuyển mọi máy khách thành một địa chỉ nguồn xóa bỏ sự khác biệt đó: mọi máy khách đến như cùng một host và danh sách nguồn không còn phân biệt được chúng. Cấp phát ổn định cho từng máy khách và một cổng giữ nguyên nguồn là điều kiện tiên quyết để dùng địa chỉ làm chính sách. Không có cả hai, biện pháp hạn chế đo cổng chứ không đo người dùng.

Dù vậy, địa chỉ không phải thiết bị. Hai máy tính xách tay sau một địa chỉ đường hầm, một hợp đồng thuê được cấp lại và một máy trạm dùng chung đều bác bỏ giả định rằng nguồn nhận diện một người. Hãy coi hạn chế là phạm vi mạng và giữ các tài khoản SMB đã xác thực làm lớp danh tính, với thông tin xác thực thiết bị như chứng chỉ nếu cần ủy quyền thiết bị.

Đó cũng là lý do thiết kế đóng các chia sẻ chứ không đóng máy chủ. Một cặp bị từ chối vẫn có thể mở phiên, tới chia sẻ khác hoặc liệt kê máy chủ, đó là kết quả khác với thất bại xác thực khi kết nối. Nếu yêu cầu là từ chối trước khi xác thực thì các tham số chia sẻ của Samba là công cụ sai.

Chứng minh bằng cặp chéo

Kiểm tra cấu hình, sau đó thử bốn tổ hợp bằng kết nối mới thay vì phiên được dùng lại. Cặp dự định phải tới được thư mục, và cả hai cặp chéo phải thất bại. Một phiên được lưu trong bộ nhớ đệm từ lần thử trước sẽ vui vẻ trả lời cho tổ hợp sai và làm một quy tắc hỏng trông có vẻ đúng.

testparm -s
smbclient //fileserver/shared-mira -U mira -c 'ls'
smbclient //fileserver/shared-tomas -U tomas -c 'ls'
smbstatus --shares

Kiểm tra cú pháp chỉ chứng minh tệp được phân tích. Thông tin đăng nhập, ACL và quyết định về host được thử bằng kết nối thật, nên hãy chạy lệnh máy khách từ địa chỉ bạn muốn thử và xem giai đoạn nào từ chối nó. Nếu một cặp chéo thành công thì danh sách host hiệu lực rộng hơn khối gợi ý, và testparm -s là thứ đầu tiên cần đọc. Nếu một cặp chéo thất bại vì lý do sai thì tài khoản hoặc ACL là đối tượng nghi ngờ.

Giám sát phiên bằng smbstatus và kết thúc chúng là hành động phản ứng sau khi truy cập đã bắt đầu, không phải kiểm soát truy cập. Chặn toàn bộ một địa chỉ quan sát được cũng có thể ngắt những người dùng không liên quan sau cùng NAT, nên quyết định thuộc về định nghĩa chia sẻ và việc giám sát thuộc quy trình phản ứng. Giữ hai việc tách biệt và thiết kế vẫn trung thực về điều nó cưỡng chế.

Bài viết liên quan