ニフクラ ブログ

ニフクラ/FJ Cloud-Vやクラウドの技術について、エンジニアが語るブログです。

Linuxサーバーへのログインを2段階認証にしてみた

こんにちは、ニフクラテクニカルアカウントチームです。

ニフクラではコントロールパネルへのログイン時の方法として「ニフクラID」とは別に「パターン認証」サービスを提供していることはご存知でしょうか。
認証をMFA(多要素認証)にすることが可能で、セキュリティの強化を実現できます。

一方、ニフクラサーバー(Linux)への主なログイン方法としては、SSHキーを使用した公開鍵認証になります。

f:id:TechnicalAccountEngineer:20190802183811p:plain

今回の検証では、Linuxサーバーにサードパーティ製のツール(google-authenticator)を導入し、サーバーログイン時(SSH接続)の認証を2段階にしました。 (公開鍵認証 + チャレンジレスポンス認証)

以降、認証設定からサーバーログインまでをご紹介します。

前提条件

本ブログは、以下の前提知識がある方を想定しています。

  • ニフクラの基本的なコントロールパネルの操作、サービスを利用する知識
    (サーバー作成、ネットワーク構築など)

検証概要

以下の流れで2段階認証をセットアップします。
(1) 対象サーバーにユーザーを作成
(2) 対象サーバーに「google-authenticator」を導入・設定
(3) 作業端末(スマートフォン)に「Google 認証システム」を導入
(4) 作成したユーザーにログインしワンタイムパスワードを登録
(5) 作業端末(PC)から作成したユーザーに接続(SSH)・ログイン

利用リソース

本検証を実施するにあたり、利用したニフクラのリソース情報に関して以下に記載します。
※リソースのアクセス制限に関しては、ニフクラのファイアウォール等を用いて適切に設定の上実施しています。

リソース 数量
サーバー(サーバーOS:CentOS 7.6) 1

検証内容

対象サーバーに2段階認証設定後、作業端末からSSH接続で対象のユーザーにログインするまでの内容を記載します。

リソース作成 (ニフクラ)

(1) SSHキーの作成

ここでは、設定項目や設定値は省略させて頂きます。
※作成方法は、以下を参照してください。
クラウドヘルプ(SSHキー)

(2) ファイアウォールグループの作成

ここでは、設定項目や設定値は省略させて頂きます。
※作成方法は、以下を参照してください。
クラウドヘルプ(ファイアウォールグループの新規作成)
クラウドヘルプ(ファイアウォール:ルールの追加)

(3) サーバーの作成

ここでは、設定項目や設定値は省略させて頂きます。
※作成方法は、以下を参照してください。
クラウドヘルプ(サーバーの作成)

接続先の設定 (接続先サーバー)

(1) ユーザー(test1) 作成

ワンタイムパスワード登録用のユーザーを作成します。

# useradd test1
# tail /etc/passwd
# passwd test1
→パスワードを設定します。

(2) キーペア作成

(1)で作成したユーザーにキーペアを作成します。
※作成した秘密鍵を作業端末へ配置する方法はここでは割愛させて頂きます。

# mkdir /home/test1/.ssh
# chmod 700 /home/test1/.ssh
# chown test1:test1 /home/test1/.ssh
# ssh-keygen -t rsa
-------------------------------------------------------------   
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):  ★[任意のディレクトリ]
    Enter passphrase (empty for no passphrase): ★任意のパスフレーズ
    Enter same passphrase again ★任意のパスフレーズ
        ~略~
-------------------------------------------------------------   
# mv [キーペアを作成したディレクトリ]/id_rsa.pub /home/test1/.ssh/authorized_keys
# chmod 600 /home/test1/.ssh/authorized_keys
# chown test1:test1 /home/test1/.ssh/authorized_keys

(3) 開発関連ツールのインストール

google-authenticator」導入に必要なツールをインストールします。

# yum -y groupinstall "Development Tools"
# yum -y install pam-devel               

(4) 「google-authenticator」のインストール

gitから「google-authenticator」をダウンロードします。
※ 2019年10月時点の情報になります。ダウンロード先のURLは使用できなくなるおそれがあります。

# git clone https://github.com/google/google-authenticator-libpam.git
# cd google-authenticator-libpam
# ./bootstrap.sh
# ./configure
# make && make install

(5) pam_google_authenticator.soの配置

ここでは、参照先である /usr/lib64/security/配下に配置します。

# ls -l /usr/lib64/security/pam_google_authenticator.so
# cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/
# ls -l /usr/lib64/security/pam_google_authenticator.so

(6) /etc/ssh/sshd_configの編集

ここでは、SSH接続時に2段階認証を許可する設定を行います。
以下に設定を記載します。

項目(変更) 設定値 備考
ChallengeResponseAuthentication yes チャレンジレスポンス認証を許可
PasswordAuthentication no パスワード認証を拒否
UsePAM yes PAMインターフェイスによる認証を許可
項目(末尾に追記) 備考
AuthenticationMethods publickey,keyboard-interactive ログイン時の認証方法を、公開鍵認証+チャレンジレスポンス認証に設定
Match User root
AuthenticationMethods publickey
PubkeyAuthentication yes
PasswordAuthentication no
ログイン時の認証方法をrootのみ変更
(公開鍵認証のみ)
# cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_org
# vi /etc/ssh/sshd_config
   ※上記の設定を入力します
