คอนฟิก User Authentication กับ OpenLDAP Server บน Fedora 17

หลังจาก  เพิ่มข้อมูลเบื้องต้นเข้าไปใน OpenLDAP Server บน Fedora 17  เรียบร้อยแล้ว ตอนนี้เราสามารถตรวจสอบข้อมูล user จาก ldap ได้

ในบทความนี้จะมาเพิ่มเติมคอนฟิก OpenLDAP เพื่อให้สามารถพิสูจน์สิทธิ์ (User Authentication) ของผู้ใช้ลีนุกซ์เช่นรองรับการ Secure Shell ได้

ใช้คำสั่ง ldappasswd เพื่อเปลี่ยน password ของ user ที่อยู่ใน ldap ได้ เช่นต้องการเปลี่ยนรหัสผ่านของ user01 สามารถทำได้ดังนี้

[root@fc17-64a ~]# ldappasswd -x -S -W -D uid=root,ou=People,dc=example,dc=com \
                              uid=user01,ou=People,dc=example,dc=com
New password: <ใส่รหัสใหม่ของ user01>
Re-enter new password: <ใส่รหัสใหม่อีกครั้งของ user01>
Enter LDAP Password: <ใส่รหัส RootPW>

ทดลอง ssh จากเครื่องอื่นเข้ามาที่เครื่องด้วย user01 ถึงแม้จะใส่รหัสผ่านตามที่เปลี่ยนไว้ถูกต้อง ก็ไม่สามารถล็อกอินเข้ามาได้

เมื่อลองดูในไฟล์ /var/log/messages ก็จะพบข้อความฟ้องเกี่ยวกับ TLS encryption

[root@fc17-64a ~]# tail -f /var/log/messages
Jul 1 22:05:39 fc17-64a sssd[be[default]]: Could not start TLS encryption. TLS error -8157:Certificate extension not found.

สาเหตุเป็นเพราะว่า Fedora เวอร์ชั่นใหม่ๆ จะมีโปรแกรม sssd (ตัว s สามตัว) ซึ่งย่อมาจาก “System Security Services Daemon” เป็นตัวกลางที่ใช้ในการตรวจสอบ user authentication ด้วย

และถ้าเราคอนฟิก sssd เชื่อมกับ ldap เพื่อทำการ authen จะต้องคอนฟิกเป็นแบบ TLS เท่านั้น

รันคำสั่ง authconfig อีกครั้งเพื่อเปิดการใช้งาน “[x] Use TLS” ในหน้า “LDAP Settings”


แล้วกด Ok

จะมีหน้าจอขึ้นเตือนว่า

 

To connect to a LDAP server with TLS
protocol enabled you need a CA certificate
which signed your server's certificate.
Copy the certificate in the PEM format to
the '/etc/openldap/cacerts' directory.
Then press OK.

อธิบายคร่าวๆ คือหากต้องการเชื่อมต่อกับ LDAP server ด้วย TLS ต้องมี CA certificate ในรูปแบบ PEM format ในไดเร็คทอรี /etc/openldap/cacerts/

สร้าง CA certificate

เพื่อให้ตรงกับคอนฟิกดีฟอลต์ของ Fedora 17 (คอนฟิกอยู่ในไฟล์ /etc/pki/tls/openssl.cnf) ต้อง cd เข้าไปใน /etc/pki/CA/ ก่อน

[root@fc17-64a ~]# cd /etc/pki/CA/
[root@fc17-64a CA]# ls -l
total 16
drwxr-xr-x. 2 root root 4096 May 16 01:32 certs
drwxr-xr-x. 2 root root 4096 May 16 01:32 crl
drwxr-xr-x. 2 root root 4096 May 16 01:32 newcerts
drwx------. 2 root root 4096 May 16 01:32 private

เริ่มต้นจะไม่มีไฟล์ certificate หรือ private key อยู่ใน CA เลย

[root@fc17-64a CA]# ls -l certs/
total 0
[root@fc17-64a CA]# ls -l private/
total 0

ใช้คำสั่ง openssl ตามด้วยออปชั่นต่างๆ เพื่อสร้างไฟล์ CA certificate ในรูปแบบไฟล์ PEM

[root@fc17-64a CA]# openssl req -new -x509 -keyout private/cakey.pem \
 -out cacert.pem -days 3650
