AWS認定Big Data勉強記 - 3

みなさん、こんにちは、えいりんぐーです。
データ分析や機械学習周りの仕事をしています。

前回はAWSのビッグデータ関連サービスをざっと紹介しました。今回はこれらビッグデータに関するサービスのセキュリティについて簡単に説明します。なお、ここで書いている情報は、[AWSのセキュリティに関するホワイトペーパー](https://aws.amazon.com/jp/whitepapers/?ref=docs_gateway#security)を参考にしています。個々のサービスのより細かいセキュリティに関しては、[公式ドキュメント](https://docs.aws.amazon.com/index.html?nc2=h_ql_doc#lang/ja_jp)を参照してください。

##S3
S3はSimple Storage Serviceの名の通りストレージです。

S3のオブジェクトにはデフォルトでアクセス制限がかかっており、バケットやオブジェクトのオーナー以外はアクセスできません。しかし、以下のようにIAM policy、ACL、Bucket policyを使うことで異なるレベルでのアクセス制限を管理することができます。

Type|Account-Level Control|User-Level Control|
---|---|---|
IAM policy|No|Yes|
ACL|Yes|No|
Bucket Policy|Yes|Yes|

#####転送
S3はSSLで暗号化されたエンドポイントを提供しており、データのアップロード・ダウンロードができます。エンドポイントはインターネット・EC2からアクセスできます。

#####暗号化
データの暗号化に関してはS3 Encryption Clientのようなツールを使ってユーザー自身が管理する暗号化やS3 Server Side EncryptionといったS3が管理する暗号化があります。暗号化鍵はAWSが提供するものやユーザーが作成したものを使うことができます。

##Glacier
Glacierはより長期保存向きのオブジェクトストレージです。Glacierへのアップロードはマルチパートアップロードを行うことで、大きなファイルを効率的にアップロードできます。データへのアクセス管理についてはIAMが利用できます。

#####転送
SSLのエンドポイントを使って、通信を暗号化したデータの転送ができます。

#####暗号化
Glacierは自動でAES-256を使ってデータを暗号化します。

##Storage Gateway
Storage GatewayはオンプレミスのIT環境とAWSを接続し、クラウドをデータのバックアップやディザスタリカバリのために使うように提供されています。これには3つのオプションがあります。

- Gateway-Stored Volume: データはローカルに保存され、次いでS3にプッシュされます。オンプレのデータがプライマリであり、クラウドのデータはバックアップとして扱われます。
- Gateway-Cached Volumes: この方法では、ボリュームはS3に暗号化されて保存され、オンプレのボリュームには最近アクセスされたデータがキャッシュされます。クラウドのデータがプライマリになります。
- Gateway-Virtual Tape Library: この方法では、ユーザーは最大10本のバーチャルテープドライブ、1つのメディアチェンジャー、最大1,500本のバーチャルテープカートリッジを設定してデータを保存します。バックアップアプリケーションとして扱われます。

##Import/Export
Import/Exportは、シンプルでセキュアな方法で物理的にデータをS3・EBS・Glacierのストレージへと移行するためのサービスです。データが100GBを超す場合や、ネットワークが遅い場合に利用されます。AWSからデータをエクスポートすることもできます。サービスを利用する際に、ジョブの一意のアイデンティファイア・デバイスを証明する電子証明書・デバイスを送るAWSのアドレスを受け取り、これらを使ってサービスを実行します。

#####暗号化
安全性を高めるために、データを移行する前に、S3ではPINコードやTrueCryptなどを使った暗号化をすることができ、EBSやGlacierでは任意の方法で暗号化することができます。

##DynamoDB
DynamoDBはマネージドのNoSQLデータベースです。データ保存に冗長性を持たせるために、Data Pipelineを使ったバックアップや、同じリージョン・異なるリージョンでのバックアップをすることができます。

#####アクセス管理
IAMを使ってリソースレベルやデータベースレベル・アイテムレベル・アトリビュートレベルでのアクセス管理をすることができます。また、アイデンティティフェデレーションを使って、他のサービスでの認証を元に、Security Token Serviceから一時的なクレデンシャルをもらい、DynamoDBテーブルにアクセスさせることもできます。また、データへのアクセスリクエストにはHMAC-SHA256の署名が必要です。

#####エンドポイント
SSLエンドポイントを使ってEC2やインターネットからアクセスすることができます。

##RDS
RDSはマネージドリレーショナルデータベースサービスです。DBのセキュリティグループ・SSL接続・自動バックアップ・DBのスナップショット・マルチリージョンデプロイメントが可能です。

#####アクセス制御
DBインスタンス作成の際は、masterアカウントといってデータベースすべてを管理するアカウントを作ります。そして、追加でユーザーアカウントを作成して、DBへのアクセスを管理します。詳細なアクセス管理にはIAMを使います。

#####ネットワーク隔離
インスタンスはVPCの内側に作成することができます。VPC内のインスタンスにはインターネットやVPC外のEC2からVPNでアクセスできます。また、インスタンスへのアクセスをセキュアにするためにDB Security Groupを作成することもでき、ネットワークトラフィックはACLやファイアーウォールで管理できます。

#####暗号化
アプリケーションとDBの通信をSSLで暗号化することができます。

#####バックアップ
自動バックアップとDBスナップショットという方法があります。前者は自動でデータベースをバックアップし、ユーザーが指定した期間中にそれを保存します。後者はユーザーが開始するインスタンスのフルバックアップで、明示的に削除されるまで保存されます。

#####DBインスタンスレプリケーション
RDSは、複数のアベイラビリティゾーンでインスタンスを使用することで、高可用性とフェイルーバーをサポートします。

##Redshift
Redshiftはペタバイトスケールのデータウェアハウスです。

#####アクセス管理
デフォルトでは、クラスターを作成した時点では、クラスターへのアクセスは禁止されています。アクセスを管理するためにファイアウォールを調整することができます。RedshiftはVPCの内部で構築することができ、IPsec VPNを使って暗号化された接続することができます。アクセス権限を管理するためにIAMでユーザーの管理をするとともに、データベース自体へのアクセスは通常のSQL同様にgrantを通して管理します。

#####データバックアップ
データはクラスターに分散されて保存されるだけでなく、継続的にS3へスナップショットがバックアップされます。スナップショットは最大35日保存され、その間はいつでも取得することができます。

#####暗号化
クラスターへ保存するときにはデータの暗号化を行うことができます。これはAES-256暗号化鍵を利用します。データの暗号化は4層にわたります。

* データ暗号化キー: クラスター上のデータブロックを暗号化
* データベースキー: データ暗号化キーを暗号化
* クラスターキー: データベースキーを暗号化
* マスターキー: クラスターキーで暗号化されたデータベースキーを暗号化

#####通信
AWSクラウドの中で転送データを保護するために、RedshiftはS3やDynamoDBと通信にSSL暗号化を行います。また、ユーザーはクライアントとRedshiftクラスターの通信をSSLを用いて暗号化することができます。

##ElastiCache
ElastiCacheはマネージドの分散インメモリデータストアです。ElastiCacheのアクセスコントロールはセキュリティグループを使います。これはファイアウォールのように振る舞い、クラスターへのネットワーク明日セスを管理します。クラスターへアクセスしたい場合は、明示的にEC2セキュリティグループからのアクセスを許可します。

##EMR
Amazon EMRはマネージドのHadoopクラスター環境です。EMRはマスターノードとスレイブノードの両方でEC2セキュリティグループを設定します。マスターノードはオープンなポートを持っており、SSHでインスタンスに接続するためポートもオープンです。スレイブノードはマスターノードからのアクセスのみを許します。デフォルトでは、両方のセキュリティグループは、外部リソースからのアクセスを禁止します。また、インプットとアウトプットのデータを保護するために、EMRとS3はSSLでデータを転送します。また、アップロード前のデータを一般的なツールを使って、暗号化することができます。この時、暗号化されたデータはEMRで処理する際に複合する必要があります。

#####アクセス管理
アクセス管理にはIAMを使います。通常、クラスターを作成したIAMユーザー以外からはクラスターは見えません。また、EC2キーペアとクラスターを関連付けて、クラスターにSSH接続することができます。

#####VPC
EMRはVPC内で構築することができます。VPNを通じて内部ネットワークのリソースへクラスターからアクセスすることができます。

##Kinesis
Kinesisはリアルタイミングデータストリームサービスです。リアルタイムのデータ処理に必要なインフラを考える必要なく、実行したい処理に専念できます。Kinesisに記録されるデータレコードには、シーケンスナンバー・パーティションキー・データブロブが含まれます。データレコードは最大24時間アクセス可能で、それを過ぎるとデータを廃棄します。

#####管理
Kinesisのリソースと管理機能へのアクセスを制御するにはIAMを使います。Kinesisにデータを送るproducerやKinesisのデータを使用するconsumerの実行を管理するには、これらのEC2インスタンスにIAMロールを付与・設定します。これにより、関連した権限が利用可能になるだけでなく、長期間にわたるようなAWSのセキュリティクレデンシャルを使う必要がなくなります。また、IAMロールには時限制のクレデンシャルもあるので、セキュリティに一層の堅牢性を与えます。

#####通信
KinesisのAPIはSSLエンドポイントのみを通じてアクセス可能です。

##Data Pipeline
Data Pipelineは、異なるデータリソースの間でデータを処理したり移動したりするサービスです。データ・ドリブンな作業や組み込みの依存関係チェックを使って処理ができます。

#####アクセス管理
コンソールを使用する際に、Data Pipelineは必要なIAMロールとポリシーを作成します。IAMロールはEC2インスタンスなどが利用を許可されるリソースやアクションを定義します。また、パイプラインを作成する時に、パイプラインを司るIAMロールとパイプラインが使用するリソースを司るIAMロールを指定します。

#####通信
Data PipelineはSSLを介したセキュアなエンドポイントを提供しています。

##IAM
IAMはユーザーやロールの作成と、それらに対してAWSのサービスについて許可を与えることでセキュリティを管理できるようにします。また、どのユーザーがマーケットプレイスでソフトウェアやサービスに登録できるかを管理することができます。

#####ロール
IAMロールは、通常AWSリソースにアクセスできないユーザーやサービスに許可を与えるために、一時的なセキュリティクレデンシャルを使います。ロールは特定のAWSリソースにアクセスする許可のセットで、これらの許可は特定のユーザーやグループに紐づけられているわけではありません。一時的なクレデンシャルはライフスパンが短く、失効した後には再使用できないことから、より強固なセキュリティを実現できます。特に有効な状況は

 - Federated (non-AWS) ユーザーアクセス。Microsoft Active DirectoryやLDAP・Kerberosのような、外部サービスを使って権限を付与する際に便利です。ロールによるクレデンシャルを使ってAWSとnon-AWSサービスとの間で権限やアイデンティティを提供することができます。
 - SAML2.0を使っている場合。この場合、アイデンティティプロバイダーとしての所属組織とサービスプロバイダーとしての他組織との間で認証を作ることができます。AWSでは、AWSをサービスプロバイダーと設定し、コンソールへのシングルサインオンをユーザーに提供するためやAWS APIコールへの連携したアクセスを得るためにSAMLを使うことができます。
 - モバイルやウェブアプリケーションがAWSリソースにアクセスする場合。AWSリソースはセキュリティクレデンシャルを要求しますが、クレデンシャルはユーザーにとってアクセス可能となり、クレデンシャルのローテーションが難しいため、アプリケーションに長期のクレデンシャルを埋め込むべきではありません。代わりに、他の方法でサインインしつつ、ロールで一時的なクレデンシャルを使うべきです。
 - クロスアカウントアクセスをする場合。複数のAWSアカウントを利用する組織にとって、ロールを設定して、あるアカウントに別のアカウントの管理下にあるリソースにアクセスする許可を与えることができます。
 - EC2上で動くアプリケーションがAWSのリソースにアクセスする場合。それぞれのアプリケーションのためにIAMアカウントを作成するよりも、ロールを使うことでインスタンスやオートスケールの管理が容易になります。

##CloudWatch
CloudWatchはAWSリソースのモニタリングサービスです。リソースの使用状況やパフォーマンス・要求量などを監視することができます。AWSリソースのメトリクスだけでなく、EC2インスタンスにインストールされたアプリケーションのログなどもモニターすることができます。

承認されたユーザーのみがアクセスしたり管理したりするために、CloudWatchは権そのAPIへのリクエストが承認されていることを要求します。リクエストはHMAC-SHA1で署名されます。

#####通信
CloudWatchのコントロールAPIは、SSLで暗号化されたエンドポイントのみからアクセスできます。

#####アクセス管理
CloudWatchへのアクセス管理はIAMを使います。

##CloudHSM
CloudHSMは、セキュアな暗号化鍵とその暗号化処理を行うデバイスを提供するサービスです。暗号化鍵を生成し、保管し、管理することができます。CloudHSMは、そのアプライアンスに対してプライベートIPとプライベートサブネットの提供しつつ、EC2とVPCと共に使用するように設計されています。EC2のアプリケーションからは、CloudHSMにはSSL/TLSを通して接続することができます。EC2インスタンスと同じリーションにCloudHSMを利用することで、レイテンシーを下げることができます。

HSMを使い始める前に、最低でも一つのパーティションをセットアップします。暗号パーティションは鍵へのアクセスを制限する論理的物理的なセキュリティバウンダリです。HSMアプライアンスは物理的論理的なタンパー検出と対応メカニズムを持っており、もしタンパリングが発見された場合には暗号化鍵の抹消とイベントログの生成をします。もし3回HSMパーティションへのアクセスに失敗したら、HSMアプライアンスはHSMパーティションを抹消します。CloudHSMへの登録が終了し、HSMの内容が必要でないと確認した場合、ログ・内容・パーティションを全て抹消しなければなりません。

##Cognito
Cognitoは、モバイルとウェブベースのアプリケーションにアイデンティティと同期サービスを提供するサービスです。ユーザーの認証やデバイス間でデータを保存・管理・同期させるタスクを簡単にします。加えて、インフラを気にすることなく一時的かつ限定的なクレデンシャルを使用することができます。

Cognitoを始めるために、まずアイデンティティプールを作成します。アイデンティティプールはAWSアカウントに特異なユーザーアイデンティティ情報の保管場所です。この際、エンドユーザーのために新しいIAMロールを作るか既存のIAMロールを使用する必要があります。ロールによって許可されたリソースにアクセスできるようになります。このため、エンドユーザーのためにAWSアカウントやIAMアカウントを作成する必要がなくなります。

CognitoはGoogleやFacebookなどのアイデンティティプロバイダーとアプリケーションが通信できるようにしますが、そのクレデンシャルを受け取ったり、保存したりしません。OAuthやOpenID Connectトークンのみを受け取ります。トークンを受け取ったら、Cognitoは新しいCognito IDと一時的で限定された権限を持つAWSクレデンシャルをユーザーに返します。

Cognitoアイデンティティはそれ自身のデータに対するアクセスしか持たず、このデータは保管時に暗号化されます。加えて、全てのアイデンティティデータはHTTPS経由で転送されます。このCognito Idetifierは、例えばiOSならキーチェーンのように、適切でセキュアな場所に保存されます。ユーザーデータはアプリケーションのサンドボックスにおいて、ローカルのSQLiteデータベースにキャッシュされますが、このアイデンティティデータを暗号化することで、セキュリティを強くすることもできます。

##終わりに
以上、AWSのデータベース関連サービスに関するセキュリティをまとめました。セキュリティは重要ですが、そのドキュメントは抽象的で冗長なところがあり、読むのはしんどかったです。しかし、主要サービスに関してほどよくまとまっており、ページ数が多いわけでもありません。こちらで書いていない細々した部分もあるので、ぜひご自身でホワイトペーパーや各サービスのドキュメントを読んでみてください。