หลังจาก เพิ่มข้อมูลเบื้องต้นเข้าไปใน 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”
จะมีหน้าจอขึ้นเตือนว่า
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 อีกครั้ง จะใช้ได้แล้ว
ข้อมูลอ้างอิง
- ติดตั้งและสตาร์ต OpenLDAP Server บน Fedora 17
- คอนฟิก OpenLDAP Server เบื้องต้น บน Fedora 17
- เพิ่มข้อมูลเบื้องต้นเข้าไปใน OpenLDAP Server บน Fedora 17
- SamatsWiki CheatSheet