AWS Organizations(1)Organizationsの概要

AWS Organizations

AWS Organizationsは、 複数のAWSアカウントを統合 するためのアカウント管理サービス。アカウント管理1や 一括請求 機能をはじめとした、以下の機能が備わっている。

  • アカウントの一元管理
  • 一括請求
  • アカウントのグループ( OU )化
  • アカウント毎の アクセスコントロール
  • タグの標準化
  • IAMの統合

これらの機能を実現するために、AWS Organizationsは以下のAWSサービスと連携している。

サービス名 有効化 実現できること
AWS IAM 不要 サービスアクティビティ による 最終アクセス時間の確認
AWS Artifact 必要 組織契約 による 契約の受諾
AWS CloudTrail 必要 組織の証跡 による 証跡の組織への適用
AWS CloudWatch Events 不要
AWS Config 必要 アグリゲータ による 集約ビュー の表示
AWS Control Tower 不要
AWS Directory Service 必要
AWS Firewall Manager 必要 AWS Firewall Manager による WAFルールの管理
AWS ライセンスマネージャー 必要
AWS RAM 必要
AWS Service catalog 必要
Service Quotas 不要
AWS シングルサインオン 必要
AWS System Manager 必要 Systems Manager Explorer によるデータの同期
タグポリシー 必要

AWS Organizationsを有効化すると、複数のAWSアカウントを一括管理することができる。それぞれのアカウントは、ルートを親として 組織単位 (OU)ごとに分類することができる。アカウントは、 マスターアカウント (=ルート)と メンバーアカウント に分かれ、マスターアカウントにはメンバーアカウントを管理するための様々な権限が付与される。AWS Organizationsの全ての機能を有効化することも、 一括請求機能のみを有効化 することもできる。各OUもしくはアカウント単位に、 サービスコントロールポリシー と呼ばれる各アカウントが持つ権限を明示したポリシーを適用することができる。 サービスコントロールポリシーとタグポリシーは、デフォルトでは無効化されている ので、利用する場合は有効化する。

組織とアカウント

AWS Organizationsが持つことのできるマスターアカウントは1つのみである。マスターアカウントでOrganizationsを有効化し、その後参加するアカウントを招待することで、メンバーアカウントを追加することができる。 マスターアカウントはサービスコントロールポリシーの影響を受けない 。Organizationsを削除すると復元できず、またポリシーも削除される。削除する際には、 全てのメンバーアカウントを消去する必要 がある。

Organizationsに参加したメンバーアカウントでは、サービスコントロールポリシーやタグポリシーが即座に適用され、またサービスの信頼を有効化している場合は、そのサービスからメンバーアカウントに対してアクションを実行することが許可される。また、Organizations内で新規のメンバーアカウントを作成することもできる。

ポリシー

サービスポリシー

サービスポリシーは、 最大で使用できるアクセスの権限を各アカウントに対して指定できる機能アカウントのルートユーザにも適用され、アカウントに与える影響が非常に大きいため適用する際には詳細のテストが必要である。IAMのサービスアクティビティに表示される、各アカウントの最終アクセス時刻を参考にポリシーの内容を決定することが望ましい。

サービスポリシーは以下のタスクには影響しない。

  • マスターアカウント
  • Service-linked Role
  • ルートユーザの認証
  • サポートプランの変更
  • CloudFrontの一部機能

サービスポリシーは、IAMポリシーとほぼ同じ構文を使用する。複数のポリシーが適用されている場合は、明示的なDenyがAllowよりも優先される。ポリシーの例は、 サービスコントロールポリシーの例 を参照のこと。

タグポリシー

タグポリシーを用いることで、タグキーおよびタグ値の大文字と小文字の処理方法の設定などを規定することができる。デフォルトでは、タグポリシーへのコンプライアンスの強制はされない。強制をサポートするAWSサービスは 強制をサポートするサービスとリソースタイプ を参照のこと。

AWS(5)セキュリティのベストプラクティス

概要

偶発的もしくは意図的な盗難漏洩不整合削除からミッションクリティカルな情報を保護するために、Information Security Management System (ISMS)を作成するためのガイドライン。

責任共有モデル

AWSでは、AWS が安全なインフラストラクチャとサービスを提供する一方で、ユーザは安全なオペレーティングシステム、プラットフォーム、データを用意する責任を持つ責任分担モデルを採用している。例えばEC2の場合は、設備やハードウェアの物理的セキュリティ、ネットワークインフラ、仮装化インフラはAWSが管理する一方で、AMI、OS、アプリケーション、データ、認証情報等は、ユーザ自らが管理しなければならない。