Generating a 2048 bit RSA private key
..................................................................+++
..........................................+++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase: <ตั้งรหัส CA>
Verifying - Enter PEM pass phrase: <ตั้งรหัส CA อีกครั้ง>
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:TH
State or Province Name (full name) []:Bangkok
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

ผลลัพธ์ที่ได้จะได้ไฟล์ CA private key “private/cakey.pem” และไฟล์ CA certificate “cacert.pem”

[root@fc17-64a CA]# ls -l private/cakey.pem
-rw-r--r--. 1 root root 1834 Jul 1 22:47 private/cakey.pem
[root@fc17-64a CA]# ls -l cacert.pem
-rw-r--r--. 1 root root 1269 Jul 1 22:47 cacert.pem

copy ไฟล์ CA certificate ไปใส่ไว้ใน /etc/openldap/cacerts/

[root@fc17-64a CA]# cp cacert.pem /etc/openldap/cacerts/

รัน authconfig-tui อีกครั้ง จะไม่มีฟ้องเกี่ยวกับ CA certificate อีกแล้ว และออกจากคำสั่ง จะมีการสร้าง link ไฟล์ขึ้นมา ไปยังไฟล์ cacert.pem

[root@fc17-64a ~]# cd /etc/openldap/cacerts/
[root@fc17-64a cacerts]# ls -l
total 4
-rw-r--r--. 1 root root 1269 Jul 1 22:53 cacert.pem
lrwxrwxrwx. 1 root root   10 Jul 1 22:53 cf4b2699.0 -> cacert.pem

ลอง secure shell อีกครั้ง ก็ยังฟ้อง error เหมือนเดิม

ต้องสร้าง private key และ certificate ใช้ใน OpenLDAP Server ด้วย

 

สร้าง certificate สำหรับ OpenLDAP Server

ใช้คำสั่ง openssl เพื่อสร้าง certificate request แนะนำให้สร้างใน /etc/pki/tls/

หมายเหตุ จำเป็นต้องระบุ “Common Name” ด้วย เช่น 127.0.0.1 ไม่งั้นจะใช้ไม่ได้

[root@fc17-64a ~]# cd /etc/pki/tls/
[root@fc17-64a tls]# openssl req -nodes -new -keyout private/slapd.key.pem -out slapd.req.pem
Generating a 2048 bit RSA private key
.......................................+++
...............................+++
writing new private key to 'private/slapd.key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:TH
State or Province Name (full name) []:Bangkok
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:127.0.0.1
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

ไฟล์ที่ได้จากการรัน

[root@fc17-64a tls]# ls -l private/slapd.key.pem
-rw-r--r--. 1 root root 1704 Jul 1 23:00 private/slapd.key.pem
[root@fc17-64a tls]# ls -l slapd.req.pem
-rw-r--r--. 1 root root 1005 Jul 1 23:00 slapd.req.pem

แนะนำให้เปลี่ยน permission ของไฟล์​ slapd.key.pem ให้ root อ่านได้อย่างเดียว

[root@fc17-64a tls]# chmod 400 private/slapd.key.pem

ต้องนำไฟล์ slapd.req.pem ไป sign certificate ด้วย CA

[root@fc17-64a tls]# openssl ca -out certs/slapd.crt.pem -in slapd.req.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: <ใส่รหัส CA ที่ตั้งไว้>
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
140182593455968:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r')
140182593455968:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

มีฟ้อง error ว่าไม่สามารถหาไฟล์ /etc/pki/CA/index.txt ได้

ใช้คำสั่ง touch สร้างไฟล์ /etc/pki/CA/index.txt ขึ้นมา

[root@fc17-64a tls]# touch /etc/pki/CA/index.txt
[root@fc17-64a tls]# openssl ca -out certs/slapd.crt.pem -in slapd.req.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: <ใส่รหัส CA ที่ตั้งไว้>
/etc/pki/CA/serial: No such file or directory
error while loading serial number
139839036016480:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/serial','r')
139839036016480:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

ฟ้องอีกครั้งว่าหาไฟล์ /etc/pki/CA/serial ไม่พบ

สำหรับไฟล์ serial ต้องมีตัวเลขในไฟล์

