[Penafian: Saya seorang profesional keamanan / crypto dan menangani pertanyaan arsitektur keamanan seperti ini setiap hari.]
Anda menemukan masalah dalam menyimpan kredensial sedemikian rupa sehingga proses yang tidak dijaga dapat mengaksesnya, tetapi penyerang tidak bisa. Ini adalah masalah yang sudah diketahui dan sangat sulit untuk dipecahkan.
Jika perangkat IoT Anda memiliki keystore perangkat keras yang terpasang di motherboard, seperti TPM, atau setara dengan Keystore yang didukung Android Hardware atau Apple Secure Enclave, maka Anda dapat menggunakannya.
Dengan server tradisional, Anda dapat menggunakan HSM atau Kartu Cerdas, tetapi satu-satunya solusi perangkat lunak lengkap yang saya ketahui adalah untuk mendapatkan kunci AES dari semacam "sidik jari perangkat keras" yang dibangun dengan menggabungkan nomor seri semua perangkat perangkat keras. Kemudian gunakan kunci AES untuk mengenkripsi kredensial. Sebuah proses yang berjalan di server yang sama dapat merekonstruksi kunci AES dan mendekripsi kredensial, tetapi begitu Anda mengekstrak file dari server, itu pada dasarnya tidak dapat didekripsi.
IOT melemparkan kunci pas ke dalam itu karena dua alasan:
Asumsi bahwa nomor seri perangkat keras adalah unik mungkin tidak berlaku, dan
Tidak seperti server, penyerang memiliki akses fisik ke perangkat, oleh karena itu mungkin bisa mendapatkan shell pada perangkat untuk menjalankan program dekripsi.
Enkripsi perangkat keras (TPM) dan enkripsi "sidik jari perangkat keras" paling tidak membingungkan karena, pada dasarnya, jika suatu proses lokal dapat mendekripsi data, maka seorang penyerang yang dapat menjalankan proses lokal itu juga dapat mendekripsi.
Jadi trik standar sepertinya tidak berfungsi di sini. Pertanyaan pertama yang perlu Anda tanyakan pada diri sendiri adalah:
- Apa model ancaman saya / di mana proyek ini berada pada
Secure <--> Convenient
skala?
Pada akhirnya, saya pikir Anda juga perlu memutuskan itu security > convenience
dan meminta seorang manusia memasukkan kredensial setelah setiap boot-up (menggunakan sesuatu seperti jawaban @ BenceKaulics ), atau Anda memutuskan itu security < convenience
dan hanya meletakkan kredensial pada perangkat, mungkin menggunakan sedikit kebingungan jika Anda merasa itu membuat perbedaan.
Ini adalah masalah sulit yang diperberat oleh sifat perangkat IoT.
Untuk kelengkapan, solusi industri lengkap untuk masalah ini adalah:
- Berikan setiap perangkat IoT kunci publik RSA yang unik pada waktu pembuatan. Rekam kunci publik ini dalam db terhadap nomor seri perangkat.
- Simpan kredensial sensitif di server yang tepat, sebut saja "gateway".
- Ketika perangkat IoT mengautentikasi ke gateway (menggunakan kunci RSA-nya), gateway membuka sesi untuk itu menggunakan kredensial yang disimpan dan menyerahkan token sesi kembali ke perangkat.
- Untuk keamanan terbaik, gateway adalah gateway fisik (atau VPN) sehingga semua lalu lintas dari perangkat IoT melewati gateway dan Anda memiliki kontrol lebih besar atas aturan dan hal-hal firewall - idealnya mencegah perangkat agar tidak langsung (non-VPN tunneled) akses ke internet.
Dengan cara ini, dan penyerang yang berkompromi dengan perangkat dapat membuka sesi, tetapi tidak pernah memiliki akses langsung ke kredensial.