Thứ sáu, 29/05/2015 | 00:00 GMT+7

Cách mã hóa kết nối OpenLDAP bằng STARTTLS

OpenLDAP cung cấp dịch vụ folder LDAP linh hoạt và được hỗ trợ tốt. Tuy nhiên, bên ngoài, server tự giao tiếp qua kết nối web không được mã hóa. Trong hướng dẫn này, ta sẽ trình bày cách mã hóa các kết nối tới OpenLDAP bằng cách sử dụng STARTTLS để nâng cấp các kết nối thông thường lên TLS. Ta sẽ sử dụng Ubuntu 14.04 làm server LDAP của bạn .

Yêu cầu

Trước khi bắt đầu với hướng dẫn này, bạn nên cài đặt một user không phải root với sudo trên server của bạn . Để cài đặt user thuộc loại này, hãy làm theo hướng dẫn cài đặt ban đầu Ubuntu 14.04 của ta .

Ta sẽ giới thiệu cách cài đặt OpenLDAP trên server Ubuntu 14.04 trong hướng dẫn này. Nếu bạn đã cài đặt OpenLDAP trên server của bạn , bạn có thể bỏ qua các bước cài đặt và cấu hình có liên quan.

LDAP qua SSL so với LDAP với STARTTLS

Có hai cách để mã hóa kết nối LDAP với SSL / TLS.

Theo truyền thống, các kết nối LDAP cần được mã hóa được xử lý trên một cổng riêng biệt, thường là 636 . Toàn bộ kết nối sẽ được bao bọc bằng SSL / TLS. Quá trình này, được gọi là LDAP qua SSL, sử dụng giao thức ldaps:// . Phương pháp mã hóa này hiện không được dùng nữa.

STARTTLS là một phương pháp thay thế hiện là phương pháp mã hóa kết nối LDAP được ưa thích. STARTTLS “nâng cấp” một kết nối không được mã hóa bằng cách bọc nó với SSL / TLS sau / trong quá trình kết nối. Điều này cho phép các kết nối không được mã hóa và mã hóa được xử lý bởi cùng một cổng. Hướng dẫn này sẽ sử dụng STARTTLS để mã hóa các kết nối.

Đặt tên server và FQDN

Trước khi bạn bắt đầu, ta nên cài đặt server của bạn để nó phân giải chính xác tên server và domain đủ điều kiện (FQDN). Điều này cần thiết để certificate của ta được khách hàng xác nhận. Ta sẽ giả định server LDAP của ta sẽ được lưu trữ trên một máy có FQDN của ldap.example.com .

Để đặt tên server ở tất cả các vị trí có liên quan trên server của bạn, hãy sử dụng lệnh hostnamectl với tùy chọn set-hostname . Đặt tên server thành tên server ngắn (không bao gồm thành phần domain ):

  • sudo hostnamectl set-hostname ldap

Tiếp theo, ta cần đặt FQDN của server bằng cách đảm bảo file /etc/hosts của ta có thông tin chính xác:

  • sudo nano /etc/hosts

Tìm dòng ánh xạ địa chỉ IP 127.0.1.1 . Thay đổi trường đầu tiên sau địa chỉ IP thành FQDN của server và trường thứ hai thành tên server ngắn. Đối với ví dụ của ta , nó sẽ trông giống như sau:

/ etc / hosts
. . .  127.0.1.1 ldap.example.com ldap 127.0.0.1 localhost  . . . 

Lưu file khi bạn hoàn tất.

Bạn có thể kiểm tra xem mình đã cấu hình đúng các giá trị này chưa bằng lệnh :

  • hostname

Kết quả sẽ trả về tên server ngắn của bạn:

tên server ngắn
ldap 

Kiểm tra FQDN bằng lệnh :

  • hostname -f

Kết quả sẽ trả về FQDN:

Cài đặt FQDN
ldap.example.com 

Cài đặt Server LDAP và Phần mềm GnuTLS

Sau khi đảm bảo tên server của bạn được đặt đúng, ta có thể cài đặt phần mềm ta cần. Nếu bạn đã cài đặt và cấu hình OpenLDAP, bạn có thể bỏ qua phần phụ đầu tiên.

Cài đặt Server OpenLDAP

Nếu bạn chưa cài đặt OpenLDAP, bây giờ là lúc để khắc phục điều đó. Cập nhật index gói local của server của bạn và cài đặt phần mềm bằng lệnh :

  • sudo apt-get update
  • sudo apt-get install slapd ldap-utils

