Câu chuyện về xác thực người dùng an toàn trong mực


17

ngày xửa ngày xưa, có một khu rừng ảo ấm áp tuyệt đẹp ở Nam Mỹ và một máy chủ mực sống ở đó. Đây là một hình ảnh tri giác của mạng:

                 <the Internet>
                        | 
                        | 
           A            |          B
Users <---------> [squid-Server] <---> [LDAP-Server] 

Khi Usersyêu cầu truy cập Internet, squidhãy hỏi tên và hộ chiếu của họ, xác thực chúng bằng cách LDAPvà nếu ldap chấp thuận chúng, thì anh ta đã cấp cho họ.

Mọi người đều vui mừng cho đến khi một số người đánh hơi lấy trộm hộ chiếu ở đường giữa người dùng và mực [đường A]. Thảm họa này xảy ra vì mực sử dụng Basic-Authenticationphương pháp.

Người dân rừng xanh tụ tập để giải quyết vấn đề. Một số thỏ được cung cấp bằng cách sử dụng NTLMphương pháp. Rắn thích Digest-Authenticationtrong khi Kerberosđược cây khuyên dùng.

Rốt cuộc, nhiều giải pháp được cung cấp bởi người rừng và tất cả đã bị nhầm lẫn! Sư tử quyết định chấm dứt tình hình. Ông hét lên các quy tắc cho các giải pháp:

  • Giải pháp sẽ được an toàn!
  • Giải pháp có hiệu quả với hầu hết các trình duyệt và phần mềm không (ví dụ: phần mềm tải xuống)
  • Giải pháp sẽ đơn giản và không cần hệ thống con lớn khác (như máy chủ Samba)
  • Không phải là phương pháp phụ thuộc vào miền đặc biệt. (ví dụ: Thư mục hoạt động)

Sau đó, một giải pháp rất thông minh-toàn diện-thông minh được cung cấp bởi một con khỉ, biến nó thành vua mới của rừng rậm!

bạn có thể đoán giải pháp là gì không?

Mẹo: Đường đi giữa squidLDAPđược sư tử bảo vệ, vì vậy giải pháp không bảo đảm an toàn cho nó.