[root@fc17-64a tls]# echo "01" > /etc/pki/CA/serial
[root@fc17-64a tls]# openssl ca -out certs/slapd.crt.pem -in slapd.req.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: <ใส่รหัส CA ที่ตั้งไว้>
Check that the request matches the signature
Signature ok
Certificate Details:
 Serial Number: 1 (0x1)
 Validity
 Not Before: Jul 1 16:09:37 2012 GMT
 Not After : Jul 1 16:09:37 2013 GMT
 Subject:
 countryName = TH
 stateOrProvinceName = Bangkok
 organizationName = Default Company Ltd
 commonName = 127.0.0.1
 X509v3 extensions:
 X509v3 Basic Constraints:
 CA:FALSE
 Netscape Comment:
 OpenSSL Generated Certificate
 X509v3 Subject Key Identifier:
 0D:05:C8:10:14:C2:E7:C5:EC:4F:62:A0:C6:61:74:92:51:46:B2:E4
 X509v3 Authority Key Identifier:
 keyid:5C:45:70:F3:A2:1E:77:62:D8:B1:0F:0D:42:73:D3:54:F1:B4:9C:F3
Certificate is to be certified until Jul 1 16:09:37 2013 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

จะได้ไฟล์ certificate เพื่อใช้กับ OpenLDAP server

[root@fc17-64a tls]# ls -l certs/slapd.crt.pem

copy ไฟล์ private key และ certificate ไปไว้ในไดเร็คทอรีของ /etc/openldap/certs/

[root@fc17-64a tls]# cp private/slapd.key.pem /etc/openldap/certs/
[root@fc17-64a tls]# cp certs/slapd.crt.pem /etc/openldap/certs/
[root@fc17-64a tls]# cd /etc/openldap/certs/
[root@fc17-64a certs]# ls -l slapd.*
-rw-r--r--. 1 root root 4399 Jul 1 23:13 slapd.crt.pem
-r--------. 1 root root 1704 Jul 1 23:13 slapd.key.pem

ต้องเปลี่ยน owner ของไฟล์ slapd.key.pem ให้ ldap สามารถอ่านได้

[root@fc17-64a certs]# chown ldap slapd.key.pem
[root@fc17-64a certs]# ls -l slapd.key.pem
-rw-------. 1 ldap root 1704 Jul 1 23:13 slapd.key.pem

แก้ไขคอนฟิก TLS ใน ldap

ใช้คำสั่ง ldapsearch เพื่อดูคอนฟิก olcGlobal ซึ่งจะมีคอนฟิก TLS อยู่ด้วย

[root@fc17-64a ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config "objectClass=olcGlobal"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password

สร้าง ldif ไฟล์ เพื่อแก้ไขคอนฟิก olcTLSCACertificatePath ให้ชี้ไปยังไดเร็คทอรีที่เก็บไฟล์ CA certificate

[root@fc17-64a ~]# cat modify-ca.ldif
dn: cn=config
changetype: modify
replace: olcTLSCACertificatePath
olcTLSCACertificatePath: /etc/openldap/cacerts

รัน ldapmodify

[root@fc17-64a ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f modify-ca.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

สร้าง ldif ไฟล์ เพื่อแก้ไขคอนฟิก olcTLSCertificateFile และ olcTLSCertificateKeyFile ให้ชี้มายังไฟล์ certificate และ private key ที่สร้างไว้ตามลำดับ

[root@fc17-64a ~]# cat modify-tls.ldif
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/slapd.crt.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/slapd.key.pem

รันคำสั่ง ldapmodify เพื่อแก้ไข

[root@fc17-64a ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f modify-tls.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

ตรวจสอบความถูกต้องในการแก้ไข ด้วยคำสัง ldapsearch อีกครั้ง

[root@fc17-64a ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config "objectClass=olcGlobal"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCertificateFile: /etc/openldap/certs/slapd.crt.pem
olcTLSCertificateKeyFile: /etc/openldap/certs/slapd.key.pem
olcTLSCACertificatePath: /etc/openldap/cacerts

ปิด/เปิด เซอร์วิส slapd เพื่อให้มีการโหลดไฟล์ private key และ certificate

[root@fc17-64a ~]# systemctl stop slapd.service
[root@fc17-64a ~]# systemctl start slapd.service

แล้วลองล็อกอิน ssh อีกครั้ง จะใช้ได้แล้ว

 

ข้อมูลอ้างอิง

 

 

Leave a Reply

Your email address will not be published.