Security Category¶
IAM(Indentity Access Management)¶
Overview¶
AWSには、AWSアカウント(ルートアカウント)とIAMアカウントの2種類がある。 ルートアカウントはAWSの全てのサービスに対し、ネットワーク上のどこからでも 操作できる強力な権限を持っている。そのため、複数の利用者でAWSを利用したい場合や、 アプリケーション上からAPIを通じて、AWSリソースにアクセスする場合など、 必要に応じて、各AWSサービスごとに操作の制御が可能なIAMアカウントを作成し、運用するのが一般的である。
IAMアカウントには、以下の3種類が定義できる。
- IAMユーザ
- IAMグループ
- IAMロール
種類 | 説明 |
IAMユーザ | ユーザは各利用者にAWSを利用するための認証情報。ユーザには、人に限らず CLI(Commnad Line Interface)やAPIを呼び出すアプリケーションも含まれる。 認証はそれぞれ、ID・パスワードを使用する方法と、アクセスキーと シークレットアクセスキーを使用する方法で行う。 |
IAMグループ | グループは同じ権限をもつユーザの集まりである。認証はユーザで行い、 認可はIAMグループに対して適切な権限を設定する方法がよい。 |
IAMロール | ロールは永続的な権限(アクセスキー、シークレットアクセスキー)を保持する ユーザと異なり、一時的にAWSリソースへアクセス権限を付与する場合に使用する。 |
認可は、「Action(どのサービスの)」、「Resource(どういう機能や範囲を)」、「Effect(許可or拒否)」という形でアクセスポリシーとして定義する。 AWSが最初から設定しているポリシーをAWS管理ポリシーといい、ユーザが独自に作成したポリシーをカスタマー管理ポリシーと呼ぶ。 これらのポリシーを上述のIAMユーザ、グループ、ロール各々に適用できる。また、これらの設定を様々なグループ、ユーザで横断的に適用できるよう、 オブジェクトとして管理できるIAM管理ポリシーと、従来の通り、ユーザ・グループ、ロール個別に設定していくインラインポリシーの2種類がある。
IAMユーザ・グループの作成¶
アプリケーションからアクセスするためのユーザ、及びグループを作成し、AWS管理ポリシーを割り当てる。
■管理コンソールのIAMから、ユーザを選び「ユーザの作成」を選択する。
■ユーザ名を入力し、アクセスの種類(ここでは、プログラムによるアクセス)を設定する。
■新規グループの作成を選択し、S3へアクセスするAWS管理ポリシーを割り当てる。
IAMロールの作成¶
IAMロールは、アプリケーションでS3へのダイレクトアップロードを行う場合など、一時的にAWSリソースへアクセス権限を付与する場合に使用する。 ここでは、S3へファイルの書き込みに対して、STS(Security Token Service)を利用することを想定した、IAMロールの設定を行う。
■管理コンソールのIAMからロールを選び、「ロールの作成」ボタンを押下する。
■アプリケーション用のユーザ(のみ)が、STSに対して、AssumreRoleリクエストが発行できるように、「別のAWSアカウント」を選択し、アプリケーション用のユーザを作成したアカウントIDを入力する。
Warning
AWSサービス(EC2等)に対してロールを割り当ててしまうと、アプリケーションの実装を知っていれば、第3者でもアクセスできてしまうため、アプリケーションのユーザのみがAssumeRoleリクエストを発行できるように設定する。
Note
アプリケーションユーザの割り当ては後ほど行うため、ここでは、アプリケーション用のIAMユーザを作成したアカウントだけ設定する。
■S3への書き込みが行えるポリシーを作成する。新規ポリシーの作成を選択し、以下の通り、S3のバケットオブジェクトへPutObject権限を割り当てる。
- サービス:S3
- アクション:PutObjectを設定
- リソース:書き込み用のバケット名とオブジェクト名(フォルダ名+ワイルドカード)を指定。
- リクエスト条件:ここでは特に設定しない
■「ReviewPolicy」を押下し、ポリシー名を入力して、「CreatePolicy」でポリシーを作成する。
■作成したポリシーをロールに対して割り当て、ロール名を入力し、ロールを作成する。
■ロールを作成したのち、信頼関係タブで、「信頼関係の編集」を押下する。
■PrincipalのAWS属性を以下の通り書き換える。
“arn:aws:iam::<アカウント>:user:<アプリケーション用のIAMユーザ>”
Note
アプリケーションからSTSを利用する場合、アカウントIDを含むロールARNを取得する必要があるが、アプリケーションのセキュリティ対策上の問題で、アプリケーション内で定義したロール名からARNを取得したい場合(アカウントIDなどをプロパティに定義したくない場合)、AssumeRequestするユーザがロール情報を取得できるよう、以下のようなポリシーをユーザにアタッチしておく必要がある。
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole"
],
"Resource": "arn:aws:iam::<account-id>:role/XX-*"
}]
}
Note
Policyは、未記入 < ALLOW < DENYの順で優先される。
AWS Certificate Manager¶
Overview¶
AWS Certification Managerは、AWSの各種サービスで使用する Secure Sockets Layer/Transport Layer Security (SSL/TLS) 証明書のプロビジョニング、管理、およびデプロイを、簡単に行えるサービスである。具体的には、
- SSL/TLS 証明書をリクエスト、プロビジョンして、Elastic Load Balancing、Amazon CloudFront、Amazon API Gateway などのサービスへ組み込み、ウェブサイトやアプリケーションに証明書をデプロイできる。
- リクエストしたドメインの所有権を証明して、証明書が発行されると、AWSマネジメントコンソールのドロップダウンリストで SSL/TLS 証明書を選択し、デプロイできる。
- AWSコマンドラインインターフェイス(CLI)コマンドまたは API 呼び出しを使用して、ACM によって提供される証明書を AWS リソースにデプロイすることもできる。ACM では、証明書の更新とデプロイが自動的に管理される。
SSL証明書には、
- ドメイン認証証明書(Domain Validation)
- 組織認証証明書(Organization Validation)
- EV証明書(Extended Validation)
があるが、ACMはドメイン認証型のSSL証明書であり、コンソール内での認証や、ドメインの管理者に確認のメールが届いて、 メールに記載されているURLをクリックするだけで、証明書の取得が可能である。
証明書のリクエスト¶
- 証明書を取得したいドメインを入力し、「次へ」を押下する。ここでは、¥*.debugroom.orgを入力。
- DNSの検証ラジオボタンにチェックをいれたまま、「次へ」を押下する。この方法では、Route53を使って認証を行うパターンである。
- 「確定とリクエスト」を押下する。
- ドメインのDNS設定でCNAMEレコードの追加を行うことで認証する。ここではRoute53を使用してレコードの追加を行う。「Route53でのレコードの作成」を押下する。
- 「作成」を押下し、レコードを追加する。
- DNSレコードが書き込まれ、検証フェーズに更新される。
- ACMコンソールでは、証明書の検証のステータスが表示される。検証が完了するまで少々時間がかかる。
Amazon Cognito¶
Overview¶
Amazon Cognitoはユーザ情報の管理や認証・認可の設定、またAWSサービスへのアクセスを許可する認証情報を提供するサービスである。 大きくユーザプールとIDプールがあり、ユーザプールではアプリユーザのサインアップやサインインオプションを提供するユーザディレクトリサービスであり、 IDプールではユーザプールで管理しているユーザや、匿名のゲストユーザに対して一時的な認証情報を発行する。
ユーザプールプールの作成¶
■API Gatewayから認証されることを目的としたユーザプールを作成する。コンソールからAmazon Congnitoサービスを選択し、 ユーザプールの管理ボタンを押下して、ユーザプールを作成する。
■ユーザプール名を入力し、「ステップに従って設定する」を選択する。
■Emailアドレスを使ったサインインを実行するため、「Emailおよび電話番号」を選択する。
■サインアップのために必要な属性を選択する(特に設定しなくても大丈夫だが、サンプルとしてfamily_nameとgiven_name、pictureを選択する)。
■パスワードの強度を設定し、ユーザに自己サインアップの許可を与える設定をした上で、「次のステップへ」ボタンを押下する。
■MFAはいったんオフ設定とし、アカウントの回復はEmailおよび電話を選択する。
■確認する属性としてEメールを選択し、SMSのロール名を入力して「次のステップ」ボタンを押下する。
■サインアップの確認ように使用されるSESのリージョンを選択する。基本デフォルトのままで良い。
■検証メッセージおよび招待メッセージの雛形文を入力する。
■タグは特に設定せず、「次のステップ」ボタンを押下する
■ユーザのデバイスを記憶しない設定で「次のステップ」ボタンを押下する
■続いてこのユーザプールにアクセスするアプリケーションクライアントの設定を行う。HTTPアクセスによる認証を想定する場合、
- 「認証用の管理APIユーザの名パスワード認証を有効にする(ALLOW_ADMIN_USER_PASSWORD_AUTH)」
- 更新トークンベースの認証を有効にする(ALLOW_REFRESH_TOKEN_AUTH)
を選択する。また、ユーザ存在エラーを防ぐを有効化し、アプリクライアントを作成して、「次のステップ」ボタンを押下する。
Note
アプリクライアントIDは後続のIDプールの作成で使用するのでメモしておくこと。
■トリガーは特にデフォルト設定(なしのまま)でユーザプールを作成する。
■トリガーは特にデフォルト設定(なしのまま)でユーザプールを作成する。
Note
ユーザプールIDは後続のIDプールの作成で使用するのでメモしておくこと。
ユーザの作成¶
■作成したユーザプールでユーザの作成を行う、「ユーザとグループ」メニューから「ユーザの作成」ボタンを押下する。
■ユーザ名と初期パスワード、サインアップ確認のEメールアドレスを入力し、「ユーザの作成」ボタンを押下する。
■作成されたユーザを確認する。ステータスは「FORCE_CHANGE_PASSWORD」となっており、初回アクセス時にはパスワードの変更が必要となる。
IDプールの作成¶
■AWSコンソールからAmazon Cognitoを選択し、「フェデレーテッドアイデンティティの管理」を押下し、IDプールを作成する。プール名を入力する。
■認証プロバイダーでCognitoタブを選択し、上記の手順で作成したユーザプールIDとアプリクライアントIDを入力して、「プールの作成」ボタンを押下する。
■新しく作成するIDプールに使うIAMロールを作成する。ロール名を適宜入力して作成すること。
Amazon STS¶
Overview¶
STSはIAMユーザもしくはフェデレーテッドユーザがリクエスト可能な一時的セキュリティ認証情報を提供するWebサービスである。 STSでは、Security Assertion Markup Language (SAML) 2.0 をサポートする。この機能では、フェデレーティッドシングルサインオン (SSO) が有効になり、 ユーザーは Windows Active Directory Federation ServicesなどのSAML 互換アイデンティティプロバイダーからのアサーションを使用して、 AWS マネジメントコンソールへのサインインや、プログラムの AWS API 呼び出しを行うことができる。
Note
フェデレーテッドユーザとは、特定の認証を完了した認証済みのユーザを指す。
また、Amazon、Facebook、または Google へのログインなどの信頼できるアイデンティティプロ バイダーを使用して、アプリケーションを設定し、 フェデレーションされた認証情報を配布するWeb ID フェデレーションをサポートするが、以下のようなステップで実行可能である。
- アイデンティティプロバイダーにアプリケーションを登録する。
- アイデンティティプロバイダー用の IAM ロールを作成する。
- そのIAMロールにアクセス権限を設定する。
- アイデンティティプロバイダーのSDKを使用して、ログイン後にトークンにアクセスできるようにする。
- AWS SDK for JavaScript を使用して、トークンを元にAWSリソースの一時的な認証情報をアプリケーションに取得させる
AWS Key Management Service(KMS)¶
AWS Key Management Serviceとは、データを暗号化するキーのマネージド暗号化サービスである。 KMSでは、カスタマーマスターキー(CMK)と呼ばれるタイプのキーを使用して、データを暗号化および復号する。 データキーは暗号化対象毎に固有のため、キーが流出しても影響は限定的になる。KMSでは以下のようなキー管理機能を実行できる。
- 一意のエイリアスおよび説明を付けたキーを作成する。
- IAMのどのユーザーおよびロールがキーを管理できるかを定義する。
- IAMのどのユーザーおよびロールがキーを使用して、データを暗号化および復号できるかを定義する。
- AWS KMSが1年ごとに自動でキーを更新するよう設定する。
- キーを誰にも使用されないように一時的に無効にする。
- 無効にしたキーを再度有効にする。
- AWS CloudTrailでログを調査して、キーの使用を監査する。
アプリケーションのデータを暗号化する必要がある場合、開発者は、AWS SDKを使用することで、簡単に暗号化キーを使用および保護できる。
Note
AWS CloudHSMと類似するサービスであるが、KMSはマスターとなるキー自体を生成するのに対し、CloudHSMはキーを保管しておくだけのサービスである。