インフラストラクチャサービスの責任共有モデル

Trusted Advisorの利用

Trusted Advisorを利用してサービスの状況を確認し、セキュリティの設定ミスシステムパフォーマンスの向上に関する提案使用率の低いリソースの確認などを行うことができる。例えば、管理ポートへのアクセスが限定的なものであるかや、IAMが設定されているか、MFAが有効化されているかなどが確認できる。

アセット

ISMSを設計する前に情報アセットを特定し、これらを保護するために必要なソリューションを技術面とコスト面から検討する必要がある。アセットは、業務の情報やプロセスなどを含む本質的な要素と、ハードウェアやソフトウェア、人員などを含む本質的な要素をサポートする要素の2つに大別される。

アセットの例

アセット名 アセットの所有者 アセットカテゴリ 依存関係 コスト
顧客向けアプリケーション eコマースチーム 必須 EC2, RDS…
AWS Direct Connect 最高情報責任者(CIO) ネットワーク ネットワーク運用, Direct Connect

これらのアセットを保護するために、情報セキュリティマネージメントシステム(ISMS) の実装、運用、モニタリング、確認、保守、改良に関する基準を定める必要がある。このとき、ビジネスニーズや目標、プロセス、組織の規模や構造などを考慮して基準を定める。ISMSの設計には、ISO27001 などの標準的なフレームワークを参考にすると良い。

段階 内容 詳細
1 スコープと境界の定義 スコープに含めるリージョン、AZ、リソース等を定義する。除外するリソースがある場合はその除外理由を明記する。
2 ISMSポリシーの定義 情報セキュリティの方向性と指針、法律や契約の要件、リスクの評価方法や承認方法
3 リスクの評価方法の選択 ビジネスニーズ、セキュリティ要件、IT機能と要件、法規制
4 リスクの特定 アセットとアセットに対する脅威を記した登録簿の作成、脆弱性とその結果
5 リスクの分析と評価
6 リスクへの対処 リスクを受け入れる、回避する、リスクレベルの査定
7 セキュリティコントロールフレームワークの選択 ISO 27002、NIST SP 800など
8 マネジメントによる承認の取得 残留リスクの報告と承認
9 適用宣言書の作成 選択したフレームワーク、導入済/予定のフレームワーク、除外したフレームワークとその理由

AWSアカウント

AWSアカウントは非常に強力な権限を有するので日常的な使用はせず、極力IAMユーザを使用する。またIAMユーザは、(特定のグループに所属するIAMユーザが1名だけであった場合でも)IAMグループを利用し、またきめ細やかに権限を付与し、タスクに必要な最小限のアクセス権限を付与する。また、AWSのアカウントは、セキュリティの観点から単一アカウントで処理する、開発ステージごとにアカウントを分割する、などビジネスやガバナンスの要件を満たすように設計することが必要である。AWSアカウントを複数有する場合は、一括請求アカウントを利用することで、管理の複雑さを低減し、スケールメリットを享受することができる。

アクセスキーを利用する場合は、定期的に更新を行う。また、IAMユーザの認証にはMFAの併用が望ましい。複数のAWSアカウントを横断的に利用する場合には、クロスアカウントアクセスの利用も検討する。社内に既にディレクトリサービスを有する場合には、IDフェデレーションの利用も可能である。EC2から他のAWSリソースを利用する場合はIAMロールを使用する。

データの保護

リソースへのアクセス保護

リソースへのアクセスは、各リソースを作成したユーザが他のユーザに対してアクセスを許可するリソースポリシーと、IAMユーザやIAMグループを使用して付与される機能ポリシーのいずれかを単独でもしくは組み合わせて使用する。

保管時のデータ保護

以下の課題を考慮して、データの保護を行う手法を検討する

  • 偶発的な情報開示や漏洩
  • データの不整合や不正な書き換え
  • 過失による削除
  • システム障害や災害に備えたシステムの可用性

S3におけるデータ保護

  • アクセス権限の付与
  • バージョニング
  • レプリケーション
  • バックアップ
  • サーバサイド暗号化
  • クライアントサイド暗号化

EBSにおけるデータ保護

  • レプリケーション
  • バックアップ(スナップショット)
  • 暗号化

RDSにおけるデータ保護

  • 暗号化関数の使用
  • アプリケーションレベルの暗号化

Glacierにおけるデータ保護

  • サーバサイド暗号化
  • クライアントサイド暗号化

DynamoDBにおけるデータ保護

  • Base64エンコード

EMRにおけるデータ保護

  • S3のサーバサイド暗号化
  • S3のクライアントサイド暗号化
  • アプリケーションレベルの暗号化