Bạn cần cung cấp password quản trị LDAP. Vui lòng bỏ qua dấu nhắc , vì ta sẽ cấu hình lại ngay sau đó.

Để truy cập một số dấu nhắc bổ sung mà ta cần, ta sẽ cấu hình lại gói sau khi cài đặt. Để làm như vậy, hãy nhập:

  • sudo dpkg-reconfigure slapd

Trả lời các dấu nhắc một cách thích hợp, sử dụng thông tin bên dưới làm điểm bắt đầu:

  • Bỏ qua cấu hình server OpenLDAP? Không ( ta muốn có một database và cấu hình ban đầu)
  • Tên domain DNS: example.com (sử dụng domain của server , trừ tên server . Tên domain này sẽ được sử dụng để tạo mục nhập cơ sở cho cây thông tin)
  • Tên tổ chức: Ví dụ Inc (Tên này sẽ chỉ được thêm vào mục nhập cơ sở làm tên tổ chức của bạn)
  • Mật khẩu administrator : [ bạn muốn ]
  • Xác nhận password : [phải trùng với password trên]
  • Backend database để sử dụng: HDB (trong số hai lựa chọn, cái này có nhiều chức năng nhất)
  • Bạn có muốn database bị xóa khi tát cạn? (lựa chọn của bạn. Chọn “Có” để cho phép xóa hoàn toàn sạch sẽ, chọn “Không” để lưu dữ liệu ngay cả khi phần mềm bị xóa)
  • Di chuyển database cũ? Đúng
  • Cho phép giao thức LDAPv2? Không

Cài đặt các thành phần SSL

Sau khi server OpenLDAP của bạn được cấu hình , ta có thể tiếp tục và cài đặt các gói ta sẽ sử dụng để mã hóa kết nối của bạn . Gói OpenLDAP của Ubuntu được biên dịch dựa trên thư viện SSL của GnuTLS, vì vậy ta sẽ sử dụng GnuTLS để tạo thông tin đăng nhập SSL của bạn :

  • sudo apt-get install gnutls-bin ssl-cert

Với tất cả các công cụ của ta được cài đặt, ta có thể bắt đầu tạo các certificate và khóa cần thiết để mã hóa các kết nối của bạn .

Tạo mẫu certificate

Để mã hóa các kết nối của ta , ta cần cấu hình tổ chức phát hành certificate và sử dụng nó để ký khóa cho (các) server LDAP trong cơ sở hạ tầng của ta . Vì vậy, để cài đặt server duy nhất của ta , ta cần hai bộ cặp khóa / certificate : một cho chính tổ chức phát hành certificate và một bộ được liên kết với dịch vụ LDAP.

Để tạo các certificate cần thiết để đại diện cho các thực thể này, ta sẽ tạo một số file mẫu. Chúng sẽ chứa thông tin mà tiện ích certtool cần để tạo certificate với các thuộc tính thích hợp.

Bắt đầu bằng cách tạo một folder để lưu trữ các file mẫu:

  • sudo mkdir /etc/ssl/templates

Tạo Mẫu CA

Trước tiên, hãy tạo mẫu cho tổ chức phát hành certificate . Ta sẽ gọi file ca_server.conf . Tạo và mở file trong editor của bạn:

  • sudo nano /etc/ssl/templates/ca_server.conf

Ta chỉ cần cung cấp một vài thông tin để tạo thành công tổ chức phát hành certificate . Ta cần chỉ định rằng certificate sẽ dành cho CA (tổ chức phát hành certificate ) bằng cách thêm tùy chọn ca Ta cũng cần tùy chọn cert_signing_key để cung cấp cho certificate đã tạo khả năng ký các certificate bổ sung. Ta có thể đặt cn thành bất kỳ tên mô tả nào mà ta muốn cho tổ chức phát hành certificate của ta :

caserver.conf
cn = LDAP Server CA ca cert_signing_key 

Lưu và đóng file .

Tạo Mẫu dịch vụ LDAP

Tiếp theo, ta có thể tạo một mẫu cho certificate server LDAP của bạn có tên ldap_server.conf . Tạo và mở file trong editor của bạn với các quyền sudo :

  • sudo nano /etc/ssl/templates/ldap_server.conf

Ở đây, ta sẽ cung cấp một vài thông tin khác nhau. Ta sẽ cung cấp tên của tổ chức của ta và cài đặt tls_www_server , encryption_key , và signing_key tùy chọn để cert của ta có các chức năng cơ bản cần thiết.

