Openldap thi hành giao thức truy cập thư mục hạng nhẹ. Dữ liệu ở dạng cấu trúc cây. Trong OND, cơ sở dữ liệu được tổ chức theo sơ đồ sau

Mỗi nút được đại diện bởi một tên phân biệt (dn – Distinguished Name). Lệnh ldapwhoami cho biết bạn đang ở điểm nào với quyền truy cập tương ứng

Các lệnh truy cập ldap phải chỉ ra kỹ thuật truy cập, nhưng vì chúng ta đã cấu hình trong tệp .ldaprc như biểu thị trong hình trên nên GSSAPI được sử dụng làm kỹ thuật mặc định. Lệnh cho biết chúng ta đang ở dn: uid=emin,ou=people,dc=nfsv4,dc=omarine,dc=org.
Ý nghĩa như sau: người sử dụng là emin, thuộc đơn vị tổ chức people trong miền nfsv4 của gốc database là dc=omarine,dc=org.
Lệnh dưới đây tìm kiếm người sử dụng có tên là tho
ldapsearch uid=tho

Trong hình không thấy thông tin mật khẩu. Đó là vì OND đã cấu hình để không ai ngoài quản trị có thể xem mật khẩu của người dùng (dù là phiên bản hash).
Nếu bạn có vé admin, bạn sẽ trở thành quản trị

cn=manager,dc=omarine,dc=org là dn gốc, có toàn quyền trong cơ sở dữ liệu của nó. admin trở thành manager là do qui tắc ủy quyền như sau trong tệp cấu hình /etc/openldap/slapd.conf
authz-regexp uid=admin,cn=omarine.org,cn=gssapi,cn=auth cn=Manager,dc=omarine,dc=org
Chạy ldap
Thủ tục khởi động ldap như sau:
systemctl enable ldap
systemctl start ldap
Cấu hình khách
Tệp /etc/openldap/ldap.conf dùng để đặt mặc định mức hệ thống cho khách, thường là URI để chỉ ra server và dn gốc mặc định cho hoạt động ldap như tìm kiếm. Bạn đặt nội dung sau:
BASE dc=nfsv4,dc=omarine,dc=org
URI ldap://omarine.omarine.org
Ngoài ra tệp .ldaprc trong thư mục nhà của người sử dụng dùng để đặt mức user như chọn kỹ thuật SASL mặc định nêu trên.
Điều khiển truy cập acl
OND cấu hình truy cập acl trong tệp slapd.conf như dưới đây:
access to dn.base="" by * read access to attrs=userPassword,userPKCS12 by self =xw by * auth access to attrs=shadowLastChange by self write by * read access to dn.subtree="cn=krbcontainer,dc=omarine,dc=org" by dn.exact="cn=adm-service,dc=omarine,dc=org" write by * none access to dn.subtree="dc=nfsv4,dc=omarine,dc=org" by dn.exact="cn=nfsv4,dc=omarine,dc=org" read by users read by anonymous auth access to * by * none
Gốc rỗng là rootDSE chỉ chứa thông tin server, ai cũng có quyền đọc nó. Những thuộc tính userPassword và userPKCS12 chủ nhân có quyền cập nhật (nhưng không đọc), người khác cần xác minh. Chủ nhân có quyền viết thuộc tính shadowLastChange, người khác có quyền đọc. Hai điều khiển truy cập tiếp theo thuộc về các bài sau. Vì ldap chứa tài khoản người dùng nên cần được bảo vệ nghiêm ngặt, ở mục cuối cùng, mọi truy cập còn lại đều không được phép.
Người sử dụng có quyền cập nhật mật khẩu của mình. Không phân biệt người dùng địa phương hay người dùng ldap, cả hai đều sử dụng lệnh passwd truyền thống.

