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