created: 2019-11-02T06:10:56.000Z
IAM権限を絞ったuserでserverlessを使う
Serverless framework は sls deploy
コマンドを叩くAWSユーザには admin アクセスを推奨している
Attach existing policies directly. Search for and select AdministratorAccess then click Next: Review. Check to make sure everything looks good and click Create user.
しかし、硬めで大きい会社だと開発者に与えられる権限は制限されることもある。そうなると制限された権限を使っている姿勢をとることが必要になってくる
本家のリポジトリでも、どれくらい権限をせばめても開発が行えるか議論がされている
前提
どんな用途でつかわれるpolicyなのかでけっこう違う権限が必要
色々考えられる
- sls deploy でリソースがCloudFormationStackの作成から行える権限
- 既存のlambda関数のソースコードが更新できればよい権限
- sls で管理するリソースにkmsやroute53などが含まれているかどうか
今回は sls deploy でリソースがCloudFormationStackの作成から行える権限
という前提で権限を整理していた。ほぼほぼ色々なことができてしまうが、ミス等で致命的なリソースを削除してしまうリスクを担保したものを考えた
policy.yaml
- こんなpolicyを書いたら sls deploy は通った
- その他権限を渡したくないものがあったらDenyで弾いてもらう
Version: '2012-10-17'
Statement:
- Sid: AllowLambdaAPIGateway
Effect: Allow
Action:
- apigateway:*
- lambda:*
- logs:*
- events:*
- s3:*
Resource: '*'
- Sid: AllowIAM
Effect: Allow
Action:
- iam:GetRole
- iam:PassRole
- iam:CreateRole
- iam:DeleteRole
- iam:CreateServiceLinkedRole
- iam:DetachRolePolicy
- iam:PutRolePolicy
- iam:AttachRolePolicy
- iam:DeleteRolePolicy
Resource: '*'
- Sid: AllowCloudFormation
Effect: Allow
Action:
- cloudformation:CreateStack
- cloudformation:Describe*
- cloudformation:ValidateTemplate
- cloudformation:UpdateStack
- cloudformation:List*
# cloudformation:DeleteStack は省いている。UIから消せればよい
Resource: '*'
# 悪用やミスで触ってしまうとマズいリソースにはdeniedを設定する
- Sid: DenyS3
Effect: Deny
Action: s3:*
Resource:
- arn:aws:s3:::apiaccess-1wqlmdji14kx3
- Sid: DenyIAM
Effect: Deny
Action: iam:*
Resource:
- arn:aws:iam::1234567890:user/kms
sls remove はできない
DeleteStack
権限がないのでremoveはできない。期待通りの挙動--aws-profile cr-slsdeploy
の部分は awscliのprofileを使うオプション
$ serverless remove --verbose --aws-profile cr-slsdeploy --stage dev
Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless Error ---------------------------------------
User: arn:aws:iam::836859347283:user/slsdeploy is not authorized to perform: cloudformation:DeleteStack on resource: arn:aws:cloudformation:us-east-1:1234567890:stack/testslsdeploypolicy-dev/0876f250-fd1e-11e9-94f2-0a583df6bf38