การตรวจรหัสผ่านใน ldap server

apache directory studio : ldap server & client
apache directory studio : ldap server & client

http://directory.apache.org/studio/

ได้รับโอกาสจากคุณหนึ่งให้หาวิธีการตรวจสอบรหัสผ่านกับ ldap server ด้วย php
ซึ่งรหัสผ่านในเครื่องบริการถูกเข้ารหัสแบบ {SHA} ซึ่งเป็นการเข้ารหัสทางเดียว แบบคงที่
การตรวจสอบทำโดยเข้ารหัสผ่านของเรา แล้วส่งไปเปรียบเทียบรหัสที่ถูกเข้ารหัสไว้ว่าตรงกันหรือไม่
หากใน shell ของ linux สามารถใช้ # slappasswd -h {SHA} -s mypassword
สร้างรหัสผ่านที่ได้รับการเข้ารหัส
แต่ถ้าเป็น PHP ต้องใช้ $e =  base64_encode( pack( “H*”, sha1(“mypassword”)));
ตัวอย่าง code นี้เข้าไป scan ใน directory ต่าง ๆ เพราะไม่ทราบว่า user นี้อยู่ในกลุ่มใด

// verify user & password in ldap server
$ldap = ldap_connect(“127.0.0.1”,389);
$b = ldap_bind($ldap,”uid=sombat”,”loveyou”) or die(“bind died”);
//
$arr = array(
“ou=LAMPANG,ou=STAFF,ou=TEAM_A”,
“ou=LAMPANG,ou=MANAGER,ou=TEAM_A”,
“ou=BANGKOK,ou=STAFF,ou=TEAM_A”,
“ou=BANGKOK,ou=MANAGER,ou=TEAM_A”,
“ou=LAMPANG,ou=STAFF,ou=TEAM_B”,
“ou=LAMPANG,ou=MANAGER,ou=TEAM_B”,
“ou=BANGKOK,ou=STAFF,ou=TEAM_B”,
“ou=BANGKOK,ou=MANAGER,ou=TEAM_B”);
foreach ($arr as $key => $value) {
$dn = ‘uid=’. $_REQUEST[“uid”] .’,’.$value.’,dc=abc,dc=com’;
$result = ldap_search($ldap, $dn,”(uid=*)”,array(“uid”,”userpassword”));
$rec = ldap_get_entries($ldap,$result);
$encoded = “{SHA}” . base64_encode( pack( “H*”, sha1($_REQUEST[“pass”]) ) );
if (isset($rec[0][“userpassword”][0]) && $rec[0][“userpassword”][0] == $encoded) {
echo “<meta http-equiv=’refresh’ content=’0;url=http://www.abc.com/pass.php’ />“;
exit;
}
}
ldap_unbind($ldap);
header(“location: http://www.abc.com/login.php“);

ปัญหากับ ldap ล้มอาการใหม่ แต่วิธีแก้เหมือนเดิม

stop on swap space after ldap service
stop on swap space after ldap service

อาการขอวันนี้
1. fedora core 4 บูทไม่ขึ้นอีกแล้วหลังไฟดับ .. บูทแล้วค้าง โดยฟ้องคำว่า swap
2. reboot แล้วกด i ตามคำแนะนำ press ‘I’ to enter interactive startup
3. กดปุ่ม y เลือกบริการไปเรื่อย ๆ แล้วก็พบ ldap ผมเลือก n เพราะถ้า y ก็จะค้างอยู่ตรงนั้นอีก
4. หลังเข้าไปก็ทดสอบ start แบบ manual
พบคำว่า Checking configuration files for slapd: แล้วก็ค้างตรงนั้น
ผมต้องกดปุ่ม ctrl-c ออกมา

วิธีแก้ไข

1. สั่ง recover ด้วยคำสั่งต่อไปนี้ แต่ถ้าท่านใช้ต้องเปลี่ยนคำว่า myname
#/usr/sbin/slapd_db_recover -v -h /var/lib/ldap/myname
2. ต้องแก้ไขสิทธ์ของแฟ้ม จึงจะ start ได้สำเร็จ
โดยเข้าห้อง /var/lib/ldap/myname
แล้วสั่ง #chown ldap:ldap *
3. สั่ง #/etc/init.d/ldap start
หรือ #/etc/init.d/ldap status พบว่ามาบริการเหมือนเดิม

press 'I' to enter interactive startup
press 'I' to enter interactive startup

http://www.thaiall.com/blog/burin/4571/

ldap server สำหรับ windows

ldap for windows
ldap for windows
22 พ.ย.55 จากการทดสอบติดตั้งโปรแกรม ldap for windows เพื่อจัดตั้ง ldap server
สำหรับให้บริการข้อมูล ก็พบว่า OpenLDAP for Windows 2.4.30 ติดตั้งง่าย
ในการติดตั้งก็กด next เป็นส่วนใหญ่ ยกเว้นรหัสผ่านของ user name ที่ผมได้กำหนดไป
โดยกำหนดให้เหมือนค่า default password ของ server ที่มีมาให้
เมื่อใช้คำสั่ง netstat -na ก็พบว่า port 389 ถูกเปิดรอให้บริการอยู่แล้ว
แล้วใช้ Apache Directory Studio
เชื่อมต่อไปที่ host:localhost port:389
แล้วเลือก No Authentication ก็เข้าได้แล้วครับ
ldap : apache directory studio
ldap : apache directory studio

การติดตั้ง Apache Directory Studio นั้น ต้องมี JRE อยู่ในเครื่อง
แล้วผมก็ copy ห้อง /jre ไปไว้ใน  C:\Program Files\Apache Directory Studio
แล้วสามารถเรียกใช้โปรแกรมได้ตามปกติ เพราะพัฒนาด้วยภาษา Java
ถ้าเข้าระบบแบบ No Authentication จะมองเห็นข้อมูลทั่วไป
แต่ไม่เห็นรหัสผ่าน ของสมาชิก จะต้องกำหนด User และ Password สำหรับแบบ Simple Authentication
จึงจะเข้าแก้ไขข้อมูลที่ถูกปิดไว้ ได้แก่ password ของ member นั่นเอง

ldap ou=xxx,dc=xxx,dc=xxx
อาทิ ldap ou=xxx,dc=xxx,dc=xxx

ldap ในเครื่องบริการ .. ไม่ตื่นอีกแล้ว

ldap fail
ldap fail

ขั้นตอนการตรวจสอบ และแก้ไข
ในกรณี ldap server ล้มหลังไฟฟ้าดับ แล้ว ldap server ก็ตอบว่า ldap unbind

1. พบว่าสั่ง start บริการ ไม่สำเร็จ
#/etc/init.d/ldap start
Checking configuration files for slapd: [FAILED]
2. แก้ไขปัญหาด้วยการ recover
#/usr/sbin/slapd_db_recover -v -h /var/lib/ldap/myname
ได้แฟ้ม log.0000000001 มาใหม่ และดูเหมือน recover สำเร็จ
แต่ก็ยังใช้งานไม่ได้ จึง restart เครื่อง เพื่อล้างค่าต่าง ๆ
3. restart เครื่องคอมพิวเตอร์
4. เมื่อสั่ง start บริการ ก็พบคำว่า OK
สั่ง start กี่ครั้ง ก็ตอบว่า OK .. หมายความว่าไม่ OK
เมื่อตรวจดู status ก็พบว่าบริการไม่ได้ถูกเปิดให้ใช้
#service ldap start เป็นวิธีเปิดบริการ ldap อีกแบบ
#/etc/init.d/ldap status เป็นวิธีตรวจสอบสถานะว่า running รึเปล่า
5. ทดสอบสั่ง start อีกแบบด้วย #/usr/sbin/slapd หรือ slapd -d 10
เมื่อตรวจ status ก็พบว่า ระบบเปิดบริการแล้ว (เรียกว่าเปิดบริการแบบ manual)
แต่ก็ต้องหาว่าสาเหตุคืออะไรต่อไป เพราะ ไม่สามารถ start ตามปกติได้
6. พบสาเหตุว่าเจ้าของแฟ้มในห้อง myname ไม่ใช่ ldap:ldap แต่เป็น root:root
จึงต้องเปลี่ยนเจ้าของ #chown ldap:ldap * ในห้อง /var/lib/ldap/myname
สรุปว่า ใช้งานได้ปกติหลังเปลี่ยนเจ้าของ
7. ใช้โปรแกรมจาก http://www.ldapadministrator.com/
ซึ่งเป็น ldap client admin เข้าไปจัดการข้อมูลได้ครับ

28 ก.ค.58 คุณตั้งแจ้งว่า verify stdid ไม่ผ่านอีกแล้ว หลังไฟดับเมื่อเช้า
หารือกับคุณตุ้ย ก็พบว่ามีปัญหาจริง ซึ่งก็ไม่รู้ว่าเกี่ยวกับไฟฟ้าดับรึเปล่า
ใช้วิธีข้างบนไม่ขลังเหมือนก่อน  ทั้งคุณเปรม และผมปลุกตามวิธีเดิม ๆ ก็ไม่ขึ้น
แล้วเวลาสั่ง start พบคำว่า
Finding last valid log LSN: file: 7 offset 8689191
Recovery starting from [7][8689099]
Recovery complete at Tue Jul 28 15:31:48 2015
Maximum transaction ID 80000007 Recovery checkpoint [7][8689191]

สรุปว่าลองลบ log
แล้วแฟ้ม ___db.001 ก็มากันปกติ จึงได้ใช้ chown จากนั้นก็ ok
แต่ก็ไม่แน่ใจ เพราะปัญหาหายไปแล้ว ถ้าเกิดอีกค่อยตามร่องรอยกันใหม่

http://www.thaiall.com/blog/admin/4282/
http://www.thaiall.com/blog/burin/3713/
http://www.thaiall.com/blog/burin/3698/
http://www.thaiall.com/blog/burin/3680/

fail to restart ldap
fail to restart ldap

สร้างบริการตรวจข้อมูลบน ldap

ldap checking
ldap checking
29 ก.ย.54 มีโอกาสต้องสืบค้นข้อมูลบน ldap server เดิมทีจะใช้ ldap client ติดต่อเข้าไป ซึ่งเป็นซอฟท์แวร์ที่ต้องมีการติดตั้ง หากต้องการตรวจสอบผ่านเว็บเพจก็ต้องเขียน script ขึ้น เพื่อให้สามารถใช้บริการจากเครื่องใดก็ได้ในระบบ LAN ที่มีไอพีขึ้นต้นด้วย 172 (ตาม script)
มีตัวอย่าง php script ดังนี้
<?
// config
$host = "ldap://xxx.xxx.xxx";
$domain = "xxxxx";
$pass = "xxx";
// form
if (!isset($_POST["act"]) && substr($_SERVER["REMOTE_ADDR"],0,3) == "172"){
?>
<form action="" method="post">uid <input name=uid><br>
<select name=ou size=8>
<option value="ou=MANAGER,ou=SALE">Manager</option>
<option value="ou=STAFF,ou=SALE">Staff</option>
</select>
<br>form password <input name=fpass type=password>
<br><input type=submit name=act value=check>
</form>
<? exit; }
if ($_POST["fpass"] != "xxxx") { echo "invalid"; exit; }
//
$baseDn2 = 'uid='.$_POST["uid"].','.$_POST["ou"].',dc='.$domain.',dc=com';
$baseDn1 = 'cn=Manager,dc='.$domain.',dc=com';
//
$ldap = ldap_connect($host);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
$b = ldap_bind($ldap,$baseDn1,$pass) or die("bind died");
if($b) echo "<pre>{$_POST["uid"]} \n";
$result = ldap_search($ldap, $baseDn2,"(cn=*)");
$rec = ldap_get_entries($ldap,$result);
if (!isset($rec[0]["data"][0]))
echo "not found"; else echo $rec[0]["data"][0];
ldap_unbind($ldap);
?>

php code สำหรับติดต่อ ldap server

22 ก.ย.54 มีโอกาสเรียนรู้การเขียนโปรแกรมด้วยภาษา PHP ติดต่อกับ LDAP Server โดยมี engineer ติดตั้ง server ตัวนี้ไว้ แล้วผมมีหน้าที่เข้าไปใช้งาน ก็คิดว่าจะใช้ php (ใช้ phpinfo ตรวจแล้วพบว่า php สามารถใช้ ldap ได้) เข้าไปอ่านข้อมูลผู้ใช้ เพื่อทำ authentication ตรวจผู้ใช้งานระบบ และ code ชุดนี้เป็นตัวอย่างที่ผมใช้ติดต่อกับ ldap server การติดต่อนั้นอาจใช้ browser

พิมพ์ ldap://www.domain.com:389
/uid=BURIN_R,ou=CLERK,ou=OFFICE1,dc=domain,dc=com

ก็จะเปิดด้วยโปรแกรม Windows Contact ขึ้นมาอัตโนมัติ

<?
$host = “ldap://www.domain.com“;
$baseDn1 = ‘cn=Manager,dc=domain,dc=com‘;
$baseDn2 = ‘uid=BURIN_R,ou=CLERK,ou=OFFICE1,dc=domain,dc=com‘;
$password = “your password“;
$ldap = ldap_connect($host);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
$b = ldap_bind($ldap,$baseDn1,$password) or die(“bind died”);
echo “<pre>bind :”;
if($b) echo “pass”; else echo “fail”;
$result = ldap_search($ldap, $baseDn2,”(cn=*)”);
$rec = ldap_get_entries($ldap,$result);
echo ldap_count_entries($ldap,$result);
echo $rec[0][“cn”][0];
echo $rec[0][“userpassword”][0];
echo $rec[0][0][0];
print_r($rec);
ldap_unbind($ldap);
?>

ldap client admin

ldap admin
ldap admin
มีโอกาสได้ใช้โปรแกรม ldapadmin-4.6.11111.0-x86-eng ซึ่ง download ได้จาก http://www.ldapadministrator.com เกี่ยวกับการบริหาร account ใน LDAP Server มีผลจากการเรียนรู้ ดังนี้
1. การ export data สามารถทำได้ครั้งละไม่เกิน 50 ระเบียน (รุ่นทดลอง)
2. เมื่อ export data ออกไปเป็นแบบ csv หากแก้ไขแล้ว ต้องลบ 2 บรรทัดแรกก่อน import
3. ถ้า import ทับข้อมูลเพิ่ม ก็ต้องลบข้อมูลเดิมก่อนที่จะ import
4. สามารถเลือกระเบียนที่ต้องการ export data ได้ตามที่ต้องการ แต่ไม่เกินครั้งละ 50 ระเบียน
5. ค่าที่ export เป็นแบบ csv ออกไปสามารถแก้ไขด้วย notepad หรือ excel ก็ได้
6. ถ้าเชื่อมต่อ ldap server พร้อมกัน 2 เครื่อง สามารถสำรองข้อมูลด้วยการกดปุ่ม ctrl-c แล้ว ctrl-v ได้เลย โดยไม่ต้องใช้เทคนิค import + export และไม่จำกัดจำนวนระเบียน
$ldaphost = “x500.bund.de”;
$ldapconn = ldap_connect($ldaphost,”389″) or die(“Could not connect to yn1″); // {$ldaphost}
if ($ldapconn) {
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
$ldapbind = ldap_bind($ldapconn,”o=Bund,c=DE”);
if ($ldapbind) {
echo “anonymous successful…”;
} else {
echo “anonymous failed…”;
}
} else {
echo “connect fail”;
}
// ldapsearch -h localhost -b “dc=domain,dc=com” -s sub “objectclass=*” -x
// add libeay32.dll, ssleay32.dll in system32 and checking by phpinfo()
// http://www.keutel.de/directory/public_ldap_servers.html
// http://www.emailman.com/ldap/public.html