Upload
shinji-kobayashi
View
842
Download
4
Embed Size (px)
DESCRIPTION
ETWest 2014 7/30 テクニカルセッションの資料です。 まだ間に合う!Androidの最新機能を使ったアプリ開発 ~Android2.3のシェアが20%を切った今、ターゲットバージョンを切り替えるチャンス!~
Citation preview
TS-# TS-6
まだ間に合う!Androidの 新機能を使ったアプリ開発
~Android2.3のシェアが20%を切った今、ターゲ
ットバージョンを切り替えるチャンス!~
AVCマルチメディアソフト株式会社 浜田 怜実 株式会社システナ 森 祥太郎
AVCマルチメディアソフト株式会社 小林 慎治 AVCマルチメディアソフト株式会社 木村 尭海
TS-# TS-6 2
目次
1. Androidの 新動向 AVCマルチメディアソフト株式会社 浜田 怜実
2. AndroidアプリにGoogleAnalyticsを 導入しよう 株式会社システナ 森 祥太郎
3. AndroidのBLE対応手法 AVCマルチメディアソフト株式会社 小林 慎治
4. これからのセキュリティ AVCマルチメディアソフト株式会社 木村 尭海
TS-# TS-6
1.Androidの 新動向
AVCマルチメディアソフト株式会社 浜田 怜実
TS-# TS-6
自己紹介
• 浜田 怜実(はまだ としみ)
• 所属
– AVCマルチメディアソフト株式会社
• 担当業務 • Android端末のドライバ、OS開発
• プリインストール用アプリケーション開発
• 特定用途向け技術研究・開発
• 個人的な活動 • AndroidのカスタムROM開発 • Firefox OSの世界初の技術系同人誌執筆(共著)
TS-# TS-6
目次
• 現在のAndroid Version分布
• Androidの変遷
• Androidを取り巻くデバイス – iBeacon / BLE – Google Glass – Android Wear – Android Auto
TS-# TS-6
Version 分布
6
約14%
https://developer.android.com/about/dashboards/index.html
TS-# TS-6
Androidの変遷
10/22 4/30 9/15 10/26 1/5 5/20 12/6 2/22
10/19 6/27 11/13 7/24 10/31 2014秋
2010 2009
2012 2013
2011 2008
2011 2014
L
TS-# TS-6 8
過去の遺物は捨て去って、 もっと大きな世界に打って出ませんか?
TS-# TS-6
iBeacon / BLE
• iBeacon – AppleがBLEを拡張して開発した、近接する端末
に対して情報をプッシュできるデバイス
• BLE(Bluetooth Low Energy) – Bluetooth 4.0で追加された超低消費電力規格
• 低電力通信に特化した仕様 • 通信速度は非常に遅い • フィットネス、医療機器、
腕時計などでの利用を想定
9
TS-# TS-6
Google Glass
• 2012年4月発表 • メガネ型ウェアラブル
コンピュータ
• Androidベースだが、AndroidアプリケーションではなくGlasswareと呼ばれる専用のWebアプリケーションを使用する
• GoogleI/O 2014でAndroid Wear対応を発表
10
TS-# TS-6
Android Wear
• 2014年3月発表
• ウェアラブル端末専用のAndroid platform • 端末形状は時計に限らない
– Google GlassがAndroid Wearに対応 • Androidスマートフォンと連携して使う
11
TS-# TS-6
Android Wear
12
TS-# TS-6
既存アプリのAndroid Wear対応:通知
13
Notification notif = new Notification.Builder(mContext) .setContentTitle("New mail from " + sender.toString()) .setContentText(subject) .setSmallIcon(R.drawable.new_mail) .extend(new Notification.WearableExtender() .setContentIcon(R.drawable.new_mail)) .build(); NotificationManager notificationManger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManger.notify(0, notif);
④通知の発行
①WearableExtender インスタンスの生成
②WearableExtender に内容を設定する
③WearableExtender をnotificationにセット
TS-# TS-6
既存アプリのAndroid Wear対応:通知
• WearableExtenderで設定できる主な項目 – 背景 :setBackground() – アイコン :setContentIcon() – ページの追加 :addPage() / addPages() – アクション :addAction() / addActions()
• 通知はAndroid Auto / Android TVでも同じ手法で対応可能(!)
14
※ android.app.Notification.WearableExtender
TS-# TS-6
Android Auto
• 2014年6月発表(in Google I/O 2014) • Android端末を車に接続し、端末の機能を車
側から操作・利用できるようにするシステム
15
TS-# TS-6
まとめ
• Androidと繋がるデバイスが作る世界は拡大される方向にある – ウェアラブルに限らない
• 手の中の端末とインターネットの世界の時代から、より大きな外の世界と繋がる時代へ – OSが新しいほど世界は大きい
16
TS-# TS-6 17
2.AndroidアプリにGoogleAnalyticsを 導入しよう
株式会社システナ 森 祥太郎
TS-# TS-6
自己紹介
• 森 祥太郎(もり しょうたろう) • 所属
– 株式会社システナ • 業務経歴
– Androidアプリケーション開発 – Androidデバイス開発
18
TS-# TS-6
目次
• GoogleAnalyticsとは
• なぜGoogleAnalyticsなのか
• アプリへの導入方法 • 注意点 • まとめ
TS-# TS-6
GoogleAnalyticsとは
• 以下のようなことを収集できる
– アクティブユーザー数
– 世界中のどこで使用されているか
– 導入や特定の機能の使われ方
– アプリのクラッシュや例外発生
– アプリ内課金および、取引
TS-# TS-6
GoogleAnalyticsを使う理由
• 無料ではじめられる
• DeveloperConsoleとの連携が容易
• Google Play Servicesに統合されている
TS-# TS-6
Google Play Services
TS-# TS-6
アプリへの導入方法
• 導入
• 画面遷移のトラッキング
• イベントのトラッキング
• クラッシュと例外のトラッキング
TS-# TS-6
アプリへの導入方法
• AndroidManifest.xmlの修正
– パーミッションの付与 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
TS-# TS-6
アプリへの導入方法
• Trackerの生成(Applicationクラス) private Tracker mTracker; private static final String TRACKING_ID = "UA-XXXXXXX-Y"; @Override protected void onCreate() { super.onCreate(); // Trackerの生成と初期化 GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); mTracker = analytics.newTracker(TRACKING_ID); } public Tracker getTracker() { return mTracker; }
TS-# TS-6
画面遷移のトラッキング
• Activityの場合(APILevel14以上)
– Applicationクラス
@Override protected void onCreate() { super.onCreate(); // Trackerの生成と初期化 GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); mTracker = analytics.newTracker(TRACKING_ID); // 画面遷移の自動トラッキング有効化 analytics.enableAutoActivityReports(this); mTracker.enableAutoActivityTracking(true); }
TS-# TS-6
画面遷移のトラッキング
• Activityの場合(APILevel13以下)
– Activityクラス
@Override public void onStart(){ super.onStart(); mAnalytics.reportActivityStart(this); } @Override public void onStop() { super.onStop(); mAnalytics.reportActivityStop(this); }
TS-# TS-6
画面遷移のトラッキング
• Fragmentの場合
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Trackerの取得 Tracker t = mApplication.getTracker(); // スクリーン名の設定 t.setScreenName(Fragment.class.getName()); // 送信 t.send(new HitBuilders.AppViewBuilder().build()); }
TS-# TS-6
画面遷移のトラッキング
スクリーンビュー画像
TS-# TS-6
画面遷移のトラッキング
ユーザー行動フロー画像
TS-# TS-6
イベントのトラッキング
• EventとしてTrackingできる内容
– Category • 文字列
– Action • 文字列
– Label • 文字列
– Value • long型の値
TS-# TS-6
イベントのトラッキング
• 実装例
– Menuクリックの場合 Public Map generat(MenuItem item) { Map event = null; switch (item.getItemId()) { case R.id.menu_scan: event = generateEvent("scan", "start", "menu"); break; case R.id.menu_stop: event = generateEvent("scan", "stop", "menu"); break; } if (event != null) { mTracker.send(event); } return true; }
TS-# TS-6
イベントのトラッキング
• イベント生成部分
public Map generateEvent(String category, String action, String label) { HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder(); builder.setCategory(category); builder.setAction(action); builder.setLabel(label); return builder.build(); }
TS-# TS-6
イベントのトラッキング
画像カテゴリリスト
TS-# TS-6
イベントのトラッキング
画像アクションリスト
TS-# TS-6
クラッシュのトラッキング
• クラッシュのトラッキング
@Override public void onCreate() { super.onCreate();
(略) UncaughtExceptionHandler myHandler = new ExceptionReporter( mTracker,//Tracker Thread.getDefaultUncaughtExceptionHandler(),// default Handler this// app context ); Thread.setDefaultUncaughtExceptionHandler(myHandler); }
TS-# TS-6
例外のトラッキング
• 例外のトラッキング
– 例外としてトラッキングできる値
• Description – 文字列
例外クラス名(@クラス名:メソッド名:行数){スレッド名} • Fatal
– 真偽値
TS-# TS-6
例外のトラッキング
• 実装例
private int convertStringToInt(String num) { int ret = 0;// 初期値 try { ret = Integer.parseInt(num); } catch (NumberFormatException e) { ExceptionBuilder builder = new ExceptionBuilder(); builder.setFatal(false); StandardExceptionParser parser = new StandardExceptionParser(this, null); String description = parser.getDescription(Thread.currentThread() .getName(), e); builder.setDescription(description); mTracker.send(builder.build()); } return ret; }
TS-# TS-6
クラッシュと例外のトラッキング
TS-# TS-6
XMLファイルでの設定
• Trackerの設定
– res/xml/tracker.xml
<resources> <!-- トラッキングID --> <string name=“ga_trackingId” >UA-********-2</string> <!-- Activityの自動トラッキング有効化 --> <bool name="ga_autoActivityTracking" >true</bool> </resources>
TS-# TS-6
XMLファイルでの設定
• Activityの自動トラッキング
– XMLの設定を読み込む
@Override protected void onCreate() { super.onCreate(); // Trackerの生成と初期化 GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); mTracker = analytics.newTracker(R.xml.tracker); }
TS-# TS-6
XMLファイルでの設定
• Analyticsの設定
– res/values/analytics.xml
<resources> <!-- Activityの自動トラッキング有効化 --> <bool name="ga_autoActivityTracking" >true</bool> <!-- Activityの自動トラッキング有効化 --> <bool name="ga_reportUncaughtExceptions">true</bool> </resources>
TS-# TS-6
注意点など
• 収集データの送信タイミング
• 収集機能のオン/オフ
• 導入のコスト
TS-# TS-6
収集データの送信タイミング
• デフォルトでは30分毎に送信
– GoogleAnalytics#setDispatchLocalPeriod()
• 手動での送信
– GoogleAnalytics#dispatchLocalHits()
TS-# TS-6
収集機能のオン/オフ
• データを収集することを、ユーザに通知する必要がある
– 収集機能をオフに出来る機能を提供する
– 同意が得られない場合アプリを終了する
TS-# TS-6
導入コスト
• 完成後のアプリケーションへの導入
– コスト大
TS-# TS-6
まとめ
• 開発ドキュメントをよく読む(特にV3) • プライバシーに配慮する • 導入を考えて居るなら開発初期から設計に
盛り込む
TS-# TS-6 48
3.AndroidのBLE対応手法
AVCマルチメディアソフト株式会社
エンジニア 小林 慎治
TS-# TS-6
自己紹介
• 小林 慎治(こばやし しんじ) – Twitter:@kobashinG
• 所属 – AVCマルチメディアソフト株式会社
• 業務経歴 – Androidデバイス開発 – Androidアプリケーション開発
• 執筆 – プロの力が身につくAndroidプログラミングの教科書 – Androidタブレットアプリ開発ガイド など
49
TS-# TS-6
目次
• BLEとは? • AndroidにおけるBLE対応
50
TS-# TS-6
BLEとは?
51
TS-# TS-6
BLEの特徴
• Bluetooth3.0までと4.0の違い – Bluetooth 3.0まで
• 240Mbps • ペアリング必要
– Bluetooth 4.0 • 1Mbps(パケット長 47octet) • Classicとの互換性無 • 低電力(ボタン電池で駆動可) • ペアリング必要無し
52
TS-# TS-6
BLEの通信手法
53
Peripheral Central
Scan
1. Scan & Discover 2. Connect
3. Scan Service(Profile) 4. Read / Write / Notify
Peripheral Central
Peripheral
Find Me Profile
Proximty Profile
Peripheral Central
Profile
Service R / W
Notify
Advertise
TS-# TS-6
BLEの通信手法
54
Peripheral Central
Scan
1. Scan & Discover 2. Connect
3. Scan Service(Profile) 4. Read / Write / Notify
Peripheral Central
Peripheral
Find Me Profile
Proximty Profile
Peripheral Central
Profile
Service R / W
Notify
Advertise
- Peripheral - Advertise Packet - 一定間隔で発信 - Central - Scan - Advを検出
TS-# TS-6
BLEの通信手法
55
Peripheral Central
Scan
1. Scan & Discover 2. Connect
3. Scan Service(Profile) 4. Read / Write / Notify
Peripheral Central
Peripheral
Find Me Profile
Proximty Profile
Peripheral Central
Profile
Service R / W
Notify
Advertise
- Central - 検出したPeripheralへ 接続
TS-# TS-6
BLEの通信手法
56
Peripheral Central
Scan
1. Scan & Discover 2. Connect
3. Scan Service(Profile) 4. Read / Write / Notify
Peripheral Central
Peripheral
Find Me Profile
Proximty Profile
Peripheral Central
Profile
Service R / W
Notify
Advertise - Central - (P)のServiceを検索
- Peripheral - Notify(Charcteristicの 変化通知) - Central - Read / Write
TS-# TS-6
BLEの通信手法
57
Peripheral
Proximty Profile
Immediate Alert
Link Loss
Tx Power
Generic Access
Battery Service
Services Characteristics
Device Name
Appearance
Peripheral Privacy Flag
Reconnection Address
…
TS-# TS-6
Service & Profile
• Profile / Service / Characteristicの定義 – https://developer.bluetooth.org/gatt/Pages/default.aspx
58
TS-# TS-6
AndroidにおけるBLE対応
59
TS-# TS-6
BLE対応
• 対応バージョン – Android 4.3からCentralに対応
Android 4.4.2以降を推奨 – Peripheralには非対応(Android L以降で対応)
• 対応デバイス(例) – Nexus 4 – Nexus 5 – Nexus 7(2013) – Etc…
60
TS-# TS-6
iBeaconとは何か
• iBeacon – BLEのAdv Packetを使った機能 – RSSI(電波強度)をAdv Packetに含め、機器から
のおおよその距離を判別
• AndroidでiBeaconの利点 – iOSと共用のハードウェアが利用可 – Android / iOS間の通信
• 簡単なメッセージのやりとりに利用できる
61
TS-# TS-6
iBeaconとは何か
• AndroidでiBeacon? – もちろん対応可能
• 距離判断の仕組みをアプリで持つ必要有り
– Estimote SDKが利用可 • https://github.com/Estimote/Android-SDK • iOSのインターフェースを真似ており、
プロトタイプなどの短期開発に向いている • 距離判断の仕組みを含む
62
TS-# TS-6
iBeaconとは何か
• AndroidでiBeaconの注意点 – iBeaconでできることをキチンと伝える
• 細かな距離の取得はできない
– AndroidとiOSはできることが異なる • AndroidはPeripheralになれない • iOSはPacketスニファにはなれない
– iOSに合わせたAndroidの距離判別アルゴリズム • 同位置でデバイス毎に取得できるRSSIが異なることも
– アプリのみで解決しようとしない • デバイス側を工夫することでできることもある
63
TS-# TS-6
BLEを使う
• AndroidでBLEを使う一連の流れ 1. BLE setup 2. 機器検索 3. Peripheral接続 4. Characteristic読み書き 5. BLE close
64
TS-# TS-6
BLE setup
• 必要なPermission
• BLEが利用できるデバイスか確認
65
android:name="android.permission.BLUETOOTH”!android:name="android.permission.BLUETOOTH_ADMIN”
if (!getPackageManager().hasSystemFeature(! PackageManager.FEATURE_BLUETOOTH_LE)) {!! // BLE非対応時の処理! finish();!}
TS-# TS-6
機器検索
• スキャン開始:BluetoothAdapter#startLEScan() • スキャン終了:BluetoothAdapter#stopLEScan()
66
@Override public void handleMessage(Message msg) { switch (msg.what){ case SERVICE_ACTION_BLE_SCAN: sendEmptyMessageDelayed( SERVICE_ACTION_BLE_STOP_SCAN, 10000); mBtAdapter.startLeScan(mLeCallback); break; case SERVICE_ACTION_BLE_STOP_SCAN: mBtAdapter.stopLeScan(mLeCallback); break; } }
TS-# TS-6
機器検索
• 結果は登録したCallbackで取得
67
BluetoothAdapter.LeScanCallback mLeCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(BluetoothDevice bluetoothDevice, int i, byte[] bytes) { // 任意の処理 } };
Callback内で重たい処理を行うと呼び出し頻度が下がる ログのみ 6.4回/1秒 1000ms wait 1回/1秒
TS-# TS-6
機器検索
• onLeScanの呼び出され方が異なる – Nexus7, Nexus4 –
– Nexus5, XperiaZ
– Issue
• https://code.google.com/p/android/issues/detail?id=65863
68
AdvPacketは以下の場合に取得 ・ 新しいデバイスを発見したとき ・ 接続できないデバイス(non-connectable)
AdvPacketは以下の場合に取得 ・ 常時取得可
TS-# TS-6
機器検索
• 注意点まとめ – スキャン時はバッテリー消費高
– スキャン間隔はCallback内処理時間に依存
– スキャンはClassicBTと競合する
69
必要に応じてスキャン実施。常時スキャンは避ける Handler等を使ったタイマー処理stopを推奨
Callback内処理負荷を下げれば、間隔を短くできる
スキャン以外は競合しないが、スキャンはNG
TS-# TS-6
Peripheral接続
• BLEの接続状態
70
切断状態 接続状態 検索完了状態
接続要求: connectGatt()
検索要求: discoverService()
BluetoothGatt経由でRead/Writeが可能に。
TS-# TS-6
Peripheral接続
• 接続要求:BluetoothDevice#connectGatt()
– 接続結果は第三引数に設定したCallback(onConnectionStateChange)で受ける
– 取得したBluetoothGattインスタンスで、接続後R/W可能
71
mBluetoothGatt = bluetoothDevice.connectGatt( getApplicationContext(), false, mGattCallback);
TS-# TS-6
Peripheral接続
• Service検索: BluetoothGatt#discoverService() – 検索結果は同Callback(onServicesDiscovered)で受ける
72
BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange( BluetoothGatt gatt, int status, int newState) { switch (newState){ case BluetoothProfile.STATE_CONNECTED: // Service検索 gatt.discoverServices(); break; } }
TS-# TS-6
Peripheral接続
• 検索完了状態: BluetoothGattCallback.onServicesDiscovered() – Service / Characteristicの検索完了時に呼ばれる
73
@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { switch (status) { case BluetoothGatt.GATT_SUCCESS: { // 0x00 // Enable Reading or Writing break; } case BluetoothGatt.GATT_FAILURE: { // 0x101 break; } } }
TS-# TS-6
Peripheral接続
• 検索完了状態: BluetoothGattCallback.onServicesDiscovered() – Service / Characteristicの検索完了時に呼ばれる – 呼び出し時に以下ログが出力される
74
$ adb logcat BluetoothGatt:* BluetoothAdapter:* *:S
TS-# TS-6
Characteristic読み書き
• BluetoothGatt経由で CharacteristicsやDescriptorを取得できる
75
static final String UUID_SERVICE_GENERIC_ACCESS = "00001800-‐0000-‐1000-‐8000-‐00805f9b34fb"; static final String UUID_CHAR_DEVICE_NAME = "00002a00-‐0000-‐1000-‐8000-‐00805f9b34fb"; BluetoothGattService service = mBluetoothGatt.getService( UUID.fromString(UUID_SERVICE_GENERIC_ACCESS)); if(service != null){ BluetoothGattCharacteristic charcteristic = service.getCharacteristic( UUID.fromString(UUID_CHAR_DEVICE_NAME)); mBluetoothGatt.readCharacteristic(charcteristic); }
TS-# TS-6
Characteristic読み書き
• Service検索と同じくCallback(onCharacteristicRead)で受信
76
@Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { if(characteristic != null) { try { Log.i(“xxx", "get device name : " + new String(characteristic.getValue(), "UTF-‐8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
TS-# TS-6
Characteristic読み書き
• Read/Writeでfalseになる? – もう一度接続(connect~discover)を行い
状態を確認すると良い
77
BluetoothGatt# discoverService()
接続確認
切断状態 初めからやり直し。
接続異常状態 初めからやり直しがベター。
接続OK
true
false
false
true
BluetoothGatt# connect()
TS-# TS-6
BLE close
• Close処理 – 忘れるとスキャン不可、不安定動作などの要因に
78
public void close() {! if (mBluetoothGatt == null) {! return;! }! mBluetoothGatt.close();! mBluetoothGatt = null;!}
TS-# TS-6
まとめ
79
• Android 4.4.2以前は機種差が大きい – 端末毎に動作が異なることも – 不安定な端末はサポートから外す等の対応を
• iBeaconをiOS/Androidで両対応する – iOSと出来ることが異なる点に注意
• Callbackベースでの実装に注意する – 読み書きはCallback経由で取得する必要あり
TS-# TS-6
4. これからのセキュリティ
AVCマルチメディアソフト株式会社 木村 尭海
80
TS-# TS-6
自己紹介
• 木村 尭海(きむら たかうみ) – Twitter:@muchiki0226
• 所属 – AVCマルチメディアソフト株式会社
• 業務経歴 – 家電連携Androidアプリケーション開発 – Androidメディアフレームワーク開発 – Androidデバイス開発
• 執筆 – プロの力が身につくAndroidプログラミングの教科書 – Effective Android
81
TS-# TS-6
目次
• 近のセキュリティトラブル
• Androidのセキュリティとは
• これからのセキュリティ – SELinux – Hardware Credential Storage – KeyStore
82
TS-# TS-6
近のセキュリティトラブル
• OpenSSL HeartBleedの脆弱性 – Android 4.1.1からAndroid4.2.2(一部)がこの脆弱性を抱える
• 秘密鍵/証明書が盗まれる – 通信内容が覗き放題
83
サーバ Android
個人情報
偽造サーバ
TS-# TS-6
Androidセキュリティ
• Androidアプリのセキュリティによるトラブルが減少 – 2012年の半分ぐらいに減少
• 減少しているが複雑な障害が発生しているケースが多数 – アプリ – カーネル – フレームワーク – アプリのプラグイン – etc
84
0
20
40
60
80
100
120
2010 2011 2012 2013
5
21
118
59 障害件数
JVNデータ(2014/5月調べ)
TS-# TS-6
Androidセキュリティ
• トラブル減少している主な要因
– アプリ開発者 • セキュリティに対する知識を持った人が増えてきている • 開発手法でのトラブルについてWebに多数掲載 • ノウハウの蓄積 • アプリが洗練されてきている
– Google • OSにセキュリティに対する実装が増えいる
– パーミッション機能の追加など
85
TS-# TS-6
セキュリティは新しい課題に直面している
• 特定のトラブルが増大 – ファイルアクセス関連:19件/59件 – 鍵関連:5件/59件
• Androidセキュリティはどこまで確保するのか – 個人情報 – 端末のroot – アプリ情報
• セキュリティは考え始めるといくらでも時間がかかる – 端末の機能を知っていると効率的に保証が出来る
86
保証されている部分を活用したアプリ開発を行う必要がある
TS-# TS-6
これからのセキュリティ
87
新しい機能を知らないと無駄な実装が増える
どこまでセキュリティ 対策したらいいの?
ファイルアクセスは どうせ防げないので 対策は何もしないでおこう
Androidはセキュリティに 問題があるので端末に 鍵は置けないな
TS-# TS-6
セキュリティ機能
• セキュリティの機能がクローズアップ – Android4.3 – Android4.4
• 追加されたセキュリティ機能
– Hardware Credential Storage • ハードウェア的に安全な領域に鍵などを保存可能
– TrustZoneなど
– KeyStore • アプリ用に暗号化鍵の生成/保存の機能が提供
– SELinux • 2000年から続くLinuxカーネルのモジュール
88
TS-# TS-6
Hardware Credential Storage
89
TS-# TS-6
Hardware Credential Storageとは
• 証明書を安全な領域に保存する機能 – Hardware的に保証されている領域に保存される
• TrustZone – Linuxカーネル上からのアクセス不可 – エクスポートはできない →安心して鍵を保存することができる ※ただしハードウェアが対応していることが条件
• KeyChainを拡張して実現されている – デジタル証明書や秘密鍵を登録/管理するAPI
• Android 4.0で追加された機能を拡張している
90
TS-# TS-6
確認方法
• ハードウェアが対応しているか確認 – デバイス情報を確認する
• [設定]>[セキュリティ]>[ストレージのタイプ]
– ソースコード上で確認する
91
// 暗号化方式はRSA、DSA、ECを使うことが可能 if (KeyChain.isBoundKeyAlgorithm("RSA")) { // ハードウェア的に対応されている時の処理をここに書く } else { // ハードウェア的に対応されていない時の処理をここに書く }
TS-# TS-6
KeyStore
92
TS-# TS-6
KeyStoreとは
• 秘密鍵/証明書を管理する機能 – 他のアプリがアクセス出来ない場所で保管する – Android 4.0で追加された機能
• ただし全アプリで共用化される
• Android 4.3で機能拡張 – アプリごとに秘密鍵/証明書を管理が可能
93
TS-# TS-6
KeyStoreの使い方
• 秘密鍵/証明書の作成
94
Context ctx = this; Calendar notBefore = Calendar.getInstance(); Calendar notAfter = Calendar.getInstance(); notAfter.add(1, Calendar.YEAR); KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx).setAlias("key1") .setSubject(new X500Principal(String.format("CN=%s, OU=%s", "test”,ctx.getPackageName()))) .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime()).setEndDate(notAfter.getTime()) .build(); KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); kpGenerator.initialize(spec); KeyPair kp = kpGenerator.generateKeyPair();
アプリA アプリB
10075_ USRCERT _key1
10075_ USRPKEY _key1
生成
生成
TS-# TS-6
KeyStoreの使い方
• 秘密鍵/公開鍵の取得
95
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); // 別アプリからアクセスされるとnullが返される KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("key1", null); // 公開鍵 RSAPublicKey pubKey = (RSAPublicKey)keyEntry.getCertificate().getPublicKey(); // 秘密鍵 RSAPrivateKey privKey = (RSAPrivateKey) keyEntry.getPrivateKey();
アプリA アプリB
10075_ USRCERT _key1
10075_ USRPKEY _key1
取得
取得
取得できない
TS-# TS-6
SELinux
96
TS-# TS-6
rootを取られるとデータ取られ放題
• Androidの下にはLinuxカーネル – rootだとすべてのファイルの操作ができる
• コピー • 削除 • etc
• rootが取られると防ぎようがないのが課題 →Linux発祥の対策モジュールSELinux
97
TS-# TS-6
SELinuxとは
• Security-Enhanced Linux
• アメリカの国家安全保障局が2000年に提供
• ライセンス – GPL
• Linuxカーネルに組み込むセキュアモジュール – CentOSには標準で導入されている – Android4.3で導入された
98
TS-# TS-6
SELinuxって
• 導入すると次のことは必要なくなるのか? – ファイアーウォール
• 通信の許可/不許可制御 – IDS/IPS
• 侵入検知/攻撃ブロック機能
– アクセス制御 • 不正ユーザのアクセス制限
– セキュリティパッチ • 脆弱性対策パッチ
– ウィルス対策ソフト • ウィルス駆除など
99
TS-# TS-6
SELinuxって
• 導入すると次のことは必要なくなるのか? – ファイアーウォール
• 通信の許可/不許可制御 – IDS/IPS
• 侵入検知/攻撃ブロック機能
– アクセス制御 • 不正ユーザのアクセス制限
– セキュリティパッチ • 脆弱性対策パッチ
– ウィルス対策ソフト • ウィルス駆除など
100
答えはNO
TS-# TS-6
SELinuxのできること
• SELinuxの特徴 – Mandatory Access Control (MAC)
• リソースやプロセスへのアクセスする権限を自由に制御できない
• MAC実現のための機能 – Type Enforcement (TE)
• プロセスがファイルへアクセスするのを制限する仕組み
– Role Base Access Control (RBAC) • ユーザアカウントの権限を制限する仕組み(rootも含む)
→アカウントが乗っ取られてもアクセス範囲を制限
101
SELinuxは侵入された際に被害が拡大しないようにすること
TS-# TS-6
SELinuxの動作
• アクセスの制限は大きく2種類 – Permissiveモード
• 何も制限しないモード • ファイルやプロセスのアクセスはすべて許可 • ルール違反のアクセスはログに記載されるのみ
– Enforcingモード • 制限モード • ルール違反した場合のアクセスは
すべて遮断される
102
TS-# TS-6
Permissiveモードの動作の流れ
103
プロセス カーネル ファイル
• ファイルアクセスの例
read/writeコマンド実行
Linux標準の権限確認 SELinuxの権限確認(MAC)
違反した場合はログに情報出力
TS-# TS-6
Enforcingモードの動作の流れ
104
プロセス カーネル ファイル
• ファイルアクセスの例
read/writeコマンド実行
Linux標準の権限確認 SELinuxの権限確認(MAC)
違反した場合はエラー
TS-# TS-6
AndroidのSELinuxは発展途上
• Enforcingモードだがルールの定義が不完全 – ほとんど動作していない →今後対応が進む可能性が非常に高い
• ルールはネットワークからアップデート可能 – Compatibility Definition Documentに記載されている – 事例あり
• SamsungがGalaxyのルールアップデートを行った
105
SELinuxは時間が経つにつれてセキュリティが強固になる
TS-# TS-6
まとめ
• 障害報告減っている – 特定の障害報告が増えている
• 鍵/証明書、ファイルアクセスなど
• KeyChain – デジタル証明書を守るために使いましょう
• KeyStore – アプリ内用暗号鍵を守るために使いましょう
• SELinux – rootを取られてもファイルアクセスに制限がある
※時間経過とともに強固になる
106