Google Authenticatorを利用し、MFAを使用してAmazon Linux / Amazon Linux 2 にSSHする

Google Authenticatorを利用し、MFAを使用してAmazon Linux / Amazon Linux 2 にSSHする

通常、Amazon Linux / Amazon Linux 2にSSH接続を実施する際、公開鍵認証のみですが、セキュアにSSH接続を行うためにGoogle Authenticatorを利用したMFA認証を設定する方法をまとめました。

author: S.T
目次

前提条件

公開鍵認証で、SSH接続可能なユーザを既に作成済みであることとします。。

もしユーザがない場合はこんな感じで作ってください。
詳細な手順は解説しません。

useradd hal
passwd hal
su – hal
mkdir .ssh
cd .ssh
vim authorized_keys
chmod 600 /home/hal/.ssh/authorized_keys
chmod 700 /home/hal/.ssh
““

設定方法

Amazon Linux 2 の場合

(1)sshまわりの設定を実施するため、rootユーザにsuします。

$ sudo su –
“`

(2)以下の内容で/etc/pam.d/google-authを新規作成します。

#%PAM-1.0
auth required pam_env.so
auth sufficient pam_google_authenticator.so try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so

(3)/etc/pam.d/sshdを以下のように修正します。

#auth substack password-auth # コメントアウト
auth substack google-auth # 追加

(4)/etc/ssh/sshd_configを以下のように修正します。

# ChallengeResponseAuthentication no # コメントアウト
ChallengeResponseAuthentication yes # 追加

また以下の内容を最下部に追記。
AuthenticationMethods publickey,keyboard-interactive
““

(5)以下のコマンドを実行し、sshdを再起動します。

systemctl restart sshd.service

(6)Google Authenticatorをインストールします。

amazon-linux-extras install epel
yum install google-authenticator

(7)qrencode-libsをインストールします。

※既にインストール済みの場合は、この手順はスキップしてください。

yum install qrencode-libs

(8)Google Authenticatorを設定するユーザにsuします。

su – hal

(9)以下のコマンドを実行します。

$ google-authenticator
“`

(10)対話式のインターフェースが起動するの以下の項目で[y]を入力します。

Do you want authentication tokens to be time-based (y/n) y

(11)コンソール上に巨大な二次元コードが表示されるので、スマホのGoogle Authenticatorを起動し、二次元コードを読み込みます。

また二次元コードの下部に緊急コードが出力されるので保存しておくこと。

Your emergency scratch codes are:
9XXXXXX3
8XXXXXX1
6XXXXXX5
9XXXXXX4
3XXXXXX1

(12)対話式のインターフェースがつづくので以下のように入力していくこと。

Google Authenticator の秘密鍵や設定情報を以下の場所に保存してもよいかの確認です。この時に生成される ~/.google_authenticator はスマホ端末を無くしたりした際の復旧に必要になるので何らかの手段で控えておきます。

Do you want me to update your “/home/hal/.google_authenticator” file? (y/n) y

同じ確認コードを複数回使うことを禁止します。これにより30秒ごとに1回のログインに制限されます。

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

クライアント(Google Authenticatorをインストールしたスマートフォン)とサーバーで最大4分の時間のずれを許容します。

By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server,
we allow an extra token before and after the current time. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) y

30秒ごとに3回までのログイン試行に制限します。すなわち確認コードを3回間違えるとその確認コードは無効になるということです。

If the computer that you are logging into isn’t hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y

Amazon Linux の場合

(1)sshまわりの設定を実施するため、rootユーザにsuします。

$ sudo su –

(2)以下の内容で/etc/pam.d/google-authを新規作成します。

#%PAM-1.0
auth required pam_env.so
auth sufficient pam_google_authenticator.so nullok
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so

(3)/etc/pam.d/sshを以下のように修正します。

#auth substack password-auth # コメントアウト
auth substack google-auth # 追加

(4)/etc/ssh/sshd_configを以下のように修正します。

# PasswordAuthentication no # コメントアウト
PasswordAuthentication yes # 追加

# ChallengeResponseAuthentication no # コメントアウト
ChallengeResponseAuthentication yes # 追加

また以下の内容を最下部に追記。
AuthenticationMethods publickey,keyboard-interactive
““

(5)以下のコマンドを実行し、sshdを再起動します。

service sshd restart

以降のGoogle Authenticatorの設定は、Amazon Linux 2と同じ。

接続確認

実際に接続してみるとこんな感じになります。
(例としてAmazon Linux 2のみ記載しますが、接続方法はAmazon Linux も同じ)

[XXXXXX@ip-XXX-XXX-XXX-XXX ]$ ssh -i XXXXXXXXX.pem hal@XXX.XXX.XXX.XXX
Verification code: <ここでGoogleAuthenticatorで表示されているコードを入力>
Last login: Wed Mar 25 14:14:36 2020 from ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal

__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 11 available
Run “sudo yum update” to apply all updates.
[hal@test-am2 ~]$
“`

注意点

  • sshd_configを修正する作業になるので、作業する際は2つ以上のコンソールを立ち上げておき、万が一のときは切り戻せるようにして作業したほうがいいです。
  • google-authenticatorコマンドは、対話形式のインターフェースでGoogle Authenticatorに二次元コードを読み込ませることをが必要なので自動化できません。自動化すると詰みます。
  • google-authenticatorコマンドは各ユーザ毎に実行する必要があります。
  • /etc/ssh/sshd_configに除外設定を書かない限り、ec2-userもGoogle Authenticatorを登録していないとログインできなくなるので、何も考えずに実施すると詰みます。(※)

    ※例えばec2-userだけは鍵認証のみで接続したい場合は、/etc/ssh/sshd_configの最下部に以下のように記載します。

AuthenticationMethods publickey,keyboard-interactive
Match User ec2-user
AuthenticationMethods publickey
PubkeyAuthentication yes
PasswordAuthentication no

参考
https://blog.apar.jp/linux/12502/
https://qiita.com/keitakn/items/3a540b4d61146063ad91
https://dev.classmethod.jp/articles/amazon-linux-ssh-two-step-authentication/

お問い合わせ

キャレット合同会社へのお問い合わせやご相談などがありましたら、以下のメールフォームよりお気軽にご連絡ください。

IT基盤支援カテゴリの最新記事