伝送中のデータ保護

以下の課題を考慮して、データの保護を行う手法を検討する

  • 偶発的な情報開示や漏洩
  • データの不整合や不正な書き換え
  • なりすましや中間者攻撃

伝送中のデータを保護するために、AWSではIPSecSSL/TSLをサポートしている。また、Remote Desktop Protocol(RDP)の使用やSSHの使用も有効である。

S3へ伝送中のデータ保護

  • SSL/TSLを用いた通信

RDSへ伝送中のデータ保護

  • SSL/TSLを用いた通信
  • X.509証明書

DynamoDBへ伝送中のデータ保護

  • HTTPSの利用

OSとアプリケーションのセキュリティ保護

OSとアプリケーションのセキュリティを保護するためには以下が奨励される。

  • ルートアクセスキーとシークレットキーの無効化
  • IPアドレスを限定したインスタンスへのアクセス
  • pemファイルのパスワード保護
  • ユーザの管理
  • 認証情報の更新
  • IAMユーザのアクセス権を定期的に管理

AMIを公開する場合は、認証情報をOS上から消去しておくなど、セキュリティ面には十分注意する。

万が一、OS等への侵入が確認された場合に、根本的な原因追求を行うためにフォレンジックを行う。

ブートストラッピング

PuppetやChefなどを利用してセキュリティプログラムの更新や、パッチの適用、ステージに合わせた環境設定の実行、リモートモニタリング等を実施する。

マルウェアからの保護

信頼できないAMIやコードは実行しない。また、信頼できないソフトウェアリポジトリも使用しない。ユーザに付与する権限は必要最小限とし、ウイルスおよびスパム対策ソリューションを必ず利用する。

その他の対策

  • ベンダー指定のデフォルト値を削除する
  • 不要なユーザを無効化する
  • EC2に複数の機能を持たせない
  • 必要なサービスやデーモンのみ有効化する
  • 不要な機能やWebサーバは無効化する

インフラの保護

インフラを保護するためには以下を行う。

VPCの利用

VPCを利用することで、AWSのパブリッククラウド内にプライベートクラウドを作成できる。他のAWSユーザからリソースを隔離できるということだけでなく、インターネットから隔離することもできる。また、IPSecやDirect Connectを利用することでオンプレミス拠点とAWS間をセキュアに接続することも可能である。

セキュリティグループやNACLを使用することで、セキュリティゾーニングを実現することができる。この際に、セキュリティゾーン間の通信を制御するかゾーン間の通信をモニタリングするかゾーンごとにアクセス権限を付与するか、などを検討する必要がある。

セキュリティのテスト

セキュリティコントロールとポリシーの有効性を定期的にレビューする。新しい脅威や脆弱性に対処するためには、外部脆弱性評価外部侵入テストアプリケーションとプラットフォームの内部グレー/ホワイトボックスレビューを行う。なお、侵入テストを行う場合には、AWSにリクエストが必要な場合がある。

メトリクスの管理と向上

有効性の測定を行う上では、メトリクスの利用が有効的である。

  • 手順のモニタリング
    • 処理結果からエラーを迅速に検出する
    • セキュリティ侵害やインシデントに迅速に対応する
    • セキュリティアクティビティが想定通りに実行されているか判断する
    • セキュリティイベントを検知してインシデントを防止する
    • 対処が効果的であったか判断する
  • ISMSの有効性のレビュー
    • セキュリティ監査、インシデント、有効性測定
    • 関係者からの提案およびフィードバック
    • ポリシーが目的に合っているかの確認
  • 有効性の測定
    • セキュリティ要件を満たしているかどうか
  • 定期的なリスク評価レビュー
    • 残留リスクの許容可能なリスクのレビュー
    • 法改定など外部イベントに適しているか
  • 内部監査
  • 定期的な管理レビュー
    • スコープが適切か
  • セキュリティ計画の更新

DoSおよびDDoS攻撃の緩和と保護

DoSおよびDDoSについて懸念がある場合には、AWSのサポートの契約が望ましい。サポートに契約することで、AWSがDoSおよびDDoS攻撃の事前および事後にサポートを提供できる。AWSは、トラフィックが攻撃によるものかは判断できないために、アクティブに対処することはしない。これらの攻撃に対処するためには、以下の手法を検討する。

  • セキュリティグループやNACLの使用
  • WAFの使用
  • レート制限
  • ハーフオープンセッションの制限

モニタリングと監査、インシデント対応

ログファイルを蓄積することで、適切なモニタリングとて監査、インシデント対応を行うことができる。

