ข้อคิดบางอย่างที่ได้หลังจากเหตุการณ์ Drupal.org ถูกแฮก

จาก

Important Security Update: Reset Your Drupal.org Password

Drupal.org ถูกแฮก รีเซ็ตรหัสผ่านผู้ใช้ทุกคน

เหตุการณ์ที่ Drupal.org ถูกแฮกนั้น เกิดจากเครื่องมือของผู้ให้บริการระบบที่ Drupal.org ที่ใช้บริการอยู่นั้นมีช่องโหว่ ทำให้ผู้เจาะระบบสามารถเข้าถึงฐานข้อมูลได้ โดยปัญหาที่เกิดขึ้นนี้ไม่ใช่ช่องโหว่ของ Drupal โดยตรงแต่อย่างใด ผู้ใช้งาน Drupal อยู่ตอนนี้สบายใจได้ (แต่ยังแนะนำให้ upgrade ตัว Drupal 7 ให้ไปใช้ Drupal 7.22 ซึ่งเป็นตัวล่าสุด)

สำหรับคนที่เป็นสมาชิก Drupal.org แบบผม ถึงแม้จะเอาข้อมูลผู้ใช้งานไปได้ แต่รหัสผ่านที่บันทึกไว้นั้นยังถูกนำไปผ่านกรรมวิธี hash และใช้ salt ร่วมด้วยเพื่อให้ได้ชุดข้อมูลเชิงเปรียบเทียบทางเดียว (ไม่สามารถแปลงกลับเป็นรหัสผ่านจริงๆ ได้อีก) แต่ก็มีรหัสผ่านบางส่วน (ที่เก่ามากๆ) มีแต่ hash อย่างเดียว (เป็นส่วนน้อย) จึงยังคงมีความปลอดภัยอยู่

แต่ทาง Drupal.org ยังแนะนำให้เข้าไปตั้งรหัสผ่านใหม่ เพื่อทำการสร้างชุด hash และ salt ใหม่อีกครั้งเพื่อความปลอดภัยและเพื่อป้องกันการใช้ชุดข้อมูลรหัสผ่านที่ถูกขโมยไปแล้ว ถูกนำไปผ่านกรรมวิธี rainbow hash cracking หรือการนำรหัสผ่านที่ได้จาก hash function ที่ยอดนิยมอย่าง md5 หรือ sha1 มาเปรียบเทียบกับ rainbow table แล้วย้อนกลับเป็นรหัสผ่านจริงๆ ได้อีกครั้ง โดยมักจะมีปัญหากับการใช้ hash กับรหัสผ่านโดยไม่มี salt มาช่วยในการ hash ตัวรหัสผ่านอีกรอบ

เหตุการณ์นี้ทำให้รู้ว่าบางครั้งระบบเราทำงานได้ดี และไม่มีช่องโหว่ใหญ่ๆ หรือแม้แต่เป็นช่องโหว่ที่ยังไม่เปิดเผยจนมีผลกระทบ แต่ก็ไม่สามารถรอดจากการถูกแฮกได้ ถ้าระบบที่ล้อมรอบหรือควบคุมระบบของเราชั้นนอกนั้น ดันมีช่องโหว่ที่สามารถเข้ามาผ่านทางช่องทางที่ไม่ปรกติได้ และช่องโหว่นั้นดันทำให้เกิดการเข้าถึงระบบของเราโดยไม่ผ่านระบบยืนยันตัวตน ซึ่งในไทยเราเจอบ่อยมากๆ ที่ระบบในส่วนของตัวเว็บไม่มีช่องโหว่ แต่ตัวระบบจัดการหลักของเว็บ หรือ Control Panel มีช่องโหว่ ก็เลยทำให้ระบบทั้งหมดอยู่บนความไม่ปลอดภัยไปด้วย

แก้ไขปัญหา Client does not support authentication protocol ใน MySQL

ใน MySQL 4.1 ขึ้นไปนั้น ได้ใช้ hashing algorithm ในการเก็บ password เพื่อใช้ในการ Authentication Protocol แบบใหม่ซึ่งทำให้ยังไม่สนับสนุนใน PHP หรือ software client ใน version เก่าๆ (หรือใหม่ๆ บางตัวก็ยังไม่สนับสนุน) ถ้าคุณ upgrade ไปเป็น MySQL 4.1 หรือสูงกว่า การติดต่อเพื่อเข้าไปใช้งานนั้น จะขึ้นข้อความว่า

Client does not support authentication protocol requested by server; consider upgrading MySQL client.

