โปรเจกต์นี้จะมาสาธิตโซลูชันความปลอดภัย IoT ของ Pod นั่นคือ SAFE2 applet กับโมดูล IoT ที่เรียบง่ายที่สุดอย่าง Arduino Nano กัน
SAFE2 applet ตัวนี้พัฒนามาจากแนวคิด GSMA IoT SAFE ที่ขยายออกไปอีกหน่อย เป้าหมายของมันคือการทำให้อุปกรณ์ IoT ราคาถูกและทรัพยากรจำกัด สามารถส่งข้อมูล Telemetry ไปยังเซิร์ฟเวอร์ได้อย่างปลอดภัย
IoT SAFE
GSMA เปิดตัว IoT SAFE applet ไปเมื่อ 3 ธันวาคม 2019 ไอเดียคือการทำให้โซลูชัน IoT ง่ายขึ้น โดยจัดเตรียมพื้นที่เก็บคีย์เข้ารหัสที่ปลอดภัย และสภาพแวดล้อมสำหรับรันฟังก์ชันการเข้ารหัสให้กับโปรโตคอล TLS
พูดง่ายๆ มันคือไลบรารีความปลอดภัยที่รันอยู่ในสภาพแวดล้อมที่ป้องกันไว้ โมเดลนี้ทำให้สถาปัตยกรรมของ IoT Application ค่อนข้างซับซ้อนนิดนึง เพราะอาจมีหลายชั้น เช่น ชั้น TLS, Middleware และ Security Element (SIM) ที่มี IoT SAFE applet อยู่ข้างใน

- TLS Layer: รับผิดชอบเรื่อง TLS handshake และการจัดการโปรโตคอล
- IoT SAFE Middleware: เป็นตัวกลางส่งคำสั่งจาก TLS Layer ไปยัง IoT SAFE applet
- IoT SAFE applet: ตัวหลักที่รันการคำนวณด้านการเข้ารหัส
SAFE2
โซลูชัน Pod SAFE2 ถูกพัฒนาขึ้นเพื่อทำให้การส่งข้อมูลจาก SIM ไปเซิร์ฟเวอร์ง่ายขึ้นอีกขั้น มันไม่ใช่แค่ไลบรารีเข้ารหัสธรรมดา แต่รวมการทำงานของโปรโตคอล TLS 1.3 ไว้ในตัวด้วย โดยใช้ฟังก์ชันของ SIM Toolkit
ข้อดีคือมันทำให้อินเตอร์เฟซระหว่างแอปพลิเคชันที่รวบรวมข้อมูล (เช่น IoT telemetry) กับ SAFE2 applet ง่ายขึ้นมากๆ แอปภายนอกแค่ส่งข้อมูลที่ต้องการส่งไปเซิร์ฟเวอร์ก็พอ

