6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

terraformAdvent Calendar 2020

Day 3

aws iam policy で s3 の bucket 制限を書く時に便利かもしれない小技

Last updated at Posted at 2020-12-02

tl;dr

  • この記事はterraform Advent Calendar 2020の3日目です
  • formatlist と setsubtract でリストを元に s3 のリソース制限をする aws iam policy を作る小技
  • formatlist("%s/*", setsubtract(var.bucket_arns, var.bucket_arns_exclude_dev))

iam なんもわからん・・・

  • aws iam 難しい><
  • チームメンバーにチームのリソースだけ触っていい権限をつけたい。ただし本番、オメーはダメだ
  • リソースタグで制限できるから簡単にできるんじゃないかな→簡単じゃなかった
  • s3 はタグで制御できるのオブジェクト操作だけでバケット操作はダメだった

とはいえ

  • 今まではちょっとゆるふわ管理で割とカジュアルに強権限つけて対処してたけど、そろそろ真面目に管理したいよね
  • 触っていい悪いを管理できるようにポリシー組む必要があるんじゃね?
  • とりあえず今よりマシにすることから始めるなら、チーム毎に readonly, developer, admin くらいのグループに分けるか
  • チームを示すタグと環境を示すタグをつけて管理だね→s3はダメだった
  • じゃあとりあえずs3は見ていいバケットを列挙しつつ、更新しちゃダメなやつは別でリストしよう

つまり

bucket readonly developer admin つまり
A - - - 参照不可
B 参照 更新 更新 本番環境以外
C 参照 参照 更新 本番環境

こんな感じのポリシーを作って、グループにアタッチして使おうというのと、今後も同様に管理するチームが増えるので、terraform で自作モジュールにしておこう。ということになった話。

全部は無理だし雑いけど


data "aws_iam_policy_document" "ro" {
  statement {
    actions = [
      "s3:GetAccountPublicAccessBlock",
      "s3:GetBucket*",
      "s3:ListAllMyBuckets",
    ]
    resources = ["*"]
  }

  statement {
    actions = ["s3:ListBucket"]
    resources = var.bucket_arns
  }

  statement {
    actions = ["s3:GetObject"]
    resources = formatlist("%s/*", var.bucket_arns)
  }
}

data "aws_iam_policy_document" "dev" {
  statement {
    actions = ["s3:*Object"]
    resources = formatlist("%s/*", setsubtract(var.bucket_arns, var.bucket_arns_exclude_dev))
  }
}

data "aws_iam_policy_document" "admin" {
  statement {
    actions = ["s3:*Object"]
    resources = formatlist("%s/*", var.bucket_arns)
  }
}

# sid は空白になるし effect は default で allow なのでこのままコピペしても使えるはず。見やすいように削った。

こんな感じのコードで、それぞれ policy にアタッチするモジュールにしておいて、


module "a_team" {
  source = "./modules/"

  name_prefix = "a_team"

  # 共通でアクセスしていいバケット
  bucket_arns = [
    "arn:aws:s3:::B",
    "arn:aws:s3:::C",
  ]

  # developer で更新させないバケット(bucket_arns から除外したいもの)
  bucket_arns_exclude_dev = [
    "arn:aws:s3:::C",
  ]
}

こんな感じで呼び出すと綺麗に収まる(a_team_ro, a_team_dev, a_team_admin というポリシーができる)
というお話でした。

もうちょっと気にせず実コードさらしていけるようになるといいけどね。。。
仕事でやってるやつを勝手にさらせないので formatlist()setsubtract() で楽に書けるねって感じのとこまででひとつw

6
0
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
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?