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

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インスタンスにロールを割り当てます。

1{
2  "Version": "2012-10-17",
3  "Statement": [{
4    "Effect": "Allow",
5    "Action": [
6      "iam:ListUsers",
7      "iam:GetGroup"
8    ],
9    "Resource": "*"
10  }, {
11    "Effect": "Allow",
12    "Action": [
13      "iam:GetSSHPublicKey",
14      "iam:ListSSHPublicKeys"
15    ],
16    "Resource": [
17      "arn:aws:iam::<YOUR_USERS_ACCOUNT_ID_HERE>:user/*"
18    ]
19  }, {
20      "Effect": "Allow",
21      "Action": "ec2:DescribeTags",
22      "Resource": "*"
23  }]
24}

※<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をインストールします。

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

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

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

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

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

一通り設定ができたので、手動でIAMユーザと連携を行います。

なお、インストール時点で同期処理がcronに登録されており、デフォルトでは10分毎に同期されるように設定されています。

1sh /opt/import_users.sh

実行後にユーザが作成されていることが確認できます。

同期対象外であったno-linux-userはLinux上にはユーザを作られていません。

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

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

1# ls /etc/sudoers.d/
290-cloud-init-users  user-admin
3# cat /etc/sudoers.d/user-admin
4user-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が動き出してしまうので注意が必要です。

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

Q. 公開鍵認証はどのように行われているのか?

aws-ec2-sshをインストールすると /etc/ssh/sshd_config に下記の設定が追加されます。

1AuthorizedKeysCommand /opt/authorized_keys_command.sh

この設定によりsshで接続時に /opt/authorized_keys_command.sh の実行結果を公開鍵として渡されています。

authorized_keys_command.shではaws cliのコマンドを発行し、対象ユーザと一致するIAMユーザに登録されている公開鍵の情報を取得しています。

この仕組みによりEC2インスタンス上に各ユーザの公開鍵を設置せずに公開鍵認証ができます。

さいごに

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

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

また、ユーザ作成時は厳密な手続きのもと作成を行われますが、 作成されたユーザに関しては厳密に管理が行われていないということもあります。

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

このような問題を解決してくれる非常に便利なツールでした。

導入も容易なので、ぜひご活用ください。