[AWS] IAMでユーザのEC2操作権限を制御したい

まずユーザ作成

続いて、set permissionsでcreate policy
sidはユニークであればなんでも良い。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ec2:Describe*",
      ],
      "Sid": "Stmt1373379895000",
      "Resource": "*"
      "Effect": "Allow"
    },
    {
      "Action": [
        "ec2:StartInstances",
        "ec2:RebootInstances",
        "ec2:StopInstances",
      ],
      "Sid": "Stmt1373378552000",
      "Resource": [
        "arn:aws:ec2:ap-northeast-1:${account_id}:instance/${instance_id}"
      ],
      "Effect": "Allow"
    }
  ]
}

ec2:Describe*は、リソースレベルで管理できない。
よって、リージョンを変えるか、AWSアカウントを変えるしかない。

どういう風に制御しているのか理解できれば、間接的にセキュリティ方針を俯瞰して観れるようになりますね。

IAMロール(permissons)のポリシー設定手順

開発時におけるステークホルダーのIAMのpermissionsについて考える
手順としては、groupを作成して、次にuserを作成する

### 基本
– 基本的にはサーバーサイドエンジニア以外にはAWSコンソールのアカウントは発行しない
– MFA認証を入れる
– フロントエンドエンジニア、PMはスキル、意欲、プロジェクトによってケースバイケースで検討

## Groupの作成
– set groupで、「dev」グループを作成

## Userの作成
### Access Type
– Programmatic accessとAWS Management Console accessをつける
– 作成した「dev」グループをattachする

### Permission
– 各種 AWS リソースの設定変更作業がある
– IAM の管理権限は与えない
– 自分のPCから aws-cli を使って AWS リソースを管理する

-> 「PowerUserAccess」を付与する
-> IAMのみ参照権限になっている
-> 会社からのアクセスのみを許可する場合、オリジナルのポリシーを作成して json の中に「Conditionエレメント」を記述し、IAM グループに作成したポリシーを割り当て

特定のインスタンスやVPCのみ許可したい場合なども出てくると思うので、PowerUserAccessは現実的でない。

IAMでMFAユーザの作り方

IAMでMFA認証のユーザを作成する手順

## 前準備
### スマホにapp storeもしくはGoogle playからAuthyをインストール

## IAM
### add user
– Set user detailsでUser nameを指定: MFA-user
– Select AWS access typeでProgrammatic accessとAWS Management Console accessにチェック

### add user to group
– 後から設定するので、チェックなしでで進む
– tagsも未設定
– create user

### MFAの設定
– IAMのuserから、’MFA-user’を選択し、「Security credentials」タブの「Sign-in credentials」からAssigned MFA deviceのManageを押下
– Virtual MFA deviceを選択
– 事前に作成しておいたAuthyからQRコードをスキャン
– Authyに表示される6桁の数字をAWSに入力

### Console sign-in linkからテスト
– https://***********.signin.aws.amazon.com/console からログイン
– ユーザ名、パスワードを入力するとMFA認証の画面に遷移する
– Authyを起動し、6桁の数字をinput formに入力
– ログイン完了

なるほど、MFA認証は簡単なのでやっておいた方が良さそうですね。

AWS IAM(Identity and Access Management)

## IAMとは?
Identity and Access Management(IAM) is a web service that enables AWS customers to manage users and user permissions in AWS. You can centrally manage users, security credentials such as key, and permissions that control which AWS resources users can access.

ユーザの仕事の内容に合わせて、IAMのグループ(permissions)を設定する。permissionsのないユーザがログインした場合、permission errorとなる。

## 手順
– ユーザを作成する
– group, permissionを作成する
– groupにユーザを作成する
– groupにadd userする

### Permissions
– アクセス権限
e.g. EC2-Admin, EC2-Support, S3-Support

### Group
Groupに対して、permissions, policyがattachされる
– Groupのpolicyには、Effect, Action resourceがある
– InlinePolicyは通常は1ユーザに対して設定
e.g. Allow CloudWatch, EC2, EC2 Auto Scaling, ELB, ELB v2

### Security credentials
– console sign-in link: https://******.signin.aws.amazon.com/console
– console password:
– Assigned MFA device:
– Access keys:

AWS MFA(多要素認証)

– AWSのアカウント申請お願いします
→ 終わりました、MFA認証しといてね
→ え、MFAって何?
→ は? 自分で調べろよ
→ 。。。

よくある会話ではないでしょうか? ということでして、AWSのMFAを調べます。
https://aws.amazon.com/jp/iam/details/mfa/

AWSのページだと、IAM配下にありますね。
MFA (Multi-Factor Authentication)は、ユーザーとパスワードに加えて、保護レイヤーを追加。サインインする際に、認証コードの入力が必要になる。

MFAのフォームファクタ
– 仮想MFAデバイス
– ユニバーサル第2因子(U2F)セキュリティーキー
– キーホルダータイプのMFAデバイス
– ハードウェアのディスプレイカードMFAデバイス
– SMS MFAデバイス(プレビュー)
– ハードウェアのキーホルダータイプ MFAデバイスAWS GovCloud向け
なんだこれは?とりあえず、SMS MFAデバイスのことか??

公式のポリシーサンプル

{
	"Version": "2012-10-17",
	"Statement": [{
	  "Effect": "Allow",
	  "Action": "["ec2:*"]",
	  "Resource":["*"],
	  "Condition": {"NumericLessThan": {"aws:MultiFactorAuthAge": "3600"}}
	}]
}