cn trong mẫu này phải trùng với FQDN của server LDAP. Nếu giá trị này không khớp, client sẽ từ chối certificate của server . Ta cũng sẽ đặt ngày hết hạn cho certificate . Ta sẽ tạo certificate 10 năm để tránh phải quản lý việc gia hạn thường xuyên:

ldapserver.conf
organization = "Example Inc" cn = ldap.example.com tls_www_server encryption_key signing_key expiration_days = 3652 

Lưu file khi bạn hoàn tất.

Tạo khóa và certificate CA

Bây giờ ta đã có các mẫu của bạn , ta có thể tạo hai cặp khóa / certificate . Trước tiên, ta cần tạo bộ của tổ chức phát hành certificate .

Sử dụng trình certtool để tạo private key . Thư mục /etc/ssl/private được bảo vệ khỏi user không phải root và là vị trí thích hợp để đặt các private key mà ta sẽ tạo. Ta có thể tạo private key và ghi nó vào file có tên ca_server.key trong folder này bằng lệnh :

  • sudo certtool -p --outfile /etc/ssl/private/ca_server.key

Bây giờ, ta có thể sử dụng private key mà ta vừa tạo và file mẫu mà ta đã tạo trong phần cuối cùng để tạo certificate của tổ chức phát hành certificate . Ta sẽ ghi điều này vào một file trong folder /etc/ssl/certs tên là ca_server.pem :

  • sudo certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem

Bây giờ ta có private key và cặp certificate cho tổ chức phát hành certificate của ta . Ta có thể sử dụng điều này để ký vào khóa sẽ được sử dụng để thực sự mã hóa phiên LDAP.

Tạo certificate và khóa dịch vụ LDAP

Tiếp theo, ta cần tạo private key cho server LDAP của bạn . Ta sẽ đặt lại khóa đã tạo trong folder /etc/ssl/private vì mục đích bảo mật và sẽ gọi file ldap_server.key để rõ ràng hơn.

Ta có thể tạo khóa thích hợp bằng lệnh :

  • sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key

Sau khi có private key cho server LDAP, ta có mọi thứ cần thiết để tạo certificate cho server . Ta cần nhập hầu hết các thành phần mà ta đã tạo cho đến nay (chứng chỉ và khóa CA, khóa server LDAP và mẫu server LDAP).

Ta sẽ đặt certificate trong folder /etc/ssl/certs và đặt tên là ldap_server.pem . Lệnh ta cần là:

  • sudo certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem

Cấp quyền truy cập OpenLDAP vào khóa server LDAP

Bây giờ ta có tất cả các certificate và khóa ta cần. Tuy nhiên, hiện tại, quy trình OpenLDAP của ta sẽ không thể truy cập vào private key của nó.

Một group có tên ssl-cert đã tồn tại với quyền là chủ sở hữu group của folder /etc/ssl/private . Ta có thể thêm user mà quy trình OpenLDAP của ta chạy trong ( openldap ) vào group này:

  • sudo usermod -aG ssl-cert openldap

Bây giờ, user OpenLDAP của ta có quyền truy cập vào folder . Mặc dù vậy, ta vẫn cần cấp cho group đó quyền sở hữu file ldap_server.key để ta có thể cho phép truy cập đọc. Cung cấp quyền sở hữu group ssl-cert đối với file đó bằng lệnh :

  • sudo chown :ssl-cert /etc/ssl/private/ldap_server.key

Bây giờ, cấp cho group ssl-cert quyền truy cập vào file :

  • sudo chmod 640 /etc/ssl/private/ldap_server.key

Quy trình OpenSSL của ta hiện có thể truy cập đúng vào file khóa.

Cấu hình OpenLDAP để sử dụng certificate và khóa

Ta có các file của bạn và đã cấu hình quyền truy cập vào các thành phần một cách chính xác. Bây giờ, ta cần sửa đổi cấu hình OpenLDAP của bạn để sử dụng các file ta đã tạo. Ta sẽ thực hiện việc này bằng cách tạo file LDIF với các thay đổi cấu hình của ta và tải nó vào version LDAP của ta .

Di chuyển đến folder chính của bạn và mở một file có tên addcerts.ldif . Ta sẽ đưa các thay đổi cấu hình của bạn vào file này:

  • cd ~
  • nano addcerts.ldif

