ขออภัย เบราว์เซอร์ของคุณไม่รองรับ JavaScript!
เข้าสู่ระบบ

Local Admin Security สำหรับมิเตอร์พลังงาน IAMMETER: คู่มือผู้ใช้

Local Admin Security: คู่มือผู้ใช้

โมดูล Local Admin Security ใช้งานได้ตั้งแต่เฟิร์มแวร์ i.91.065.3 เป็นต้นไป

วัตถุประสงค์

โมดูลนี้ป้องกันส่วนติดต่อ Web UI ภายในและ API ภายในที่สำคัญของอุปกรณ์จากการเข้าถึงโดยไม่ได้รับอนุญาต

หลังจากเปิดใช้แล้ว จะต้องระบุชื่อผู้ใช้และรหัสผ่านผู้ดูแลระบบสำหรับ:

  • Set API ทั้งหมดที่มีในหน้าทดสอบ WEM API
  • GET API ที่ส่งคืนข้อมูลการตั้งค่าที่สำคัญหรือดำเนินการที่สำคัญ
  • การอัปโหลดและอัปเกรดเฟิร์มแวร์ OTA ภายใน

รวมถึงการเปลี่ยนการตั้งค่าเครือข่ายหรือการอัปโหลด การอัปเดตเฟิร์มแวร์ การรีสตาร์ทอุปกรณ์ การคืนค่าโรงงาน และการแก้ไขพารามิเตอร์สำคัญอื่นๆ

โมดูลนี้มีความสามารถดังต่อไปนี้:

  • กำหนดชื่อผู้ใช้และรหัสผ่านผู้ดูแลระบบได้
  • ใช้ HTTP Basic Authentication กับ API ภายในที่ได้รับการป้องกัน
  • เปลี่ยนข้อมูลรับรองผ่าน Web UI หรือ API
  • กู้คืนด้วยลายเซ็น Ed25519 เมื่อผู้ดูแลระบบลืมรหัสผ่าน

คุณสมบัตินี้ถูกปิดไว้เป็นค่าเริ่มต้นเพื่อให้เข้ากันได้กับเฟิร์มแวร์รุ่นก่อน ต้องเปิดใช้และตั้งค่าก่อนการป้องกันการเข้าถึงจึงจะมีผล

Web UI ภายในปัจจุบันใช้ HTTP โดย HTTP Basic Authentication เข้ารหัสข้อมูลรับรองในรูปแบบ encoding แต่ไม่ได้เข้ารหัสลับ โปรดใช้คุณสมบัตินี้บนเครือข่ายภายในที่เชื่อถือได้ เว้นแต่จะเข้าถึงอุปกรณ์ผ่านกลไกการรับส่งข้อมูลที่ปลอดภัยเพิ่มเติม

ตั้งค่า Admin Security ใน Web UI

  1. เปิดที่อยู่ IP ของอุปกรณ์ในเบราว์เซอร์
  2. เลือกแท็บ Security
  3. ป้อนชื่อผู้ใช้ผู้ดูแลระบบ
  4. ป้อนและยืนยันรหัสผ่าน
  5. เลือก Enable Admin Security