SASL
Phương pháp xác thực đơn giản sử dụng mật khẩu kết hợp với một dn là không khuyến khích đối với người dùng, trừ trường hợp đặc biệt như cần thao tác dữ liệu cấu hình, sơ khởi database. Nhưng chỉ nên thao tác tại server. Phương pháp này cũng có thể sử dụng bởi chương trình đặc biệt. Chương trình này phải chạy tại server.
Xác thực an toàn là thông qua SASL – Tầng an ninh và xác thực đơn giản. Các kỹ thuật chính bao gồm GSSAPI, KERBEROS_V4, EXTERNAL và DIGEST-MD5. Trong đó KERBEROS_V4 đã lạc hậu và được thay thế bằng GSSAPI nên chúng ta không sử dụng.
1) GSSAPI
Chúng ta biết rằng việc trước tiên khách phải đạt được TGT, sau đó xin cấp vé dịch vụ. Dịch vụ ở đây là ldap cho máy chủ ldap, vậy chúng ta phải tạo principal dịch vụ ldap, trong ví dụ là
ldap/omarine.omarine.org
Cách tạo tương tự như principal dịch vụ host. Sau khi có vé dịch vụ khách gửi vé tới server. Nhưng vé ở dạng mã hóa bằng khóa dịch vụ, cho nên server phải có khóa dịch vụ để mở. Do đó principal dịch vụ ldap phải được thêm tới bảng khóa tại máy chủ ldap, mặc định là tệp /etc/krb5.keytab.
Kỹ thuật GSSAPI là mặc định trong OND và đã được trình bày bên trên.
2) EXTERNAL
Kỹ thuật EXTERNAL bao gồm hai kiểu là TLS và IPC (ldapi:///).
a. TLS
Sử dụng TLS thông qua chứng chỉ. Bạn đặt các chứng chỉ và khóa bí mật đã tạo trong bài trước vào thư mục /etc/openldap/certs. Thêm các dòng dưới đây vào tệp cấu hình slapd.conf dành cho cấu hình server
TLSCACertificateFile /etc/openldap/certs/ca-cert.pem
TLSCertificateFile /etc/openldap/certs/cert.pem
TLSCertificateKeyFile /etc/openldap/certs/key.pem
TLSVerifyClient demand
Vì ldap (slapd) chạy với người sử dụng là ldap nên ba tệp trên phải đổi chủ sang ldap
sudo chown ldap.ldap /etc/openldap/certs/{ca-cert.pem,cert.pem,key.pem}
Đảm bảo tệp khóa bí mật chỉ truy cập được bởi chủ nhân
sudo chmod 600 /etc/openldap/certs/key.pem
Khởi động lại dịch vụ ldap là cần thiết khi thay đổi cấu hình
systemctl restart ldap
Về cấu hình khách, bạn bổ sung dòng dưới đây vào tệp /etc/openldap/ldap.conf
TLS_CACERT /etc/openldap/certs/ca-cert.pem
Ngoài ra cần cấu hình khách mức user. Vì TLS chỉ sử dụng bởi root để quản lý cơ sở dữ liệu của kdc nên chúng ta chỉ cấu hình cho root. Trong vai trò root, bạn tạo tệp .ldaprc như sau:
cat > /root/.ldaprc << EOF
TLS_CERT /etc/openldap/certs/client-cert.pem
TLS_KEY /etc/openldap/certs/client-key.pem
SASL_MECH GSSAPI
EOF
Đảm bảo tệp khóa bí mật chỉ truy cập được bởi chủ nhân
sudo chmod 600 /etc/openldap/certs/client-key.pem
Lệnh dưới đây ứng dụng TLS

b. IPC
ldapi:/// chỉ nên chạy bởi root, vì socket chỉ cần mở cho root

3) DIGEST-MD5
Sử dụng DIGEST-MD5 là một sở thích. Tuy rằng kỹ thuật này yêu cầu vào mật khẩu nhưng mật khẩu không đi qua dây. Server chỉ yêu cầu thử thách đối với khách và khách phải chứng minh nó biết bí mật chia sẻ. Để sử dụng DIGEST-MD5, bạn thêm qui tắc ủy quyền vào tệp slapd.conf như sau:
authz-regexp uid=([^,]*),cn=omarine.org,cn=digest-md5,cn=auth uid=$1,ou=People,dc=nfsv4,dc=omarine,dc=org
Ví dụ sử dụng kỹ thuật DIGEST-MD5:

