この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
AWSのサービスについて知っているつもりだったけど、ほかの人に説明しようとするとできなかった経験はありませんか?わたしは上司にAWSの代表的な個別サービスについて質問されたのですが、スパっと答えることができませんでした。
例えばIAMロールです。
サービス名や内容は頭の中でわかっているのですが、言語化しようとすると言葉が出てきませんでした。「IAMロールはEC2にほかのリソースへの操作権限を与えるサービスでしたよね?」と当たり障りのない答えしかできず、恥ずかしかったです。
今回の記事では、IAMロールへの理解を深めるために仕組みを調べてみました。記事の後半では、IAMロールを実際に使ってみるハンズオンも紹介していきます。
IAMロールについて調べてみました
1,そもそもIAMって何?
IAMロールを説明する前に、IAM(アイアム)について調べてみました。
IAMはAWS Identity and Access Managementの略で、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM により、誰を認証 (サインイン) し、誰にリソースの使用を承認する (アクセス許可を持たせる) かを制御します。 引用:IAM とは – AWS Identity and Access Managementより
IAMを知るために重要な言葉は、認証と認可です。
- 認証とは、ITの分野では、相手が名乗った通りの本人であると何らかの手段により確かめる本人確認(相手認証)のことを単に認証ということが多い。 引用:IT用語辞典 e-Wordsより
- 認可とは、IT分野ではコンピュータシステムの利用者に特定の操作権限を付与する処理や手続きを指すことが多い。 引用:IT用語辞典 e-Words
AWS IAMにおいては、認証とは、相手が誰なのかを確認し、認可とは、誰に操作権限、もしくはアクセス許可を与えるかです。
本題のIAMロールについて紹介していきます
2,IAMロールとは
IAMロールとはAWSサービスやアプリケーションに対してAWSリソースの操作権限を付与するための仕組みです。ユーザーまたはアプリケーションがロールを一時的に引き受けることで関連付けられたアクセス許可を受けることができます。
例えば、EC2にS3へRead権限を与えたり、EC2の削除権限がないAWSユーザーに対し、削除権限のあるIAMロールにスイッチさせることで一時的に削除が実行可能になります。
IAMロールの説明を読むと、IAMユーザーやIAMグループでもいいじゃないかと思ってしまいますよね。IAMロールを利用するメリットは、以下の通りです。
- 認証方法は一時的なセキュリティ認証情報(※)を利用している
- EC2上のアプリケーションに最低権限を与えることに適している
- IAMユーザーの認証情報を外部に漏洩してしまうリスクを低減させる
- 複数のユーザーがロールを引き受け可能
※一時的なセキュリティ情報とは、短期的な有効期限付きのアクセスキーID・シークレットアクセスキー・セキュリティトークンで構成されています
IAMロールの作成・運用例を紹介
この章ではIAMロールの作成の仕方と運用例をハンズオン形式で紹介していきます。まずは下の構成図を見てください。
IAMロール検証用EC2インスタンスにIAMロールをアタッチし、S3へのアクセスの可否を3パターン試します。
-
検証用EC2インスタンスに“AmazonS3FullAccessポリシー”を追加したIAMロールをアタッチしている場合
-
検証用EC2インスタンスに“AmazonS3ReadOnlyAccess”ポリシーを追加したIAMロールをアタッチしている場合
-
検証用EC2インスタンスに“ポリシーを一つも追加していない”IAMロールをアタッチしている場合
それでは、IAMロールの作成方法から説明していきます。
1,IAMロールハンズオン準備
まずはEC2インスタンスにS3への全操作権限(フルアクセス)を付与するパターンを試しますので、IAMロールにAmazonS3FullAccessの許可を追加し作成していきましょう。
手順1,AWS マネジメントコンソールからIAMのページいきます。
手順2,左のペインからロールをクリックし、“ロールを作成”を押します。
↓
手順3,信頼されたエンティティタイプは“AWSのサービス”を選択し、
ユースケースはEC2のラジオボタンを押し、“次へ”をクリックしてください。
手順4,許可ポリシーの中から“AmazonS3FullAccess”を探し、チェックボックスにチェックを入れ、画面右下の“次へ”をクリックしてください。
↓
↓
手順5,ロール名を入力し、画面左下の“ロールを作成”をクリックしてください。
↓
手順6,画面上に“ロール{任意のロール名}が作成されました”と出ましたらIAMロール作成完了です。
次に検証用EC2インスタンスを作成します。
手順7,EC2のページにいきます。
手順8,EC2ダッシュボード画面にあります“インスタンスを起動”をクリックしてください。
手順9,EC2インスタンス名と事前に準備したキーペア以外はデフォルトのまま選択し、“インスタンスを起動”をクリックしてください。
↓
↓
※練習用のためAMI・インスタンスタイプなどはデフォルト設定にしました。
EC2インスタンスの起動が確認できましたので、作成したIAMロールを検証用EC2インスタンスにアタッチします。
手順10,EC2ダッシュボードで先ほど作成したEC2インスタンスのチェックボックスにチェックを付けます。
手順11,EC2ダッシュボードの右上にあります“アクション”をクリックし、セキュリティの欄の“IAMロールを変更”をクリックしてください。
↓
↓
右下の“IAMロールの更新”をクリック、正常にアタッチできたことを確認してください。次に、S3バケットを作成します。
手順12,S3のページにいきます。
手順13,“バケットを作成”をクリックします。
手順14,バケット名を入力します。バケット名は一意(重複のない)である必要があります。バケット名以外の設定はデフォルトのまま、“バケットを作成”をクリックしてください。“正常に作成されました”と表示されたら、完了です。
↓
手順15,作成したS3バケットにファイルをアップロードします。後ほどEC2インスタンスからS3バケット内の一覧を表示する指示を出した時に、ファイルがないとわかりづらいので表示確認用のファイルをアップロードします。確認用ファイルはメモ帳アプリで作りましたテキストファイルです。ファイルを追加しましたら、“アップロード”をクリックします。
↓
↓
↓
すべての準備が整いましたので、コマンドを入力してIAMロールの働きを見ていきましょう。
2,IAMロールハンズオン
検証する準備が整いましたので、4つのコマンドを試していきます。まずは以下の前提条件を確認してください。
■前提条件①AWS CLIバージョンを確認します。AWS CLIの最新バージョンはAWS CLI バージョン2です。今回のハンズオンはバージョン1でも可能です。最新バージョンのインストールはこちらから。
[ec2-user@ip-172-31-7-2 ~]$ aws --v
aws-cli/1.18.147 Python/2.7.18 Linux/5.10.130-118.517.amzn2.x86_64 botocore/1.18.6
■前提条件②検証用EC2インスタンスからS3にファイルをコピーするコマンドを実行するため、事前に検証用EC2インスタンスに適当なファイルをアップロードしておきます。
アップロード方法はTeraTermを使ったファイル送信です。
↓
アップロードされたか確認してみます。
[ec2-user@ip-172-31-7-2 ~]$ ls
iamrole.txt
それではIAMロールの管理ポリシー3パターンで4つのコマンドを試していきます。
使用コマンド | 説明 |
---|---|
aws s3 ls | S3バケットの一覧を表示 |
aws s3 ls s3://{バケット名}/{ファイルパス} | 指定したS3バケットの内容を表示 |
aws s3 cp {ファイルパス} s3://{バケット名}/{ファイルパス} | ローカルのファイルを指定したS3バケットにコピーする |
aws s3 rm s3://{バケット名}/{ファイルパス} | 指定したS3バケットのファイルを削除する |
①IAMロールにAmazonS3FullAccessポリシーを追加している場合
- S3バケットの一覧を表示するlsコマンドを試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 ls
2022-09-06 06:29:51 saitou-s3-iamrole-test
アクセスが成功し、作成したS3バケットsaitou-s3-iamrole-testが表示されました。
- バケットの内容を表示するコマンド「aws s3 ls s3://{バケット名}/{パス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 ls s3://saitou-s3-iamrole-test
2022-09-06 09:25:56 0 testfile.txt
アクセスが成功し、S3バケットにアップロードしたテキストファイルtestfile.txtが表示されました。
- ローカルのファイルS3バケットにコピーするコマンド「aws s3 cp {ファイルパス} s3://{バケット名}/{パス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 cp iamrole.txt s3://saitou-s3-iamrole-test/
upload: ./iamrole.txt to s3://saitou-s3-iamrole-test/iamrole.txt
アクセスが成功し、S3バケットsaitou-s3-iamrole-test内にローカルに保管されていたテキストファイルiamrole.txtがコピーされました。
- S3バケット内にあるファイルを削除するコマンド「aws s3 rm s3://{バケット名}/{ファイルパス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 rm s3://saitou-s3-iamrole-test/iamrole.txt
delete: s3://saitou-s3-iamrole-test/iamrole.txt
アクセスが成功し、S3バケット内に保管されているテキストファイルiamrole.txtが削除されました。
②IAMロールにAmazonS3ReadOnlyAccessポリシーを追加している場合
- S3バケットの一覧を表示するlsコマンドを試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 ls
2022-09-06 06:29:51 saitou-s3-iamrole-test
アクセスが成功し、作成したS3バケットsaitou-s3-iamrole-testが表示されました。
- S3バケットの内容を表示する「aws s3 ls s3://{バケット名}/{パス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 ls s3://saitou-s3-iamrole-test
2022-09-06 09:25:56 0 testfile.txt
アクセスが成功し、S3バケットにアップロードしたテキストファイルtestfile.txtが表示されました。
- ローカルのファイルS3バケットにコピーするコマンド「aws s3 cp {ファイルパス} s3://{バケット名}/{パス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 cp iamrole.txt s3://saitou-s3-iamrole-test/
upload failed: ./iamrole.txt to s3://saitou-s3-iamrole-test/iamrole.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
アクセスが拒否され、コピーできませんでした。
- S3バケット内にあるファイルを削除するコマンド「aws s3 rm s3://{バケット名}/{ファイルパス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 rm s3://saitou-s3-iamrole-test/testfile.txt
delete failed: s3://saitou-s3-iamrole-test/testfile.txt An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
アクセスが拒否され、削除することができませんでした。
③IAMロールにポリシーを許可しない場合
- S3バケットの一覧を表示するlsコマンドを試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
アクセスが拒否され、S3バケットが表示されませんでした。
- S3バケットの内容を表示する「aws s3 ls s3://{バケット名}/{パス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 ls s3://saitou-s3-iamrole-test
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
アクセスが拒否され、S3バケット内のファイルが表示されませんでした。
- ローカルのファイルS3バケットにコピーするコマンド「aws s3 cp {ファイルパス} s3://{バケット名}/{パス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 cp iamrole.txt s3://saitou-s3-iamrole-test/
upload failed: ./iamrole.txt to s3://saitou-s3-iamrole-test/iamrole.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
アクセスが拒否され、コピーできませんでした。
- S3バケット内にあるファイルを削除するコマンド「aws s3 rm s3://{バケット名}/{ファイルパス}」を試します。
[ec2-user@ip-172-31-4-185 ~]$ aws s3 rm s3://saitou-s3-iamrole-test/testfile.txt
delete failed: s3://saitou-s3-iamrole-test/testfile.txt An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
アクセスが拒否され、削除することができませんでした。
まとめ:IAMロールを簡単に解説【使い方・構築例あり】
IAMロールを簡単にまとめてみました。IAMにはユーザーやグループ、そしてロールというアイデンティティがあり、セキュリティの観点から適切に選択する必要があることがわかりました。構築例をもとに実際に手を動かしてみると、IAMロールの仕組みがわかりますよね。
そして、IAMロールを適切に運用するためには、ポリシーの理解も不可欠です。今回利用したS3へのアクセス・操作権限だけではなく、他にもたくさんの管理ポリシーがあります。
さらに、IAMロールは始めに設定したら終わりというわけでなく、運用している中で最小限の権限が付与されているかを継続的に監視していく必要があります。以下に、AWSアカウントの監視に役立つサービスをまとめましたので、興味があれば参照してみてください。
【AWSアカウントのアクテビティの監視に役立つAWSサービス・機能一覧】
-
Amazon CloudFront
→CloudFrontが受信したユーザーリクエストを記録します -
AWS CloudTrail
→AWSアカウントで行われたAWSAPIコールなどを記録します -
Amazon CloudWatch
→AWSクラウドリソースとAWSで実行されるアプリケーションをモニタリングします -
AWS Config
→IAMユーザー、グループ、ロール、およびポリシーを含むAWSリソースの設定に関する詳細な履歴情報を確認できます。 -
アクセスアドバイザー[機能]
IAMの最小限の権限に関する設定に利用できます。下の画像を見てください。
画像はあるIAMロールの管理画面です。アクセスアドバイザータブを押していただくと、アタッチしたサービスから許可したAWSリソースへの最終アクセス時間が確認できます。
AWSのセキュリティベストプラクティスの一つは最小権限の原則です。最小権限の原則に則るのであれば、“追跡期間中のアクセスはありません”と表示された管理ポリシーを削除することを考える必要があるかもしれません。
参考サイトリンク:AWSドキュメント-IAMロール
参考動画リンク:【AWS Black Belt Online Seminar】AWS Identity and Access Management (AWS IAM) Part1
↓IAM関連の協栄情報ブログ記事はこちら↓
・IAM ロールにアタッチする管理ポリシーの制限を引き上げ方法
https://cloud5.jp/policies-per-role-increase/
・CLIによる「IAM」構築
https://cloud5.jp/cli-iam/