2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
はじめに
みなさん、こんにちは。
KDDIウェブコミュニケーションズの Twilio事業部エバンジェリストの高橋です。
前回、Twilioで開発を始める前に知っておくこと(電話のセキュリティ 前編)ということで、主にコールログのセキュリティ対策について解説をしました。
そこで今回は、録音データのセキュリティ対策について解説をしていきたいと思います。最後にベストプラクティスも記載してありますので、ぜひご覧ください。
録音データのセキュリティとは
Twilio の Programmable Voice を利用すると、ボイスメール(いわゆる留守電)や通話中録音ができるのですが、この録音されたデータってどんな感じで保管されているのでしょうか。
気になるポイントは以下の通りかと思います。
- どこに保存されているのか
- データは暗号化されているのか
- 誰が見られるのか
- 消すことはできるのか
- 操作ログは取れるのか
この他にも、「そもそも録音には料金がかかるのか」とか、「保存しておくストレージにも課金されるのか」などの疑問があるかと思いますが、今回はセキュリティをいう切り口だけで解説をします。
保存される場所
こちらについてはコールログ同様で、ログの保管場所については公開はされていません。
Twilio のシステムは AWS の8つのリージョン上の複数の Availability Zone の分散して管理をしているので、そのどこかに分散されて管理されているということくらいしかわかりません。
試しに、管理コンソール上から録音データをダウンロードしたときのネットワークを見てみましたが、バージニアの AWS EC2 からダウンロードしたようです。
もちろん、Twilio のセキュリティシステムはかなり堅牢であり、セキュリティに関するホワイトペーパーも公開されているので、ほとんどケースで問題になることはないです。むしろ、ユーザアカウントの方をしっかり管理すべきなのですが、それはそれとして、例えば 米国のCLOUD 法によって、日本国外の法律に従ってデータが開示されてしまう可能性がゼロではないというところを気にされるところもあるかと思います。
そんなご心配を持たれる方は、ぜひ続きも読んでくださいね。
暗号化
録音データの保管場所がどこかも重要かもしれませんが、それが暗号化されているのか、だれが復号(暗号を解く作業)できるのかが重要です。すなわち、たとえ海外にデータが保管されていたとしても、そのデータをユーザ以外の誰もが復号できなければデータは安全だと言えます。
結論から言うと、暗号化は可能です。可能と書いたのは、デフォルトでは暗号化されていないため、有効にするための設定が必要だからです。
暗号化を行う機能は、Voice Recording Encryption(以後、VRE)と呼ばれます。なお、暗号化録音を行う場合は、通常の録音料金(0.38円/分)に加えて、暗号化料金(2.36696円/分)が必要です。
一般的に、暗号化にはいろいろな方法がありますが、VRE では公開鍵暗号方式を利用します。この方式を簡単に説明すると、暗号化と復号で異なる鍵を用い、一方を公開鍵、もう一方を秘密鍵として利用します。
たとえば、公開鍵で暗号化したデータは、公開鍵では復号することはできず、唯一復号が可能なものが秘密鍵になります。
VRE では、この公開鍵を Twilio 上に設定しておき、公開鍵で録音データを暗号化をします。秘密鍵はユーザーだけが保有することで、暗号化された録音データはユーザー以外には復号ができないというしくみです。この秘密鍵の管理を社内でも徹底することで、復号ができる管理者を特定させることができます。
具体的な実装方法は、この記事の後半で記載します。
閲覧権限
録音データはコールログの中から参照が可能です。
こちらもコールログの記事で書きましたが、すべてのユーザロールでログの閲覧が可能なため、ユーザの権限で制御することはできません。
(なので、ユーザアカウントのセキュリティ対策を万全にしてください)
なお、録音データに関しては、もう一つ重要な設定項目があります。
それは、Media URL という、録音データにアクセスするための URL を使って録音データをダウンロードする際に、認証を行うかどうかという設定です。
Media URL 自体が長い文字列によって生成されているため、ランダムに URL を生成して録音データをダウンロードすることはほぼ不可能ですが、仮に Media URL が漏洩した場合は、認証がないと誰でもダウンロードできてしまうことになります。特に、暗号化がされていない場合には注意が必要です。
設定は、Programmable Voice > 設定 > 一般 の中のEnforce HTTP Auth on Media URLsになります。デフォルトは無効になっているので、認証が走りませんので、そもそもこのURLを使ってダウンロードをさせないのであれば、有効にしておくことをおすすめします。
なお、この設定を有効にした場合の認証については、AccountSid / AuthToken の組み合わせか、もしくは API Key / API Secret の組み合わせのいずれかを、Basic 認証で行う必要があります。
録音データの削除
もちろん可能です。
管理コンソールからもできますし、API経由で一括で削除することもできます。API経由で削除する方法は、以下の記事が参考になるかと思います。
Twilio上に溜まった録音データを一括削除
操作ログ
残念ながら誰が録音データを操作したかを確認することはできません。
しかし、Enterprise Editions の Audit イベントを有効にすることで、管理コンソールにログインしたユーザの監査を行うことができます。Audit イベントでは、ログイン以外にも重要な操作をした記録を確認することができるので、システム監査が必要な企業にとっては有用なオプションとなります。
なお、Audit イベントは有料のオプションサービスとなりますので、ご興味のある方は営業担当までお問い合わせください。
VRE を実装してみる
ではここから、録音データの暗号化設定を行っていきたいと思います。
VRE の具体的な暗号化のステップは以下のようになっています。
- Twilioは、録音データができるたびに、ランダムな暗号鍵を生成
- その鍵を使って AES256-GCM アルゴリズムで録音データを暗号化
- 暗号に使った鍵を、ユーザーの公開鍵で RSAES-OAEP-SHA256-MGF1 アルゴリズムで暗号化
一方、復号のステップは以下の通りです。
- ユーザーは暗号化された録音データ、暗号に使った鍵(これは公開鍵で暗号化されている)、さらに暗号に利用した IV(Initial Vector)を Twilio から取得する
- 暗号に使った鍵を秘密鍵で復号
- 複合した鍵と IV を使って、暗号化された録音データを復号
※IV は、AES256-GCM で用いられる初期化ベクトルと呼ばれる文字列で、IV を用いることで暗号強度を高めることができます。
準備
以下の手順を実行するためには、opensslが必要ですので、予め準備をしておいてください。
次のように入力してバージョンが表示されればインストールされています。
openssl version
LibreSSL 2.8.3
RSA キーペアを作る
先程書いたように、VRE では公開鍵暗号方式を用いるため、まずはじめに鍵のペアを作ります。
以下のコマンドを使って、まずは秘密鍵を生成します。
openssl genrsa -out private_key.pem 2048
Generating RSA private key, 2048 bit long modulus
............+++
...+++
e is 65537 (0x10001)
以下のような秘密鍵が生成されます。
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtePBUk3IM45Jj8eFFrmwzjr/2seEtMknl5OD7VDBipazsq5v
MBnIYcE+EuzDiFC5XXww9rncFRZC0I3hLUejUTkJNZjMDQzVFkGXo9+A4MsXRZqK
OOYhCNAr2C1acpHKK6bEqGhRW2F2R0dSndbEKOCpPKD70ZF2aZyQdb//9104ROdh
bvsycQD7ZGQ8V5SoUo6kPBjQv1sbi99LN6uQm+trUDHkBhbpeKU836YPpIH1ZAqG
h2sSzRHN0eXdOPYNdu649ZuOSz0kIUN22e8R39suRhu6VbrC2kvVz2Su+tSPMWlp
gKjMboVKrsWUH9B1fQM9ajixc8fc892ZoGBqaQIDAQABAoIBAQCd5BlbEr4pUui0
cOQs+ABs5XZYOj4OmVdPEvTAuwtm/K78+sL2JEt34EG8N978o+ZlKntukaRkgbB6
Tc8ceUViKnq+Fed7pJoM+d9il4/Okz2eZCp8ffhLKDoHLEeJkNjIz7mC3xtQkegU
s+sZrOcW/P6r7KrsHrOFti0IqiTOWps1M6gIUKFWcIRIh/6SyN0gmdDxmfGD9o4W
CePswAS0fmwMZPCwQ9GazC8iVL+CvrF92UNfmNQSUiuR0GynOlsMnDu2GvSim3yO
9lqWAo1yyEBVU8x6pS1wFTdsXQ7Ch2Ei9ZU+XE6SL5lq3jSc8WqIGmLvZ+zw5eAR
8J73+fkBAoGBAO12zPHKgvN5nHRTrO3gNVcl92201umLHllf2elOjlE98/qtNsuX
R96LILDv4rgSjwH0+eVQW2g2B5o3D6KPvXdEvUmaRIXDValqr1UzED1DFWLs1MQK
HO30rJSpfWpTD3B56zvMb620avIBv3+Oe6kmjImn7Db/nyuEZrs49sE5AoGBAMQW
bAXgbG5GDUMVvJfrWwiXz3Ip7yv2j6xz5MtU58gytVV2ZnesLSCfpKrUpalPDWsX
04ZBuZ7bqZR4UpGQnGlYePtttKMdI4Vbo+tPK8gNN8ELu+8Fgmr0UNv3BWmcSRzo
AfiWWIHZS6iAkPoaYWQtCtf3WU0wnt/beiP/NWKxAoGAafCUYlLMtT7OE/+4qK9c
XLLtfh4tuyd7tLfUigen6orPLEjWp2GoiJpdTVLYPPLapi7axflhrk5ceeqSqR2j
k3AxWoLeiyaoMtsLueD8H7ir8+Rgz80LNwXvcKtk7mh7/NwHnDgKot5Yz/sDqi6w
8Lfn/wnRkn/cTRfWlTRGsdECgYEAuXjP4lsdlMyT3MFhqnzGlYEqibyaaoYD7cWN
Qrpjplw4YsbkMwvbf4EhOyh6LYQFmCdoPxRJ47W4WCPbTa5wE8DIZmGlO6fjIk/E
41z2d3nxI5rav0IB0vKWzQiAyR03lqzouF5VBzUmuBIrjzWGqz9jg1WF1VpI3Er3
47aQo3ECgYBQ7UZ3IP1+unprNsvVDT4CbjsoAypstmQhfgxYiNPY0wB7rvTOWT3q
3vwOBwVBjfvkG8yYglYgHc0xGOrqL6DxhMUFTxBe0iDvBX0QM1tpp4apsKdHvuuQ
h1icaQZp8WKxBOzVilj3DLoHJEyIrsWWMnDHazV4fxbxijpj4uwJCw==
-----END RSA PRIVATE KEY-----
では次に、この秘密鍵をつかって公開鍵を作成します。
openssl rsa -in private_key.pem -pubout -out public_key.pem
writing RSA key
以下のような公開鍵が生成されます。
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtePBUk3IM45Jj8eFFrmw
zjr/2seEtMknl5OD7VDBipazsq5vMBnIYcE+EuzDiFC5XXww9rncFRZC0I3hLUej
UTkJNZjMDQzVFkGXo9+A4MsXRZqKOOYhCNAr2C1acpHKK6bEqGhRW2F2R0dSndbE
KOCpPKD70ZF2aZyQdb//9104ROdhbvsycQD7ZGQ8V5SoUo6kPBjQv1sbi99LN6uQ
m+trUDHkBhbpeKU836YPpIH1ZAqGh2sSzRHN0eXdOPYNdu649ZuOSz0kIUN22e8R
39suRhu6VbrC2kvVz2Su+tSPMWlpgKjMboVKrsWUH9B1fQM9ajixc8fc892ZoGBq
aQIDAQAB
-----END PUBLIC KEY-----
公開鍵を Twilio に設定する
Twilio 管理コンソールにログインします。
設定 > クレデンシャル を選択します。
新しいクレデンシャルを作成するボタンを押します。
わかりやすい名前に適当な名前をつけます。
TYPEは、「Public Key」を選択します。
公開鍵欄に、先ほど作成した公開鍵を貼り付けます(秘密鍵ではないので間違えないように)。
Createボタンを押します。
クレデンシャルが登録されて、CR〜
というSIDが割り当てられます。
終了ボタンを押します。
暗号化設定を有効にする
では、暗号化を有効化しましょう。
有効化後の録音データはすべて暗号化されます
管理コンソールで、 Programmable Voice > 設定 > 一般 を選択します。
Voice Recording Encryption を ENABLED に切り替えます。
Continue ボタンを押します。
PUBLIC KEYのプルダウンリストから、先程登録した公開鍵を選択します。
最後に Save ボタンを押して設定を保存します。
以上で暗号化の設定はすべて完了です。
この後は、実際に暗号化された録音ファイルを複合する方法について紹介します。
暗号化されたデータをコンソールで確認
VRE によって暗号化された録音データは、コンソール上では以下のように表示されます。
もちろんコンソール上で再生することはできません。
暗号化された WAV ファイル自体はダウンロードできますが、ダウンロードした WAV は暗号化されているので、そのままでは再生できません。復号の確認をしたい場合は、ここで録音データをダウンロードしておいていください。
暗号化された録音データの復号
では次に、暗号化されている録音データを復号していきます。復号には以下の4つの情報が必要です。
項目 | 説明 |
---|---|
type | 暗号に利用したアルゴリズム(現在は rsa-aes のみサポート) |
public_key_sid | Twilioに登録した公開鍵のSID |
encrypted_cek | 暗号に利用された鍵 |
iv | 同じく暗号に利用された初期ベクター |
これらの情報は、API を使って取得することができます。今回は Twilio CLI を使って取得してみましょう。取得するためには、RecordingSid (RE から始まる一意な文字列)が必要です。これはコールログに記録されています。
twilio api:core:recordings:fetch --sid RExxxxxxxxxxxxxxxxxxxxxxxxxxx -o json
-o json
オプションをつけることで、JSON 形式で取得することできます。
結果は以下の通りとなります。
[
{
(省略)
"encryptionDetails": {
"public_key_sid": "CRa804e6eb80d1138dc835bdaa1d68741c",
"encrypted_cek": "T86iq9553ZYkjXFkKh8+0JR5X+KIMWaoMwgBp3C3HDHhEPaaM7hmszEb8yLcFKZ1GpTeeoqQEamo/db5LIsqve2FNm0rDXWznygX/EPOEJMPgO5MlFLkUcvfAFmnA7kcz+pq1/SV3BCvk+Jp2g3nlfm30ouQgL90J+JETDUyXkHXWhV4oxFuBMrAxmmLf9FGYF4ghBuIFNhwN+XvGAKsejg1QFxqDRUfV4cZeRSE8hjLS73hwQoGF4QrK7UlnGT7+qfttPVFFa2L7ncYbCEBVu4+qk0LE0h4M6kGTRNudMibQqFoY+DLzK0pXsmIauauKUs7Teztszbh/oPhk6w9Fg==",
"type": "rsa-aes",
"iv": "jzzPVTJuK6duW73l"
},
(省略)
}
]
encryptionDetails
パラメータの中に必要な情報が書かれていることがわかります。
この中の encrypted_cek
が暗号に使われた鍵なのですが、これ自体は公開鍵で暗号化された状態のため、このままでは復号はできません。
復号をするためにはプログラムを用意する必要がありますが、Twilio には以下のサンプルプログラムが用意されています。
今回はこの中から、JavaScript を使って復号していきましょう。
上記の JavaScript のリンクから、RecordingsDecryptor.html
ファイルを適当なフォルダにダウンロードしてください。
このプログラムでは秘密鍵が PKCS#8 形式しか対応していないため、現在の秘密鍵を以下のコマンドを使って変換してください。
openssl pkcs8 -topk8 -in private_key.pem -out enckey.pem --nocrypt
では先程ダウンロードした html ファイルをブラウザで開いてみましょう。
以下の項目を入力して Decrypt ボタンを押すと、ブラウザ上で録音データが再生されます。
項目 | 入力値 |
---|---|
Encrypted CEK | 先程の JSON データの中の encrypted_cek |
IV | 同じく iv |
Private Key PEM File | 先程コマンドで変換した enckey.pem |
Encrypted Recording File | Twilio 管理コンソールからダウンロードした録音データ |
復号された録音データは生成されません。これはセキュリティ上望ましいです。
以上で、VRE の一連の流れの説明は終了です。
ベストプラクティス
セキュリティに関するベストプラクティスというのは、その要件によって変わるので非常に難しいのですが、以下の内容を参考にしていただけると幸いです。
アカウント管理を徹底する
まずは必ずやるべきこととして、アカウントの管理が挙げられます。
プロジェクトに参加できるのは誰なのか、それらのアカウントには不要なものが含まれていないか、二要素認証は設定されているかを確認しましょう。
くれぐれも共有アカウントでの運用はしないでください。録音データのセキュリティ以前に、とても危険な状態です。
ユーザアカウントの管理方法については、ぜひこの記事を見てください。
Twilioで開発を始める前に知っておくこと(アカウント編)
Enforce HTTP Auth on Media URLs を有効にする
この設定はデフォルトが無効になっています。 前述の通り、Media URL をランダムに推測することは不可能ですが、URL 自体が漏洩する可能性は比較的高いため、この設定は有効にすることをおすすめします。
録音データの扱い方を検討する
録音データを海外には保存したくないという要望が強いようであれば、録音データは Twilio 上には保存せずに、たとえば AWS の日本リージョンの S3 などに退避して、Twilio 上からは速やかに削除することをおすすめします。
Twilio には、RecordingStatusCallbackというしくみがあるので、この Webhook をトリガーにして、録音データを退避と削除をシステムに組み込むことが可能です。
Twilioで録音された録音データを、S3に自動でアップロードして削除する
ただし、前回のログの記事でも書きましたが、削除自体はすぐに反映されるものの、データがシステム上から完全に削除されるには最大30日かかります。また、Webhook を利用したとしても、ダウンロードと削除が完了するまでは Twilio 上にデータが記録されることになるので、それすら許容できないということであれば、公開鍵による暗号化をおすすめします。
プライバシーに配慮する
これは Twilio のシステムの話ではないのですが、通話を録音する場合には事前に相手方にも許可を取得することをおすすめします。法的には事前の同意なく録音をすること自体は違法ではないのですが、相手方へのプライバシーに配慮したシステムにしておくことに越したことはありません。
もし録音データを再利用するようなケースでは、この部分はとても重要になります。たとえば、録音データを使って応対マニュアルを改善する、オペレータの教育に利用する、音声認識の精度上げるなどです。このような再利用を前提としているのであれば、事前告知は重要な意味を持ちます。
もし心配な方は一度弁護士に相談するとよいでしょう。
まとめ
いかがでしたでしょうか。
実は、Twilio 上にはセキュリティに関する設定項目が色々あることがわかったかと思います。
セキュリティと利便性、運用コストはそれぞれバランスが重要です。まずは皆さん側のセキュリティポリシーと照らし合わせて、最適なセキュリティ対策を実施することをおすすめします。
KDDIウェブコミュニケーションズ経由でアカウントを開設していただくと、このようなご提案も含めて最適なご相談をお受けすることができますので、これからシステムを構築される方は、ぜひ弊社経由でアカウントを開設していただけると嬉しいです(完全に営業モード)。
相談会(オンライン)は毎週水曜日に実施していますので、事前に確認したいことなどがあれば、ぜひこちらからお申込ください。
Twilio(トゥイリオ)とは
https://cloudapi.kddi-web.com
Twilio は音声通話、メッセージング(SMS /チャット)、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウド API サービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。