Tạo cơ sở dữ liệu
Tệp cấu hình slapd.conf mặc định có bộ phận database như sau
database mdb maxsize 1073741824 suffix "dc=my-domain,dc=com" rootdn "cn=Manager,dc=my-domain,dc=com" # Cleartext passwords, especially for the rootdn, should # be avoid. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. rootpw secret # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd and slap tools. # Mode 700 recommended. directory /var/lib/openldap # Indices to maintain index objectClass eq
Chúng ta sẽ thay thế và bổ sung những thông tin cần thiết. my-domain được thay bằng omarine, com được thay bằng org. Để làm như vậy, bạn thực hiện dòng lệnh dưới đây:
sudo sed -i 's,my-domain,omarine,;s,com,org,' /etc/openldap/slapd.conf
dn gốc của cơ sở dữ liệu là cn=Manager,dc=omarine,dc=org với mật khẩu mặc định là secret. Bạn chạy lệnh dưới đây để tạo mật khẩu mới:
sudo slappasswd
Đầu ra của lệnh là phiên bản hash của mật khẩu của bạn, có dạng
{SSHA}EqbRSfaDUhDX9fTxcFNddDexeQk4ZAQQ
Chúng ta giả định dùng mật khẩu này, thay thế secret:
sudo sed -i 's,secret,{SSHA}EqbRSfaDUhDX9fTxcFNddDexeQk4ZAQQ,' /etc/openldap/slapd.conf
Tệp slapd.conf mặc định đã đặt chỉ số cho thuộc tính objectClass. Chỉ số dùng để tăng tốc tìm kiếm. Xử lý tìm kiếm sẽ kéo các mục được tham chiếu bởi chỉ số thay vì quét tất cả các mục trong phạm vi để kiểm tra khớp lọc. Chúng ta thêm chỉ số cho hai thuộc tính uid và krbPrincipalName:
sudo sed -i '/^index/i index uid,krbPrincipalName eq,sub' /etc/openldap/slapd.conf
Các thuộc tính mới có chỉ số bằng (eq) và xâu con (sub).
Kết quả là bộ phận database của tệp slapd.conf mới như sau
database mdb maxsize 1073741824 suffix "dc=omarine,dc=org" rootdn "cn=Manager,dc=omarine,dc=org" # Cleartext passwords, especially for the rootdn, should # be avoid. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. rootpw {SSHA}EqbRSfaDUhDX9fTxcFNddDexeQk4ZAQQ # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd and slap tools. # Mode 700 recommended. directory /var/lib/openldap # Indices to maintain index uid,krbPrincipalName eq,sub index objectClass eq
Một số lớp đối tượng cần có schema. Việc này hệ thống đã đặt sẵn nên bạn không cần bổ sung schema.
Việc cần thực hiện là bổ sung các qui tắc ủy quyền, cấu hình kỹ thuật SASL và thay thế điều khiển truy cập acl mặc định với nội dung như trình bày bên trên.
Đảm bảo khởi động lại ldap cho cấu hình mới:
systemctl restart ldap
Bây giờ bạn đã sẵn sàng tạo cơ sở dữ liệu. Trước tiên bạn tạo tệp entries.ldif có nội dung sau
# omarine.org dn: dc=omarine,dc=org objectClass: dcObject objectClass: organization dc: omarine o: Omarine Corporation description: Omarine Corporation # nfsv4.omarine.org dn: dc=nfsv4,dc=omarine,dc=org objectClass: dcObject objectClass: organization dc: nfsv4 o: Omarine Corporation description: NFSv4 domain # Manager, omarine.org dn: cn=Manager,dc=omarine,dc=org objectClass: organizationalRole cn: Manager description: Directory Manager # adm-service, omarine.org dn: cn=adm-service,dc=omarine,dc=org objectClass: person objectClass: inetOrgPerson uid: adm-service sn: adm-service cn: adm-service description: KDC's admin # krbcontainer, omarine.org dn: cn=krbcontainer,dc=omarine,dc=org objectClass: krbContainer cn: krbcontainer # omarine.omarine.org, omarine.org dn: cn=omarine.omarine.org,dc=omarine,dc=org objectClass: organizationalRole cn: omarine.omarine.org description: Master Server # Groups, nfsv4.omarine.org dn: ou=Groups,dc=nfsv4,dc=omarine,dc=org objectClass: top objectClass: organizationalUnit ou: Groups # People, nfsv4.omarine.org dn: ou=People,dc=nfsv4,dc=omarine,dc=org objectClass: top objectClass: organizationalUnit ou: People
Để áp dụng ngay kỹ thuật GSSAPI bạn tạo principal quản trị nếu chưa có:
kadmin -p root/admin -q 'addprinc -policy dict admin'
Lấy vé quản trị:
kinit admin
Bạn chạy lệnh dưới đây để thêm dn, trong trường hợp này là tạo cơ sở dữ liệu:
ldapadd -f entries.ldif
Cách khác để tạo cơ sở dữ liệu là sử dụng phương pháp xác thực đơn giản:
ldapadd -D cn=Manager,dc=omarine,dc=org -x -W -f entries.ldif
Sửa đổi dn
Giả sử chúng ta cần thêm thuộc tính mô tả “LDAP Groups” cho ou=Groups,dc=nfsv4,dc=omarine,dc=org, bạn đặt nội dung tệp entries.ldif như sau
# Groups, nfsv4.omarine.org dn: ou=Groups,dc=nfsv4,dc=omarine,dc=org changetype: modify add: description description: LDAP Groups
Thực hiện lệnh:
ldapmodify -f entries.ldif
Xóa dn
Để xóa cn=krbcontainer,dc=omarine,dc=org, bạn thực hiện lệnh
ldapdelete cn=krbcontainer,dc=omarine,dc=org
Nếu muốn xóa nhiều dn thì cách tiện hơn là lập danh sách các dn trong file, mỗi dn trên một dòng, rồi sử dụng lựa chọn -f
ldapdelete -f entries.ldif
Cơ sở dữ liệu khung đã hoàn thành. Trong các bài sau chúng ta sẽ xây dựng cơ sở dữ liệu chi tiết.