ตั้งค่า Password ให้กับ mongoDB ก่อน Production

 Isaranu,  10.9.2017 , 

วันนี้จะมาสอนวิธีการตั้งค่า password บนฐานข้อมูล mongoDB ให้ทุกท่านที่กำลังจะนำไปใช้งานระดับ production กันนะครับ อันที่จริงแล้ว การนำไปใช้ระดับ production จะต้องมีการตั้งค่าอีกหลายๆอย่างมากกว่านี้ แต่การตั้ง password ป้องกันการเข้าถึง จากผู้ไม่ประสงค์ดีนั้น เป็นสิ่งแรกๆที่ต้องทำครับ

ในบทความนี้จะใช้ mongoDB version 3.4.2 ติดตั้งบน window server 2012 R2 และจะใช้ php ในการเขียน code ผ่าน extension pecl:mongodb เข้าถึงข้อมูลนะครับ (วิธีการตั้งตั้ง extension module php สำหรับ mongodb จะมาเล่าให้ฟังทีหลังจ้า) ส่วนใครใช้ภาษาอื่นๆก็ได้ ไม่ว่ากัน

การทดสอบอ่านข้อมูลผ่าน php จะใช้ postman
และสำหรับการดูข้อมูลบน mongoDB จะดูผ่าน Robomongo นะครับ.

ทำตาม step ตามนี้กันเลย
1. Start mongoDB โดยเข้าไปที่ C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe.




2. เปิด command prompt, แล้วก็เข้าไปที่ address ข้างบน จากนั้นก็เข้า mongo shell โดยพิมพ์ mongo เมื่อเข้ามาใน mongo shell แล้ว, ใช้คำสั่ง show dbs เพื่อแสดงชื่อฐานข้อมูล โดยปกติหลังจากการติดตั้งใหม่ จะมีฐานข้อมูลอยู่ 2 ตัวเป็นค่า default คือ admin และ local.


3. สร้าง user ใหม่ เพื่อใช้ในการเข้าถึงฐานข้อมูล ใช้คำสั่ง db.createUser ตามด้านล่างนี้.

db.createUser(
{
user: "name",
pwd: "pass",
roles: [{ role: "root", db:"admin"}]
}
)
ค่าที่ต้อง set ก็คือ
user: "ชื่อ user"
pwd: "password"
role: "ระดับในการเข้าถึงฐานข้อมูล"
db: "admin", ในที่นี้ ถ้าตั้งเป็น admin, user นี้จะสามารถเข้าใช้งานได้ทุกฐานข้อมูลย่อยใน mongodb

** command ให้พิมพ์ลงไปเลย เมื่อกด enter แต่ละบรรทัดแล้วจะเจอ '...' ไม่ต้องตกใจ ให้พิมพ์ code ต่อให้จบครับ เมื่อ syntax command ครบแล้ว มันจะประมวลผลเอง ในที่นี้คือวงเล็บตัวสุดท้าย **

หลังเพิ่ม user เสร็จ, จะปรากฏข้อความประมานนี้.

Successfully added user: {
  "user" : "username",
  "roles" : [
    {
      "role" : "root",
      "db" : "admin"
    }
  ]
}

3. กด ctrl+c เพื่อออกจาก mongo shell, แล้วทำการ restart mongoDB ใหม่ด้วยคำสั่งดังนี้
mongod --auth --port 27017 --dbpath /data/db
การใช้ --auth ต่อท้าย จะเป็นการ start ด้วยโหมด authentication และหลังจากนี้การเข้าถึงฐานข้อมูลทั้งหมด จะต้องใช้ username และ password ที่ตั้งค่าเอาไว้ครับ.



4. ลองเข้าถึงฐานข้อมูลด้วย Robomongo
ติดตั้ง Robomongo บน server กันก่อน. เสร็จแล้วทำการ connect local database กันเลย. ลอง connect แบบยังไม่ได้ใส่ password, จะเห็นว่า connect ไม่ได้นะครับ






งั้นเรามาใส่ password ดีกว่า. ใส่แล้วลองอีกครั้ง ก็จะ connect ได้.




5. ทดสอบ connect ฐานข้อมูลแบบการเขียน code ผ่าน php. จะ copy ด้านล่าง หรือจะเข้าไปที่  github:php-mongoldb-with-authenticate ก็ได้ครับ.
ลอง connect ธรรมดาโดยไม่ใส่ username และ password. ใช้ postman เรียกไปที่ไฟล์ ผลลัพธ์ที่ได้ จะไม่สามารถอ่านข้อมูลในฐานข้อมูลได้.

<?php

$req = $_SERVER['REQUEST_METHOD'];

if($req=='GET'){

  // Connect mongodb without password.
    $m = new MongoClient();
  // Connect mongodb with username and password (authentication mode)
    //$m = new MongoClient("mongodb://localhost", array("username" => "your-username", "password" => "your-password"));

  if($m){
    $db = $m->test_db;
    $collection = $db->test_collection;
    echo "mongodb connecting OK";
  }else {
    echo "mongodb connecting failed";
    exit();
  }

  // Read documen in collection.
  $cursor = $collection->find();
  echo nl2br("\n");

  foreach ($cursor as $doc) {
    var_dump($doc);
  }

}else {

}

?>

คราวนี้มาลองใส่ username, password ตามที่ตั้งค่าไป. โดยให้ comment คำสั่งเก่าแล้ว uncomment คำสั่งตัวนี้ครับ.
$m = new MongoClient("mongodb://localhost", array("username" => "your-username", "password" => "your-password")); และใช้ postman เรียกไปที่ไฟล์เหมือนเดิม.
ผลลัพธ์คราวนี้จะเห็นว่า สามารถเชื่อมต่อได้แล้ว.



นอกจากการตั้งค่า username, password ในการเข้าถึงฐานข้อมูลผ่าน authentication mode แล้ว. ยังมีวิธีอื่นๆอีกเช่น การตั้งค่าเลขพอร์ตจาก 27017 ให้เป็นเลขอื่นๆ เพื่อเข้าถึงได้เฉพาะ local เท่านั้น เป็นต้น. เอาเป็นว่าจะมาเล่าให้ฟังในบทความอื่นๆแล้วกันจ้า.

Isaranu.