ラベル IAM の投稿を表示しています。 すべての投稿を表示
ラベル IAM の投稿を表示しています。 すべての投稿を表示

2012-07-25

IAM roles for EC2 instancesを使ってみた

EC2インスタンスのIAMロールとは?
  • 今までIPアドレスで利用範囲を絞っていたところを、このEC2インスタンスから!みたいな制約で利用できるようにする機能
  • aws-sdkを使えばcredentials周りのコードを簡略化できる
制約とか
  • roleは、EC2インスタンス起動時に選択することができる
  • roleは1つしか割り当てられない
  • 既存のインスタンスにはroleを割り当てることはできない
  • 既にroleが割り当てられているインスタンスからroleを外すことはできない
  • roleのPermissionsの変更は即時反映される
roleの作成
AWS ConsoleのIAMのところからCreate Roleをクリック
roleの名前を入力してContinue
適当なPolicyをSelect(後から編集もできるのでてきとーに)
Policyの名前を決めて、Policy Documentを確認したらContinue
内容を確認して問題なければCreate Role
はい、出来上がりましたヾ(*・ω・)シ
あとは、作成したroleを割り当ててインスタンスの起動
通常通りインスタンス起動のウィザードを辿っていくとInstance DetailsのところでIAM Roleの選択肢がでてくるので先ほど作成したroleを選択

起動を待っている間に、s3バケットのURLを一覧表示するようなサンプルプログラムの作成
通常版
#! /usr/bin/ruby
require 'rubygems'
require 'aws-sdk'

my_access_key_id = 'xxxxxxxxxxxxxxxxxxxx'
my_secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

AWS.config({
  :access_key_id => my_access_key_id,
  :secret_access_key => my_secret_key
})

sts = AWS::STS.new()
session = sts.new_session()
#puts "Session expires at: #{session.expires_at.to_s}"

#s3 = AWS::S3.new(session.credentials)

for bucket in s3.buckets
 puts bucket.url
end
てな具合で見慣れたCredentials周りのコードを書く訳ですがIAM roles for EC2 instances版だとここを省くことができます
#! /usr/bin/ruby
require 'rubygems'
require 'aws-sdk'

s3 = AWS::S3.new()

for bucket in s3.buckets
 puts bucket.url
end
と、こんな単純に。
実行結果はどちらも同じように
./list_s3_urls.rb
http://bucket1.s3.amazonaws.com/
http://bucket2.s3.amazonaws.com/
http://bucket3.s3.amazonaws.com/
みたいな感じで表示してくれます
aws-sdkを利用しない場合はcurlを使って
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role1
{
  "Code" : "Success",
  "LastUpdated" : "2012-07-25T04:43:21Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "xxxxxxxxxx",
  "SecretAccessKey" : "xxxxxxxxxx",
  "Token" : "xxx",
  "Expiration" : "2012-07-25T11:15:42Z"
}
みたいに最後の/の後にEC2インスタンスに割り当てられたroleの名前を入れてあげれば、一時的に利用できるAccessKeyIdとSecretAccessKeyを含むレスポンスが得られるのでこれを利用すれば良いみたいです。

2012-06-13

AWS IAMユーザにSigning Certificate(X.509証明書)を追加する

IAM(AWS Identity and Access Management)ユーザにAWS Consoleを利用してSigning Certificateを追加する方法はオフィシャルのドキュメントに書かれている訳ですが、IAM Foxといツールを利用して追加作業をやってみたのでメモφ(・ω・ )

まずは、肝心の鍵ファイルの作成
Linux上のopensslコマンドを利用しました。
1.Private Keyの作成
2048bitでhoge.keyというファイルを作成しました
$ openssl genrsa -des3 -out hoge.key 2048

openssl genrsa -out ozawa.key 2048
Generating RSA private key, 2048 bit long modulus
......................................................+++
.........................................................................+++
e is 65537 (0x10001)
Enter pass phrase for ozawa.key:
Verifying - Enter pass phrase for ozawa.key:
パスフレーズなしにしたい場合は-des3を抜けばOK 2.Certificate Signing Request (CSR)の作成
openssl req -new -key hoge.key -out hoge.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Tokyo
Organization Name (eg, company) [My Company Ltd]:company
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hoge
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
住所やら所属やら聞かれるけれど適当に入力 3.Self-Signed SSL Certificatの作成 アップロードするのはこのファイルです。
openssl x509 -req -days 3650 -in hoge.csr -signkey hoge.key -out hoge.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Tokyo/O=company/CN=hoge
Getting Private key

予め、AWSのアカウントはIAM Foxに登録されていて、IAMユーザが作成されていることを前提にします
4.IAM FoxでSigning Certificateを追加したいユーザを右クリックしてCertificateを選択

5. Addボタンを押してNew Certificateにhoge.crtの中身を入力してOKボタン

6.追加されると、自動的に名前が付与され、StatusがActiveになります

Private Key Fileにあたるのがhoge.key
X.509証明書(X.509 Certificate)にあたるのがhoge.crt
になります。

2011-06-23

別アカウントのIAMアカウントに対してs3へのアクセス権限を与える

IAM Policyの方は単純に
{
 "Statement": [
  {
   "Action": "s3:*",
   "Effect": "Allow",
   "Resource": "arn:aws:s3:::*"
  }
 ]
}
とかしちゃえば、s3に関してはなんでもOKになります。

あとは、対象のバケット側のACLで設定しちゃえば良いかと思ったのですが、IAMアカウントにはcanonical user IDが割り当てられていないので無理でした(´・ω・`)

さて、どうするか・・・
s3 Bucket Policyを使えば出来ましたヾ(*・∀・)ノ"
こんな感じ
{
  "Version": "2008-10-17",
  "Id": "2c08cdf1-ddfc-4765-ac19-26b03a8e8b5e",
  "Statement": [
    {
      "Sid": "AllowMyUser",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678901:user/iam-user-name"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::bucket-name/*",
        "arn:aws:s3:::bucket-name"
      ]
    }
  ]
}

Resourceにはarn:aws:s3:::bucket-name/*だけではなく、arn:aws:s3:::bucket-nameも設定しておくのがミソです。
これがないと、アイテムの一覧を取得することができません。

2011-03-23

IAM(Identity and Access Management)あれこれ

※えらー
iam-useruploadpolicy -u xxx -p xxx -p xxx
で、ポリシーファイルサイズが2048 byte以下なのに次のようなエラーが出るときは
409 LimitExceeded Maximum policy size of 2048 bytes exceeded for user xxx
次のコマンドで一度ポリシーを消してからiam-useruploadpolicyしてやれば幸せになれるみたいヾ(*・∀・)ノ"
iam-userdelpolicy -u xxx -p xxx

※s3ブラウザで確認できるように
リード権限のみ付与しようと次のようなポリシーを設定するとS3用の汎用ツールだと上の階層から辿っていかないとならないのでアクセスできない。
"Effect":"Allow",
"Action":["s3:List*","s3:Get*"],
"Resource":"arn:aws:s3:::hoge/*"
そこでこんな感じの設定も追加したら行けましたよ。
"Effect":"Allow",
"Action":"s3:List*",
"Resource":["arn:aws:s3:::","arn:aws:s3:::hoge"]