mod_authn_dbd+WordPress

หลังจากติดตั้ง WordPress ทำ KM ให้บริษัทจนตอนนี้มีบทความต่าง ๆ ไหลมาเป็นน้ำจากหลายคน ก็เกิดอีกปัญหาขึ้นเพราะว่ามี Service ก่อนหน้าที่เอาขึ้นมาก่อนแล้วเช่น HG สำหรับทำ Project เล็ก ๆ เป็นการทดลอง Trac ที่ไว้เก็บ issue ต่าง ๆ ของ Project เหล่านั้นหรือแม้แต่ feed ที่ต้องการแต่ไม่อยากเปิดให้คนนอกเข้ามาก็ต้องทำให้มันถามรหัสเพื่อรู้ว่าเป็นคนภายในหรือป่าว

วิธีที่จะทำให้บริการเหล่านี้ใช้ข้อมูลของ User ที่เดียวกันก็มีหลายวิธี ง่ายสุดก็คงเป็นการตั้ง LDAP แต่เนื่องจากเป็นคนใจร้อนขี้เกียจรอเลยให้ทุก Service มาใช้ Database WordPress เพื่อ Authenticate แบบชั่วคราวไปก่อน โดยใช้ตัวช่วยที่อยู่ใน Apache ที่เรียกว่า mod_authn_dbd

mod_authn_dbd เป็น module เสริมของ Apache ที่ใช้คู่กับ mod_dbd ที่ทำให้ Apache ติดต่อกับ Database ต่าง ๆ โดย mod_authn_dbd จะเป็นส่วนที่เพิ่มคำสั่งให้ query database เพื่อตรวจสอบ user ด้วย http basic หรือ http digest รหัสผ่านที่ query จาก database ออกมาต้องเป็น รหัสผ่านที่ถูกเข้ารหัสอีกชั้นไว้แล้ว ด้วยวิธีต่าง ๆ เช่น Crypt, SHA1 หรือ MD5 โดยมี configuration คือ

DBDriver mysql
DBDParams host=localhost,user=username,pass=password,db=mydb

DBDMin  4
DBDKeep 8
DBDMax  20
DBDExptime 300

<Location />
  AuthType Basic
  AuthName "My Server"
  AuthBasicProvider dbd

  Require valid-user

  AuthDBDUserPWQuery \
    "SELECT password FROM authn WHERE user = %s"
</Location>

DBDriver และ DBD ทั้งหลายสามารถดูได้ที่ Apache mod_dbd ในนั้นมีรายละเอียดให้ครบเลย จากด้านบนยกตัวอย่างมาจาก MySQL

Configuration นี้คือให้ต่อไปที่ MySQL จากนั้น query ไปที่ตาราง authn ที่มี column user = username ที่ user จะใส่และเอารหัสผ่านออกมา %s คือสิ่งที่ Apache จะเอา username ที่กรอกไปแทนที่ สิ่งถัดไปที่ต้องทำคือ หาทางให้ WordPress เก็บรหัสผ่านที่ Apache เข้าใจ แต่ที่เลือกมาใช้คือ encode SHA1

เริ่มจากดาวโหลด plugins ไปติดตั้ง โดยตัวนี้แก้ไขเพิ่มจาก MD5 Password Hashes หน้าที่ของมันคือแปลงรหัสผ่านจากรูปแบบที่ WordPress ใช้ มาเป็น SHA1 ที่ Apache ต้องการหลังจากที่ User login จากนั้นก็กำหนด Location ของ service ต่าง ๆ ด้านบนให้มาใช้ตารางของ WordPress

<Location /feed>
  AuthType Basic
  AuthName "Wordpress"
  AuthBasicProvider dbd

  Require valid-user

  AuthDBDUserPWQuery \
    "SELECT user_pass FROM wp_users WHERE user_login = %s"
</Location>

reload Apache config อีกซักรอบแค่นี้ก็ใช้รหัสผ่านเดียวกันทั้งหมดแล้ว แถมยังเปลี่ยนรหัสผ่านจาก WordPress ได้เลยอีกด้วย

Link ทั้งหมด:

About llun

Just a programmer

, ,