実験してみたシリーズ。 Advent Calendar のネタは出来てないのに大丈夫なのか…?
非サポートなので自己責任!本番環境では非推奨です!
SSH ログインに Google Authenticator
Google Authenticator(Google 認証システム)は、Googleが開発した二段階認証(二要素認証)を行うトークンソフトウェアである。Authenticatorは、Googleログイン時の二段階認証に必要な6桁の数字コードを生成する。また、LastPassやDropboxといった他社製のアプリケーションの二段階認証にも対応する。
Google Authenticator - Wikipedia
ログイン時にアプリなどで時間で変化する 6桁のコードを生成し、入力することでログインできるようになるアレの Google 版ですが、Google の仕組みは PAM 経由で Linux サーバの認証で使える lib が OSS として開発、公開されていたりする。
Linux にいけるということは vCSA でも使えるんじゃないか…ということで試してみる。
環境
今回試した環境は(雑に立ててた) vCenter Server 8.0 U3c。
(U3d じゃないのかよというツッコミはノーサンキュー)
今回の記事では割愛するが、vCenter Server 7.0 U3t でも動いた。
(7.0 U3 だと gcc がデフォルトなかったので追加インストールする必要あり)
インストール
よくある Linux ディストリビューションであれば yum なり apt なりでインストールできるみたいだが、残念ながら vCSA(Photon) のリポジトリには入っていないのでソースからのコンパイル。
幸いなことにコンパイルに必要なものはすべてtdnf
で取得できる。
root@vcsa03 [ ~ ]# tdnf install autoconf automake binutils make linux-api-headers Linux-PAM-devel Installing: binutils-libs x86_64 2.35-14.ph4 photon-updates 4.09M 4292472 Linux-PAM-devel x86_64 1.5.3-3.ph4 photon-updates 196.28k 200988 linux-api-headers noarch 5.10.210-1.ph4 photon-updates 5.19M 5438242 make x86_64 4.3-2.ph4 photon-release 1.35M 1418198 binutils x86_64 2.35-14.ph4 photon-updates 27.37M 28699422 automake noarch 1.16.1-3.ph4 photon-updates 1.37M 1436542 autoconf noarch 2.69-10.ph4 photon-updates 1.70M 1783277 Total installed size: 41.26M 43269141 Is this ok [y/N]: y 【略】
それと Github から Google-authenticator-libpam のソースをダウンロードし、解凍する。
root@vcsa03 [ ~ ]# wget https://github.com/google/google-authenticator-libpam/archive/refs/tags/1.10.tar.gz --2024-12-08 22:44:57-- https://github.com/google/google-authenticator-libpam/archive/refs/tags/1.10.tar.gz Resolving github.com... 20.27.177.113, 64:ff9b::141b:b171 【略】 2024-12-08 22:45:01 (636 KB/s) - ‘1.10.tar.gz’ saved [64409/64409] root@vcsa03 [ ~ ]# tar -xvzf 1.10.tar.gz google-authenticator-libpam-1.10/ google-authenticator-libpam-1.10/.github/ 【略】 root@vcsa03 [ ~ ]# ls 1.10.tar.gz google-authenticator-libpam-1.10
Github の手順の通りbootstrap.sh
→ ./configure
→ make
→ make install
root@vcsa03 [ ~ ]# cd google-authenticator-libpam-1.10/ root@vcsa03 [ ~/google-authenticator-libpam-1.10 ]# ./bootstrap.sh libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build'. libtoolize: copying file 'build/ltmain.sh' 【略】 Makefile.am: installing 'build/depcomp' parallel-tests: installing 'build/test-driver' root@vcsa03 [ ~/google-authenticator-libpam-1.10 ]# ./configure checking whether make supports nested variables... yes checking for gcc... gcc 【略】 config.status: executing libtool commands google-authenticator version 1.10 Prefix.........: /usr/local Debug Build....: C Compiler.....: gcc -g -O2 -Wall Linker.........: /usr/bin/ld -m elf_x86_64 -ldl root@vcsa03 [ ~/google-authenticator-libpam-1.10 ]# make make all-am make[1]: Entering directory '/root/google-authenticator-libpam-1.10' 【略】 make[1]: Leaving directory '/root/google-authenticator-libpam-1.10' root@vcsa03 [ ~/google-authenticator-libpam-1.10 ]# make install make[1]: Entering directory '/root/google-authenticator-libpam-1.10' /usr/bin/mkdir -p '/usr/local/bin' 【略】 make[1]: Leaving directory '/root/google-authenticator-libpam-1.10' root@vcsa03 [ ~/google-authenticator-libpam-1.10 ]#
make install
で /usr/local/lib/security
にインストールされる
root@vcsa03 [ /usr/local/lib/security ]# ls pam_google_authenticator.la pam_google_authenticator.so
ここだとパスが通っていないので、/usr/lib64/security
にリンクを作っておく。
root@vcsa03 [ ~ ]# ln -s /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/pam_google_authenticator.so root@vcsa03 [ ~ ]# ls -l /usr/lib64/security/pam_google_authenticator.so lrwxrwxrwx 1 root root 51 Dec 8 23:14 /usr/lib64/security/pam_google_authenticator.so -> /usr/local/lib/security/pam_google_authenticator.so
sshd_config の設定
ChallengeResponseAuthentication yes
を追記しておく。
root@vcsa03 [ ~ ]# echo "ChallengeResponseAuthentication yes" >> /etc/ssh/sshd_config
(無くてもいいんじゃないか、、、という気もしている)
/etc/pam.d/sshd の設定
設定ファイルに追記。
# Begin /etc/pam.d/sshd auth required pam_google_authenticator.so nullok echo_verification_code ★ この行(表示幅の関係で改行されているかも) auth [success=done new_authtok_reqd=done default=ignore perm_denied=die] pam_mgmt_cli.so /usr/lib/applmgmt/linux_cli/bin/getticket account sufficient pam_mgmt_cli.so /usr/lib/applmgmt/linux_cli/bin/getticket auth include system-auth account include system-account password include system-password session include system-session # End /etc/pam.d/sshd
追記する位置について、シェルが bash の場合は末で問題ないが、どうも appliancesh の場合だとauth [success=done ...
行より前にないとパスワード認証が通った段階で appliancesh が起動してしまう。
auth [success=done
の内容を読み解いて直せばいいのだろうが、そこは妥協し先頭に書いておく。
google-authenticator の初期化
google-authenticator を初期化し、シークレットキーを生成する。
root@vcsa03 [ ~ ]# google-authenticator Do you want authentication tokens to be time-based (y/n) y Failed to use libqrencode to show QR code visually for scanning. Consider typing the OTP secret into your app manually. Your new secret key is: 【hogehoge】 Enter code from app (-1 to skip):
キーが生成されるので、これをアプリの Google Authenticator に登録する。
登録が問題なければアプリ側で6桁のコードが表示されるようになるので、それをEnter code from app
に入力し先へ進める。
Enter code from app (-1 to skip): 111111 Code confirmed Your emergency scratch codes are: 【hogehoge】 Do you want me to update your "/root/.google_authenticator" file? (y/n) y 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 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 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
緊急用の復旧コードが表示されるので控えておく。
その他、サーバサイド側でのキーの配置や各種設定が聞かれるが、ここはデフォルトにしておくのが無難かな。。。
最後にsshd
を再起動
root@vcsa03 [ ~ ]# systemctl restart sshd
この後動作確認だが、このコンソールセッションはそのままで別ターミナルで新たに接続して確認するのが安全。
動作確認
別ターミナルよりssh
で接続。
$ ssh root@192.168.100.53 VMware vCenter Server 8.0.3.00300 Type: vCenter Server with an embedded Platform Services Controller (root@192.168.100.53) Verification code: 222222 ★アプリの6桁の数字を入力 (root@192.168.100.53) Password: ★ root ユーザのパスワード Last login: Sun Dec 8 23:02:26 2024 from 192.168.1.13 Connected to service * List APIs: "help api list" * List Plugins: "help pi list" * Launch BASH: "shell" Command>
/etc/pam.d/sshd
の記述が先頭に来たことでアプリの6桁コードがまず聞かれるため若干違和感があるが、一応動作上は問題なく、コードもパスワードも正しいものを入力しないとログインできないため、一応目的は達成。
基本 SSH は Disable でも問題ないので、vCenter の機能的には問題ない…はず。
(vSphere Client でざっと見ではエラーなし)
終わりに
Google Authenticator を利用して SSH に対して二段階認証を試してみるお話しでした。
vCSA ができた = Photon OS ベースな他のアプライアンスに対しても適用できるものかと思いますが、あくまで非公式・非サポート、自己責任な内容となりますので、ラボ環境とかでならいいんじゃないですかね。。。