本記事ではIAMロールって使っているけど、なんだかよくわかっていない。
という方に向けて読んでいただきたい記事です。
Role = 役割 であるということを念頭にしておくと、後の説明が分かるかと思います。
IAMの基本
まずはIAMの基本的な部分からご説明します。
IAMユーザー認証には以下の2パターンが存在します。
- マネジメントコンソールからパスワードによる認証
- アクセスキーとシークレットアクセスキーを用いた認証
-> アクセスキー,シークレットアクセスキーとは: IAMユーザーやAWSルートユーザーの長期的な認証情報で以下のような2つのキー情報で構成されます。
# これらの値は発行した後、無効化しない限りずっと使い続けることが可能
ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
用途: 上記の認証情報を使用して、ユーザーやアプリケーションがAWSへAPIをリクエストしています。
-> リクエストを送信する際に、誰のリクエストであるか?を認識するためにアクセスキーが必要になります。このアクセスキーがないとAWSは誰からの要求なのかが判断できないため、リクエストを受け入れることができません。
長期的な認証情報とは別に一時的な認証情報というものも存在する -> こちらは後述します。
IAMユーザーそのものにはサービスやリソースへのアクセス権限を持たせるという認可の機能はありません。
IAMポリシーをアタッチして、IAMユーザーを用いたアクセスに権限を付与できます。
IAMユーザー(人)ではなく、リソース(物)に対してアクセス許可を付与することができます。
- 誰が: 対象リソースが
- どこに対して: 操作したい対象のリソースに
- どんな操作を: S3へアクセスしてログを出力する操作を
IAMロール : 一時的な認証情報
IAMユーザーは冒頭で説明した通り、IAM管理者などがIAMユーザーを発行すれば、明示的に無効化などをしない限り、永続的に使用することが可能です。
そのためIAMユーザーは長期的な認証情報と呼ばれています。
対して、IAMロールは一時的な認証情報と呼ばれます。
IAMロール作成までの流れを以下の図にまとめました。
ここではSystems ManagerとEC2が対話するためのロール、ポリシーを作成し、作成したロールをEC2にアタッチする、というデモを通しながら説明していきます。
IAMロールの作成
信頼されたエンティティを選択 -> AWSサービスを選択します
ユースケースを選択します
ロールにアタッチするポリシーを作成またはAWS管理ポリシーから選択します。
AmazonSSMManagedInstanceCore
というEC2インスタンスをSystemsManagerのマネージドインスタンス化する上で必要なポリシーを選択します。
AmazonSSMManagedInstanceCore
というポリシーには以下のアクセス許可ポリシーを定義しています。
Action
の右にどんな許可を付与しているのかをコメントで記載しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:DescribeAssociation", # 指定したインスタンスまたはターゲットの指定した関連付けの詳細を表示する許可を付与
"ssm:GetDeployablePatchSnapshotForInstance", # 指定したインスタンスの現在のパッチベースラインスナップショットを取得する許可を付与
"ssm:GetDocument", # 指定された SSM ドキュメントの内容を表示する許可を付与
"ssm:DescribeDocument", # 指定した SSM ドキュメントの詳細を表示する許可を付与
"ssm:GetManifest", # Systems Manager および SSM Agentに、インスタンスのパッケージのインストール要件を決定する許可を付与(内部 Systems Manager の呼び出し)
"ssm:GetParameter", # 指定したパラメータに関する情報を表示する許可を付与
"ssm:GetParameters", # 指定した複数のパラメータに関する情報を表示する許可を付与
"ssm:ListAssociations", # 指定した SSM ドキュメントまたはマネージドインスタンスの関連付けを一覧表示する許可を付与
"ssm:ListInstanceAssociations", # インスタンスの関連付けをリストする
"ssm:PutInventory", # 指定した複数のマネージドインスタンスでインベントリ項目を追加または更新する許可を付与
"ssm:PutComplianceItems", # 指定したリソースのコンプライアンスタイプおよびその他のコンプライアンス詳細を登録する許可を付与
"ssm:PutConfigurePackageResult", # SSM Agentに特定のエージェントリクエストの結果のレポートを生成する許可を付与
"ssm:UpdateAssociationStatus", # 指定したインスタンスに関連付けられている SSM ドキュメントのステータスを更新する許可を付与
"ssm:UpdateInstanceAssociationStatus", # 現在実行中の関連付けのステータスを更新するSSM Agentに許可を付与(内部 Systems Manager の呼び出し)
"ssm:UpdateInstanceInformation" # ハートビート信号をクラウド内の Systems Manager サービスに送信する SSM Agent に許可を付与
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
# Systems Managerはクラウド上のSSM AgentからSystems ManagerからSession ManagerまでのAPIオペレーションにこのエンドポイントを使用します
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
# Systems ManagerはSSM AgentからSystems ManagerサービスのAPIオペレーションにこのエンドポイントを使用します
# このエンドポイントはコマンドの送受信をするために必要になります
"ec2messages:AcknowledgeMessage",
"ec2messages:DeleteMessage",
"ec2messages:FailMessage",
"ec2messages:GetEndpoint",
"ec2messages:GetMessages",
"ec2messages:SendReply"
],
"Resource": "*"
}
]
}
ポリシーについてはAWS公式のサービス許可リファレンスを参照すると良いでしょう。
ロール名を入力し、作成します。
信頼されたエンティティを選択する、ここでで言ってること -> 信頼ポリシーのことです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
# 一時的な認証を許しますよ
"Action": [
"sts:AssumeRole"
],
# このロールを使用できるのはEC2インスタンスですよ
"Principal": {
"Service": [
"ec2.amazonaws.com"
]
}
}
]
}
"Principal": {
"Service": [
"ec2.amazonaws.com"
]
}
-> このロールを使用できるのはEC2インスタンスですよ
sts:AssumeRole
-> 一時的な認証を許可
という信頼ポリシーをこのロールに付与します。ということを言っています。
ここまでで図の①~③までの手順を実行していることになります。
IAMロールをEC2インスタンスにアタッチ
EC2を新規作成する場合は、IAM インスタンスプロフィールに対象のロールを選択します。
既存のEC2インスタンスにロールを付与する場合は、以下の図のようにアクション -> セキュリティ -> IAMロールの変更します。
先ほど作成したIAMロールを付与して、IAM ロールの更新 をすることでアタッチすることができます。
ここまで実施すれば、①~③の手順で作成したIAMロールをEC2インスタンスにアタッチすることができ、STS(SecurityToken Service)に対して一時的な認証許可を発行して、いいですよ、と返してもらうことで、Systems Managerとの対話をすることが可能になります。
※Systems Manager正確にはSystems Managerと対話するにはVPCエンドポイントやNAT Gatewayなどで経路を確保してあげる必要があります。
以上がIAMロールに関する説明でした。