1
1

【IAM】ABACで遊んで、ABACできる操作とできない操作を調べてみた!!

Posted at

ABACとは

以下の記事がとてもわかりやすいです。

失礼ですが、抜粋し超雑にまとめます。

  • RBAC(ABACの先輩)はRole-Based Access Controlの略で、ロール(人々のグループ)を中心に権限管理を行う仕組みです。
  • ABACはAttribute-Based Access Controlの略で、属性を中心に権限管理を行う仕組みです。
  • ABACの場合、RBACで付与された大まかな権限に加えて、操作先・操作元の属性値を使って追加の許可・拒否条件を導入できるのです。

操作先・操作元の属性値を使って追加の許可・拒否条件を導入できるのです。

すごい!便利じゃん!!

つまり、RBAC、ABACを適切に設定することで、こんな感じの運用ができます。

  1. グループAの人はEC2サービスを自由に触って良いですよ~(RBAC)

  2. ただし、 "Importance": "High" タグのついたEC2は操作できませんよ~(ABAC)

試してみます!

動作確認

IAMポリシーの準備

今回はあまり深いことを考えず、以下のポリシーを用意しました。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SampleRBAC"
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*",
        },
        {
            "Sid": "SampleABAC"
            "Effect": "Deny",
            "Action": [
                "ec2:TerminateInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances",
                "ec2:DeleteTags",
                "ec2:CreateTags"
            ],
            "Condition": {
                "Null": {
                    "aws:ResourceTag/Importance": "false"
                },
                "StringEquals": {
                    "aws:ResourceTag/Importance": "High"
                }
            },
            "Resource": "*",
        }
    ]
}

RBACの雰囲気を掴む

policy.json
    "Statement": [
        {
            "Sid": "SampleRBAC"
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*",
        },
        ...

RBAC思想で設定されている箇所です。
ロールに対し、大まかな権限を設定しています。

"Action": "ec2:*", が大事で、EC2の操作のみを許可するポリシーとなっています。

グループAの人はEC2サービス(だけ)を自由に触って良いですよ~(RBAC)の部分ですね。

ABACの雰囲気を掴む

ABAC思想で設定されている箇所です。

policy.json
    "Statement": [
        ...
        {
            "Sid": "SampleABAC"
            "Effect": "Deny",
            "Action": [
                "ec2:TerminateInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances",
                "ec2:DeleteTags",
                "ec2:CreateTags"
            ],
            "Condition": {
                "Null": {
                    "aws:ResourceTag/Importance": "false"
                },
                "StringEquals": {
                    "aws:ResourceTag/Importance": "High"
                }
            },
            "Resource": "*",
        }
    ]

ややこしいので、少しずつ見ていきます。

statementで権限を管理するアクションの指定

    "Action": [
        "ec2:TerminateInstances",
        "ec2:StopInstances",
        "ec2:RebootInstances",
        "ec2:DeleteTags",
        "ec2:CreateTags"
    ],

許可または拒否するアクションを提示しています。
EC2のやばい操作や、タグの変更です。拒否されそうな雰囲気が凄いです。

アクションの明示的な拒否

    "Effect": "Deny",

Deny でリストしたアクションを拒否しています。

拒否設定の適応条件

Conditionブロックで、Denyする条件を定義しています。

    "Condition": {
        "Null": {
            "aws:ResourceTag/Importance": "false"
        },
        "StringEquals": {
            "aws:ResourceTag/Importance": "High"
        }
    },

ちょっと複雑なので、1つずつ確認します。

Importanceタグの値を確認するCondition
    "StringEquals": {
        "aws:ResourceTag/Importance": "High"
    }

"aws:ResourceTag/Importance": "High" で、リソースタグのImportanceがHighなリソースに対して、Denyを適用するように設定しています。

Importanceタグが存在しない場合のCondition
    "Null": {
        "aws:ResourceTag/Importance": "false"
    },

"aws:ResourceTag/Importance": "false" で、リソースタグのImportanceが存在しない場合、条件がどう評価されるかを設定しています。

"false" にしているため、リソースタグにImpotanceが存在しない場合、Conditionはfalseとなり、Denyは適応されません。

ABACの雰囲気まとめ

このように、操作先のリソースの属性値(タグ)の値を参照し、Deny権限を設定しています。
上述した操作先・操作元の属性値を使って追加の許可・拒否条件を導入できるをやってみた感じです。

動作確認

3台のEC2を用意しました。

cap10.PNG

何もタグのないインスタンスと、

cap09.PNG

"Importance": "Low"のインスタンスと、

cap11.PNG

"Importance": "High"のインスタンスです。

作成したロールで操作してみます。

何もタグのないインスタンス

cap13.PNG

Stopできました

"Importance": "Low"のインスタンス

cap12.PNG

Stopできました

"Importance": "High"のインスタンス

cap14.PNG

Stopできません!

良い感じにRBAC、ABACできていることが確認できました。

ABACできない操作の確認方法

本題です。

公式のドキュメントにある通り、ABACに対応しているサービスと、そうではないサービスが存在します。

cap15.PNG

S3などが「部分的」と記載されています。
クリックするとこのような記載が表示されます。

cap16.PNG

・・・もう少し納得いく説明がほしい!

ちょっと深掘り

そこで確認すべきなのが以下のドキュメントです。

cap22.PNG

IAMポリシーで使用することのできるActionや、Actionそれぞれが、Conditionにどのような条件を付与できるかが記載されています。

EC2のRunInstancesアクションを見てみます。

cap17.PNG

条件キーに aws:ResourceTag/${TagKey} が存在することが確認できます。
リソースのタグを条件にIAMポリシーを評価できるわけです。
ABACできそうです。

S3のlistAllMyBucketアクションを見てみます。

cap18_1.PNG

条件キーに aws:ResourceTag/${TagKey} が存在しないことが確認できます。
リソースのタグを条件にIAMポリシーを評価できなさそうですね。

cap19_1.PNG

その他一部のアクションは条件キーに aws:ResourceTag/${TagKey} が存在することが確認できました。

cap21.PNG

また、上記で Amazon S3 は、オブジェクトリソースに対してのみタグベースの認可をサポートしています。 と記載されていましたが、ドキュメントでは条件キーに aws:ResourceTag/${TagKey} が存在しませんでした。

けっこうカタカタで、部分的に対応してるなーって感じですね。

感想まとめ

  • 自社のアカウント運営チームが普段苦しんでいるABACで遊んでみた!
  • 柔軟に設定できる一方で、複雑さが増して、サイロな組織だと軋轢が生まれそう!
  • 削除保護やIaC化を進め、壊れるようなオペレーションをいったん他のやり方で防御したほうが幸せかも!
  • AWSのドキュメントって、なんでこんなにボロボロなんだろう!
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1