Để áp dụng các thay đổi cấu hình, ta cần nhắm đến mục nhập cn=config của cấu hình DIT. Ta cần xác định rằng ta muốn sửa đổi các thuộc tính của mục nhập. Sau đó, ta cần thêm các thuộc tính olcTLSCACertificateFile , olcCertificateFileolcCertificateKeyFile và đặt chúng vào vị trí file chính xác.

Kết quả cuối cùng sẽ như thế này:

addcerts.ldif
dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key 

Lưu file khi bạn hoàn tất. Áp dụng các thay đổi cho hệ thống OpenLDAP của bạn bằng lệnh ldapmodify :

  • sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif

Ta có thể reload OpenLDAP để áp dụng các thay đổi:

  • sudo service slapd force-reload

Các khách hàng của ta hiện có thể mã hóa kết nối của họ với server qua cổng ldap:// thông thường bằng cách sử dụng STARTTLS.

Cài đặt Máy khách

Để kết nối với server LDAP và bắt đầu nâng cấp STARTTLS, client phải có quyền truy cập vào certificate của tổ chức phát hành certificate và phải yêu cầu nâng cấp.

Trên server OpenLDAP

Nếu bạn đang tương tác với server OpenLDAP từ chính server , bạn có thể cài đặt các tiện ích client bằng cách sao chép certificate CA và điều chỉnh file cấu hình client .

Đầu tiên, sao chép certificate CA từ folder /etc/ssl/certs vào một file trong folder /etc/ldap . Ta sẽ gọi file này là ca_certs.pem . Tệp này được dùng để lưu trữ tất cả các certificate CA mà client trên máy này có thể cần truy cập. Đối với mục đích của ta , điều này sẽ chỉ chứa một certificate duy nhất:

  • sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem

Bây giờ, ta có thể điều chỉnh file cấu hình toàn hệ thống cho các tiện ích OpenLDAP. Mở file cấu hình trong editor của bạn với các quyền sudo :

  • sudo nano /etc/ldap/ldap.conf

Điều chỉnh giá trị của tùy chọn TLS_CACERT để trỏ đến file ta vừa tạo:

/etc/ldap/ldap.conf
. . .  TLS_CACERT /etc/ldap/ca_certs.pem  . . . 

Lưu và đóng file .

Đến đây bạn có thể nâng cấp kết nối của bạn để sử dụng STARTTLS bằng cách chuyển tùy chọn -Z khi sử dụng các tiện ích OpenLDAP. Bạn có thể buộc nâng cấp STARTTLS bằng cách vượt qua nó hai lần. Kiểm tra điều này bằng lệnh :

  • ldapwhoami -H ldap:// -x -ZZ

Điều này buộc phải nâng cấp STARTTLS. Nếu điều này thành công, bạn sẽ thấy:

STARTTLS thành công
anonymous 

Nếu bạn cấu hình sai thứ gì đó, bạn có thể sẽ gặp lỗi như sau:

STARTTLS thất bại
ldap_start_tls: Connect error (-11)     additional info: (unknown error code) 

Cấu hình client từ xa

Nếu bạn đang kết nối với server OpenLDAP của bạn từ các server từ xa, bạn cần phải hoàn tất quy trình tương tự. Đầu tiên, bạn phải sao chép certificate CA vào client . Bạn có thể làm điều này dễ dàng với tiện ích scp .

Chuyển tiếp các SSH key cho khách hàng

Nếu bạn kết nối với server OpenLDAP của bạn bằng các SSH key và client của bạn cũng ở xa, bạn cần thêm chúng vào một tác nhân và chuyển tiếp chúng khi kết nối với client của bạn.

Để thực hiện việc này, trên máy local của bạn, hãy khởi động tác nhân SSH bằng lệnh :

  • eval $(ssh-agent)

Thêm SSH key của bạn vào tác nhân bằng lệnh :

  • ssh-add

Bây giờ, bạn có thể chuyển tiếp các SSH key của bạn khi bạn kết nối với client LDAP của bạn bằng cách thêm cờ -A :

  • ssh -A user@ldap_client

Sao chép Chứng chỉ CA

Khi bạn được kết nối với ứng dụng client OpenLDAP, bạn có thể sao chép certificate CA bằng lệnh :

  • scp user@ldap.example.com:/etc/ssl/certs/ca_server.pem ~/

Bây giờ, nối certificate đã sao chép vào danh sách certificate CA mà ứng dụng client biết. Điều này sẽ nối certificate vào file nếu nó đã tồn tại và sẽ tạo file nếu nó không có:

  • cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem

Điều chỉnh cấu hình client

