AWSにおけるセキュリティ設計
AWSにおけるセキュリティ設計の考え方
AWS責任共有モデルによるセキュリティ方針
- 責任分界点を明確にし、分担・協力しながらセキュリティを強化していく
責任者 | 責任範囲 |
---|---|
ユーザ | ユーザのデータ、暗号化 |
アプリケーション、ID・アクセス管理 | |
OS、ネットワークセキュリティ | |
AWS | ソフトウェア |
コンピューティング、ストレージ、DB、ネットワーク | |
仮想化インフラ | |
データセンター、物理H/W、グローバルネットワーク | |
リージョン、AZ、エッジロケーション |
AWSのセキュリティ責任・対策
-
データセンター、物理H/W
- 物理的な場所の秘匿
- 監視カメラ
- 侵入検知
- H/W破棄プロセスを定め、徹底している
-
ネットワーク
- DDoS
- IPなりすまし
- パケット盗聴
-
仮想化インフラ
-
ハイパーバイザー(ホストOS)の…
- アップデート・パッチ管理
- アクセス管理
- ログ監査
-
ユーザーのセキュリティ責任・対策
- OS以上のレイヤ
-
アイデンティティ管理とアクセス管理
- 最小権限の原則
-
ネットワークセキュリティ
- VPCのセグメンテーション
-
論理的なアクセス制御
- セキュリティグループ
- ネットワークACL
-
データの保護
- 暗号化
-
セキュリティ監視
-
ログ収集・監視
- CloudWatch
- CloudTrail
-
リソース構成の追跡
- AWS Config
-
セキュリティチェック
- Trusted Advisor
-
アイデンティティ管理とアクセス管理
AWSにおけるアカウント
-
ルートユーザー
- フルアクセス権限
- 通常操作では原則としてルートユーザー使うな
-
例外: ルート権限が必要な操作
- ルートアカウントのメールアドレスやパスワードの変更
- IAMユーザーの課金情報に対するアクセス許可・拒否
- AWSサポートプランの変更
IAMユーザーとIAMグループの概要
@startuml
class AWSAccount
class IAMUser
class IAMGroup
class IAMPolicy
AWSAccount o-- IAMUser
AWSAccount o-- "0..300"IAMGroup
AWSAccount o-- IAMPolicy
IAMUser -- "0..10" IAMGroup
IAMUser -- IAMPolicy
IAMGroup -- IAMPolicy
@enduml
-
上限
- 1つのAWSアカウントで最大300グループ
- 1つのIAMユーザーは10グループにまで所属可能
IAMポリシーによるアクセス権限管理
-
最小権限の原則
- IAMユーザー、IAMグループにはデフォルトで何も権限が付与されていない
-
IAMポリシー
- JSON形式
- 何を許可するか
- 何を拒否するか
{
"Version": "...",
"Statement": [
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Principal": "*",
"Resource": "arn:aws:s3:::hoge-bucket",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"11.22.33.44/32"
]
}
}
}
]
}
-
IAMポリシーの種類
-
AWS管理ポリシー
- AWS管理のテンプレート集
-
代表例
-
AdministratorAccess
- 全権
-
PowerUserAccess
- IAMサービス以外全権
-
-
カスタマー管理ポリシー
- ユーザーが自分で作るやつ
-
インラインポリシー
- IAMユーザー、IAMグループ、IAMロールにポリシーを個別に反映
- 【補】HTMLのstyle属性みたいな気持ち(前者2つはclass属性みたいな気持ち)
-
IAMによる認証方式
-
IAMユーザー名とパスワード
- WebブラウザでAWSマネジメントコンソールにログインしてなんやかんやする
-
他要素認証(MFA: Multi-Factor Authentication)
- 強化
-
ワンタイムパスワード等
- AWS Virtual MFA
- Google Authenticator
-
アクセスキーID + シークレットアクセスキー
- IAMユーザーに対して発行するもの
- AWS CLI, AWS SDKで利用可能
- 非推奨。IAMロール使え
-
IAMロール
- AWSサービスやアプリケーションに対してAWS操作権限を与える
-
例: EC2
EC2 -- IAM Role --IAMポリシー
みたいな感じに権限管理する- EC2上のAWS SDK経由で、IAMロールで許可されている操作を行える
IAMによるIDフェデレーション
-
IDフェデレーション
-
企業や組織ですでに導入されている認証の仕組みとAWSの認証とを紐付け、SSOを実現する
- LDAP
- ソーシャルログイン
-
IDフェデレーションによるSSOを簡単に実現するプロトコル
- SAML: Security Assersion Markup Language 2.0
- OpenID Connect
- IAMはこれらに対応している
-
TST: Temporary Security Token
- IDフェデレーションで発行される一時的なアクセスキー
-
AWS STS: Security Token Service
- AWSへのTSTを発行
-
-
Web IDフェデレーション
-
OpenID ConnectをサポートしているソーシャルサービスとIDフェデレーション
-
AWS Cognito
- 各ソーシャルサービスとの認証連携を簡単に実現できるサービス
- 【補】認証情報はロックインされる
-
-
Directory ServiceによるMicrosoft ADとの認証連携
-
Microsoft AD: Acitve Directory
-
企業内のさまざまな情報を管理するディレクトリサービス
- ユーザー情報とか
-
-
AWS Directory Service
- マネージドのMicrosoft ADサービス
-
AD Connector
- オンプレのActive Directory環境との認証連携できるプロキシサービス
-
ネットワークセキュリティ
VPCによるネットワーク構成
-
VPC
- リージョン上にプライベートな仮想ネットワークを構築
- AZ上にサブネット構築
- さまざまなAWSサービスを配置できる
セキュリティグループとネットワークACLによるアクセス制御
セキュリティグループ | ネットワークACL | |
---|---|---|
アタッチ対象 | EC2インスタンス | VPCサブネット |
アタッチ可能個数 | 複数 | 1つ |
デフォルトin | 拒否 | 許可 |
デフォルトout | 許可 | 許可 |
ステート | ステートフル inで許可したら戻りも許可 |
ステートレス |
ルールのマッチ | 該当するもの全部 | 番号順、最初にマッチしたもの |
-
両方使うとどうなるの
- 許可(T)、拒否(F)としたとき、ANDの真理値表な感じになる
- セキュリティグループの設定は即時反映らしい(書籍より)
- ネットワークACLはAWS公式ドキュメントに「短時間」と書いてある
VPC内でのネットワークセキュリティの設定例
-
構成
- ELB
- NATゲートウェイ in パブリックサブネット
- EC2 in プライベートサブネットA
- RDS in プライベートサブネットB
-
EC2にセキュリティグループ設定
-
ELBからのinbound HTTP 80許可
- アプリケーションの動作のため
- 他はデフォルト拒否
-
-
RDSにセキュリティグループ設定
-
EC2からのアクセス許可
- アプリケーションの動作のため
- 他はデフォルト拒否
-
-
プライベートサブネットBにネットワークACL設定
-
パブリックサブネットからのアクセスを明示的に拒否
- デフォルト許可
- パブリックサブネットに侵入された場合でもデータ流出せぬよう
-
踏み台サーバーによるセキュアなリモートアクセス制御
-
踏み台サーバー(bastion = 砦)
- こいつだけパブリックサブネットに置く
- 必要なときだけ起動
-
SSH(TCP22)やRDP(T/U3389)を絞る
-
踏み台サーバー経由でリモートアクセスされるEC2インスタンス
- 踏み台サーバーからのSSH/RDPのみ許可する
-
踏み台サーバー
- SSH/RDP許可する
- アクセス元IP絞る
-
データの保護
暗号化によるデータの保護
-
通信の暗号化
-
SSL/TLS
- 証明書持ち込み
- ACM: AWS Certificate Managerでの発行
-
サポートしているサービス
- ELB
- RDS
- CloudFront
- API Gateway
-
SSH終端
- クライアント —> ELBまでの通信経路をSSL/TLSで暗号化
- ELB —> EC2はHTTP 80
-
-
データ自体の暗号化
データ暗号化の方式と場所
-
CSE: Client Side Encryption
- ユーザが暗号化してからデータ保存する
-
SSE: Server Side Encryption
- AWSサービス側で自動的にデータを暗号化する
-
例
- S3: バケットにデフォルト暗号化オプション
-
EBS: ボリューム作成時に暗号化設定
- 既存のものを暗号化ボリュームに変更するには、スナップショットから複製を作成する必要がある
-
鍵の管理
- ユーザ管理
- AWS KMS等のサービスと連携
- S3で自動生成
暗号化に必要な鍵の管理
-
鍵の管理
- 鍵自体の作成
- 有効化/無効化
- 定期的なローテーション
管理者 | 保管 | 暗号化処理 | AWSサービス |
---|---|---|---|
ユーザー | ユーザー | CSE | なし |
ユーザー | AWS | CSE/SSE | AWS KMS, AWS CloudHSM |
AWS | AWS | SSE | S3やEBS等の暗号化機能 |
AWS KMSとCloudHSMによる鍵の管理・保管
-
AWS KMS
-
鍵管理
- 作成
- 有効化/無効化
- ローテーション
- 削除
- リージョンサービス
- SSEやCSEに使う
-
連携可能サービス
-
クライアントアプリケーション
- AWS CLI
- AWS SDK
-
ストレージサービス
- S3
- EBS
- 等
-
データベースサービス
- RDS
- Redshift
- 等
-
-
-
CloudHSM: Hardware Security Module
-
ユーザ専有のハードウェアアプライアンス
- AWSデータセンター内に配置される
-
セキュリティコンプライアンス要件が厳しい場合に適用する
- VPC内にHSMが配置され他のネットワークから隔離される
- 国際的なセキュリティ基準準拠(NIST FIPS140-2)
-
連携可能サービス
- Redshift
- RDS for Oracle
-
セキュリティ監視
セキュリティ監視の関連サービス
-
CloudTrail
-
さまざまなサービスの操作(APIコール)をログとして記録
-
サービス例
- 管理コンソール: ルートユーザーによるログイン
- EC2: インスタンスの操作履歴(削除等)
- KMS: 管理されている鍵の使用や削除履歴
- いつ、どこから、どのAPIを、どのリソースに対して
-
過去90日分をデフォルトでS3に保存
- CloudWatch Logsへの連携も可能
-
-
セキュリティ監視・監査に利用可能
- 怪しいアクセスはないか
- 意図せぬ設定変更がなされていないか
- ヒトによる操作の追跡に特化
-
-
VPCフローログ
- ネットワークインタフェースを行き来する通信の内容をキャプチャ
- 送信元/宛先のIP/ポート、プロトコル
-
CloudWatch Logs
-
AWSのさまざまなログを統合的に集める
- CloudTrail
- VPCフローログ
- アプリケーションのログ(CloudWatchエージェントで送りつける)
-
-
AWS Config
- リソースの構成変更を追跡
- モノの構成変更履歴に特化
-
Trusted Advisor
-
5項目でチェック、改善事項の推奨を行う
- コスト最適化
-
セキュリティ
-
例
- セキュリティグループ — 開かれたポート
- ルートアカウントのMFA
-
- 耐障害性
- パフォーマンス
-
サービスの制限
- AWSサービスの制限の引き上げリクエストのこと
-
AWS上でのセキュリティ侵入テスト
- 公式
- 「AWS脆弱性/侵入テストリクエストフォーム」で申請必要
-
許可されているリソースは限られる
-
EC2
-
許可されないインスタンスタイプも(小さい連中)
- T3.nano
- T2.nano
- T1.micro
- M1.small
-
- NATゲートウェイ
- ELB
- RDS
- Aurora
- CloudFront
- API Gateway
- Lambda
- Lambda Edge
-
Lightsail
- VPS的なやつ
- Elastic Beanstalk
-