Help us understand the problem. What is going on with this article?

Raspberry Pi で casual な tampering ぐらいには耐える程度に secure な SDカードをつくる

More than 1 year has passed since last update.

はじめに

言い訳がましいタイトルで申し訳ないところではございます
デバイスドライバ(これをどうやって悪いのと置き換えるのかが悪の起点でしたよね)が SDカード上でむき出しな上に、(最近はどうなっているのかよくしりませんが)起動時に pi アカウントのパスワードの変更までできた Raspbian で「セキュアな環境の構築」って、鍵を掛ける習慣のない島で防犯考えるぐらい無理があるのも事実です

とはいえ、Raspberry Pi で実用的な装置の構築を依頼されると「無理です」では済まず

  • アカウントやクレデンシャルみたいに盗られたらまずい情報をどこに置いたらいいのか。5分間デバイスを止めてSDカードまるごとコピーされたら全部持って行かれるのに
  • SDカードをコピーされて別の Raspberry Pi で起動されたらどうするのか
  • アプリケーションそのものをマリシャスなユーザーからどうやって保護するのか

特に最後の奴なんか、実はお客様自身が一番マリシャスだったという笑い事じゃない事例もございまして、別の業者に依頼してまで tamper なされますので深刻でございます
同業者の皆様、どのように御対処されておりますでしょうか?

ご参考まで私の場合、以下のように対処しております

  1. 暗号化ストレージ
  2. SD カードのコピープロテクション
  3. Server Side Device Programing1

ID やクレデンシャル、センサーで取得されたデータを、SDカードごと一気にコピーされる事を 1. で防ぐ
コピーした SD カードで別の Raspberry Pi を起動する事を 2. で防ぐ
私のアプリケーションを3. で守る

このような話にどの程度ニーズがあるのかよくわからないので本稿は試しに 1. についてのみご紹介させていただければと存じます
2. と 3. については future works とさせていただければ幸いです

暗号化ストレージ

一言で言ってしまうとサーバでよく使われる LUKS を Raspberry Pi の SD カードでも使ってます、というだけの話でございます

暗号化されたパーティションは悪意の第三者にコピーされても中身を見ることはできません
マウントした後は普通のストレージと同じように使うことができます
なので、起動後に悪い人にログインされると無力ですが、ssh とかで守れているという前提ではセキュアであるあたりが、タイトルの「casual な tampering ぐらいには」につながっています

組み込みデバイスでの利用実績

サーバではなく組み込み Linux で暗号化ストレージを使うのは実はかなり昔から casual attack を防ぐ目的でいろいろと使っていて、たとえば有料動画の再生アプリとかがコンテンツの暗号鍵とか、復号後のコンテンツ自体をセキュアに保存する目的で使ってたりしてました

私自身も Raspbian 上に暗号化パーティションをつくってそこに置いたアプリケーションを5分間隔で実行するようなアプリケーションを何年も前からお客様にご提供しておりますが、暗号化ストレージが原因で起きたトラブルはまだ一件もありません

暗号化ストレージの作り方

詳細につきましては Qiita の先輩諸兄諸姉の良い記事が洛陽の紙価を高める程潤沢に上梓されてございますのでそちらをご参照いただく事をお願いさせていただきますものと致しまして、Raspberry Pi に特有の注意点を何点かご紹介させていただくのに留めさせていただきます

パーティションの操作は Raspberry Pi 自身でやったほうが便利だし安全です

これまでもこちらとかでご説明させていただきましたが、Raspbina の SD カードのパーティションの操作は Raspberry Pi 自身でやったほうが楽ですし安全です

暗号化パーティションは mmcblk0p2 をずらして mmcblk0p1 と mmcblk0p2 の間に作ったほうが自由度が高いです

こんな感じで、Linux のファイルシステムが入っている mmcblk0p2 を後ろにずらして、できた隙間に
セキュアストレージを作るように一手間かけておくと
2018-11-26 11.06.37.jpg

サイズの大きい SD カードで使う時に、Linux のパーティションのサイズを広げるのが楽です
それはそうとして、凄いモアレってる...

