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はこの仕組みを利用している。有効期限は数分から数時間に設定可能である。