Site cover image
AWS EC2へのSSHをIAMユーザーで擬似的に管理する

AWS EC2インスタンスにSSH可能なユーザーを、IAMユーザーで管理したいということがあると思います。

このエントリでは、EC2へのSSHをIAMユーザーで擬似的に管理する方法を紹介します。

できるだけシンプルに実現するために次のような仕組みを構築します。

Image in a image block
  1. 公開鍵をIAMに登録する
  2. 公開鍵の取得をEC2に許可するポリシーを作成する
  3. 公開鍵を取得するシェルスクリプトを作成する
  4. sshd configのAuthorizedKeysCommandにスクリプトを指定する

以下、それぞれの項目を説明します。

セキュリティの考慮漏れなどあるかもしれないので、使用は自己責任でお願いします。

AWSマネジメントコンソールを開き、IAM > ユーザー > 認証情報 > AWS CodeCommit の SSH キー > SSH パブリックキーのアップロードからユーザーごとに公開鍵をアップロードします。

Image in a image block

iam:ListUsers, iam:ListSSHPublicKeys, GetSSHPublicKeyを許可するポリシーを作成しEC2にアタッチします。

下記はポリシーの例です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "iam:ListSSHPublicKeys",
                "iam:ListUsers",
                "iam:GetSSHPublicKey"
            ],
            "Resource": "*"
        }
    ]
}

全てのIAMユーザーの公開鍵を標準出力に列挙します。

ユーザーや鍵が増えるにつれて遅くなる点に注意してください。

また、BOTユーザーなどがいて除外したい場合は、ユーザーにグループを付与して list-users の代わりに get-group を使用します。

その場合はポリシーでiam:GetGroupも許可します。

#!/bin/sh
for user_name in $(aws iam list-users --query 'Users[].UserName' --output text)
do
  for key_id in $(aws iam list-ssh-public-keys --user-name $user_name --query 'SSHPublicKeys[].SSHPublicKeyId' --output text)
  do
    aws iam get-ssh-public-key --encoding SSH --user-name $user_name --ssh-public-key-id $key_id --query 'SSHPublicKey.SSHPublicKeyBody' --output text
  done
done

ファイルはroot:root 755で作成し/etc/ssh/iam-key-finderなどに配置します。

/etc/ssh/sshd_configAuthorizedKeysCommand, AuthorizedKeysCommandUser を設定し、sshd を再起動します。

AuthorizedKeysCommand /etc/ssh/iam-key-finder
AuthorizedKeysCommandUser nobody

iam-key-finder での鍵の取得に少し時間がかかりますが、SSHログインできれば成功です。

以上です。

このエントリでは、EC2へのSSHをIAMユーザーで擬似的に管理する方法を紹介しました。

Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます