ja ja en en ja fa ja ja ja ja ja ja en ja ja en ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en nl ja de ja ja nb ja ja nb ja ja en ja ja nb ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja jbo en en ja nl nb en ko it en it it it en fr it ja ja en la fi ja it it it pt it de en ja en en it fr it en it nb it ja ja ja ja en ja ja ja ja ja ja ja ja ja
{ "Statement": [ { "Effect": "Allow", "Action": [ "ec2:Describe*", "autoscaling:Describe*", "elasticloadbalancing:Describe*", "cloudwatch:List*", "cloudwatch:Get*", "cloudwatch:Describe*", "autoscaling:Describe*", "rds:Describe*", "rds:ListTagsForResource", "logs:Get*", "logs:Describe*", "logs:TestMetricFilter", "sns:Get*", "sns:List*" ], "Resource": "*" } ] }
管理者が仮想MFAデバイスを無効化した後、ユーザーが再度仮想MFAデバイスを追加する場合も同じくiam:DeleteVirtualMFADeviceが必要です。
IAMユーザーが自分で仮想MFAデバイスの無効化を行うためにはiam:DeactivateMFADeviceが必要です。
3. S3バックアップフォルダ
最後はS3です。ユーザー個人のファイル置き場(他ユーザーからは参照不可)として、S3にバックアップ用バケットを作成し、この中に/Personal/USERNAME*2というフォルダを作成してあります。ここに読み書きする権限を与えます。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::*" }, { "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::backup-test-sanwasystem", "Condition": { "StringEquals": { "s3:prefix": [ "", "Personal/" ], "s3:delimiter": "/" } } }, { "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::backup-test-sanwasystem", "Condition": { "StringLike": { "s3:prefix": "Personal/${aws:username}/*" } } }, { "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::backup-test-sanwasystem/Personal/${aws:username}/*" } ] }
バケットのリストを取得するための権限
指定したバケットの/Personal直下を見るための権限
指定したバケットの/Personal/USERNAMEを見るための権限
指定したバケットの/Personal/USERNAME以下を読み書きするための権限
これだけだと格好がつかないので、ポリシーについて簡単に解説を加えます。AWSの操作には、
ec2:DescribeInstances(EC2インスタンスの概要を取得する)
ec2:DescribeImages(AMIの概要を取得する)
ec2:StopInstances(EC2インスタンスを停止する)
rds:DeleteDBInstance(RDSインスタンスを削除する)
……といったように、すべてに名前が付いています*3。IAMユーザーには、これらを許可するか禁止するかを個別に設定することができます。また、ec2:Describe*やrds:*のようにワイルドカードを利用することもできます。
"Effect":"Allow"のかわりに"Effect":"Deny"と書くと、そのユーザーはその操作が決して許されなくなります。「決して」というのはつまり、
rds:*(RDSに対するすべての操作)を許可
rds:DeleteDBInstance(RDSのインスタンス削除)を禁止
というルールを両方設定したとしても禁止の方が勝つということです。
さらに条件をつけて絞ることもできます。
「Groupタグが特定の値なら」という条件で、Groupタグが特定の値を持つEC2インスタンスに対しての操作のみ許可する
「ARNが特定の値なら」という条件で、特定のEC2インスタンスに対しての操作は受け付けないように禁止する
「操作元IPアドレスが特定の値なら」という条件で、社内からの操作のみ受け付ける
「操作が発生した時刻が特定の期間内なら」という条件で、本番リリースまでの間だけ環境構築のための操作を受け付ける
「S3でキーが特定のパターンから始まるなら」という条件で、S3の特定のフォルダ以下の読み書きを受け付ける
最後のパターンを「3. S3バックアップフォルダ」にあるCondition句で使っています。
管理上の都合から、一般的にはIAMユーザーに対して直接権限を与える(ポリシーをアタッチする)ことは推奨されていません。AWSにはIAMユーザーをまとめて管理するためのIAMグループという機能が用意されているので、
IAMグループに対してポリシーをアタッチする
IAMユーザーを任意のグループに追加する(複数可)
という手順に従うのがベストプラクティスだとされています。このため、IAMユーザー間に上位・下位関係を持たせるようなロールはありません。
このようにIAMユーザーの権限は細かくかつ柔軟に設定できますが、あまり「必要最低限」にこだわると、使うサービスやユーザー増えてきたときに管理が難しくなると感じています。何か緊急時にいちいち管理者の対応が必要になるような体制にしてしまうとAWSのメリットが薄れてしまいますし、CloudTrailで操作ログも取ることができます。「お前を信じて…これ(PowerUserAccessポリシー)を……渡す! 受け取れ!!」といった信頼(と割り切り)は大切かもしれません。
*1:ARNとはAmazon Resource Nameの略で、EC2インスタンス、RDSインスタンス、IAMユーザーなど、AWSの全てのリソースに対して振られた一意のIDです。
*2:USERNAMEはユーザーのアカウント名。弊社の運用ルールでは、Slack・Backlogのアカウント名、会社のメールアドレスの先頭部分でもあります。
*3:つまりAPIの名前だと思えばいいです。Management Consoleの操作と1:1では対応していません。1回のクリックや画面遷移で複数の操作が行われることもあります。
nurenezumi 2015-10-20 09:47
Amazon S3の機能まとめ
こんにちは、AWS担当のwakです。そろそろAWSソリューションアー…
SlackのCustom Commandsことはじめ
どうも、Slack大好きなwakです。今日はSlackで自作コマンドを作…
AWS LambdaのパラメータをDynamoDBで管理する
こんにちは、AWS担当のwakです。前回に続きAWS Lambdaの話をし…
新規AWSアカウント作成時にまずやること
こんにちは、AWS担当のwakです。先日社内でAWSアカウントを新規…
RDS(MySQL) slow_log を slack に通知!
こんにちは。平尾です。 今回はSlackネタです。DB(MySQL)のslow…
« PowerShellでhashを書いてさくっとJSONを… OpenSSLコマンドでオレオレ証明書を作り、… »