AWS Identity and Access Management (IAM)ユーザを使ってEC2インスタンスのLinuxユーザを管理する | SEEDS Creators' Blog | 株式会社シーズ

AWS Identity and Access Management (IAM)ユーザを使ってEC2インスタンスのLinuxユーザを管理する

クラウドソリューション事業部 インフラエンジニアの上野です。

皆さんはEC2 インスタンス(Linux)のユーザ管理をどのようにされていますか?
個別の管理シートのようなものを用意して管理をされていたりするのでしょうか?あるいはディレクトリサービスと連携させて管理しているのでしょうか?

人の出入りが激しいプロジェクトや、そもそもの管理するインスタンス数が多い場合に 個別にユーザを作成・削除したり、現在のユーザの状況を管理するのは非常に運用コストがかかります。

このようなユーザ作成・削除の運用コストやユーザの管理の問題を解決するのにおすすめのaws-ec2-sshというツールを紹介します。

aws-ec2-ssh
https://github.com/widdix/aws-ec2-ssh

aws-ec2-sshはIAMユーザとEC2のLinuxユーザを紐付けし、IAMユーザの作成・削除に連動して、Linuxユーザも作成・削除されるという便利ツールです。

それでは早速導入していきましょう。

aws-ec2-sshの導入方法(AWS側)

まずはAWS側の設定を行います。
EC2インスタンスがaws-ec2-sshを使えるようにするためのIAMロールを用意します。 下記のポリシーを持つIAMロールを作成し、連携を行うEC2インスタンスにロールを割り当てます。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "iam:ListUsers",
      "iam:GetGroup"
    ],
    "Resource": "*"
  }, {
    "Effect": "Allow",
    "Action": [
      "iam:GetSSHPublicKey",
      "iam:ListSSHPublicKeys"
    ],
    "Resource": [
      "arn:aws:iam::<YOUR_USERS_ACCOUNT_ID_HERE>:user/*"
    ]
  }, {
      "Effect": "Allow",
      "Action": "ec2:DescribeTags",
      "Resource": "*"
  }]
}

※<YOUR_USERS_ACCOUNT_ID_HERE>にはAWSのアカウントIDを記入してください。

次にIAMグループを作成します。
ここで作成したグループを元に連携させるIAMユーザであるか、連携させるIAMユーザは管理者権限を付与する対象であるかを判別します。
今回は linux-member を連携対象とするグループ、linux-adminを特権ユーザとするグループとします。

  • linux-member( 連携対象とするグループ )
  • linux-admin(特権ユーザ用のグループ )

それでは連携させるIAMユーザを作成します。
今回はテストのために、次の3つのユーザを登録します。

  • user-member
    Linuxの一般ユーザとして登録するユーザ
    linux-member のIAMグループに 所属
  • user-admin
    Linuxの管理者ユーザとして登録するユーザ
    linux-memberとlinux-admin のIAMグループに 所属
  • no-linux-user
    Linuxには同期させないユーザ
    いずれのIAMグループにも所属しない

IAMユーザ作成後に
IAM > ユーザ > 対象のユーザ > 認証情報 > SSHパブリックキーのアップロード
から公開鍵認証用の公開鍵をアップロードします。

作成したIAMユーザとグループの状況はこのような形です。

aws-ec2-sshの導入方法(Linuxサーバ側)

ここからはLinuxサーバ側の作業になります。
まずはLinuxサーバにaws-ec2-sshをインストールします。

cd /usr/local/src
git clone https://github.com/widdix/aws-ec2-ssh.git
cd aws-ec2-ssh
./install.sh

aws-ec2-sshの設定ファイルを作成します。

cd /usr/local/src/aws-ec2-ssh
cp aws-ec2-ssh.conf aws-ec2-ssh.conf
vi aws-ec2-ssh.conf

aws-ec2-ssh.confの内容は以下のように設定します。

