2021年6月27日日曜日

awsでスイッチロールしてみる

 

下記要件でクロスアカウントでスイッチロールしてみます。


IAMユーザ用アカウントでの作業


作成するもの
  • IAMロール(スイッチ用)
  • IAMグループ(ログイン用)
  • IAMユーザ(ログイン用)

IAMロール作成


スイッチ用のロールを作ります。
IAMユーザでログイン後、このロールにスイッチして「IAMユーザ用アカウント」で作業するようにします。

CloudFromationテンプレートのサンプルは下記のとおり。
パラメータの${AccountId} の部分には、「IAMユーザ用アカウント」のAWSアカウントIDを指定します。
ConditionでスイッチするIAMユーザ名の有無をチェックしています。この条件は、Versionが 2012-10-17 より古いと使用できないようです。
ちなみに、rain は、IAMユーザ名を伝えられないようなので、rainを使いたい場合は、このConditionは削除したほうが良さそうです。
  SwitchRoleDev:
    Type: AWS::IAM::Role
    Properties:
      RoleName: Blue21DemoDevRole
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Effect: Allow
          Principal:
            AWS:
              - !Sub arn:aws:iam::${AccountId}:root
          Action:
            - 'sts:AssumeRole'
          Condition:
            StringLike:
              sts:RoleSessionName: ${aws:username}
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
        - arn:aws:iam::aws:policy/AmazonEC2FullAccess
        - arn:aws:iam::aws:policy/IAMReadOnlyAccess
      Policies:
        - PolicyName: accesskey-fullaccess
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "iam:DeleteAccessKey"
                  - "iam:GetAccessKeyLastUsed"
                  - "iam:UpdateAccessKey"
                  - "iam:CreateAccessKey"
                  - "iam:ListAccessKeys"
                Resource: "arn:aws:iam::「IAMユーザ用アカウントのID」:user/${aws:username}"

「IAMユーザ用アカウント」の、このロールにはアクセスキーを作成する権限を与えます。

IAMグループ作成


IAMユーザ用のグループを作成します。
グループに設定するポリシーでは、「パスワード変更」、「MFA設定」、「スイッチロール」ができるだけの最小限の権限を与えます。

CloudFromationテンプレートのサンプルは下記のとおり。
  DevGroupPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: Blue21DemoDevUser
      Groups:
        - !Ref DevGroup
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Sid: "VisualEditor0"
          Effect: "Allow"
          Action:
          - "iam:ChangePassword"
          Resource: "arn:aws:iam::*:user/${aws:username}"
        - Sid: "VisualEditor1"
          Effect: "Allow"
          Action:
          - "iam:GenerateCredentialReport"
          - "iam:Get*"
          - "iam:List*"
          - "iam:SimulatePrincipalPolicy"
          - "iam:SimulateCustomPolicy"
          - "iam:GenerateServiceLastAccessedDetails"
          Resource: "*"
        - Sid: "VisualEditor2"
          Effect: "Allow"
          Action:
          - "iam:DeactivateMFADevice"
          - "iam:EnableMFADevice"
          - "iam:ResyncMFADevice"
          - "iam:ListMFADevices"
          Resource: "arn:aws:iam::*:user/${aws:username}"
        - Sid: "VisualEditor3"
          Effect: "Allow"
          Action:
          - "iam:DeleteVirtualMFADevice"
          - "iam:CreateVirtualMFADevice"
          Resource: "arn:aws:iam::*:mfa/${aws:username}"
        - Sid: "VisualEditor4"
          Effect: "Allow"
          Action:
          - "sts:AssumeRole"
          Resource: "arn:aws:iam::*:role/Blue21DemoDevRole"
          Condition:
            BoolIfExists:
              aws:MultiFactorAuthPresent: "true"
  DevGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: Blue21DemoGroupDev
      Path: /

IAMユーザ作成


IAMユーザを登録します。
aws-cli だと下記のとおり。
このユーザには、AWSコンソールのログインを許可します。
$ aws iam create-user --user-name user-dev01
$ aws iam create-login-profile --user-name user-dev01 --password P@ss20210627 --password-reset-required
$ aws iam add-user-to-group --user-name user-dev01 --group-name Blue21DemoGroupDev

開発用アカウントでの作業


作成するもの
  • IAMロール(スイッチ用)

IAMロール作成


スイッチ用のロールを作ります。
「IAMユーザ用アカウント」のユーザが、このロールにスイッチして「開発用アカウント」で作業するようにします。

