冒頭から謝罪
SORACOM Advent Calendar 12/10 担当のma2shitaです
とか書いておきながら、EncFSとかマイナーなネタを書きました
ごめんなさい、BLEネタは近日中に必ず書きます!
TL;DR
SORACOM Airのメタデータサービス内ユーザデータ(パスフレーズとして AccessSecretFileKey
を使用)を設定
$ soracom group create --tags=name:demo_encrypted
$ soracom group update_configuration \
--group-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
--namespace SoracomAir \
--params '[{"key": "userdata", "value":"AccessSecretFileKey"}]'
$ soracom sim set_group --imsi YYYYYYYYYYYYYYY \
--group-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
それを読み出し、EncFSのパスフレーズに使用
$ encfs --extpass='curl -s http://metadata.soracom.io/v1/userdata' ~/.crypted ~/mnt
概要
暗号化ファイルシステム実装の一つである EncFS は、ディレクトリの暗号化を行うことができます
EncFSは --extpass=program
というオプションを持っており、パスフレーズの入力に program の標準出力を使うことができます
もうおわかりですね
すでにメソられているAWSのIAMネタを、EncFSのパスフレーズに焼き直しただけのパクりネタです
利点
マウントに使用するパスフレーズをローカル保存しなくても良くなります
たとえばプログラムファイルの難読化を目的として使用することができます
デバイスの中身を見られなくない時、例えば契約切れでプログラムを使わせたくない、デバイスが盗難された、といった時に効果を発揮するでしょう
ただし、盗難自体を防げるわけじゃありませんのでご注意
メタデータ内の location とか、使えるようになりませんか? <唐突な要望>
また、暗号化されているからと行って過信は禁物です
プログラムによっては /tmp
や /var
に一時ファイル/キャッシュを保存&削除し忘れという可能性もあるのでご注意ください
この辺りの注意事項や他の暗号化ファイルシステムとの比較についてはディスク暗号化 - ArchLinuxに詳細があります
準備
EncFSを準備する
前提
-
~/.crypted
を EncFS による暗号化済データ保存ディレクトリとし、そのディレクトリをのマウント先として~/mnt
とします - パスフレーズは
AccessSecretFileKey
とします - 暗号化パラメータはパラノイア(=偏執狂、ようするにできる限り最強ってことでしょう)とします
初回のマウント操作で、暗号化に関する設定を求められます
$ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y encfs
$ mkdir ~/.crypted ~/mnt
$ encfs ~/.crypted ~/mnt
新しい暗号化ボリュームを作成します。
Please choose from one of the following options:
enter "x" for expert configuration mode,
enter "p" for pre-configured paranoia mode,
anything else, or an empty line will select standard mode.
?> <== p を入力
Paranoia configuration selected.
設定が完了しました。以下のプロパティのファイルシステムが
作成されます:
ファイルシステム暗号アルゴリズム: "ssl/aes", バージョン 3:0:2
Filename encoding: "nameio/block", version 4:0:2
鍵サイズ: 256 ビット
ブロックサイズ : 1024 バイト (8 バイト MAC ヘッダ含む)
Each file contains 8 byte header with unique IV data.
Filenames encoded using IV chaining mode.
File data IV is chained to filename IV.
File holes passed through to ciphertext.
-------------------------- 警告 --------------------------
The external initialization-vector chaining option has been
enabled. This option disables the use of hard links on the
filesystem. Without hard links, some programs may not work.
The programs 'mutt' and 'procmail' are known to fail. For
more information, please see the encfs mailing list.
If you would like to choose another configuration setting,
please press CTRL-C now to abort and start over.
Now you will need to enter a password for your filesystem.
You will need to remember this password, as there is absolutely
no recovery mechanism. However, the password can be changed
later using encfsctl.
新しい Encfs パスワード: <== AccessSecretFileKey を入力
Encfs パスワードの確認: <== AccessSecretFileKey を入力
これで暗号化&マウントが完了しました。確認してみましょう
$ df -h ~/mnt
Filesystem Size Used Avail Use% Mounted on
encfs 231G 62G 158G 29% /home/user0/mnt
$ echo "hoge" > /home/user0/mnt/bar
$ mkdir -p /home/user0/mnt/dir0/subdir0
$ tree /home/user0/mnt
/home/user0/mnt
├── bar
└── dir0
└── subdir0
2 directories, 1 file
$ tree /home/user0/.crypted/
/home/user0/.crypted/
├── Rdub0T6WYTSiuzjGS0eHKtzZ
│ └── 4R02B3,8E94W39e5di,yl4bz
└── c,jxy1NVlX4,f2x8ylazC2DC
$ cat /home/user0/.crypted/c,jxy1NVlX4,f2x8ylazC2DC
p,���
�U��� ��JU|
上記の通り、ファイル名や中身が暗号化されている事がわかります
ディレクトリ構造は残念ながら隠匿化できませんが、他の暗号化ファイルシステムで解決できる可能性があります
EncFSの操作
アンマウント
EncFSはfuseを使っているので、アンマウントは fusermount -u
です
$ fusermount -u /home/user0/mnt
(再)マウント
$ encfs ~/.crypted ~/mnt
EncFS パスワード: <== AccessSecretFileKey
パスフレーズが一致しない場合はマウントできません
$ encfs ~/.crypted ~/mnt
EncFS パスワード: <== hoge
Error decoding volume key, password incorrect
SORACOM Airのメタデータサービスの準備
ユーザデータはグループ毎に設定することができます
今回は demo_encrypted
というグループを作成し、そのグループのユーザデータにEncFSのパスフレーズ AccessSecretFileKey
を設定します。せっかくなのでCLIから行います
$ soracom group create --tags=name:demo_encrypted
{
"operatorId": "OPXXXXXXXXXX",
"groupId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"createdAt": 1449383020624,
"lastModifiedAt": 1449383020624,
"configuration": {
},
"tags": {
"name": "demo_encrypted"
},
"createdTime": 1449383020624,
"lastModifiedTime": 1449383020624
}
$ soracom group update_configuration --group-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX --namespace SoracomAir --params '[{"key": "userdata", "value":"AccessSecretFileKey"}]'
{
"operatorId": "OPXXXXXXXXXX",
"groupId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"createdAt": 1449383020624,
"lastModifiedAt": 1449383350396,
"configuration": {
"SoracomAir": {
"userdata": "AccessSecretFileKey",
"metadata": {
"enabled": false,
"readonly": true,
"allowOrigin": null
},
"useCustomDns": false,
"dnsServers": [
]
}
},
"tags": {
"name": "demo_encrypted"
},
"createdTime": 1449383020624,
"lastModifiedTime": 1449383350396
}
グループ作成とユーザーデータ設定できたら、SIMを所属させます
$ soracom sim set_group --imsi YYYYYYYYYYYYYYY --group-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
{
"imsi": "YYYYYYYYYYYYYYY",
"msisdn": "ZZZZZZZZZZZZ",
"ipAddress": "XXX.XXX.XXX.XXX",
"apn": "soracom.io",
"type": "s1.standard",
"groupId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"createdAt": 1444992915451,
"lastModifiedAt": 1449383959562,
"expiredAt": null,
"terminationEnabled": false,
"status": "active",
"tags": {
"name": "IMSI NAME 0"
},
"sessionStatus": {
"lastUpdatedAt": 1449234567601,
"imei": null,
"location": null,
"ueIpAddress": null,
"dnsServers": null,
"online": false
},
"speedClass": "s1.standard",
"moduleType": "nano",
"plan": 1,
"expiryTime": null,
"operatorId": "OPXXXXXXXXXX",
"createdTime": 1444992915451,
"lastModifiedTime": 1449383959562
}
SORACOM Air側の準備も完了です
動作確認
先ほど demo_encryted
に所属させたSIMの回線から curl コマンドで ユーザデータが取得できるか確認します
$ curl -s http://metadata.soracom.io/v1/userdata
AccessSecretFileKey
確認できたら EncFS の --extpass
オプションに指定してマウントできるか確認です
$ encfs --extpass='curl -s http://metadata.soracom.io/v1/userdata' ~/.crypted ~/mnt
お疲れ様でした