暗号化ストレージのマウントに crypttab とか絶対に使わない

Server だと起動時に crypttab ファイルに自動マウントするように設定を書くことが多いと思いますが、Raspbian でそんな事してると、コピーした SD カードをじっくり眺める悪意の第三者にキーファイルが簡単にバレちゃいます ^^;;;
めんどくさくても自分で cryptsetup luksOpen する処理を書いて、これを暗号化するなり難読化するなりした上で起動シーケンスのどこかに紛れ込ませて秘すようにしておく必要があります

threat of validity

internal validity: 暗号化ストレージなんか使わなくても単に個々のファイルを個別に暗号化すればいいんじゃないか

SDカードごとごっそりコピーされると個々のファイルを暗号化するプログラムまで持っていかれるので、ここから鍵をみつけられる可能性があります
鍵をとられないように C や C++ で書いてきっちりと obfuscation しておくのが本手なんだと思うのですがコストが高くついてしまいます
Bash だと shc があるのですが、Python とかだと効果的な obfuscation の手段を私はまだ見つけられていません
プログラムごと暗号化ストレージに置いておけばカジュアルに保護することができます

external validity: 暗号化ストレージがあればそれで対タンパーは完全なんじゃないか

暗号化ストレージはマリシャスな第三者からデータを直接盗まれることは防げますが、その SD カードを別の Raspberry Pi に刺して起動されてしまうと正常にマウントされてしまうので、ssh で守っているとはいえすこし心許ないです
コピープロテクトと組み合わせて、コピーした SD カードからの起動をブロックしてしまうことでかなり安心になります

そもそも暗号化ストレージはマリシャスな第三者からデータを盗まれることは防げますが、なりすましに対して無力です

例えば、センサーから取得したデータを暗号化ストレージに溜めながらサーバに送信するデバイスを考えます

取得したセンサデータやサーバのアカウント情報をSDカードごとコピーされてしまう事は暗号化で確かに防げています
しかし、コピーされた SD カードを別の Raspberry Pi に刺して起動すると、起動時に正常にマウントされて起動してしまい、同じサーバーに別の場所からデータを送信してしまいます

これを防ぐには、アプリケーション側でデバイスの固有ID を個別にチェックするか、コピーされたSDカードはそもそも起動しないようにコピープロテクトをかけてしまう事が必要になります

reference implementation

2018-10-09 version の raspbina stretch lite (2018.11.26時点でさえすでに一個前のバージョンですね ^^; どうもすみません)に 256MByte のセキュアストレージを前述の写真のように用意して、起動時にこっそりと /home/pi/secure_strage にマウントする SD カードのイメージを こちら の payhip にご用意させていただきましたので、セキュリティの評価などにご利用いただければ幸いです

評価の過程でこの暗号化ストレージの暗号鍵を見事に見抜かれてしまった豪の方には、どうやって見つけたのかおしえてくれれば先着1名で100円の賞金を差し上げます ^^/

future works

ここまで書いておきながら、あまり刺さる人のないような話題を紹介してしまっているのではないかと今更ながら心配になっている小心者です
コピープロテクションや SSDP については本稿にもニーズがあって、例えばいいねが2桁つくような事があった場合に改めて起筆を考えさせていただくということにしてやっぱり保留にさせていただければ幸いです

ついでみたいで申し訳ないのですが、同業者の皆様はどのようにされているのかありがたく教えていただければ本当にありがたいです

あと、「この記事酷い」というお叱りにつきまして「-1」ではじまるコメントで奇譚のないご意見をいただければ、いいねの数から引いて前述のデシジョンに利用するようにさせていただきます次第です


  1. 私の造語です^^;。アカデミックな背景はありません。2015年の時点でこんな言葉、念のためにググってみたのですが存在してませんでした。デバイスのアプリケーションをマリシャスなユーザーから守るために危険なデバイス上に保存せず、安全なサーバー上に保存して必要時に都度、サーバからデバイスに push して使う、というアイデアです。いろいろな実装方法があります 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away