ชื่อผู้ใช้และรหัสผ่านต้องเป็นไปตามกฎต่อไปนี้:

  • ความยาว 1 ถึง 32 ตัวอักษร
  • ใช้เฉพาะอักขระ ASCII ที่มองเห็นได้
  • ห้ามใช้เครื่องหมายทวิภาค (:), อัญประกาศคู่ (") หรือแบ็กสแลช (\)

หลังจากเปิดใช้ Admin Security เบราว์เซอร์จะแสดงหน้าต่างยืนยันตัวตนเมื่อเข้าถึงหน้าหรือ API ที่ได้รับการป้องกัน ให้ป้อนชื่อผู้ใช้และรหัสผ่านที่ตั้งไว้

แท็บ Security ยังใช้เพื่อ:

  • เปลี่ยนชื่อผู้ใช้และรหัสผ่านผู้ดูแลระบบ
  • ตรวจสอบว่าเปิดใช้การยืนยันตัวตนแล้ว
  • เปิดหรือปิดบริการ Modbus/TCP บนพอร์ต 502
  • เปิดหรือปิดการค้นหา SSDP
  • ปิด Admin Security หลังจากยืนยันตัวตนด้วยข้อมูลรับรองปัจจุบัน

แท็บ Security ของ Web UI ภายใน IAMMETER แสดงการตั้งค่าข้อมูลรับรองผู้ดูแลระบบและสวิตช์บริการ Modbus TCP กับ SSDP

การเปลี่ยนสถานะบริการ Modbus/TCP หรือ SSDP ต้องรีสตาร์ทอุปกรณ์ หากเฟิร์มแวร์รุ่นก่อนไม่เคยบันทึกการตั้งค่าเหล่านี้ บริการทั้งสองจะเปิดไว้เป็นค่าเริ่มต้นเพื่อรองรับการทำงานร่วมกับรุ่นก่อน

เบราว์เซอร์อาจแคชข้อมูล Basic Authentication สำหรับที่อยู่อุปกรณ์ หลังเปลี่ยนรหัสผ่าน เบราว์เซอร์อาจลองข้อมูลเดิมก่อนแสดงหน้าต่างยืนยันตัวตนใหม่ การปิดหน้าต่างเบราว์เซอร์ทั้งหมดหรือใช้หน้าต่างส่วนตัวสามารถบังคับให้เข้าสู่ระบบใหม่ได้

API ที่ไม่ต้องใช้ Basic Authentication

Endpoint ต่อไปนี้ยังเข้าถึงได้โดยไม่ต้องมีส่วนหัว Basic Authentication เพื่อให้ Web UI โหลดข้อมูลพื้นฐานและให้กระบวนการกู้คืนแบบลงลายเซ็นทำงานได้:

เมธอด Endpoint วัตถุประสงค์
GET /api/admin/status ส่งคืนสถานะ Admin Security และการรองรับการกู้คืนแบบลงลายเซ็น
GET /api/admin/recovery_challenge สร้าง payload กู้คืนแบบใช้ครั้งเดียวเฉพาะอุปกรณ์
GET /api/getbrand ส่งคืนการตั้งค่าแบรนด์ของ Web UI ภายใน
GET /api/monitor ส่งคืนข้อมูลตรวจสอบอุปกรณ์และมิเตอร์ปัจจุบันที่ Web UI ใช้
GET /api/monitorjson ส่งคืนข้อมูลตรวจสอบรูปแบบเดิมผ่านเส้นทางที่เข้ากันได้ /api
GET /monitorjson ส่งคืนข้อมูลตรวจสอบรูปแบบเดิม
GET /api/sntpstatus ส่งคืนสถานะ SNTP ปัจจุบัน
GET /info.xml ส่งคืนข้อมูลอุปกรณ์ในรูปแบบ UPnP
POST /api/admin/recovery ตรวจสอบลายเซ็นกู้คืนของ IAMMETER และล้างข้อมูลรับรองที่ลืม

สามารถเรียก POST /api/admin/enable โดยไม่ใช้ Basic Authentication ได้เช่นกันเมื่อ Admin Security ปิดอยู่ เนื่องจากเป็น endpoint สำหรับการตั้งค่าครั้งแรก หากเปิดใช้อยู่แล้ว ต้องใช้ข้อมูลรับรองผู้ดูแลระบบปัจจุบันที่ถูกต้องเพื่อเปลี่ยนหรือปิดการตั้งค่า

ไฟล์ Web UI แบบ static และทรัพยากร GET อื่นที่ไม่ได้อยู่ใต้ /api/ ไม่ใช่ API endpoint และยังอ่านได้แบบสาธารณะ API ภายในอื่นทั้งหมดจะได้รับการป้องกันเมื่อเปิด Admin Security รวมถึง Set API, GET API ที่สำคัญ และการดำเนินการ OTA

เอกสารอ้างอิง API

GET /api/admin/status

ส่งคืนสถานะ Admin Security ปัจจุบัน ไม่ต้องยืนยันตัวตน

ตัวอย่าง:

{
  "enabled": 1,
  "hasPassword": 1,
  "recoverySupported": 1,
  "modbusTcpEnabled": 1,
  "ssdpEnabled": 1
}

ฟิลด์:

  • enabled: 1 เมื่อเปิด Admin Security มิฉะนั้นเป็น 0
  • hasPassword: 1 เมื่อกำหนดข้อมูลรับรองแล้ว
  • recoverySupported: 1 เมื่อเฟิร์มแวร์รองรับการกู้คืนแบบลงลายเซ็น
  • modbusTcpEnabled: 1 เมื่อเปิด Modbus/TCP บนพอร์ต 502
  • ssdpEnabled: 1 เมื่อเปิดการค้นหา SSDP

POST /api/admin/enable

เปิดหรือปิด Admin Security

เปิดใช้งาน:

POST /api/admin/enable
Content-Type: application/json

{
  "enable": 1,
  "username": "admin",
  "password": "ExamplePassword"
}

ตัวอย่าง curl:

curl -X POST "http://<device-ip>/api/admin/enable" \
  -H "Content-Type: application/json" \
  -d '{"enable":1,"username":"admin","password":"ExamplePassword"}'

ปิดใช้งาน:

POST /api/admin/enable
Authorization: Basic <base64-credentials>
Content-Type: application/json

{
  "enable": 0
}

หากเปิด Admin Security อยู่ ต้องใช้ข้อมูล Basic Authentication ปัจจุบันที่ถูกต้อง

curl -X POST "http://<device-ip>/api/admin/enable" \
  -u admin:ExamplePassword \
  -H "Content-Type: application/json" \
  -d '{"enable":0}'

POST /api/admin/password

เปลี่ยนชื่อผู้ใช้และรหัสผ่าน API นี้จะได้รับการป้องกันหลังเปิด Admin Security

POST /api/admin/password
Authorization: Basic <current-base64-credentials>
Content-Type: application/json

{
  "username": "newadmin",
  "password": "NewExamplePassword"
}
curl -X POST "http://<device-ip>/api/admin/password" \
  -u admin:ExamplePassword \
  -H "Content-Type: application/json" \
  -d '{"username":"newadmin","password":"NewExamplePassword"}'

หลังคำขอสำเร็จ ให้ใช้ข้อมูลรับรองใหม่กับคำขอที่ได้รับการป้องกันครั้งต่อไป

GET /api/admin/check

ตรวจสอบความถูกต้องของข้อมูล Basic Authentication

curl -u admin:ExamplePassword \
  "http://<device-ip>/api/admin/check"

การตอบกลับเมื่อสำเร็จ:

{
  "successful": 1
}

หากไม่มีข้อมูลรับรองหรือข้อมูลไม่ถูกต้อง จะได้รับ HTTP 401 Unauthorized

GET /api/admin/recovery_challenge

สร้าง payload กู้คืนแบบใช้ครั้งเดียวเฉพาะอุปกรณ์ ไม่ต้องยืนยันตัวตน เพราะ endpoint นี้ไม่สามารถรีเซ็ตข้อมูลรับรองได้ด้วยตนเอง

{
  "successful": 1,
  "alg": "ed25519",
  "payload": "reset_admin|DEVICE_SN|DEVICE_MAC|ONE_TIME_NONCE"
}

ต้องส่งค่า payload ที่ได้รับให้ IAMMETER เมื่อต้องการกู้คืนสิทธิ์ผู้ดูแลระบบ

การขอ challenge ใหม่จะทำให้ challenge เดิมใช้ไม่ได้ และ challenge จะใช้ไม่ได้หลังการกู้คืนสำเร็จหรือรีสตาร์ทอุปกรณ์

POST /api/admin/recovery

ส่ง payload กู้คืนและลายเซ็น Ed25519 ที่ IAMMETER จัดเตรียมให้

POST /api/admin/recovery
Content-Type: application/json

{
  "payload": "reset_admin|DEVICE_SN|DEVICE_MAC|ONE_TIME_NONCE",
  "signature": "128-hex-character-ed25519-signature"
}
curl -X POST "http://<device-ip>/api/admin/recovery" \
  -H "Content-Type: application/json" \
  -d '{"payload":"reset_admin|DEVICE_SN|DEVICE_MAC|ONE_TIME_NONCE","signature":"<signature-from-IAMMETER>"}'

หากตรวจสอบลายเซ็นสำเร็จ อุปกรณ์จะล้างข้อมูลรับรองภายในและปิด Admin Security จากนั้นจึงตั้งชื่อผู้ใช้และรหัสผ่านใหม่ได้

หากอุปกรณ์มีหน่วยความจำว่างไม่พอสำหรับตรวจสอบลายเซ็น API จะส่งคืนข้อมูลลักษณะนี้:

{
  "successful": 0,
  "message": "low memory, please change to standalone mode",
  "freeMemory": 18000,
  "minFreeRequired": 28000
}

ในกรณีนี้ ให้ลดการใช้หน่วยความจำและขอ challenge ใหม่ก่อนลองอีกครั้ง หากไม่มีรหัสผ่านและไม่สามารถเปลี่ยนโหมดการทำงานได้ ให้รีสตาร์ทอุปกรณ์และกู้คืนก่อนที่การเชื่อมต่อ MQTTS หรือ HTTPS จะใช้หน่วยความจำเพิ่มเติม

การกู้คืนรหัสผ่านทำงานอย่างไร

การออกแบบนี้หลีกเลี่ยงการเพิ่มคำสั่งคืนค่าโรงงานที่ไม่ต้องยืนยันตัวตน ซึ่งอาจใช้ข้ามการป้องกันของผู้ดูแลระบบได้

กระบวนการใช้คู่กุญแจ Ed25519 แบบสาธารณะ/ส่วนตัว:

  • เฟิร์มแวร์มีเฉพาะกุญแจสาธารณะสำหรับการกู้คืนของ IAMMETER
  • IAMMETER เก็บกุญแจส่วนตัวที่ตรงกันไว้ และไม่ได้จัดเก็บบนอุปกรณ์
  • อุปกรณ์สร้าง payload ที่มีการดำเนินการ หมายเลข SN, MAC และ nonce แบบใช้ครั้งเดียว
  • IAMMETER ลงลายเซ็น payload นั้นด้วยกุญแจส่วนตัว
  • อุปกรณ์ตรวจสอบลายเซ็นด้วยกุญแจสาธารณะที่ฝังไว้
  • เฉพาะลายเซ็นที่ถูกต้องสำหรับอุปกรณ์และ nonce ปัจจุบันเท่านั้นที่ล้างการตั้งค่าได้

nonce ถูกเก็บไว้ใน RAM เท่านั้น และจะใช้ไม่ได้เมื่ออุปกรณ์รีสตาร์ท เมื่อขอ challenge อื่น หรือหลังการกู้คืนสำเร็จ จึงไม่สามารถนำ payload และลายเซ็นเก่ากลับมาใช้ในภายหลังได้

สถานการณ์การใช้งาน

สถานการณ์ที่ 1: ตั้งชื่อผู้ใช้และรหัสผ่านผู้ดูแลระบบ

วิธีที่ง่ายที่สุดคือใช้ Web UI:

  1. เปิด http://<device-ip>/
  2. เปิดแท็บ Security
  3. ป้อนชื่อผู้ใช้และรหัสผ่านใหม่
  4. ยืนยันรหัสผ่าน
  5. เปิด Admin Security

สามารถทำผ่าน POST /api/admin/enable ได้เช่นกัน:

curl -X POST "http://<device-ip>/api/admin/enable" \
  -H "Content-Type: application/json" \
  -d '{"enable":1,"username":"admin","password":"ExamplePassword"}'

ตรวจสอบผลลัพธ์:

curl "http://<device-ip>/api/admin/status"

สถานการณ์ที่ 2: เข้าถึง API ที่ได้รับการป้องกันด้วย Basic Authentication

สำหรับคำขอที่ได้รับการป้องกันแต่ละครั้ง ให้ส่งชื่อผู้ใช้และรหัสผ่านในส่วนหัว HTTP Basic Authentication

Authorization: Basic Base64(username:password)

ตัวอย่างเช่น นำ admin:ExamplePassword มารวมกันแล้วเข้ารหัส Base64 โดยไคลเอนต์ HTTP ส่วนใหญ่ดำเนินการให้อัตโนมัติ

ใช้ curl:

curl -u admin:ExamplePassword \
  "http://<device-ip>/api/getadv"

ใช้ส่วนหัวโดยตรง:

TOKEN=$(printf '%s' 'admin:ExamplePassword' | base64)

curl "http://<device-ip>/api/getadv" \
  -H "Authorization: Basic ${TOKEN}"

สำหรับคำขอ JSON POST:

curl -X POST "http://<device-ip>/api/setadv" \
  -u admin:ExamplePassword \
  -H "Content-Type: application/json" \
  -d '<setadv-json-body>'

เบราว์เซอร์จะจัดการส่วนหัวนี้โดยอัตโนมัติหลังผู้ดูแลระบบป้อนข้อมูลในหน้าต่าง Basic Authentication

Web UI ปัจจุบันอัปโหลดเฟิร์มแวร์ไปยัง POST /api/ota_successful.html ส่วน endpoint เดิม POST /ota_successful.html ยังคงใช้ได้กับ Web UI รุ่นเก่าและเครื่องมือภายนอก ทั้งสองต้องใช้ Basic Authentication เมื่อเปิด Admin Security

หากปิดหน้าต่างยืนยันตัวตน แท็บต่างๆ จะทำงานดังนี้:

  • Settings และ Wi-Fi ไม่สามารถโหลด API การตั้งค่าที่ได้รับการป้องกันและจะแสดงข้อความยืนยันตัวตน
  • System ยังคงแสดง SN, MAC และเวอร์ชันเฟิร์มแวร์ได้ เนื่องจากข้อมูลมาจาก /api/monitor แบบสาธารณะ แต่การอัปโหลด OTA ยังได้รับการป้องกัน
  • Security ยังคงแสดงสถานะพื้นฐานได้จาก /api/admin/status แต่การเปลี่ยนข้อมูลรับรองและสวิตช์บริการยังได้รับการป้องกัน

สถานการณ์ที่ 3: กู้คืนการเข้าถึงหลังลืมรหัสผ่าน

อุปกรณ์ไม่มีปุ่มรีเซ็ตฮาร์ดแวร์ เพื่อหลีกเลี่ยงฟังก์ชันที่ไม่ต้องยืนยันตัวตนและอาจข้าม Admin Security อุปกรณ์จึงใช้กลไกกู้คืนแบบลงลายเซ็นที่อธิบายข้างต้น

ขั้นตอนนี้มีไว้เฉพาะเมื่อผู้ใช้ลืมทั้งชื่อผู้ใช้และรหัสผ่าน ควรเก็บข้อมูลรับรองไว้ในที่ปลอดภัยและไม่ใช้การกู้คืนสำหรับการเปลี่ยนข้อมูลตามปกติ หากยังมีข้อมูลปัจจุบัน ให้เปลี่ยนจากแท็บ Security หรือใช้ POST /api/admin/password

  1. ขอ challenge ใหม่จากอุปกรณ์:

    curl "http://<device-ip>/api/admin/recovery_challenge"
    
  2. คัดลอกค่า payload ทั้งหมด ห้ามแก้ไข SN, MAC, nonce, ตัวคั่น หรือตัวพิมพ์เล็ก/ใหญ่

  3. ติดต่อฝ่ายสนับสนุน IAMMETER ที่ support@devicebit.com และส่ง payload ทั้งหมด

  4. หลังยืนยันความเป็นเจ้าของหรือสิทธิ์ในการรับบริการ IAMMETER จะลงลายเซ็น payload และส่งลายเซ็น Ed25519 กลับ

  5. ส่ง payload เดิมและลายเซ็นกลับไปยังอุปกรณ์:

    curl -X POST "http://<device-ip>/api/admin/recovery" \
      -H "Content-Type: application/json" \
      -d '{"payload":"<original-payload>","signature":"<signature-from-IAMMETER>"}'
    
  6. หลังได้รับการตอบกลับสำเร็จ Admin Security จะถูกปิดและข้อมูลรับรองเดิมจะถูกล้าง เปิดแท็บ Security หรือเรียก POST /api/admin/enable เพื่อตั้งข้อมูลใหม่

อย่ารีสตาร์ทอุปกรณ์หรือขอ challenge อื่นระหว่างรอลายเซ็น เพราะทั้งสองกรณีจะทำให้ payload ใช้ไม่ได้และต้องเริ่มกระบวนการกู้คืนใหม่

ด้านบน