【AWS/CloudFormation】Linuxインスタンス起動時にec2-userを無効化して同等の権限を持つユーザアカウントを作成する

こんにちは、Aireです。

本記事では、CloudFormationを用いて、Linuxインスタンスを起動する際にデフォルトアカウントを無効化し、代わりに同等の権限を持つユーザアカウントを新規に作成する方法を紹介します。

AWS環境にAmazon Linux等のLinuxインスタンスを起動する際、多くの場合はデフォルトアカウントとしてec2-userが作成されます。ログイン情報の一部が広く知れ渡っている状態はセキュリティ的に望ましくないため、ec2-userを無効化する代わりに同等の権限を持つユーザアカウントを作成してみます。

目次

OS上で直接コマンドを実行して設定する場合

はじめに比較情報として、OS上で直接コマンドを実行する場合の手順を紹介します。

ユーザアカウントを新規作成する

useraddコマンドを実行し、ec2-userの代わりとなる新規ユーザアカウントを作成します。その後、/etc/passwdファイルを参照し、新規ユーザアカウントが作成されたことを確認します。

ec2-userと同じようにsudoコマンドをパスワードなしで使用したい場合は、/etc/sudoers.d/90-cloud-init-usersファイルに<新規ユーザアカウント名> ALL=(ALL) NOPASSWD:ALLという記載を追加します。

パスワードを設定する場合はchpasswdコマンドを実行します。passwdコマンドでもパスワードを設定できますが、標準入力でパスワードを指定する必要があるので、スクリプトやCloudFormationでの実行を考慮しchpasswdコマンドを使用しています。

ユーザアカウントに管理者権限を追加する

usermodコマンドを使用するとユーザの設定変更が可能です。ここでは新規ユーザアカウントをwheel管理グループに追加することで管理者権限を付与しています。

ec2-userの公開鍵をコピーして権限を変更する

公開鍵認証によるSSH接続ができるように/home/ec2-user/.ssh配下にあるec2-userの公開鍵を/home/<新規ユーザアカウント名>にコピーします。その後、新規ユーザアカウントがコピーしたファイルやディレクトリにアクセスできるように権限を変更します。

ec2-userを無効化する

本節までの手順で新規ユーザアカウントの設定が完了しました。

以下、/etc/ssh/sshd_configファイルにDenyUsers ec2-userと記載することで、ec2-userへのSSHアクセスを無効化しています。また、sshdサービスを再起動し、ec2-userのSSHの無効化設定を有効にしています。

ec2-userでSSHアクセスを試みると、以下のようにアクセスが拒否されます。

実際の運用では、ec2-userを無効化する前に新規ユーザアカウントでSSH接続できるか確認することをおすすめします。

CloudFormationテンプレート内でユーザデータとしてコマンドを記載して設定する場合

本題に入りますが、前章で紹介した設定手順をCloudFormationで実行する方法を紹介します。(なお、新規ユーザアカウントのパスワードは設定しない手順で話を進めます)

OS上で実行するコマンドについては、UserDataセクションと呼ばれる箇所に記載します。また、以下のテンプレート例では、Parametersセクションで変数UserIdを用意し、ユーザが入力した文字列を新規ユーザアカウント名として利用しています。

直接コマンドを実行する場合とCloudFormationテンプレートに記載する場合の違いですが、sudoコマンドの記載を削除しています。これはwhoamiコマンドを実行すると分かりますが、ユーザデータを実行するのはec2-userではなくrootであるためです。(sudo -u ec2-userと実行すると、それ以降のコマンドをec2-userとして実行することも可能です)

次のテンプレート例では、新規ユーザアカウント名をOSのシェル変数として直接宣言して使用する場合の記載方法です。

先ほどのテンプレートとの違いは、Fn::Subの変数UserIdが不要になったのでFn::Sub:と記載された行を削除している点と、もう一つは、UserIdをOSのシェル変数として認識させるため、最初の中括弧{の後ろに感嘆符!をつけることでエスケープしている点です。これはシェル変数の表記がFn::Subの変数の表記${xxxxx}と被っているためにCloudFormation側で用意された回避手段です。

ユーザデータの実行結果を確認する方法

UserDataセクションに記載したコマンドの実行結果は、インスタンス内の/var/log/cloud-init-output.logファイルに記録されるので、結果を確認したい場合はそちらのファイルを参照してください。

インスタンス作成時にユーザデータとしてコマンドを入力して設定する場合

おまけになりますが、CloudFormationは利用せず、EC2コンソール画面からインスタンスを作成するときにもユーザデータを入力することができるのでそちらの方法も紹介します。

以下がユーザデータの入力例になります。注意点は、シェル変数の記載方法はOS上で直接コマンドを実行する場合と同様で、最初の中括弧{の後ろに感嘆符!をつけてエスケープをする必要はありません。また、ユーザデータはrootによって実行されるため、sudoコマンドの記載を削除しています。

以上、ここまで。

この記事を書いた人

目次