ん?

{
	"Version": "2012-10-17",
	"Statement": [
	{
		"Sid": "AllowAllActionForEC2",
		"Effect": "Allow",
		"Action": "ec2:*",
		"Resource": "*"
	},
	{
	    "Sid": "DenyStopAndTerminateWhenMFAIsNotPresent",
	    "Effect":"Deny",
	    "Action" : [
	    	"ec2:StopInstances",
	    	"ec2:TerminateInstances"
	    ],
	    "Resource": "*",
	    "Condition": {"BoolIfExists": {"aws:MultiFactorAuthPresent": false}}
	}
	]
}

Create a read-only user with aws ec2

Create a read-only user on IAM.

Select IAM on the service list page

Select users from the left menu of the IAM dashboard

Click add user button

set username and programmatic access for access type

At this point the user has no permissions.

On the user detail page you just created, open the security crudential tab

Click Access keys to create a new access key and secret key.

Well, finally it’s coming to set permissions. Select add permissions button from the permission tab.

From add user to group, press create group.

In management console Create policy, chose service for EC2 and Access level should be Read.

Put name for read-only-ec2 and create policy.

finally attache user to just created read-only-ec2 policy.

Then, user permission has changed to access EC2.
I explained how to make ReadOnly IAM users using IAM. There are many things IAM can do, such as creating groups, writing policies in detail, and creating Role. I think that AWS is the only cloud that can control privilege so far. Want to make good and secure system.

S3にアップロードしてmysqlに登録:S3 / IAM編

まず、awsコンソールにログインし、S3でバケットを作成します。適当に[zeus-image]としておきましょう。リージョンはアジアパシフィック東京でいいでしょう。

続いてプロパティ
バージョニング、アクセスログの記録、タグ、オブジェクトレベルのログ記録、デフォルト暗号化、cloudWatchリクエストメトリクス、いずれも特に設定はしません。

続いてアクセス権
デフォルトではチェックボックスに全てチェックが入っています。


このバケットのパブリックアクセスコントロールリスト (ACL) を管理する
– 新規のパブリック ACL と、パブリックオブジェクトのアップロードをブロックする (推奨)
– パブリック ACL を通じて付与されたパブリックアクセスを削除する (推奨)

このバケットのパブリックバケットポリシーを管理する
– 新規のパブリックバケットポリシーをブロックする (推奨)
– バケットにパブリックポリシーがある場合、パブリックアクセスとクロスアカウントアクセスをブロックする (推奨)


このまま作成します。

IAMでユーザ追加
ユーザを追加していきます。

アクセスの種類で「プログラムによるアクセス」にチェックを入れます。

アクセスキー IDとシークレットアクセスキーを保存します。

続いて、対象ユーザからインラインポリシーの追加を押下します。

s3の指定bucketへのアクセス付与をします。

うおー、なんかやる気がでねーぞ。
続いてcomposerを入れていきます。

[vagrant@localhost app]$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading…

Composer (version 1.8.0) successfully installed to: /home/vagrant/local/app/composer.phar
Use it: php composer.phar

[vagrant@localhost app]$ php composer.phar install aws/aws-sdk-php
Invalid argument aws/aws-sdk-php. Use “composer require aws/aws-sdk-php” instead to add packages to your composer.json.

あれ??

s3だけ使えるIAMの作成方法

awsコンソールにログインし、サービスでIAMを選択して、レフトペインの「ユーザ」から「ユーザ追加」を選択します。

ユーザ名は適当にtravis ciとしておきましょう。
AWSアクセスの種類を選択で「プログラムによるアクセス」のチェックボックスをオンにします。

既存のポリシーを直接アタッチで「ポリシーの作成」を選択します。

ポリシーを作成していきます。
サービスはS3を選択
手動のアクションは、すべてのS3アクションで「リスト」「読み込み」「書き込み」「アクセス権限の管理」を選択してます。
リソースは、bucketを指定してます。先ほど作成した「travisci-s3」を入れます。

続いて、ポリシーnameの作成画面になるので、適当に「travisci-s3-iam」とでもしておきましょう。

ポリシーが作成されました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::travisci-s3"
        }
    ]
}

作成するユーザと作成したポリシーを紐づけます。
アクセスキー、シークレットキーが作成されました!!!!

よっしゃーーーーーーーー

Travis CIでS3に自動デプロイ

前回の続き

1. AWSマネジメントコンソールにログイン
2. S3を選択
3. 「バケットを作成する」押下
バケット名は何にしましょう。とりあえず「travisci-s3」としておきます。

4. デプロイ用のIAMポリシーを作成
ん? IAM? IAMは確かユーザとロールだった筈。json形式で記載する。

IAM Management Consoleを開きます

あああああああああああああああ、S3のIAMポリシーの作成方法がわからんーーーー

aws switch roleとは

ロールは、必要な AWS リソースへのアクセスに使用できるアクセス権限セットを指定する
AWS Identity and Access Management (IAM) のユーザーに似ている

>ユーザーとしてサインインすると、特定のアクセス権限セットが付与されます。ただし、ロールにはサインインされませんが、一度サインインするとロールを切り替えることもできます。こうすると、元のユーザーアクセス権限が一時的に無効になり、そのロールに割り当てられたアクセス権限が代わりに付与されます。

なるほど、awsアカウントのロールの切り替えね。
ネーミングが難解なので、難しいわ。