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:
. . . 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:
ldap
Kiểm tra FQDN bằng lệnh :
- hostname -f
Kết quả sẽ trả về 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 :
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:
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
, olcCertificateFile
và olcCertificateKeyFile
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:
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:
. . . 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:
anonymous
Nếu bạn cấu hình sai thứ gì đó, bạn có thể sẽ gặp lỗi như sau:
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
:
. . . 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:
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:
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:
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
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
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.
Các tin liên quan