Cách quản lý và sử dụng server LDAP với các tiện ích OpenLDAP
Hệ thống LDAP có vẻ khó quản lý nếu bạn không nắm rõ về các công cụ có sẵn cũng như thông tin và phương pháp LDAP yêu cầu. Trong hướng dẫn này, ta sẽ trình bày cách sử dụng các công cụ LDAP do group OpenLDAP phát triển để tương tác với server folder LDAP.Yêu cầu
Để bắt đầu, bạn phải có quyền truy cập vào hệ thống có cài đặt và cấu hình OpenLDAP. Bạn có thể tìm hiểu cách cài đặt server OpenLDAP tại đây . Bạn nên quen thuộc với thuật ngữ cơ bản được sử dụng khi làm việc với dịch vụ folder LDAP. Hướng dẫn này được dùng để làm quen với các chủ đề này.
Cài đặt Công cụ
Yêu cầu ở trên giả định bạn đã có quyền truy cập vào hệ thống LDAP, nhưng bạn có thể chưa cài đặt các công cụ OpenLDAP được thảo luận trong hướng dẫn này.
Trên hệ thống Ubuntu hoặc Debian, bạn có thể cài đặt các công cụ này thông qua các kho apt
. Cập nhật index gói local của bạn và cài đặt bằng lệnh :
- sudo apt-get update
- sudo apt-get install ldap-utils
Trên CentOS hoặc Fedora, bạn có thể lấy các file thích hợp bằng cách sử dụng yum
. Cài đặt chúng bằng lệnh :
- sudo yum install openldap-clients
Khi bạn đã cài đặt đúng gói, hãy tiếp tục bên dưới.
Kết nối với Phiên bản LDAP
Hầu hết các công cụ OpenLDAP đều cực kỳ linh hoạt, hy sinh cấu trúc lệnh ngắn gọn để có khả năng tương tác với các hệ thống trong một số role khác nhau. Do đó, user phải chọn nhiều đối số chỉ để thể hiện mức tối thiểu cần thiết để kết nối với server LDAP.
Trong phần này, ta sẽ tập trung vào việc xây dựng các đối số cần thiết để liên hệ với server tùy thuộc vào loại hoạt động bạn muốn thực hiện. Các đối số thảo luận ở đây sẽ được sử dụng trong nhiều công cụ khác nhau, nhưng ta sẽ sử dụng ldapsearch
cho mục đích demo .
Chỉ định Server
Công cụ OpenLDAP yêu cầu bạn chỉ định phương thức xác thực và vị trí server cho mỗi hoạt động. Để chỉ định server , hãy sử dụng cờ -H
theo sau là giao thức và vị trí mạng của server được đề cập.
Đối với giao tiếp cơ bản, không được mã hóa, schemas giao thức sẽ là ldap://
như thế này:
- ldapsearch -H ldap://server_domain_or_IP . . .
Nếu bạn đang giao tiếp với một server local , bạn có thể bỏ domain hoặc địa chỉ IP của server (bạn vẫn cần chỉ định schemas ).
Nếu bạn đang sử dụng LDAP qua SSL để kết nối với server LDAP của bạn , thay vào đó bạn cần sử dụng schemas ldaps://
( lưu ý đây là phương pháp không được dùng nữa. Dự án OpenLDAP khuyên bạn nên sử dụng nâng cấp STARTTLS trên cổng LDAP thông thường để thay thế). Tìm hiểu cách cài đặt điều này tại đây ):
- ldapsearch -H ldaps://server_domain_or_IP . . .
Các giao thức này giả định cổng mặc định ( 389
cho LDAP thông thường và 636
cho LDAP qua SSL). Nếu bạn đang sử dụng một cổng không chuẩn, bạn cần thêm cổng đó vào cuối bằng dấu hai chấm và số cổng.
Để kết nối với folder LDAP trên server mà bạn đang truy vấn qua Linux IPC (giao tiếp giữa các quá trình), bạn có thể sử dụng giao thức ldapi://
. Điều này an toàn hơn và cần thiết cho một số tác vụ quản trị:
- ldapsearch -H ldapi:// . . .
Vì schemas ldapi
yêu cầu kết nối local , ta sẽ không bao giờ phải chỉ định tên server ở đây. Tuy nhiên, nếu bạn đã thay đổi vị trí file socket trong cấu hình server LDAP, bạn cần chỉ định vị trí socket mới như một phần của địa chỉ.
Ràng buộc ẩn danh
LDAP yêu cầu client tự nhận dạng để server có thể xác định mức độ truy cập để cấp yêu cầu. Điều này hoạt động bằng cách sử dụng cơ chế LDAP được gọi là "ràng buộc", về cơ bản chỉ là một thuật ngữ để liên kết yêu cầu của bạn với một thực thể bảo mật đã biết. Có ba loại xác thực riêng biệt mà LDAP hiểu được.
Loại xác thực chung nhất mà khách hàng có thể sử dụng là ràng buộc "ẩn danh". Đây là trường hợp không có xác thực. Server LDAP có thể phân loại các hoạt động nhất định là có thể truy cập được đối với bất kỳ ai (thông thường, theo mặc định, DIT công khai được cấu hình là chỉ đọc cho user ẩn danh). Nếu bạn đang sử dụng ràng buộc ẩn danh, các thao tác này sẽ khả dụng cho bạn.
Các công cụ OpenLDAP giả định xác thực SASL ( ta sẽ thảo luận về vấn đề này ngay sau đây) theo mặc định, vì vậy để cho phép một ràng buộc ẩn danh, ta phải đưa ra đối số -x
. Kết hợp với thông số kỹ thuật server , nó sẽ trông giống như sau:
- ldapsearch -H ldap://server_domain_or_IP -x
Nếu bạn nhập mà không cung cấp các đối số bổ sung, bạn sẽ nhận được thông tin như sau:
# extended LDIF # # LDAPv3 # base <> (default) with scope subtree # filter: (objectclass=*) # requesting: ALL # # search result search: 2 result: 32 No such object # numResponses: 1
Điều này nói rằng công cụ không tìm thấy những gì ta đã tìm kiếm. Vì ta không cung cấp tham số truy vấn, điều này là mong đợi, nhưng nó cho ta thấy rằng liên kết ẩn danh của ta đã được server chấp nhận.
Xác thực đơn giản
Phương pháp xác thực thứ hai với server LDAP là với một liên kết đơn giản. Một liên kết đơn giản sử dụng một mục nhập trong server LDAP để xác thực yêu cầu. DN (tên phân biệt) của mục nhập có chức năng như tên user để xác thực. Bên trong mục nhập, một thuộc tính xác định password phải được cung cấp trong quá trình yêu cầu.
Tìm mục nhập root DIT và ràng buộc RootDN
Để xác thực bằng cách sử dụng xác thực đơn giản, bạn cần biết phần tử mẹ ở đầu cấu trúc phân cấp DIT, được gọi là mục root , cơ sở hoặc hậu tố, dưới đó tất cả các mục khác được đặt. Bạn cũng cần biết về một DN để liên kết.
Thông thường, trong quá trình cài đặt server LDAP, một DIT ban đầu được cài đặt và cấu hình bằng một mục nhập quản trị, được gọi là rootDN và password . Khi bắt đầu, đây sẽ là DN duy nhất được cấu hình cho các liên kết.
Nếu bạn không biết mục root của server LDAP mà bạn đang kết nối, bạn có thể truy vấn mục nhập “meta” đặc biệt bên ngoài LDAP DIT thông thường để biết thông tin về những mục root DIT mà nó biết (đây được gọi là DSE root ) . Bạn có thể truy vấn mục nhập này cho các tên DIT bằng lệnh :
- ldapsearch -H ldap://server_domain_or_IP -x -LLL -s base -b "" namingContexts
Server LDAP sẽ trả về các mục root mà nó biết, sẽ trông giống như sau:
dn: namingContexts: dc=example,dc=com
Khu vực được đánh dấu là root của DIT. Ta có thể sử dụng điều này để tìm kiếm mục nhập để liên kết. Mục nhập quản trị thường sử dụng objectClass simpleSecurityObject
để có được khả năng đặt password trong mục nhập. Ta có thể sử dụng điều này để tìm kiếm mục nhập có lớp này:
- ldapsearch -H ldap://server_domain_or_IP -x -LLL -b "dc=example,dc=com" "(objectClass=simpleSecurityObject)" dn
Thao tác này sẽ cung cấp cho bạn danh sách các mục nhập sử dụng lớp này. Thông thường chỉ có một:
dn: cn=admin,dc=example,dc=com
Đây là account rootDN mà ta có thể liên kết với. Bạn nên cấu hình password cho account này trong quá trình cài đặt server . Nếu bạn không biết password , bạn có thể làm theo hướng dẫn này để đặt lại password .
Thực hiện ràng buộc
Khi bạn có mục nhập và password , bạn có thể thực hiện một liên kết đơn giản trong quá trình yêu cầu của bạn để xác thực bản thân với server LDAP.
, ta sẽ phải chỉ định vị trí server LDAP và cung cấp cờ -x
để cho biết rằng ta không muốn sử dụng xác thực SASL. Để thực hiện ràng buộc thực tế, ta cần sử dụng cờ -D
để chỉ định DN để liên kết và cung cấp password bằng lệnh -w
hoặc -W
. Tùy chọn -w
cho phép bạn cung cấp password như một phần của lệnh, trong khi tùy chọn -W
sẽ nhắc bạn nhập password .
Một ví dụ yêu cầu liên kết với rootDN sẽ trông như thế này:
- ldapsearch -H ldap://server_domain_or_IP -x -D "cn=admin,dc=example,dc=com" -W
Ta sẽ nhận được kết quả tương tự như ràng buộc ẩn danh của ta , cho thấy rằng thông tin đăng nhập của ta đã được chấp nhận. Việc ràng buộc với một mục nhập thường cung cấp cho bạn các quyền bổ sung mà không có sẵn thông qua ràng buộc ẩn danh. Liên kết với rootDN cho phép bạn truy cập đọc / ghi vào toàn bộ DIT, dù điều khiển truy cập.
Xác thực SASL
SASL là viết tắt của lớp bảo mật và xác thực đơn giản. Nó là một khuôn khổ để kết nối các phương pháp xác thực với các giao thức nhằm cung cấp một hệ thống xác thực linh hoạt không bị ràng buộc với một triển khai cụ thể. Bạn có thể xem trang wikipedia để tìm hiểu về các phương pháp khác nhau có sẵn.
Server LDAP của bạn có thể sẽ chỉ hỗ trợ một tập hợp con các cơ chế SASL có thể có. Để tìm hiểu nó cho phép những cơ chế nào, có thể chạy lệnh:
- ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms
Kết quả mà bạn nhìn thấy sẽ khác nhau tùy thuộc vào sơ đồ bạn đã sử dụng để kết nối. Đối với schemas ldap://
không được mã hóa, hầu hết các hệ thống sẽ mặc định cho phép:
dn: supportedSASLMechanisms: DIGEST-MD5 supportedSASLMechanisms: NTLM supportedSASLMechanisms: CRAM-MD5
Nếu bạn đang sử dụng schemas ldapi://
, sử dụng giao tiếp liên quá trình an toàn, bạn có thể sẽ có một danh sách các lựa chọn mở rộng:
- ldapsearch -H ldapi:// -x -LLL -s base -b "" supportedSASLMechanisms
dn: supportedSASLMechanisms: DIGEST-MD5 supportedSASLMechanisms: EXTERNAL supportedSASLMechanisms: NTLM supportedSASLMechanisms: CRAM-MD5 supportedSASLMechanisms: LOGIN supportedSASLMechanisms: PLAIN
Việc cấu hình hầu hết các phương pháp xác thực SASL có thể mất một chút thời gian, vì vậy ta sẽ không trình bày nhiều chi tiết ở đây. Mặc dù xác thực SASL nói chung nằm ngoài phạm vi của bài viết này, ta nên nói về phương thức EXTERNAL
mà ta thấy có sẵn để sử dụng với schemas ldapi://
.
Cơ chế EXTERNAL
cho biết xác thực và bảo mật được xử lý bởi một số phương tiện khác liên quan đến kết nối. Ví dụ, nó được dùng với SSL để cung cấp mã hóa và xác thực.
Thông thường nhất, bạn sẽ thấy nó được sử dụng với giao diện ldapi://
với user root hoặc sudo
. Vì ldapi://
sử dụng socket Unix, user khởi tạo yêu cầu có thể được lấy và được sử dụng để xác thực cho một số hoạt động nhất định. DIT mà LDAP sử dụng để cấu hình sử dụng cơ chế này để xác thực user root để đọc và áp dụng các thay đổi đối với LDAP. Những yêu cầu này trông giống như sau:
- sudo ldapsearch -H ldapi:// -Y EXTERNAL . . .
Điều này được sử dụng để sửa đổi cấu hình LDAP thường được giữ trong DIT bắt đầu bằng mục root cn=config
.
Cài đặt file .ldaprc
Ta đã chỉ định thông tin kết nối chủ yếu trên dòng lệnh cho đến nay. Tuy nhiên, bạn có thể tiết kiệm cho mình một số thao tác nhập bằng cách đặt một số giá trị kết nối phổ biến vào file cấu hình.
Tệp cấu hình ứng dụng client global được đặt tại /etc/ldap/ldap.conf
, nhưng chủ yếu bạn cần thêm các thay đổi vào file cấu hình của user nằm trong folder chính của bạn tại ~/.ldaprc
. Tạo và mở file có tên này trong editor của bạn:
- nano ~/.ldaprc
Bên trong, các cài đặt cơ bản mà bạn có thể cần cấu hình là BASE
, URI
và BINDDN
:
-
BASE
: DN cơ sở mặc định được sử dụng để chỉ định mục nhập bắt đầu tìm kiếm. Điều này sẽ bị overrides nếu một cơ sở tìm kiếm khác được cung cấp trên dòng lệnh ( ta sẽ xem thêm điều này trong phần tiếp theo). -
URI
: Địa chỉ mà server LDAP có thể được truy cập. Điều này sẽ bao gồm một chương trình (ldap
cho LDAP thường xuyên,ldaps
cho LDAP qua SSL, vàldapi
cho LDAP trên một socket IPC) tiếp theo là tên và cổng của server . Có thể bỏ tên nếu server nằm trên cùng một máy và có thể bỏ cổng nếu server đang chạy trên cổng mặc định cho schemas đã chọn. -
BINDDN
: Điều này chỉ định mục nhập LDAP mặc định để liên kết. Điều này được sử dụng để cung cấp thông tin "tài khoản" cho quyền truy cập mà bạn muốn sử dụng. Bạn vẫn cần chỉ định bất kỳ password nào trên dòng lệnh.
Điều này sẽ chăm sóc thông tin xác thực đơn giản. Nếu bạn đang sử dụng xác thực SASL, hãy xem man ldap.conf
để xem các tùy chọn để cấu hình thông tin xác thực SASL.
Nếu mục nhập cơ sở của LDAP của ta là dc=example,dc=com
, server được đặt trên máy tính local và ta đang sử dụng cn=admin,dc=example,dc=com
để liên kết, ta có thể có ~/.ldaprc
trông giống như sau:
BASE dc=example,dc=com URI ldap:// BINDDN cn=admin,dc=example,dc=com
Sử dụng điều này, ta có thể thực hiện tìm kiếm cơ bản bằng cách chỉ định xác thực không phải SASL và cung cấp password được liên kết với mục nhập quản trị. Điều này sẽ cung cấp một tìm kiếm cây con đầy đủ của DN cơ sở mặc định mà ta đã chỉ định:
- ldapsearch -x -w password
Điều này có thể giúp rút ngắn các tùy chọn kết nối "bảng soạn sẵn" của bạn khi bạn sử dụng các tiện ích LDAP. Trong suốt hướng dẫn này, ta sẽ bao gồm thông tin kết nối trong các lệnh để được rõ ràng, nhưng khi chạy các lệnh, bạn có thể xóa bất kỳ phần nào mà bạn đã chỉ định trong file cấu hình của bạn .
Sử dụng ldapsearch để Truy vấn các Mục nhập DIT và Tra cứu
Bây giờ ta đã xử lý tốt cách xác thực và chỉ định server LDAP, ta có thể bắt đầu nói thêm một chút về các công cụ thực tế mà bạn sử dụng. Đối với hầu hết các ví dụ của ta , ta sẽ giả định ta đang thực hiện các hoạt động này trên cùng một server lưu trữ server LDAP. Điều này nghĩa là thông số kỹ thuật server của ta sẽ trống sau schemas . Ta cũng sẽ giả định mục nhập cơ sở của DIT mà server quản lý là cho dc=example,dc=com
. RootDN sẽ là cn=admin,dc=example,dc=com
. Bắt đầu nào.
Ta sẽ bắt đầu với ldapsearch
, vì ta đã sử dụng nó trong các ví dụ của ta cho đến nay. Hệ thống LDAP được tối ưu hóa cho các hoạt động tìm kiếm, đọc và tra cứu. Nếu bạn đang sử dụng folder LDAP, phần lớn các hoạt động của bạn có thể sẽ là tìm kiếm hoặc tra cứu. Công cụ ldapsearch
được sử dụng để truy vấn và hiển thị thông tin trong LDAP DIT.
Ta đã đề cập đến một phần của cú pháp chịu trách nhiệm đặt tên và kết nối với server , trông giống như sau:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -W
Điều này giúp ta có được mức tối thiểu cần thiết để kết nối và xác thực với version LDAP đang chạy trên server , tuy nhiên, ta không thực sự tìm kiếm bất kỳ thứ gì. Để tìm hiểu thêm, ta sẽ phải thảo luận các khái niệm về cơ sở tìm kiếm và phạm vi tìm kiếm.
Cơ sở và phạm vi tìm kiếm
Trong LDAP, nơi bắt đầu tìm kiếm được gọi là cơ sở tìm kiếm . Đây là một mục trong DIT mà từ đó hoạt động sẽ bắt đầu và hoạt động như một mỏ neo. Ta chỉ định cơ sở tìm kiếm bằng cách chuyển tên mục nhập với cờ -b
.
Ví dụ, để bắt đầu từ root của dc=example,dc=com
DIT, ta có thể sử dụng nó làm cơ sở tìm kiếm, như sau:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com"
Lệnh này sẽ tạo ra mọi mục nhập bên dưới mục nhập dc=example,dc=com
mà user mà bạn đã ràng buộc có quyền truy cập. Nếu ta sử dụng một mục khác, sẽ nhận được một phần khác của cây. Ví dụ: nếu ta bắt đầu ở mục nhập quản trị, bạn chỉ có thể nhận được chính mục nhập administrator :
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "cn=admin,dc=example,dc=com"
# extended LDIF # # LDAPv3 # base <cn=admin,dc=example,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # admin, example.com dn: cn=admin,dc=example,dc=com objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: e1NTSEF9ejN2UmHoRjdha09tQY96TC9IN0kxYUVCSjhLeXBsc3A= # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
Ta đã chỉ định cơ sở trong các ví dụ này, nhưng ta có thể định hình thêm cách mà công cụ tìm kiếm kết quả bằng cách chỉ định phạm vi tìm kiếm. Tùy chọn này được đặt bởi tùy chọn -s
và có thể là bất kỳ tùy chọn nào sau đây:
-
sub
: Phạm vi tìm kiếm mặc định nếu không có cái nào khác được chỉ định. Điều này sẽ tìm kiếm chính mục nhập cơ sở và bất kỳ con cháu nào trong suốt quá trình đi xuống cây. Đây là phạm vi lớn nhất. -
base
: Điều này chỉ tìm kiếm chính cơ sở tìm kiếm. Nó được sử dụng để trả về mục nhập được chỉ định trong cơ sở tìm kiếm và được định nghĩa tốt hơn dưới dạng tra cứu hơn là tìm kiếm. -
one
: Điều này chỉ tìm kiếm các con / cháu ngay lập tức của cơ sở tìm kiếm (cấp phân cấp đơn bên dưới cơ sở tìm kiếm). Điều này không bao gồm bản thân cơ sở tìm kiếm và không bao gồm cây con bên dưới bất kỳ mục nhập nào trong số này. -
children
: Chức năng này giống như phạm visub
, nhưng nó không bao gồm chính cơ sở tìm kiếm trong kết quả (tìm kiếm mọi mục nhập bên dưới, nhưng không bao gồm cơ sở tìm kiếm).
Sử dụng cờ -s
và cờ -b
, ta có thể bắt đầu định hình các vùng của DIT mà ta muốn công cụ xem xét. Ví dụ: ta có thể xem tất cả các phần tử con cấp một của mục nhập cơ sở của ta bằng cách sử dụng one
phạm vi, như thế này:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -s one -LLL dn
Ta đã thêm -LLL dn
vào cuối để lọc kết quả một chút. Ta sẽ thảo luận thêm về vấn đề này ở phần sau của bài viết. Nếu ta đã thêm một vài mục nhập khác vào cây, điều này có thể đã trả về kết quả như sau:
dn: cn=admin,dc=example,dc=com dn: ou=groups,dc=example,dc=com dn: ou=people,dc=example,dc=com
Nếu ta muốn xem mọi thứ trong mục nhập ou=people
, ta có thể đặt nó làm cơ sở tìm kiếm và sử dụng phạm vi children
:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "ou=people,dc=example,dc=com" -s children -LLL dn
Bằng cách điều chỉnh cơ sở tìm kiếm và phạm vi tìm kiếm, bạn có thể chỉ hoạt động trên các phần của DIT mà bạn quan tâm. Điều này sẽ làm cho truy vấn của bạn hoạt động tốt hơn bằng cách chỉ tìm kiếm một phần của cây và nó sẽ chỉ trả về các mục bạn quan tâm trong.
Loại bỏ kết quả không liên quan
Trước khi tiếp tục, hãy nói về cách loại bỏ một số kết quả thừa mà ldapsearch
tạo ra.
Phần lớn kết quả phụ được điều khiển bằng cờ -L
. Bạn có thể sử dụng không đến ba cờ -L
tùy thuộc vào mức kết quả mà bạn muốn xem. Bạn càng thêm nhiều cờ -L
, càng có nhiều thông tin bị triệt tiêu. Có thể là một ý kiến hay nếu bạn không chặn bất kỳ kết quả nào khi tìm hiểu hoặc khắc phục sự cố, nhưng trong quá trình hoạt động bình thường, sử dụng cả ba cấp độ có thể sẽ dẫn đến trải nghiệm tốt hơn.
Nếu bạn đang sử dụng xác thực SASL, khi sửa đổi cn=config
DIT chẳng hạn, bạn có thể sử dụng thêm cờ -Q
. Điều này sẽ kích hoạt chế độ im lặng SASL, chế độ này sẽ loại bỏ bất kỳ kết quả nào liên quan đến SASL. Điều này không sao cả khi sử dụng phương thức -Y EXTERNAL
, nhưng hãy cẩn thận nếu bạn đang sử dụng cơ chế nhắc nhập thông tin xác thực vì điều này cũng sẽ bị chặn (dẫn đến xác thực không thành công).
Bộ lọc tìm kiếm và bộ lọc thuộc tính kết quả
Để thực sự thực hiện tìm kiếm thay vì chỉ xuất ra toàn bộ phạm vi tìm kiếm, bạn cần chỉ định bộ lọc tìm kiếm.
Chúng có thể được đặt ở cuối dòng và có dạng một loại thuộc tính, một toán tử so sánh và một giá trị. Thông thường, chúng được chỉ định trong dấu ngoặc kép để ngăn việc giải thích bằng shell. Dấu ngoặc đơn được sử dụng để chỉ ra giới hạn của một bộ lọc này so với một bộ lọc khác. Đây là tùy chọn trong các tìm kiếm đơn thuộc tính đơn giản, nhưng được yêu cầu trong các bộ lọc ghép phức tạp hơn. Ta sẽ sử dụng chúng ở đây để chỉ rõ vị trí của bộ lọc tìm kiếm.
Ví dụ: ta có thể xem liệu có một mục nhập trong dc=example,dc=com
DIT với thuộc tính tên user ( uid
) được đặt thành “jsmith” hay không. Thao tác này tìm kiếm từng mục nhập trong phạm vi tìm kiếm cho một thuộc tính được đặt thành giá trị đó:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=jsmith)"
Ta đã sử dụng toán tử bình đẳng trong ví dụ trên để kiểm tra sự khớp chính xác của giá trị thuộc tính. Cũng có nhiều toán tử khác, hoạt động như bạn mong đợi. Ví dụ: để tìm kiếm các mục nhập có chứa một thuộc tính, mà không cần quan tâm đến tập giá trị, bạn có thể sử dụng toán tử "hiện diện", đơn giản là một dấu bằng với một ký tự đại diện ở bên phải của phép so sánh. Ta có thể tìm kiếm các mục nhập có chứa password bằng lệnh :
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(userPassword=*)"
Một số bộ lọc tìm kiếm hữu ích là:
- Equality : Sử dụng toán tử
=
để khớp một giá trị thuộc tính chính xác. - Hiện diện : Sử dụng
=*
để kiểm tra sự tồn tại của thuộc tính mà không quan tâm đến giá trị của nó. - Lớn hơn hoặc bằng : Sử dụng toán tử
>=
để kiểm tra các giá trị lớn hơn hoặc bằng giá trị đã cho. - Nhỏ hơn hoặc bằng : Sử dụng toán tử
<=
để kiểm tra các giá trị nhỏ hơn hoặc bằng giá trị đã cho. - Chuỗi con : Sử dụng
=
với một chuỗi và ký tự đại diện*
như một phần của chuỗi. Được sử dụng để chỉ định một phần của giá trị bạn đang tìm kiếm. - Gần đúng : Sử dụng toán tử
~=
để so khớp gần đúng với những gì ở bên phải. Điều này không phải lúc nào cũng được server LDAP hỗ trợ (trong trường hợp đó, tìm kiếm bằng hoặc chuỗi con sẽ được thực hiện thay thế).
Bạn cũng có thể phủ định hầu hết các tìm kiếm bằng cách gói bộ lọc tìm kiếm trong một tập hợp bổ sung các dấu ngoặc đơn có tiền tố là “!” biểu tượng phủ định. Ví dụ: để tìm kiếm tất cả các mục nhập của đơn vị tổ chức, ta có thể sử dụng bộ lọc này:
"(ou=*)"
Để tìm kiếm tất cả các mục nhập không phải là mục nhập của đơn vị tổ chức, ta có thể sử dụng bộ lọc này:
"(!(ou=*)"
Công cụ sửa đổi phủ định đảo ngược ý nghĩa của bộ lọc tìm kiếm theo sau.
Sau đặc điểm kỹ thuật bộ lọc, ta cũng có thể thêm bộ lọc kết quả thuộc tính. Đây chỉ là danh sách các thuộc tính mà bạn muốn hiển thị từ mỗi mục nhập phù hợp. Theo mặc định, mọi thuộc tính mà thông tin đăng nhập của bạn có quyền đọc được hiển thị cho mỗi mục nhập phù hợp. Đặt bộ lọc kết quả thuộc tính cho phép bạn chỉ định chính xác loại kết quả bạn muốn xem.
Ví dụ: ta có thể tìm kiếm tất cả các mục nhập có ID user , nhưng chỉ hiển thị tên chung liên quan của từng mục nhập bằng lệnh :
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=*)" cn
Điều này có thể tạo ra một danh sách giống như sau:
dn: uid=bwright,ou=People,dc=example,dc=com cn: Brian Wright dn: uid=jsmith1,ou=People,dc=example,dc=com cn: Johnny Smith dn: uid=sbrown2,ou=People,dc=example,dc=com cn: Sally Brown
Nếu ta cũng muốn xem mô tả mục nhập của chúng, ta có thể thêm nó vào danh sách các thuộc tính để hiển thị:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=*)" cn description
Thay vào đó, nó sẽ hiển thị thông tin như thế này:
dn: uid=bwright,ou=People,dc=example,dc=com cn: Brian Wright description: Brian Wright from Marketing. Brian takes care of marketing, pres s, and community. Ask him for help if you need any help with outreach. dn: uid=jsmith1,ou=People,dc=example,dc=com cn: Johnny Smith description: Johnny Smith from Accounting. Johnny is in charge of the company books and hiring within the Accounting department. dn: uid=sbrown2,ou=People,dc=example,dc=com cn: Sally Brown description: Sally Brown from engineering. Sally is responsible for designing the blue prints and testing the structural integrity of the design.
Nếu không có bộ lọc thuộc tính nào được đưa ra, tất cả các thuộc tính sẽ được trả về. Điều này có thể được thực hiện rõ ràng với ký tự “*”. Để trả về các thuộc tính hoạt động (thuộc tính metadata đặc biệt được quản lý trong nền cho mỗi mục nhập), bạn có thể sử dụng ký hiệu “+” đặc biệt. Ví dụ, để xem các thuộc tính hoạt động cho rootDN của ta , ta có thể nhập:
- ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -b "dc=example,dc=com" -LLL "(cn=admin)" "+"
Kết quả trông như sau :
dn: cn=admin,dc=example,dc=com structuralObjectClass: organizationalRole entryUUID: cdc718a0-8c3c-1034-8646-e30b83a2e38d creatorsName: cn=admin,dc=example,dc=com createTimestamp: 20150511151904Z entryCSN: 20150514191233.782384Z#000000#000#000000 modifiersName: cn=admin,dc=example,dc=com modifyTimestamp: 20150514191233Z entryDN: cn=admin,dc=example,dc=com subschemaSubentry: cn=Subschema hasSubordinates: FALSE
Tìm kiếm hợp chất
Tìm kiếm kết hợp bao gồm việc kết hợp hai hoặc nhiều bộ lọc tìm kiếm riêng lẻ để có được kết quả chính xác hơn. Các bộ lọc tìm kiếm được kết hợp bằng cách đặt chúng trong một tập hợp các dấu ngoặc đơn khác với một toán tử quan hệ làm mục đầu tiên. Điều này được chứng minh dễ dàng hơn là giải thích.
Các toán tử quan hệ là ký tự “&” hoạt động như một AND logic và “|” ký tự, biểu thị một OR logic. Các bộ lọc này đặt trước các bộ lọc có mối quan hệ mà chúng xác định trong một tập hợp các dấu ngoặc đơn bên ngoài.
Vì vậy, để tìm kiếm một mục nhập có cả mô tả và địa chỉ email trong domain của ta , ta có thể tạo một bộ lọc như sau:
"(&(description=*)(mail=*@example.com))"
Để một mục nhập được trả lại, mục nhập đó phải được xác định cả hai thuộc tính đó.
Biểu tượng OR sẽ trả về kết quả nếu một trong hai bộ lọc phụ là true. Nếu ta muốn xuất các mục nhập mà ta có thông tin liên hệ, ta có thể thử một bộ lọc như sau:
"(|(telephoneNumber=*)(mail=*)(street=*))"
Ở đây, ta thấy rằng toán tử có thể áp dụng cho nhiều hơn hai bộ lọc phụ. Ta cũng có thể lồng các cấu trúc logic này khi cần thiết để tạo ra các mẫu khá phức tạp.
Sử dụng ldapmodify và Variations để thay đổi hoặc tạo mục nhập LDAP
Lúc này, ta chỉ tập trung vào lệnh ldapsearch
, lệnh này hữu ích cho việc tra cứu, tìm kiếm và hiển thị các mục nhập và phân đoạn mục nhập trong LDAP DIT. Điều này sẽ đáp ứng phần lớn các yêu cầu chỉ đọc của user , nhưng ta cần một công cụ khác nếu ta muốn thay đổi các đối tượng trong DIT.
Lệnh ldapmodify
thao tác DIT thông qua việc sử dụng các file LDIF. Bạn có thể tìm hiểu thêm về các file LDIF và chi tiết cụ thể về cách sử dụng các file này để sửa đổi hoặc thêm các mục nhập bằng cách xem hướng dẫn này .
Định dạng cơ bản của ldapmodify
phù hợp chặt chẽ với cú pháp ldapsearch
mà ta đã sử dụng trong suốt hướng dẫn này. Ví dụ: bạn vẫn cần chỉ định server có cờ -H
, xác thực bằng cờ -Y
để xác thực SASL hoặc cờ -x
, -D
và -[W|w]
để xác thực đơn giản.
Áp dụng các thay đổi từ file LDIF
Sau khi cung cấp các tùy chọn bảng soạn sẵn này, hành động phổ biến nhất là đọc trong file LDIF và áp dụng file đó cho DIT. Điều này có thể được thực hiện với tùy chọn -f
(nếu bạn không sử dụng tùy chọn -f
, bạn sẽ phải nhập thay đổi bằng cách sử dụng định dạng LDIF trên dòng lệnh). Bạn cần tự tạo file LDIF, sử dụng cú pháp được mô tả trong hướng dẫn được liên kết ở trên:
- ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif
Thao tác này sẽ đọc file LDIF và áp dụng các thay đổi được chỉ định bên trong. Đối với lệnh ldapmodify
, mỗi thay đổi LDIF phải có một changetype
thay đổi được chỉ định. Lệnh ldapmodify
là dạng tổng quát nhất của các lệnh thao tác DIT.
Nếu file LDIF của bạn đang thêm các mục nhập mới và không bao gồm changetype: add
cho mỗi mục nhập, bạn có thể sử dụng cờ -a
với ldapmodify
hoặc chỉ cần sử dụng lệnh ldapadd
, về cơ bản là alias cho hành vi này. Ví dụ: file LDIF bao gồm kiểu changetype
sẽ trông giống như sau:
dn: ou=newgroup,dc=example,dc=com changetype: add objectClass: organizationalUnit ou: newgroup
Để xử lý file này, bạn chỉ cần sử dụng ldapmodify
:
- ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif
Tuy nhiên, file cũng có thể được xây dựng mà không cần loại changetype
, như sau:
dn: ou=newgroup,dc=example,dc=com objectClass: organizationalUnit ou: newgroup
Trong trường hợp này, để thêm mục này vào DIT, bạn cần phải sử dụng cờ -a
với ldapmodify
hoặc sử dụng lệnh ldapadd
. Hoặc:
- ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -a -f /path/to/file.ldif
Hoặc cái này:
- ldapadd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif
Các lệnh tương tự có sẵn để xóa mục nhập ( ldapdelete
) và di chuyển mục nhập LDAP ( ldapmodrdn
). Sử dụng các lệnh này giúp bạn không cần phải chỉ định rõ changetype: delete
và changetype: modrdn
trong các file . Đối với mỗi định dạng này, việc sử dụng định dạng nào là tùy thuộc vào bạn (cho dù chỉ định thay đổi trong file LDIF hay trên dòng lệnh).
Kiểm tra các thay đổi và xử lý lỗi
Nếu bạn muốn chạy nhanh các file LDIF nào, bạn có thể sử dụng cờ -n
và -v
. Điều này sẽ cho bạn biết thay đổi nào sẽ được thực hiện mà không cần sửa đổi DIT thực tế:
- ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -n -v -f /path/to/file.ldif
Thông thường, nếu lỗi xảy ra trong khi xử lý file LDIF, hoạt động sẽ tạm dừng ngay lập tức. Đây thường là điều an toàn nhất để làm vì thường, các yêu cầu thay đổi sau này trong file sẽ sửa đổi DIT với giả định các thay đổi trước đó đã được áp dụng đúng.
Tuy nhiên, nếu bạn muốn lệnh tiếp tục qua file , bỏ qua các thay đổi gây ra lỗi, bạn có thể sử dụng cờ -c
. Có thể bạn cũng cần sử dụng cờ -S
để trỏ đến một file có thể ghi lỗi để bạn có thể sửa các yêu cầu vi phạm và chạy lại chúng:
- ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -c -S /path/to/error_file -f /path/to/file.ldif
Bằng cách này, bạn sẽ có một log (hoàn chỉnh với các comment chỉ ra các mục vi phạm) để đánh giá sau hoạt động.
Nhiều lệnh LDAP khác
Các lệnh mà ta đã đề cập thực hiện các hoạt động LDAP phổ biến nhất mà bạn sẽ sử dụng hàng ngày. Có một số lệnh nữa mặc dù hữu ích để biết về.
ldappasswd
Nếu một số mục nhập LDAP của bạn có password , lệnh ldappasswd
được dùng để sửa đổi mục nhập. Điều này hoạt động bằng cách xác thực bằng account được đề cập hoặc account quản trị và sau đó cung cấp password mới (và tùy chọn là password cũ).
Mật khẩu cũ phải được chỉ định bằng cách sử dụng cờ -a
(mật khẩu cũ được đưa vào dòng tiếp theo), cờ -A
(mật khẩu cũ được yêu cầu ) hoặc cờ -t
(mật khẩu cũ là đọc từ file được cung cấp dưới dạng mục tiếp theo). Đây là tùy chọn đối với một số triển khai LDAP nhưng được yêu cầu bởi những người khác, vì vậy tốt nhất là nên bao gồm.
Mật khẩu mới phải được chỉ định bằng cách sử dụng cờ -s
(mật khẩu mới được cung cấp trong dòng làm mục tiếp theo), cờ -S
(mật khẩu mới được yêu cầu ) hoặc cờ -T
(mật khẩu mới là đọc từ file được cung cấp dưới dạng mục tiếp theo).
Vì vậy, một thay đổi điển hình có thể trông như thế này:
- ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w oldpassword -a oldpassword -s newpassword
Nếu không có mục nhập nào được đưa ra, mục nhập đang được sử dụng để ràng buộc sẽ bị thay đổi. Nếu bạn ràng buộc với một mục nhập quản trị, bạn có thể thay đổi các mục nhập khác mà bạn có quyền ghi bằng cách cung cấp chúng sau lệnh.
- ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w adminpassword -a oldpassword -s newpassword "uid=user,dc=example,dc=com"
Để tìm hiểu thêm về cách thay đổi và đặt lại password , hãy xem hướng dẫn này .
ldapwhoami
Lệnh ldapwhoami
có thể cho bạn biết cách server LDAP nhìn thấy bạn sau khi xác thực.
Nếu bạn đang sử dụng xác thực ẩn danh hoặc đơn giản, kết quả có thể sẽ không quá hữu ích (“ẩn danh” hoặc chính xác là mục nhập mà bạn đang ràng buộc). Tuy nhiên, đối với xác thực SASL, điều này có thể cung cấp thông tin chi tiết về cách cơ chế xác thực của bạn đang được nhìn thấy.
Ví dụ: nếu ta sử dụng cơ chế -Y EXTERNAL
SASL với sudo
để thực hiện các hoạt động trên cn=config
DIT, ta có thể kiểm tra với ldapwhoami
để xem DN xác thực:
- sudo ldapwhoami -H ldapi:// -Y EXTERNAL -Q
dn:gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
Đây không phải là một mục thực tế trong DIT của ta , nó chỉ là cách xác thực SASL được dịch sang một định dạng mà LDAP có thể hiểu được. Mặc dù vậy, thấy DN xác thực được dùng để tạo ánh xạ và hạn chế truy cập, do đó, rất tốt nếu biết cách lấy thông tin này.
ldapurl
Công cụ ldapurl
cho phép bạn tạo URL LDAP bằng cách chỉ định các thành phần khác nhau liên quan đến truy vấn của bạn. URL LDAP là một cách mà bạn có thể yêu cầu tài nguyên từ server LDAP thông qua một URL được chuẩn hóa. Đây là những kết nối chưa được xác thực và ở chế độ chỉ đọc. Nhiều giải pháp LDAP không còn hỗ trợ URL LDAP để yêu cầu tài nguyên, vì vậy việc sử dụng chúng có thể bị hạn chế tùy thuộc vào phần mềm bạn đang sử dụng.
URL LDAP chuẩn được định dạng theo cú pháp sau:
ldap://host:port/base_dn?attr_to_return?search_scope?filter?extension
Các thành phần như sau:
-
base_dn
: DN cơ sở để bắt đầu tìm kiếm. -
attr_to_return
: Các thuộc tính từ các thực thể phù hợp mà bạn quan tâm. Các thuộc tính này phải được phân tách bằng dấu phẩy. -
search_scope
: Phạm vi tìm kiếm. Cơ sở, phụ, một hoặc con. -
filter
: Bộ lọc tìm kiếm được sử dụng để chọn các mục nhập sẽ được trả lại. -
extension:
Các tiện ích mở rộng LDAP mà bạn muốn chỉ định. Ta sẽ không đề cập đến những điều này ở đây.
Mỗi mục được phân tách trong URL bằng dấu chấm hỏi. Bạn không phải cung cấp các mục mà bạn không sử dụng, nhưng vì loại mục được xác định bằng vị trí của nó trong chuỗi, bạn phải để trống "vị trí" cho mục đó, điều này sẽ khiến bạn có nhiều dấu chấm hỏi trong một hàng. Bạn có thể dừng URL ngay sau khi bạn đã thêm thông tin của bạn (bạn không cần dấu chấm hỏi ở cuối để thể hiện “vị trí” không sử dụng).
Ví dụ: một URL có thể trông như thế này:
ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)
Nếu bạn đưa nó vào công cụ ldapurl
, bạn sẽ sử dụng cờ -H
và đặt URL trong dấu ngoặc kép:
- ldapurl -H "ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)"
Lệnh sẽ chia nó ra như thế này:
scheme: ldap host: localhost port: 389 dn: dc=chilidonuts,dc=tk selector: dn selector: ou scope: sub filter: (ou=*)
Bạn cũng có thể sử dụng các cờ này để đảo ngược quá trình và kết hợp một URL LDAP với nhau. Chúng phản ánh các thành phần khác nhau của URL LDAP:
-
-S
: Lược đồ URL (ldap
,ldaps
hoặcldapi
). Đề ánldap
là mặc định. -
-h
: Tên hoặc địa chỉ server LDAP -
-p
: Cổng server LDAP. Giá trị mặc định sẽ phụ thuộc vào schemas . -
-b
: DN cơ sở để bắt đầu truy vấn -
-a
: Một danh sách các thuộc tính được phân tách bằng dấu phẩy để trả về -
-s
: Phạm vi tìm kiếm để sử dụng (cơ sở, phụ, con hoặc một) -
-f
: Bộ lọc LDAP để chọn các mục nhập để trả lại -
-e
: Phần mở rộng LDAP để chỉ định
Sử dụng những thứ này, bạn có thể nhập thông tin như thế này:
- ldapurl -h localhost -b "dc=example,dc=com" -a dn,ou -s sub -f "(ou=*)"
Lệnh sẽ trả về URL được tạo, có dạng như sau:
ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)
Bạn có thể sử dụng điều này để tạo các URL được dùng với ứng dụng LDAP có khả năng giao tiếp bằng định dạng này.
ldapcompare
Công cụ ldapcompare
được dùng để so sánh thuộc tính của mục nhập với một giá trị. Điều này được sử dụng để thực hiện kiểm tra xác nhận đơn giản để xác nhận dữ liệu.
Quá trình liên quan đến ràng buộc như bạn thường làm tùy thuộc vào dữ liệu được truy vấn, cung cấp DN nhập và xác nhận để kiểm tra. Xác nhận được đưa ra bằng cách chỉ định một thuộc tính và sau đó là một giá trị, được phân tách bằng một hoặc hai dấu hai chấm. Đối với các giá trị chuỗi đơn giản, nên sử dụng một dấu hai chấm. Dấu hai chấm cho biết giá trị được mã hóa base64 đã được cung cấp.
Vì vậy, bạn có thể khẳng định rằng John là một thành viên của group “powerusers” với những điều như sau:
- ldapcompare -H ldap:// -x "ou=powerusers,ou=groups,dc=example,dc=com" "member:uid=john,ou=people,dc=example,dc=com"
Nếu anh ta ở trong group , nó sẽ trả về TRUE
. Nếu không, lệnh sẽ trả về FALSE
. Nếu DN được sử dụng để liên kết không có đủ quyền để đọc thuộc tính được đề cập, nó sẽ trả về UNDEFINED
.
Điều này được dùng làm cơ sở cho hệ thống ủy quyền bằng cách kiểm tra tư cách thành viên group trước khi thực hiện các hành động được yêu cầu.
Kết luận
Đến đây bạn nên biết cách sử dụng một số tiện ích LDAP để kết nối, quản lý và sử dụng server LDAP của bạn . Các ứng dụng client khác có thể cung cấp giao diện hữu dụng hơn cho hệ thống LDAP của bạn để quản lý hàng ngày, nhưng những công cụ này có thể giúp bạn tìm hiểu kỹ thuật và cung cấp quyền truy cập cấp thấp tốt vào dữ liệu và cấu trúc của DIT của bạn.
Các tin liên quan