Tiếp theo, ta có thể điều chỉnh file cấu hình chung để các tiện ích LDAP trỏ đến file ca_certs.pem của ta . Mở file với quyền sudo :

  • sudo nano /etc/ldap/ldap.conf

Tìm tùy chọn TLS_CACERT và đặt nó thành file ca_certs.pem :

/etc/ldap/ldap.conf
. . .  TLS_CACERT /etc/ldap/ca_certs.pem  . . . 

Lưu file khi bạn hoàn tất.

Kiểm tra nâng cấp STARTTLS bằng lệnh vào:

  • ldapwhoami -H ldap://ldap.example.com -x -ZZ

Nếu nâng cấp STARTTLS thành công, bạn sẽ thấy:

STARTTLS thành công
anonymous 

Buộc các kết nối sử dụng TLS (Tùy chọn)

Ta đã cấu hình thành công server OpenLDAP của bạn để nó có thể nâng cấp liền mạch các kết nối LDAP bình thường lên TLS thông qua quy trình STARTTLS. Tuy nhiên, điều này vẫn cho phép các phiên không được mã hóa, có thể không phải là những gì bạn muốn.

Nếu bạn muốn buộc nâng cấp STARTTLS cho mọi kết nối, bạn có thể điều chỉnh cài đặt server của bạn . Ta sẽ chỉ áp dụng yêu cầu này cho DIT thông thường, không phải DIT cấu hình có thể truy cập bên dưới mục cn=config .

Trước tiên, bạn cần tìm mục nhập thích hợp để sửa đổi. Ta sẽ in danh sách tất cả các DIT (cây thông tin folder : phân cấp của các mục nhập mà server LDAP xử lý) mà server OpenLDAP có thông tin cũng như mục nhập cấu hình từng DIT.

Trên server OpenLDAP của bạn, nhập:

  • sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "(olcSuffix=*)" dn olcSuffix

Câu trả lời sẽ trông giống như sau:

DIT do OpenLDAP cung cấp
dn: olcDatabase={1}hdb,cn=config olcSuffix: dc=example,dc=com 

Bạn có thể có nhiều cặp DIT và database hơn nếu server của bạn được cấu hình để xử lý nhiều hơn một DIT. Ở đây, ta có một DIT duy nhất với mục nhập cơ sở là dc=example,dc=com , đây sẽ là mục nhập được tạo cho domain example.com . Cấu hình của DIT này được xử lý bởi mục olcDatabase={1}hdb,cn=config . Ghi lại các DN của DIT mà bạn muốn bắt buộc mã hóa.

Ta sẽ sử dụng file LDIF để áp dụng các thay đổi . Tạo file LDIF trong folder chính của bạn. Ta sẽ gọi nó là forcetls.ldif :

  • nano ~/forcetls.ldif

Bên trong, hãy nhắm đến DN bạn muốn buộc TLS. Trong trường hợp của ta , nó sẽ là dn: olcDatabase={1}hdb,cn=config . Ta sẽ đặt changetype thành “sửa đổi” và thêm thuộc tính olcSecurity . Đặt giá trị của thuộc tính thành “tls = 1” để buộc TLS cho DIT này:

forcetls.ldif
dn: olcDatabase={1}hdb,cn=config changetype: modify add: olcSecurity olcSecurity: tls=1 

Lưu file khi bạn hoàn tất.

Để áp dụng thay đổi, hãy nhập:

  • sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif

Reload dịch vụ OpenLDAP bằng lệnh :

  • sudo service slapd force-reload

Bây giờ, nếu bạn tìm kiếm dc=example,dc=com DIT, bạn sẽ bị từ chối nếu bạn không sử dụng tùy chọn -Z để bắt đầu nâng cấp STARTTLS:

  • ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
Yêu cầu TLS thất bại
Confidentiality required (13) Additional information: TLS confidentiality required 

Ta có thể chứng minh rằng các kết nối STARTTLS vẫn hoạt động chính xác:

  • ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
TLS yêu cầu thành công
dn: dc=example,dc=com  dn: cn=admin,dc=example,dc=com 

Kết luận

Đến đây bạn sẽ có một server OpenLDAP được cấu hình bằng mã hóa STARTTLS. Mã hóa kết nối của bạn với server OpenLDAP bằng TLS cho phép bạn xác minh danh tính của server mà bạn đang kết nối. Nó cũng bảo vệ lưu lượng truy cập của bạn khỏi các bên trung gian. Khi kết nối qua mạng mở, mã hóa lưu lượng của bạn là điều cần thiết.


Tags:

Các tin liên quan