สาเหตุมาจากการที่ MySQL ได้ทำการปรับเปลี่ยนการเข้ารหัส password ใหม่อย่างที่ได้กล่าวไปแล้วโดย ถ้าใน MySQL version ก่อน 4.1 นั้นใช้การเข้ารหัสที่มีความยาว 16 bytes แต่ใน version ตั้งแต่ 4.1 ขึ้นมาถึงปัจจุบันนี้จะใช้การเข้ารหัสที่มีความยาว 41 bytes ซึ่ง client บางตัวยังไม่สนับสนุน password hashing algorithm แบบนี้ครับ ซึ่งการเข้ารหัส password ที่มีความยาว 41bytes นี้จะทำให้การถอดรหัสเพื่อทำการ hack ข้อมูลนั้นทำได้ยากขึ้นมากเลยทีเดียวครับ 

โดยถ้าเราเปรียบเทียบจากตัวก่อนหน้า version 4.1 จะได้

mysql> SELECT PASSWORD(‘mypass’);
+——————–+
| PASSWORD(‘mypass’) |
+——————–+
| 6f8c114b58f2ce9e |
+——————–+

แต่ถ้าเราใช้คำสั่งเดียวกันใน version หลังจาก 4.1 จะได้

mysql> SELECT PASSWORD(‘mypass’);
+———————————————–+
| PASSWORD(‘mypass’) |
+———————————————–+
| *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 |
+———————————————–+

จะเห็นความแตกต่างของการเข้ารหัส password ของ MySQL ครับ

การแก้ไขปัญหานี้ทำได้โดยการ

  • ทำการ upgrade ตัว client ที่ติดต่อกับ MySQL ให้เป็น version ที่สนับสนุน hashing algorithm ที่เก็บ password ใหม่ใน MySQL 4.1 ขึ้นไป (client ที่ว่านี้หมายถึง PHP MySQL Module, MySQL Front, PHPMyAdmin และตัวจัดการข้อมูลต่างๆ ที่เชื่อมต่อกับ MySQL ถือเป็น client ทั้งหมดครับ)

  • เมื่อทำการติดต่อกับ server โดยใช้ pre-4.1 client program ให้ใช้บัญชี username ที่ใช้ pre-4.1-style password แทนการใช้ username ที่ใช้ style password แบบเก่า

  • ทำการ Reset password ไปเป็น pre-4.1 style โดยใช้คำสั่ง SET PASSWORD และ OLD_PASSWORD() function โดยทำใน MySQL Command Line Client ซึ่งใช้คำสั่งดังนี้

mysql> SET PASSWORD FOR

-> ‘some_user‘@’some_host‘ = OLD_PASSWORD(‘newpwd‘);

  • some_host ให้เปลี่ยนเป็น hostname ที่ใช้เช่น localhost, 127.0.0.1, 192.168.0.1 หรือที่เป็น hostname นั้นๆ
  • some_user ให้เปลี่ยนเป็น username ที่ใช้เช่น root, admin หรือ username อื่นๆ ที่ต้องการ
  • newpwd ให้เป็นเป็น password ที่ใช้เช่น 1234, abcde หรือที่ต้องการ

ตัวอย่าง :

mysql> SET PASSWORD FOR

-> ‘root‘@’localhost‘ = OLD_PASSWORD(‘1234‘);

คือกำหนด password ใหม่ให้กับ root ที่ localhost โดยใช้ hashing algorithm password แบบเก่าโดยกำหนด password คือ 1234

แล้วทำการ UPDATE และ FLUSH PRIVILEGES โดยใช้สั่ง

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd‘)

-> WHERE Host = ‘some_host‘ AND User = ‘some_user‘;

mysql> FLUSH PRIVILEGES;

ตัวอย่าง :

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘1234‘)

-> WHERE Host = ‘localhost‘ AND User = ‘root‘;

mysql> FLUSH PRIVILEGES;

* ด้วยวิธีด้านบนนี้เหมาะสำหรับใช้ในกรณีที่มี user ที่อยู่ในฐานข้อมูลน้อยๆ เท่านั้น มิเช่นนั้นแล้วอาจจะต้องเปลี่ยนกันมืองึก -_-"

  • ถ้ามี user ในฐานข้อมูลมากๆ และการปรับเปลี่ยนวิธีด้านบนทั้งหมดเป็นการยากในการทำระบบฐานข้อมูลกลับมาใช้งานได้ปกติในเวลาอันสั้น เราสามารถบอกให้ MySQL ใช้ password hashing algorithm แบบเก่าตอน start-up service ได้เลย แต่แนะนำให้ใช้งานชั่วคราวเท่านั้นครับ และเมื่อมีเวลาให้ทำการปรับเปลี่ยนไปใช้ระบบ password hashing algorithm แบบใหม่แทน

    โดยเริ่มการทำงานของ mysqld ด้วย –old-passwords ที่เป็น option command

    ตัวอย่าง :

    c:\MySQL\bin\mysqld –old-passwords

อ้างอิงจาก A.2.3. Client does not support authentication protocol ใน MySQL 5.0 Reference Manual