IAM_AUTHORIZED_GROUPS="linux-member" #管理対象するIAMグループ
LOCAL_MARKER_GROUP="iam-synced-users" #IAMユーザと連携していることを示すグループ
LOCAL_GROUPS=""
SUDOERS_GROUPS="linux-admin" #特権を付与するIAMグループ
ASSUMEROLE=""
# Remove or set to 0 if you are done with configuration
# To change the interval of the sync change the file
# /etc/cron.d/import_users
DONOTSYNC=0 #0の場合に同期機能が有効化

一通り設定ができたので、手動でIAMユーザと連携を行います。
なお、インストール時点で同期処理がcronに登録されており、デフォルトでは10分毎に同期されるように設定されています。

sh /opt/import_users.sh

実行後にユーザが作成されていることが確認できます。
同期対象外であったno-linux-userはLinux上にはユーザを作られていません。

# egrep "user-member|user-admin|no-linux-user" /etc/passwd
user-admin:x:1004:1005::/home/user-admin:/bin/bash
user-member:x:1005:1006::/home/user-member:/bin/bash

user-adminにはsudoの実行権限があります。

# ls /etc/sudoers.d/
90-cloud-init-users  user-admin
# cat /etc/sudoers.d/user-admin
user-admin ALL=(ALL) NOPASSWD:ALL

結果はこのようになりました。

  • Linux上にuser-adminとuser-memberというユーザが追加された
  • user-adminには管理者権限が付与されていた
  • 同期対象外のno-linux-userはLinux上にユーザは作成されなかった

意図したとおりに動作していますね。
今回は作成を試しましたが、IAMユーザから削除を行うと、Linuxサーバ上のアカウントも削除されます。

aws-ec2-ssh の仕組み

ここからはaws-ec2-sshの仕組みについて少し説明します。

Q.ユーザをどのように判別しているか?
/etc/aws-ec2-ssh.conf 内の設定をもとに判断して処理しています。

  • IAM_AUTHORIZED_GROUPS
    IAM上でこのグループに所属しているユーザがLinuxサーバへの同期の対象となります。
  • SUDOERS_GROUPS
    IAM上でこのグループに所属しているユーザが管理者権限(sudoの実行権限)を付与されます。
    同期の対象となるにはIAM_AUTHORIZED_GROUPSに指定されたグループに所属している必要があり、 このグループだけに所属している場合はLinuxサーバへの同期対象にはなりません。
  • LOCAL_MARKER_GROUP
    Linuxサーバ上でIAMと同期しているユーザを判別するためのグループです。 このグループに所属しているLinuxサーバ上のユーザがIAMユーザとの同期対象になります。


Q. 同期処理はいつ・どのように実施されるか?
インストール時に/etc/cron.d/import_usersが追加されます。
このcronの設定により10分おきに同期処理が実行されます。
インストール直後からcronが動き出してしまうので注意が必要です。

SHELL=/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin
MAILTO=root
HOME=/
*/10 * * * * root /opt/import_users.sh

Q. 公開鍵認証はどのように行われているのか?
aws-ec2-sshをインストールすると /etc/ssh/sshd_config に下記の設定が追加されます。

AuthorizedKeysCommand /opt/authorized_keys_command.sh

この設定によりsshで接続時に /opt/authorized_keys_command.sh の実行結果を公開鍵として渡されています。
authorized_keys_command.shではaws cliのコマンドを発行し、対象ユーザと一致するIAMユーザに登録されている公開鍵の情報を取得しています。
この仕組みによりEC2インスタンス上に各ユーザの公開鍵を設置せずに公開鍵認証ができます。

さいごに

いかがでしたでしょうか。

AIMユーザを作成するだけで対象のLinuxサーバに自動的にユーザが追加され、ユーザの公開鍵をサーバに設置するなどの手間も省けます。

また、ユーザ作成時は厳密な手続きのもと作成を行われますが、 作成されたユーザに関しては厳密に管理が行われていないということもあります。
よくある見られるのは利用されていないユーザが削除されずに残っているというパターンです。 削除手続きが正しく行われていない場合もあれば、対象サーバが多く漏れていたということも考えられます。

このような問題を解決してくれる非常に便利なツールでした。
導入も容易なので、ぜひご活用ください。