エリア 考慮事項
ログ収集 収集方法に注意する
ログ転送 ログファイルを安全、確実、タイムリーに転送する
ログストレージ 一元管理し分析を行う
ログ分類 分析に適した形式
ログ分析 ログファイル内のイベントを相互に関連付ける
ログの保護 改ざん等を防ぐ

AWS API Gateway(3)カスタムログの出力


API Gatewayは、詳細のアクセスログをCloudWatch Logsに吐き出すことができる。CloudWatch Logsへのログ書き込みを行うためには、書き込み権限の取得とログを書き込むロググループの指定が必要となる。

IAMロールの指定

IAM上でAPI GatewayからCloudWatch Logsへの書き込み許可を持つIAMロールを作成する。IAMでは、あらかじめAmazonAPIGatewayPushToCloudWatchLogsと呼ばれるポリシーが用意されているため、このポリシーがアタッチされたIAMロールを作成する。この作成したIAMロールをAPI Gatewayの設定画面上で指定することで、API GatewayはCloudWatch Logsへの書き込み権限を取得する。

ログの指定

次にAPI Gateway上の各APIのログ/トレース設定画面にて、カスタムアクセスのログ記録を有効化する。入力項目は、CloudWatchロググループのARNと、ログ形式の2種類。ログ形式は、JSONやCLFなどの中から選ぶと自動的に入力される。

AWS API Gateway(2)Kinesisへのデータ投入

API Gatewayから大量のデータを投入し、これらのデータを解析および蓄積する場合には、API GatewayからLambdaに直接データを渡すのではなく、大規模データストリームサービスのKinesisを介した方が、バックエンドのシステムが高負荷に晒されずに安定的に稼働させられる場合がある。

API Gatewayとバックエンドのエンドポイントとの接続は、API Gateway内の統合リクエスト機能を用いて行い、統合リクエストは下の5つの統合タイプを用意している。

  • Lambda関数
  • HTTP
  • Mock
  • AWSサービス
  • VPCリンク

Mockは、バックエンドと接続せずにレスポンスを返す統合タイプで、テストを行う際や、CROSのプリフライトリクエストの返答などに用いる。

統合リクエスト

Kinesisと接続する場合は、POSTメソッドを作成し、上記のうちの「AWSサービス」を選択して以下のように各欄に必要事項を入力する。Kinesisへデータ投入する際には、Kinesis側で用意されているputRecordメソッドを使用する。

データ入力項目

項目 入力内容 備考
統合タイプ AWSサービス  
AWS リージョン 当該Kinesisのリージョン  
AWS サービス Kinesis  
AWS サブドメイン 空欄  
HTTP メソッド POST  
アクション PutRecord  
実行ロール KinesisへのputRecordをAPI Gatewayに許可するIAMロール arn:aws:iam::account-id:role/iam-role-name

