SORACOM Airのタグとメタデータサービスで認証情報をSIMごとに管理する #soracom
ども、大瀧です。本記事はSORACOM Advent Calendar 2015の2日目です。 先日追加されたSORACOM Airの新機能メタデータサービスを利用して、端末側でAWSの認証情報を持たない一時認証の仕組みを考えてみました。
処理の流れ
SORACOM Airのメタデータサービスは、Air SIM 1枚毎に紐付く情報を認証なしで端末に提供します。そこで、ユーザーが自由に設定できるAir SIMのタグにAWSのAPIキーとAssumeRoleするIAMロールを埋め込み、端末でそれらからAWSの一時キーを生成、AWSサービスにアクセスします。
AssumeRoleなしで直接使えるAPIキーを用意するのとセキュリティレベルがどの程度異なるかは精査できていませんが、一時キーの方がCloudTrailで証跡を追いやすいかなぁと考えた次第です。 また、CognitoのIdentity IDをタグに埋め込んでCognitoによる一時キー発行を実装することもできると思います。
事前に準備するもの
AWS側の認証設定をあらかじめ用意しましょう。
- IAMユーザーとAPIキー、シークレットキー
- AssumeRoleするためのIAMロール
1. SORACOMの設定
では、認証情報をSORACOM Air SIMのタグに追加します。SORACOMユーザーコンソールから設定するAir SIMを選択、[詳細]ボタンで詳細設定を開きます。
[タグ]タブをクリックし、[+]をクリックして追加画面を開きます。
タグ名と値をそれぞれ入力します。今回は以下3つを設定しました。
AWS_ACCESS_KEY_ID
: IAMユーザーのAPIキーAWS_SECRET_ACCESS_KEY
: IAMユーザーのシークレットキーAWS_IAM_ROLE_ARN
: AssumeRoleで指定するIAMロールのARN
以下のような感じです。
SORACOM側の設定はこれでOKです。
2. 端末のスクリプト作成
メタデータサービスをコールし、AWSの一時キーを生成しAWS APIを呼び出すシェルスクリプトを作成しました。今回はDynamoDBのテーブル一覧を取得してみます。
#!/bin/bash export AWS_DEFAULT_REGION='ap-northeast-1' export AWS_ACCESS_KEY_ID=`curl -s metadata.soracom.io/v1/subscriber | jq -r '.tags.AWS_ACCESS_KEY_ID'` export AWS_SECRET_ACCESS_KEY=`curl -s metadata.soracom.io/v1/subscriber | jq -r '.tags.AWS_SECRET_ACCESS_KEY'` export AWS_IAM_ROLE_ARN=`curl -s metadata.soracom.io/v1/subscriber | jq -r '.tags.AWS_IAM_ROLE_ARN'` CREDS=`aws sts assume-role --output text --role-session-name temp --role-arn $AWS_IAM_ROLE_ARN | grep CREDENTIALS` export AWS_ACCESS_KEY_ID=`echo $CREDS | awk '{print $2}'` export AWS_SECRET_ACCESS_KEY=`echo $CREDS | awk '{print $4}'` export AWS_SESSION_TOKEN=`echo $CREDS | awk '{print $5}'` aws dynamodb list-tables
スクリプトには認証情報が一切含まれていないことがわかりますね。では、実行してみます。
$ ./metadata-soracom.bash { "TableNames": [ "ReplicaTable", "grove-water", "iottest", "streamtest" ] }
一時キーでAWS APIがコールできました!
まとめ
SORACOM Airのタグとメタデータサービスを利用して、端末に認証情報を提供する例を紹介してみました。SORACOM側で認証情報の差し替えや削除ができますので、なかなかアクセスが難しいIoTデバイス/ゲートウェイの遠隔管理の手段として活用できるのでは、と考えます。
SORACOM側でメタ情報を持たせる同様の仕組みとしてメタデータサービスのユーザーデータとSORACOM Beamがありますが、現在はグループ単位での設定にあるため、SIM 1枚毎に異なる情報を扱うのであれば、タグとメタデータサービスの組み合わせが適していると言えます。