CloudFromationテンプレートのサンプルは下記のとおり。
前述の「IAM用アカウント」で作成したロールとの違いは、「アクセスキー」を操作する権限がないことだけです。
パラメータの${AccountId} の部分には、「IAMユーザ用アカウント」のAWSアカウントIDを指定します。
ConditionでスイッチするIAMユーザ名の有無をチェックしています。
  SwitchRoleDev:
    Type: AWS::IAM::Role
    Properties:
      RoleName: Blue21DemoDevRole
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Effect: Allow
          Principal:
            AWS:
              - !Sub arn:aws:iam::${AccountId}:root
          Action:
            - 'sts:AssumeRole'
          Condition:
            StringLike:
              sts:RoleSessionName: ${aws:username}
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
        - arn:aws:iam::aws:policy/AmazonEC2FullAccess

AWSコンソールで確認


AWSコンソールで「IAMユーザ用アカウント」にログインすると、初回のみパスワード変更を要求されます。
試しに、MFAを設定せずに、スイッチロールしてみるとエラーになりましました。

MFAを設定して、ログインし直すと、スイッチロールできます。
スイッチロールすれば、Blue21DemoDevRoleの権限で作業できます。
下図の左が「ログインしたアカウントの情報」、右が「スイッチした先のアカウントの情報」になります。

「IAMユーザ用アカウント」から「開発用アカウント」へもスイッチできます。

なお、このユーザが所属するグループは、Blue21DemoDevRoleへのスイッチしか許可していないので、他のロールにスイッチしようとするとエラーになります。

MFAの設定は下記ページ参照。
ChromeでGoogle Authenticator使うと便利です。

Chromeで複数アカウントを使い分けたいときは、下記ページ参照

Chromeからスイッチロールの履歴を削除したい場合は、下記ページ参照

Chromeでスイッチロールを便利に使う方法は、下記ページ参照

aws-cli で確認


まず、アクセスキーを作ります。

AWSコンソールで「IAMユーザ用アカウント」にログインします。
ログインしただけではアクセスキーを作成する権限がないので、Blue21DemoDevRoleにスイッチして、アクセスキーを作成します。

次に、aws-cli の設定をします。

~/.aws/config の設定は下記のとおり。
blue21-iam が「IAMユーザアカウント」用

[profile blue21-iam]
region = us-east-1
output = json

[profile blue21-dev]
region = us-east-1
output = json
role_arn = arn:aws:iam::「IAMユーザ用アカウントのID」:role/Blue21DemoDevRole
mfa_serial = arn:aws:iam::「IAMユーザ用アカウントのID」:mfa/user-dev01
role_session_name = user-dev01
source_profile = blue21-iam

[profile sandbox-dev]
region = us-east-1
output = json
role_arn = arn:aws:iam::「開発ユーザ用アカウントのID」:role/Blue21DemoDevRole
mfa_serial = arn:aws:iam::「IAMユーザ用アカウントのID」:mfa/user-dev01
role_session_name = user-dev01
source_profile = blue21-iam

~/.aws/credentiales は下記のとおり。
[blue21-iam]
aws_access_key_id = 「アクセスキー」
aws_secret_access_key = 「シークレットアクセスキー」

「IAM用アカウント」で作業したい場合は、下記のように実行します。
MFAの認証コードを聞かれるので、認証コードを入力すると実行できます。
$ aws s3 ls --profile blue21-dev
Enter MFA code for arn:aws:iam::123456789012:mfa/user-dev01:

「開発用アカウント」で作業したい場合は、下記のように実行します。
MFAの認証コードを聞かれるので、認証コードを入力すると実行できます。
$ aws s3 ls --profile sandbox-dev
Enter MFA code for arn:aws:iam::345678901234:mfa/user-dev01:

aws-cliでMFAする場合は、aws-mfaを使うと便利です。
下記ページ参照




2021年6月15日火曜日

emacs の neotree の色を変える


emacs に neotree をいれてみました。 

環境は以下のとおり。

  • Windows10 + WSL2
  • ubuntu20.04
  • emacs 26.3


init.el の設定は以下のとおり。

(require 'neotree)
(setq neo-theme 'acsii)
(setq neo-persist-show t)
(setq neo-smart-open t)
(global-set-key "\C-o" 'neotree-toggle)


これで、Ctlキー+oキーでディレクトリ一覧が表示されます。

下図はWindowsターミナルの表示例ですが、ファイル名の表示色が黒なので背景に同化して見えません。(赤枠の部分)



neotreeの色を変えてみます。

init.el に custom-set-fasesの設定を追加します。

(require 'neotree)
(setq neo-theme 'acsii)
(setq neo-persist-show t)
(setq neo-smart-open t)
(global-set-key "\C-o" 'neotree-toggle)
(custom-set-faces
 '(neo-root-dir-face ((t (:foreground "#8D8D84"))))
 '(neo-dir-link-face ((t (:foreground "#0000FF"))))
 '(neo-file-link-face ((t (:foreground "#BA36A5")))))


下図のようにファイル名が見えるようになりました。