ใน IoT Application จะไม่ต้องมี TLS Layer แล้ว เพราะ Pod SAFE2 applet จัดการให้หมด SIM จะเป็นคนรับผิดชอบทุกขั้นตอนของโปรโตคอล ตั้งแต่การ resolve ชื่อโดเมน ไปจนถึงการลองส่งข้อมูลซ้ำจนกว่าจะถึงเซิร์ฟเวอร์
วิธีการส่งข้อมูลผ่าน SAFE2 applet:
Device Application ต้องส่งคำสั่งเฉพาะไปยัง SIM ผ่าน Modem Middleware โดยใช้ AT commands สำหรับการเข้าถึง SIM แบบเต็ม นั่นคือ AT+CSIM
ขั้นตอนคร่าวๆ มีดังนี้:
- เปิดช่องทางสื่อสารเสริม (Supplementary logical channel) ก่อน เพื่อไม่ให้รบกวน session GSM หลักระหว่างโมเด็มกับ SIM
- เลือก applet ในช่องทางใหม่นี้
- ส่งข้อมูลไปยัง applet ในช่องทางเดียวกัน
- ปิดช่องทางเพื่อนำกลับมาใช้ใหม่
คำสั่ง AT+CSIM ต้องเข้ารหัสคำสั่ง APDU ต่อไปนี้ให้กับ SIM ตามมาตรฐาน ISO/IEC 7816-4:
MANAGE CHANNEL(Open)SELECT(by name)PUT DATAพร้อมกับ tag เฉพาะ 'c1'MANAGE CHANNEL(Close)
เมื่อ SAFE2 applet ได้รับคำสั่ง PUT DATA พร้อมข้อมูลแอปพลิเคชัน มันจะสร้าง "งาน" สำหรับส่งขึ้นมา งานนี้ประกอบด้วยข้อมูลที่อยู่และข้อมูลแอปพลิเคชัน Applet จะพยายามทำงานนี้จนกว่าจะสำเร็จ ปัจจุบัน สำหรับแต่ละงาน เซิร์ฟเวอร์จะ resolve ชื่อโดเมน (ถ้าจำเป็น) และสร้าง session TLS 1.3 โดยใช้ Pre-Shared Key ที่เก็บไว้ใน SIM
Execution Log
มาดูตัวอย่าง Log การทำงานของ Demo Sketch กันดีกว่า ส่วนแรก: เป็นการตั้งค่าโมเด็ม รอการลงทะเบียนเครือข่าย และให้กระบวนการที่เกี่ยวข้องกับ GSM ในโมเด็มทำงานเสร็จ ส่วนที่สอง: การลงทะเบียน Device ID เพื่อตั้งค่าให้เสร็จสมบูรณ์ ส่วนสุดท้าย: การส่งข้อมูลให้กับ applet
15:35:05.588 -> nano started!
15:35:06.589 -> put 'at'
15:35:06.988 -> put 'at'
15:35:07.389 -> put 'at'
15:35:07.789 -> put 'at'
15:35:08.189 -> put 'at'
15:35:08.589 -> put 'at'
15:35:08.988 -> put 'at'
15:35:09.387 -> put 'at'
15:35:09.787 -> put 'at'
15:35:10.186 -> put 'at'
15:35:10.286 -> at
15:35:10.319 -> OK
15:35:10.386 ->
15:35:10.386 -> +CFUN: 1
15:35:10.485 ->
15:35:10.519 -> +CPIN: READY
15:35:10.651 ->
15:35:10.685 -> SMS Ready
15:35:11.581 -> put 'at+creg?'
15:35:11.581 -> 0:2
15:35:11.581 -> cntr: 0
15:35:13.074 -> put 'at+creg?'
15:35:13.074 -> 0:2
15:35:13.074 -> cntr: 0
15:35:14.600 -> put 'at+creg?'
15:35:14.600 -> 0:5
15:35:14.600 -> cntr: 1
15:35:16.093 -> put 'at+creg?'
15:35:16.093 -> 0:5
15:35:16.093 -> cntr: 2
15:35:17.587 -> put 'at+creg?'
15:35:17.587 -> 0:5
15:35:17.587 -> cntr: 3
15:35:19.080 -> put 'at+creg?'
15:35:19.113 -> 0:5
15:35:19.113 -> cntr: 4
15:35:20.606 -> put 'at+creg?'
15:35:20.606 -> 0:5
15:35:20.606 -> cntr: 5
15:35:22.099 -> put 'at+creg?'
15:35:22.099 -> 0:5
15:35:22.099 -> cntr: 6
15:35:23.592 -> put 'at+creg?'
15:35:23.625 -> 0:5
15:35:23.625 -> cntr: 7
15:35:24.621 -> setup finished
15:35:24.621 -> at+csim=10,"0070000001"
15:35:24.621 -> +CSIM: 6,"019000"
15:35:24.621 ->
15:35:24.621 -> OK
15:35:24.654 -> at+csim=34,"01A404000CF0706F646773616665320101"
15:35:24.654 -> +CSIM: 4,"9000"
15:35:24.654 ->
15:35:24.654 -> OK
15:35:24.787 -> at+csim=30,"01DA02C00A51523143572089723526"
15:35:24.787 -> +CSIM: 4,"9000"
15:35:24.787 ->
15:35:24.787 -> OK
15:35:24.820 -> at+csim=10,"0070800100"
15:35:24.820 -> +CSIM: 4,"9000"
15:35:24.820 ->
15:35:24.820 -> OK
15:35:24.820 -> Set DeviceID: OK
15:35:24.821 -> Humidity: 40
15:35:24.821 -> Temperature: 25
15:35:24.821 ->
15:35:24.821 -> HT data:00280019
15:35:24.821 -> at+csim=10,"0070000001"
15:35:24.821 -> +CSIM: 6,"019000"
15:35:24.821 ->
15:35:24.821 -> OK
15:35:24.854 -> at+csim=34,"01A404000CF0706F646773616665320101"
15:35:24.854 -> +CSIM: 4,"9000"
15:35:24.854 ->
15:35:24.854 -> OK
15:35:25.650 -> at+csim=18,"01DA02C10400280019"
15:35:25.650 -> +CSIM: 4,"9000"
15:35:25.650 ->
15:35:25.650 -> OK
15:35:25.650 -> at+csim=10,"0070800100"
15:35:25.650 -> +CSIM: 4,"9000"
15:35:25.650 ->
15:35:25.650 -> OK
Data Stored
ทีนี้เรามาตรวจสอบข้อมูลที่เก็บไว้ในเซิร์ฟเวอร์กัน โดยส่งคำขอ https ไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์ก็จะตอบกลับด้วยข้อมูลแบบนี้
[
{
"sim_attribute_update_id": 11,
"iccid": "894450250918638963",
"deviceid": "51523143572089723526",
"createdAt": "2020-10-01",
"updatedAt": "2020-10-01",
"sim_attributes": [
{
"id": 5,
"sim_attribute_update_id": 11,
"key": "data",
"value": "00280019",
"createdAt": "2020-10-01",
"updatedAt": "2020-10-01"
}
]
}
]
EXPANDED TECHNICAL DETAILS
Secure Communication Layer
การนำ Transport Layer Security (TLS 1.3) มาใช้บนบอร์ดจำกัดอย่าง Arduino Nano ถือเป็นการฝึกฝนขั้นสูงในเรื่องการจัดการหน่วยความจำและการเข้ารหัสเลยทีเดียว
- Handshake Protocol: ระบบจะจัดการการจับมือแบบเข้ารหัส (encrypted handshake) ซึ่งรวมถึงการแลกเปลี่ยนคีย์และการตรวจสอบใบรับรอง เพื่อให้ทำงานใน RAM ของ Nano ได้ ต้องใช้ไลบรารี SSL/TLS ที่เบา เช่น WolfSSL หรือ BearSSL
- Encryption Algorithms: ใช้อัลกอริธึมการเข้ารหัสสมัยใหม่ เช่น AES-GCM หรือ ChaCha20-Poly1305 เพื่อความสมบูรณ์และความลับของข้อมูล ทำให้สามารถเชื่อมต่อ IoT อย่างปลอดภัยไปยังเซิร์ฟเวอร์ HTTPS หรือ MQTT broker ที่มีการป้องกันได้