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
- เปิดที่อยู่ IP ของอุปกรณ์ในเบราว์เซอร์
- เลือกแท็บ Security
- ป้อนชื่อผู้ใช้ผู้ดูแลระบบ
- ป้อนและยืนยันรหัสผ่าน
- เลือก Enable Admin Security
ชื่อผู้ใช้และรหัสผ่านต้องเป็นไปตามกฎต่อไปนี้:
- ความยาว 1 ถึง 32 ตัวอักษร
- ใช้เฉพาะอักขระ ASCII ที่มองเห็นได้
- ห้ามใช้เครื่องหมายทวิภาค (
:), อัญประกาศคู่ (") หรือแบ็กสแลช (\)
หลังจากเปิดใช้ Admin Security เบราว์เซอร์จะแสดงหน้าต่างยืนยันตัวตนเมื่อเข้าถึงหน้าหรือ API ที่ได้รับการป้องกัน ให้ป้อนชื่อผู้ใช้และรหัสผ่านที่ตั้งไว้
แท็บ Security ยังใช้เพื่อ:
- เปลี่ยนชื่อผู้ใช้และรหัสผ่านผู้ดูแลระบบ
- ตรวจสอบว่าเปิดใช้การยืนยันตัวตนแล้ว
- เปิดหรือปิดบริการ Modbus/TCP บนพอร์ต 502
- เปิดหรือปิดการค้นหา SSDP
- ปิด Admin Security หลังจากยืนยันตัวตนด้วยข้อมูลรับรองปัจจุบัน

การเปลี่ยนสถานะบริการ 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 มิฉะนั้นเป็น0hasPassword:1เมื่อกำหนดข้อมูลรับรองแล้วrecoverySupported:1เมื่อเฟิร์มแวร์รองรับการกู้คืนแบบลงลายเซ็นmodbusTcpEnabled:1เมื่อเปิด Modbus/TCP บนพอร์ต 502ssdpEnabled: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:
- เปิด
http://<device-ip>/ - เปิดแท็บ Security
- ป้อนชื่อผู้ใช้และรหัสผ่านใหม่
- ยืนยันรหัสผ่าน
- เปิด 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
ขอ challenge ใหม่จากอุปกรณ์:
curl "http://<device-ip>/api/admin/recovery_challenge"คัดลอกค่า
payloadทั้งหมด ห้ามแก้ไข SN, MAC, nonce, ตัวคั่น หรือตัวพิมพ์เล็ก/ใหญ่ติดต่อฝ่ายสนับสนุน IAMMETER ที่
support@devicebit.comและส่ง payload ทั้งหมดหลังยืนยันความเป็นเจ้าของหรือสิทธิ์ในการรับบริการ IAMMETER จะลงลายเซ็น payload และส่งลายเซ็น Ed25519 กลับ
ส่ง payload เดิมและลายเซ็นกลับไปยังอุปกรณ์:
curl -X POST "http://<device-ip>/api/admin/recovery" \ -H "Content-Type: application/json" \ -d '{"payload":"<original-payload>","signature":"<signature-from-IAMMETER>"}'หลังได้รับการตอบกลับสำเร็จ Admin Security จะถูกปิดและข้อมูลรับรองเดิมจะถูกล้าง เปิดแท็บ Security หรือเรียก
POST /api/admin/enableเพื่อตั้งข้อมูลใหม่
อย่ารีสตาร์ทอุปกรณ์หรือขอ challenge อื่นระหว่างรอลายเซ็น เพราะทั้งสองกรณีจะทำให้ payload ใช้ไม่ได้และต้องเริ่มกระบวนการกู้คืนใหม่