はじめに
AWS環境のサーバー管理を効率化してくれる「Fleet Manager」ですが、実業務で運用する際には、ユーザーやグループに応じた権限管理が必要にな場面もあるかと思います。
業務の中で「特定のインスタンスの操作だけを制限したい」場面があり、今回はFleet Managerの操作制限に特化したIAMポリシーを作成し、挙動を検証してみました。
前提
・対象のEc2インスタンスでFleetmanagerが有効になっていること
・IAMポリシーの作成権限などがあること
アクセス制御前
Fleetmanagerが有効化されていれば、以下のような機能が使用できるかと思います。
・リモートデスクトップ接続
・フリートマネージャー>マネージドノードの画面から各種ツール(ファイルシステム、ユーザーの作成など)の操作
「ファイルシステム」

設定
ではこの機能を制限するためのポリシーを作成します。
ここでは対象のインスタンス名を「Test」としています
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyFleetManagerToolsAndRunCommand",
"Effect": "Deny",
"Action": [
"ssm:SendCommand",
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*"
],
"Condition": {
"StringEquals": {
"ssm:resourceTag/Name": "Test"
}
}
},
{
"Sid": "DenyPatchNode",
"Effect": "Deny",
"Action": [
"ssm:CreateAssociation",
"ssm:UpdateAssociation"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ssm:resourceTag/Name": "Test"
}
}
}
]
}
このポリシーは、「Nameタグの値が Test であるEC2インスタンスに対して、特定の操作(コマンド実行やパッチあて、セッション接続など)を禁止(Deny)する」 ためのポリシーになります。
下に具体的にポリシーの内容について解説します。
"Effect": "Deny",
"Action": [
"ssm:SendCommand",
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:*:*:instance/*"
],
"Condition": {
"StringEquals": {
"ssm:resourceTag/Name": "Test"
ここでは、対象のEC2インスタンスに Name というキーのタグがあり、
その値が 「Test」 である場合にのみ ssm:SendCommand と ssm:StartSession
の禁止ルールが発動します。
ssm:SendCommand を禁止することで「Run Command」機能を使ったコマンドの実行を禁止しています。
ssm:StartSession を禁止することでFleetmanagerをつかったRDP機能を禁止しています。
"Effect": "Deny",
"Action": [
"ssm:CreateAssociation",
"ssm:UpdateAssociation"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ssm:resourceTag/Name": "Test"
}
ここでは、対象のEC2インスタンスに 「Name」 というキーのタグがあり、
その値が 「Test」 である場合にのみ ssm:CreateAssociation と ssm:UpdateAssociation
の禁止ルールが発動します。
これらを禁止することで、対象のインスタンスに対して、勝手に定期パッチ適用のスケジュールを組んだり、設定変更のタスクを紐付けたりすることを制限することができます。
アクセス制御後
上記のポリシー適用後、ファイルシステムなどのツールの操作や、RDP時にこの様なメッセージが出て操作できなくなります。

まとめ
今回は、AWS Systems Manager Fleet Manager(および周辺機能)において、特定のタグ(Name: Test)を持つEC2インスタンスへの操作をIAMポリシーの Deny(明示的な拒否)を使って制限する方法を解説しました。
同じようにFleet Managerの権限設計で悩んでいる方の参考になれば幸いです。
参考サイト


