2012年12月8日土曜日

DynamoDBをIAMでアクセス制限

DynamoDBは便利。AWSのManagementConsoleのウィザードでちょちょいとテーブル
作成が簡単にできる。検証でさくっと作ってぱぱっとテストも出来てしまう。テーブル
削除もぽちっとすれば、はい消えた!となるのでお手軽。テーブルはあるだけでお金
がかかるので、不要となったら小まめに消さなきゃね。
と、調子にのっているとミスって肝心の本番用テーブルを消してしまいがちなものですね。

そこで、IAMアカウントで本番用と開発用と分けてアクセス制限してしまいましょう^^


・制御内容
ネーミングルール(少なくとも本番用)が必要となります。今回は下記のようにします。
■本番用はテーブル名の頭にprd_がついている
■開発用はそれ以外

・アカウント
アカウントは二つ作成します。
■本番用アカウント prd_dynamo
■開発用アカウント dev_dynamo

・グループ
DynamoDBではアラート設定が出来るため、cloudwatchの権限を付与します。
テーブル自体は個々のアカウントでアクセス制御しますので、cloudwatchの権限はgroupで
管理します。Policy Generatorで簡単に作れますが、一応JSON載せておきます。

{
  "Statement": [
    {
      "Sid": "Stmt1354899265648",
      "Action": [
      "cloudwatch:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}


では実際にアカウントへのpolicy設定です。
まずはprd_dynamoです。
{
  "Statement": [
    {
      "Sid": "Stmt1330073911360",
      "Action": [
        "dynamodb:DescribeTable",
        "dynamodb:ListTables"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "Stmt1330073911361",
      "Action": [
        "dynamodb:*"
      ],
      "Effect": "Allow",
      "Resource": [
      "arn:aws:dynamodb:ap-northeast-1:<アカウントID>:table/prd_*"
      ]
    }
  ]
}

キーとなるのは、次の二点です。
■最初のAllowでDescribeTableとListTablesを入れる事
→これで全体のテーブルリストを表示する事ができます。全体を表示できるように
 設定しておかないと、自身のテーブルも表示出来ません。この設定でテーブル
 リストの表示のみ出来るようになります。
■次のAllowのリソースでtable/prd_*と記載する事
→これでprd_*で始まるテーブルを全て制御できるようになります。

次にdev_dynamoです。
{
  "Statement": [
    {
      "Sid": "Stmt1330073911370",
      "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:CreateTable",
        "dynamodb:DeleteItem",
        "dynamodb:DeleteTable",
        "dynamodb:DescribeTable",
        "dynamodb:GetItem",
        "dynamodb:ListTables",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:UpdateTable"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "Stmt1330073911371",
      "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:CreateTable",
        "dynamodb:DeleteItem",
        "dynamodb:DeleteTable",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:UpdateTable" ],
      "Effect": "Deny",
      "Resource": [
      "arn:aws:dynamodb:ap-northeast-1:<アカウントID>:table/prd_*"
      ]
    }
  ]
}

キーとなるのは、次の二点です。
■最初のAllowでDynamoDBの全ての権限を記載する事
→これで全てのテーブルの制御ができるようになります。ほんとは*でも良いかと
 思うのですが、ちょっと上手く動かなかったので個別に記載しています。
■次のDneyでtable/prd_*を記載する事
→これでprd_*で始まるテーブルを全て制御出来なくなります。但し、ここの記載
 にListTablesとDescribeTableは記載してはいけません。テーブルリスト表示が
 出来なくなるため、全体のテーブルリストも表示できなくなります。

さて、アクセス制御出来ているか確認してみましょう。

まずはprd_dynamoです。

テーブルリストが確認できます。

prd_testにアクセスできます。

testにアクセスできません。


次にdev_dynamoです。
テーブルリストが確認できます。

prd_testにアクセスできません。
testにアクセスできます。


最初はActionは*でResourceをprd_*のAllowとDenyで逆にすれば簡単に制御できる
かと思いましたが、テーブルリスト表示などの細かい部分で*で制御出来ない感じ
でした。


0 件のコメント:

コメントを投稿