Lưu ý: xin lỗi nếu câu chuyện nhàm chán và lộn xộn, nhưng hầu hết là có thật! =)

               /~\/~\/~\
            /\~/~\/~\/~\/~\
          ((/~\/~\/~\/~\/~\))
        (/~\/~\/~\/~\/~\/~\/~\)
       (////     ~   ~     \\\\)
       (\\\\(   (0) (0)   )////)
       (\\\\(   __\-/__   )////)
        (\\\(     /-\     )///)
         (\\\(  (""""")  )///)
          (\\\(  \^^^/  )///)
           (\\\(       )///)
             (\/~\/~\/~\/)         **
               (\/~\/~\/)        *####*
                |     |           ****
               /| | | |\            \\
            _/  | | | | \_ _________//   Thanks!
           (,,)(,,)_(,,)(,,)--------'

Cập nhật:

Massimo giải thích rằng phương thức xác thực giữa Users- squidsquid- LDAPkhông nhất thiết phải giống nhau. chúng ta có thể sử dụng phương pháp tùy ý để lấy thông tin xác thực từ người dùng và phương pháp tùy tiện đến dữ liệu được thu thập xác thực.

Nhưng có một vấn đề: đầu vào / đầu ra của tất cả các loại trình xác thực không giống nhau. Ví dụ:

  • một trình Basicxác thực sẽ đọc cặp "mật khẩu tên người dùng" trong một dòng và trả lời OKnếu thông qua người dùng là chính xác hoặcERR
  • một trình Digestxác thực nên đọc username:realmvà trả lời mã hóa hex HA(A1)hoặc hoặc ERR.

Mặc dù không có mối quan hệ trực tiếp giữa phương pháp mực khách và phương pháp mực ống, dữ liệu thu thập được từ máy khách phải tương thích với phương pháp được sử dụng trong phần mực-ldap. Do đó, nếu chúng tôi thay đổi phương thức xác thực ở phía người dùng, chúng tôi cũng có thể nên thay đổi trình xác thực của mình.

Vì vậy, vấn đề đơn giản hóa để:

  1. Ở cấp độ đầu tiên, tôi (con khỉ!) Đang tìm kiếm một phương thức xác thực tốt ở phía người dùng. Phương pháp nào bạn khuyên dùng là an toàn và được hỗ trợ bởi hầu hết các trình duyệt ? tôi đang bối rối giữa NTLM, KerberosDigest.

  2. Nơi tôi có thể tìm thấy trình xác thực hỗ trợ thông tin xác thực của phương thức đã chọn và xác thực thông qua LDAP.


2
+1, cách kể chuyện hoàn toàn tuyệt vời.
Massimo

tất cả các câu hỏi nên được hỏi trong mẫu này?
Bart Silverstrim

@Bart, có lẽ là không, nhưng dù sao thì nó cũng tuyệt vời :-)
Massimo

+1 cho phong cách !!!
geoffc

4
Tôi hơi thất vọng vì con sư tử không được đánh dấu đúng cú pháp: 7
Oskar Duveborn

Câu trả lời:


1

Kerberos không phải là một tùy chọn để xác thực HTTP. NTLM không được hỗ trợ tốt trong bất kỳ trình duyệt nào ngoài IE. Basic không an toàn trừ khi bạn đặt nó phía sau HTTPS mà mực AFAIK không thể làm được. Vì vậy, bạn còn lại với Digest.


Bây giờ tôi đang xác thực người dùng bằng Xác thực HTTP Digest được triển khai bằng digest_ldap_auth(đi kèm với mực) đối với máy chủ LDAP.
Isaac

HTTP không hỗ trợ Kerberos thông qua Negotiatecơ chế; Tôi đã sử dụng thành công với Apache và Squid. SSL cũng là một tùy chọn cho Squid, chỉ Debian không kích hoạt nó do vấn đề giấy phép.
grawity

4

Một tính năng thú vị có thể giúp bạn ở đây là phương pháp Squid sử dụng để yêu cầu trình duyệt máy khách xác thực (đường dẫn A) hoàn toàn không cần liên quan đến phương thức mà nó sử dụng để xác thực thông tin đăng nhập do người dùng cung cấp (đường dẫn B ). Điều này có nghĩa là, bạn có thể tạo ra Squid "nói chuyện" với các trình duyệt máy khách, nhưng sau đó nó có thể xác thực người dùng rất tốt đối với cơ sở dữ liệu người dùng nội bộ của Linux (/ etc / passwd). Có không cần thiết phải thông tin mua sử dụng NTLM (trên con đường A) để thực sự được xác nhận chống lại một miền Windows (trên con đường B). Điều tương tự cũng áp dụng cho mọi kết hợp có thể có của các phương thức xác thực phía máy khách và các phương thức xác thực phía máy chủ.

Điều này có nghĩa là gì trong trường hợp của bạn, đó là vì bạn có thể định cấu hình Squid một cách an toàn để yêu cầu xác thực NTLM từ trình duyệt máy khách thay vì xác thực cơ bản và điều này sẽ không yêu cầu bạn sử dụng Samba / WinBind / AD / bất cứ cách nào.

Vì vậy, bạn có thể chọn bất kỳ phương thức nào bạn muốn để xác thực phía máy khách, nhưng vẫn tiếp tục xác thực người dùng đối với máy chủ LDAP sau khi họ cung cấp thông tin đăng nhập của họ bằng phương pháp bạn đã chọn.

Điều kỳ diệu xảy ra, tất nhiên, trong squid.conf:

#auth_param negotiate program <uncomment and complete this line to activate>
#auth_param negotiate children 5
#auth_param negotiate keep_alive on
#auth_param ntlm program <uncomment and complete this line to activate>
#auth_param ntlm children 5
#auth_param ntlm keep_alive on
#auth_param digest program <uncomment and complete this line>
#auth_param digest children 5
#auth_param digest realm Squid proxy-caching web server
#auth_param digest nonce_garbage_interval 5 minutes
#auth_param digest nonce_max_duration 30 minutes
#auth_param digest nonce_max_count 50
#auth_param basic program <uncomment and complete this line>
#auth_param basic children 5
#auth_param basic realm Squid proxy-caching web server
#auth_param basic credentialsttl 2 hours
#auth_param basic casesensitive off

Mỗi auth_paramchỉ thị cho phép xác thực cụ thể cho các trình duyệt máy khách (đường dẫn A), trong khi phần "chương trình" đặt ra những gì Squid thực sự sẽ sử dụng để xác thực thông tin đăng nhập do người dùng cung cấp. Bạn có thể sử dụng bất kỳ chương trình xác thực nào bạn muốn tại đây (ngay cả một chương trình được viết tùy chỉnh), miễn là nó có thể nhận được id người dùng và mật khẩu và trả lời "có" hoặc "không".

Bạn chỉ cần lấy bất kỳ trình xác thực nào bạn đang sử dụng để thực hiện truy vấn LDAP của mình và dán nó vào câu lệnh "auth_param ntlm" hoặc "auth_param digest", thay vì câu lệnh "auth_param basic" hiện tại.


Cập nhật:

Bạn chắc chắn nên sử dụng squid_ldap_auth làm trình xác thực của mình, nhưng tôi không thể cho bạn biết chính xác làm thế nào mà không có bất kỳ chi tiết nào về máy chủ LDAP cụ thể mà bạn đang sử dụng.

Về xác thực phía khách hàng, bất kỳ ai cũng phải tốt; Tôi khá hài lòng với NTLM và ngày nay hầu hết các trình duyệt đều hỗ trợ nó.

Một cấu hình như vậy sẽ trông như thế này trong squid.conf:

auth_param ntlm program /usr/lib/squid/squid_ldap_auth <parameters>

Điều này sẽ yêu cầu thông tin đăng nhập của người dùng (đường dẫn A) bằng NTLM, sau đó xác thực chúng với máy chủ LDAP (đường dẫn B); nhưng những "tham số" đó hoàn toàn phụ thuộc vào cấu hình và triển khai LDAP của bạn.

Điều này cũng có thể giúp ích: http://www.cyberciti.biz/tips/howto-configure-squid-ldap-authentication.html .


có vẻ đúng Sau đó, bạn cung cấp phương pháp nào? NTLM? Kerberos? cái nào trong số chúng được hỗ trợ trên hầu hết các trình duyệt và đã có 'trình xác thực' hỗ trợ ldap?
Isaac

@Isaac, vui lòng đọc kỹ hơn :-) Không có mối quan hệ nào giữa phương thức và chương trình xác thực, vì vậy, miễn là bạn có chương trình xác thực hỗ trợ LDAP, bạn có thể sử dụng nó với bất kỳ phương thức xác thực ứng dụng khách nào bạn muốn. Và tôi đã bị ấn tượng bởi bạn đã sử dụng nó với xác thực cơ bản ... không phải vậy sao? Bạn có thể đăng phần tương đối của squid.conf không?
Massimo

Cảm ơn. tôi đã giải thích điều này trong phần Cập nhật trong câu hỏi. tôi hy vọng tôi không sai : - /
Isaac

Tôi biết đây là một bài viết cũ, nhưng, sử dụng auth_param ntlm program /usr/lib/squid/squid_ldap_auth <parameters>không hoạt động đối với tôi, mực bị sập và được khởi động lại mỗi khi người dùng cố gắng xác thực. Có thể vì sử dụng sai parameters, nhưng tôi đang sử dụng cùng một tham số basicvà hoạt động tốt. Có ý kiến ​​gì không?
Fidel Roy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.