1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

aws cli をできるだけ安全に行う

Last updated at Posted at 2024-07-10

TL;DR

できるだけ安全にAWS リソースを操作する方法を調べました。

方法 実行マシン 煩雑さ ユースケース 備考
Identity Center+awscli v2 local 簡単 cli操作はこれが基本で良い AWS 近年の推奨
sts + mfa local 面倒 Identity Centerを使ってない(IAMユーザーを使用)場合 MultiFactorAuthPresent を用いたポリシーのアタッチが必要!
aws-mfa local 少しだけ面倒 同上 サードパーティのツール
CloudShell Web 簡単 思いつかない… マネージメントコンソールで触れるコンソール
Cloud9 EC2 簡単 IDEにこだわりない場合 特に初心者は迷ったらこれで良い気がします
SSH + SSM EC2 めんどう IDEがVSCodeじゃないと嫌な場合 設定が面倒。運用も少しめんどう。鍵ファイルとか 管理できるなら鍵認証の方が楽?
EC2 Instance Connect EC2 少しだけ面倒 EC2のちょっとした設定(特に初期) sg の設定必要

他におすすめあったら教えてください...

はじめに

AWS cli 使うときの「v2使って!!」という警告文が気になったのがきっかけです。
awscliを実行するために IAMユーザーのアクセスキーを発行する事は非推奨なのは周知の事実とは思いますが、ではどうすればよいか をまとめてみたいと思います。

大きく以下の2つの視点でまとめてみます。

  • awscli が使えればよい場合
  • 仮想マシン環境(EC2)が欲しい場合

詳細情報はリンク先を頼り、できるだけ簡単なまとめに努めたいと思います。

awscli が使えればよい

awscli v2 + IAM Identity Center

概要

  • AWS の最近の推奨
  • マネージメントコンソールで一時的なID, PW, Token を発行

操作方法

  • Identity Center でユーザーを作成(割愛)

  • Access Portal からログイン

    • Access keys をクリックすると以下のような認証情報が表示されます
      image.png
  • クライアント機で以下のコマンドを実行

aws configure sso

# SSO session name は好きな文字列を、あとはマネージメントコンソールで表示されているものを入力
  • Web ブラウザで ://device.sso.*** が開く
  • コンソールとWebブラウザで表示されているコードが一致していれば Confirm and continue をクリック
  • 最後にデフォルト region, output format, profile name を設定

最終行にサンプルスクリプトが表示される(実際にこのようにcliでリソースを操作できる)

aws s3 ls --profile AdministratorAccess-********

資料

sts + mfa

概要

sts を用いて一時的な認証情報を発行します。
アクセスキーを使ってaws sts get-session-token を実行 -> 一時キーが発行される

  • cli コマンドの実行にはこの一時キーを使うことになります
  • また、sts を実行する際に mfa による認証を行います

前準備

  • mfa を強要するカスタマー管理ポリシーを作成してIAM ユーザーに割り当て
    • これをやらないと元のアクセスキーが有効になってしまい意味がない!!