IAMロールについては、KinesisへのputRecordをAPI Gatewayに許可する記述が必要で、IAM上で以下の内容を含んだIAMロールを作成する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": "arn:aws:kinesis:*:*:stream/*"
        }
    ]
}

データマッピング

API GatewayからKinesisにデータを投入する場合は、クライアントから受信したデータをKinesisが規定するデータフォマットに変換する必要がある。これに対応するのがデータマッピング機能で、Velocity Template Languageを用いて記述することができる。

よく使われる関数および使用例を以下に挙げる。

記述 内容
#set($param = ”) 変数の定義
#if(評価式) #end if文
$context.requestTimeEpoch データの受信時刻
$input.path(‘$.param’) 入力データ内の指定タグの値
$input.path(‘$.param’).size 入力データ内の指定タグの数
$input.params().header.get(”) ヘッダ内の指定タグの値
$input.json(‘$.param’) 入力データ内の指定タグJSONデータ
$util.urlDecode($input.path(‘$’)) 入力データをURLデコード
$util.escapeJavaScript(data) 文字をエスケープ
$util.base64Encode(data) 文字をBASE64エンコード

また、これらを使用してデータマッピングを記述すると以下となる。

#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

AWS Identity and Access Management(3)ルートアカウントとIAMユーザ

アカウント設定と請求情報

ルートアカウントは極力使用しないことが望ましいため、AWSのリソースにアクセスする際には、AWS Identity and Access Managementで作成したIAMユーザを使用する。各IAMユーザには、ポリシーと呼ばれる各リソースへのアクセス権限が付与可能で、アカウント管理者向けには、ルートアカウント並みの権限を持つAdministratorAccessと呼ばれるポリシーが用意されている。

権限 ルートアカウント IAMユーザ (AdministratorAccess) IAMユーザ (BillingFullAccess) IAMユーザ (Billing)
ルートアカウントの設定情報の変更 × × ×
サポートプランの変更 × × ×
アカウントの解約 × × ×
CloudFront のキーペアの作成 × × ×
リソースベースポリシーの見直し × × ×
AWSサービス全般へのアクセス許可 × ×
AWSアカウント設定(支払い方法等)の参照 △ (※) △ (※) ×
AWSアカウント設定(支払い方法等)の変更 △ (※) △ (※) ×
請求情報の参照 △ (※) △ (※) △ (※)
  • (※) ルートアカウントから明示的に、[AWS 請求およびコスト管理コンソールへのIAMユーザーアクセスをアクティベート]](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_billing.html)した場合のみアクセスすることが可能。

BillingFullAccessというポリシーは事前に用意されていないため、各IAMユーザごとに以下のようなカスタムポリシーを付与する必要がある。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StmtXXXXXXXXXXXXXXXX",
            "Effect": "Allow",
            "Action": [
                "aws-portal:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

参考情報

AWS Identity and Access Management(1)IAMの概要

AWS Identity and Access Management (IAM)とは

AWS IAMは、AWSをセキュアに使用するための認証認可の仕組み。UserやGroupを作成してパーミッションを付与することができる。AccessKey, SecretKeyの取り扱いは注意が必要で定期的な更新が望ましい。また、Rootアカウント(アカウントを作成したときのID)はIAMの設定するポリシーが適用されない強力なアカウントになるので極力使用しない。

IAMで作成したユーザでマネージメントコンソールにログインすることが可能で、ログインURLはIAM Dashboardより確認編集することが可能である。

安全なアカウント管理のために

安全にアカウントを管理するためには以下の手法を講じることが望ましい。

  • ルートアカウントのアクセスキーを消去する
  • ルートアカウントをMFA認証にする
  • AWSが定期着したポリシーを利用する
  • ユーザにグループを割り当て、グループごとにポリシーを定義する
  • 最小限の権限のみを与える
  • EC2で動作するアプリケーションへは、アクセスキーではなくロールで権限を与える

セキュリティ監査

セキュリティ監査を実施することで高いセキュリティレベルを維持することができる。セキュリティ監査は、定期的もしくはユーザの増減があった際や、サービスの開始/停止時、不正アクセスが疑われる際などに推測を交えずに徹底的に行うと良い。

管理ポリシー

AWSアクセスへの管理権限をJSON形式で指定することが可能である。条件(Condition)は、項目を連ねた場合はAND、項目内で条件を連ねた場合はORとして扱われる。全てのアクセスはデフォルトで拒否、Allowが指定されれば許可、Denyが指定されれば明示的な拒否として扱われる。

分類 項目例 内容
Effect Allow or Deny 許可設定であればAllow, 拒否設定であればDeny
Action s3:createBucket 操作の指定、ワイルドカードも使用可能
Resource arn:aws:s3:::mybucket service:region:account:resouceの順で記述する
Condition “IPAddress”: {“AWS:SourceIP”: “192.168.0.1”} 条件を指定する

IAMロール

AWSサービスに対してAWSアクセスの管理権限を付与する仕組み。UserやGroupには紐付かない。例えばEC2からDynamoDBやS3にアクセスする場合は、EC2上にCredentialを置くのではなくインスタンス作成時に適切なIAMロールを紐付ける。EC2へのIAMロールの紐付けは、インスタンス作成時のみ可能であることに注意が必要である。

AWSCredentialsProvider

AWSの各サービスにアクセスするプログラムをEC2上で動作させる場合に、認証情報をCredentialsから取得するのか、IAMロールから取得するのか選択することができる。Credentialsから取得する場合はProfileCredentialsProviderを、IAMロールから取得する場合はInstanceProfileCredentialsProviderクラスを使用する。

// Credentialsから取得する場合
AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();

// IAMロールから取得する場合
//
// 引数(refreshCredentialsAsync)をtrueにすると認証情報を非同期に更新する新しいスレッドが生成される
// falseにすると認証情報の更新は、インスタンスメタサービスに合わせられる
AWSCredentialsProvider credentialsProvider = new InstanceProfileCredentialsProvider(true);

// 認証情報の取得
credentialsProvider.getCredentials();

STS(AWS Security Token Service)

AWSには、STS(AWS Security Token Service) と呼ばれる一時的に認証情報を付与するサービスが存在し、動的にIAMユーザを作成することができる。IAM Role for EC2はこの仕組みを利用している。有効期限は数分から数時間に設定可能である。