# systemctl status sshd
# systemctl restart sshd
# systemctl status sshd

(7) PAMファイルの作成

ここでは、「google_authenticator」認証についての定義ファイルを作成します。
以下に設定を記載します。

項目 備考
#%PAM-1.0 -
auth required pam_env.so 環境変数の読み込み
auth requisite pam_succeed_if.so uid >= 500 quiet ログイン時の一般ユーザーの uid が500以上必要
auth sufficient pam_google_authenticator.so nullok 「Google Authenticator」を有効
auth required pam_deny.so 認証がNGならログインを拒否
# vi /etc/pam.d/google-auth
※上記の設定を入力

(8) /etc/pam.d/sshd の編集

ここでは、(7)で作成した「google-auth」ファイルを「/etc/pam.d/sshd」に登録します。

# cp -p /etc/pam.d/sshd /var/tmp/
# vi /etc/pam.d/sshd
[追加]
auth       substack    google-auth
[下記をコメントアウト]
#auth       substack     password-auth

接続先サーバーでの設定は以上です。

接続元の設定 (作業端末)

ここでは、作業端末としてPC(Windows)とスマートフォン(Android)を使用します。

(1) 「Google 認証システム」 インストール

公式サイトからスマートフォンにアプリをインストールします。
※インストール方法は割愛させていただきます。

(2) 「PuTTY」 インストール

ここでは作業端末(PC)に「PuTTY」をインストールします。
※インストール方法は割愛させていただきます。

(3) ワンタイムパスワード登録

対象サーバーにログイン後、ユーザー(test1)を切り替え、「Google 認証システム」を使用し登録します。

1、下記コマンドを実行します。

$ su - test1
$ google-authenticator -t -d -W -u -f -e 10

※オプションの内容は以下になります。

オプション 備考
-t 時刻ベースのワンタイムパスワードを生成
-d 一度利用したワンタイムパスワードの再利用を禁止
-W 時刻のズレを最小化
-u 一定時間内のログイン回数制限なし
-f ユーザーのホームディレクトリの設定ファイルを上書き(確認なし)
-e 10 緊急コードの生成数を10に設定

2、QRコードが表示されます。
※QRコードが途中で途切れる場合があるため、ウィンドウサイズを適切な大きさにします。

f:id:sameshima_fjct:20191002170620p:plain

3、スマートフォンの「Google 認証システム」を起動させ、「開始」をタップします。
f:id:TechnicalAccountEngineer:20190702154112p:plain

4、ここでは「バーコードをスキャン」をタップし、「2」のQRコードをスキャンします。
f:id:TechnicalAccountEngineer:20190702154116p:plain

5、スキャンが完了すると、Google 認証システムに対象のユーザーが登録され、ワンタイムパスワードが発行されます。
「完了を」タップします。
f:id:TechnicalAccountEngineer:20190702154120p:plain

6、発行されたワンタイムパスワードを入力します。
※30秒おきにパスワードが変更になります。

f:id:sameshima_fjct:20191002170733p:plain

7、登録が完了したこと(Code confirmed)を確認します。
※ここでは8桁の緊急コードが生成されます。
ワンタイムパスワードを取得できなくなってしまった場合、代わりに使用するため控えておきます。

f:id:sameshima_fjct:20191002170805p:plain

接続元サーバーでの設定は以上です。

検証作業

ここでは作業端末(PC)から、対象サーバーへtest1ユーザーと秘密鍵を指定しssh接続します。
※本検証ではPuTTYを使用しています。

1、パスフレーズ(公開鍵認証)を入力します
f:id:TechnicalAccountEngineer:20190802130102p:plain

2、スマホアプリに表示されたワンタイムパスワード(チャレンジレスポンス認証)を入力します
※スマーとフォンを紛失した際などは、登録時に表示された緊急コードを使用してログインすることも可能です。ただし各緊急コードは使用できるのは1回のみです。 f:id:TechnicalAccountEngineer:20190802130117p:plain

3、ログインできたことを確認します。
f:id:TechnicalAccountEngineer:20190702154149p:plain

公開鍵認証とワンタイムパスワードを使用したログインができました。
これで、検証は終了となります。

まとめ

サーバー側の設定もスマホ側の設定も容易にできました。

懸念点としては、使用するSSHクライアントによっては、2段階認証に対応していない場合があることです。 また、ワンタイムパスワード設定前にログイン時の認証方法を2段階認証にしてしまうと、ログインができなくなってしまうため注意が必要です。 (本検証では「root」のみ公開鍵認証にしています。)

懸念点さえ抑えておけば、容易に2段階認証を導入できるため、 サーバーログイン時のセキュリティ強化の方法として使用してもよいかと思いました。

注意事項

  • 本記事については検証結果の1つとなります。実際に検討される場合は、事前にそれぞれの要件を鑑みて実装するか確認してください。
  • 本記事ではOS上の操作についても記載していますが、ニフクラではOS以上はご利用者様の責任範囲となりますのでご留意ください。