全リソースの全操作に mfa 認証を強制するポリシー例
{
  "Version": "2012-10-17",
  "Statement": [
        {
            "Sid": "MFARestrectionExample",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

  • sts で一時的なID, key, Tokenを発行してaws configureや環境変数で指定
aws sts get-session-token --serial-number {ARN-OF-THE-MFA-DEVICE} --token-code {CODE-FROM-MFA-DEVICE}

{
    "Credentials": {
        "AccessKeyId": "ABC********",
        "SecretAccessKey": "123****",
        "SessionToken": "Fwo*******",
        "Expiration": "2024-01-01T00:00:00Z"
    }
}

参考:aws cli: get-session-token

資料

公式(MultiFactorAuthPresent関連):

公式(sts関連):

参考(MultiFactorAuthPresentの注意点)

aws-mfa

概要

上の sts を用いた一時的なトークンによる認証の操作を楽に行います。
※AWS公式のツールではないです
公式github

操作方法

ID/key 情報の登録

aws configure --profile myuser-long-term
aws configure --profile myuser

ログイン

aws-mfa --profile myuser
# > mfa コードの入力
# > success! と表示される 

補足

基本的にはユーザー名を default(とdefault-long-term) とした方が使いやすいと思います。

資料

参考

CloudShell

概要

特に説明不要かと思います。Webブラウザ(マネージメントコンソール)で使えるterminal。

公式:https://aws.amazon.com/jp/cli/

操作方法

マネージメントコンソールにログイン > サービス検索ウィンドウで CloudShell を検索

image.png

仮想マシン(EC2) が必要な場合

SSM を用いたローカル機からの SSH 接続

概要

VSCode を用いたEC2 接続を行う場合に良いように思われます。
が、手順などが結構多く、煩雑です。

  • EC2 のセキュリティグループで22番インバウンドの開放が不要

条件

  • EC2 インスタンス作成時にキーペアの作成が必要
  • IAMユーザーのアクセスキーの発行が必要
  • ローカル機にaws cli のインストールが必要

方法

  • IAM ロールを作成
    • ユースケース:EC2 - EC2 Role for AWS Systems Mnager
    • カスタマー管理ポリシーを作成して付与
    • 対象のEC2 のIAMロール(インスタンスプロファイル)をこのロールにする

参考:公式資料 - ステップ2

  • EC2 に「SSM Agent(v2.3.672.0 以降)」をインストール
    • インストールの仕方は公式資料 を参考
    • 補足:この際は Instance Connect などで接続すると良いかも
  • ローカル機に「Session Manager プラグイン」をインストール;
  • ローカル機の .ssh\config を編集
    • 書き方は非常に特殊です
    • 先にEC2のIDを調べておく
    • ProxyCommand は公式資料(下の方)を参照してください
      (Windows と Linux では書き方が違うようです)

こんな感じになります:

Host ec2_over_ssm
  User ec2-user
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
  HostName i-1234567890abcdefg
  IdentityFile /path/my-key-pair.pem

このセクションの補足情報 補足1:IAM ロールにAWS管理ポリシー:AmazonSSMManagedInstanceCore を付与という情報がありましたが、なくてもできました。(むしろこれだけでは不足していたようです)ただし、なんとなくもやっとするので、時間があれば追加調査します。

補足2:SSM Agent は Amazon Linux では最初からインストール済、という情報をどこかで見ましたが、結局インストールしなければSSM のセッションは開始できませんでした。

個人的な感想

確かにEC2 の22番ポートを開放しなくて良いですが、EC2キーペアはおろかIAM ユーザーのアクセスキーも発行するし、手順は多いし、正直どうなのかな...という気もします。

トラブルシューティング

TargetNotConnected

現象

SSM でセッションを開始する際、以下のメッセージが表示される。
要するにSSM のセッションマネージャーがセッションを開始できていません。

when calling the StartSession operation: i-1234567890abcdefg is not connected.
原因

原因は色々あるようです。

  • EC2 にアタッチしたIAMロールの権限が適切でない
  • EC2 に「SSM Agent」がインストールされていない

UNPROTECTED PRIVATE KEY FILE!

現象

鍵を用いたssh 認証の時にエラーが起こる

ssh -i /path/my-key-pair.pem username@instance-id
対応

鍵ファイルのパーミションは以下である必要がある(それ以上でも以下でもダメ)

  • Linuxの場合は:600(w+r)
  • Windowsの場合:SYSTEM、Administrators、自分自身 だけにする
    • 操作
      • 鍵ファイルを右クリック > プロパティ > 「セキュリティ」タブ
        詳細設定 > 継承の無効化 > 「継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換」> 適用
      • (アクセス許可)編集:SYSTEM、Administrators、自分自身 だけにする

独り言;Windows ってどうしてこう分かりにくいんですかね。
設定する際毎回思いますが、こんなの初見で分かるわけないですよね。

資料

非常に良い記事です。( 2024.7月現在 少し古い)
参考:https://blog.serverworks.co.jp/vscode-remote-ssh-via-session-manager

公式(本件の全体的な資料)
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

Cloud9

特に説明不要かと思います。
マネージメントコンソールにログインしてCloud9 > 環境を作成

特徴

  • webブラウザ(マネージメントコンソール)で専用 IDE を開く
  • docker, git などの開発ツールがインストール済

EC2 Instance Connect

特徴

  • Public IPv4を持つインスタンスとの接続
  • SSH/RDP接続のためのセキュアな認証・接続サービス
  • webブラウザ(マネージメントコンソール)でターミナルを開く

前準備

EC2_INSTANCE_CONNECT からの 22番ポートへのインバウンド通信を許可する必要があります。

EC2_INSTANCE_CONNECT の CIDR(アドレス範囲)は以下で確認できます。EC2を配置したリージョンのものを選んでください。

CIDR確認:https://ip-ranges.amazonaws.com/ip-ranges.json
jqを使って探す例

curl -s https://ip-ranges.amazonaws.com/ip-ranges.json \
| jq '.prefixes[] | select(.region=="ap-northeast-1" and .service=="EC2_INSTANCE_CONNECT")'

リージョンが東京(ap-northeast-1)の場合の例
image.png

接続

Management Console:EC2 > ナビゲーションペイン:インスタンス > インスタンスを選択 > 接続 > ラジオボタンは「EC2 Instance Connect を使用して接続する」のまま > EC2 Instance Connectタブを選択 > ユーザー名を確認 > 接続

公式:https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html

トラブルシューティング

Failed to connect to your instance

接続のためには色々条件があるようです。
公式

  • セキュリティグループで22番ポートを開放していない場合は解放する(上記参照)

資料

公式資料:安全にEC2に SSH 接続するには

ローカル機で SSM セッションを開始する方法

先にインスタンス IDを確認する
(つかいませんでしたが、備忘録的に)

aws ssm start-session --target YOUR_INSTANCE_ID
aws ssm start-session --target i-12345678abcdeg
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?