PAM の設定ファイルを編集して xrdp を PW + OTP 認証にした.

こんにちは.あらい大先生です.

コロナ禍&猛暑なので在宅研究をしたくなり,Cuckoo Server に xrdp (と openssh-server) をインストールしました.
また,せっかくなので xrdp の認証方式を PW 以外,あるいは PW + α にしたくなりました(踏み台サーバ経由の SSH Port Forwarding で接続するので元から安全性は高めですが).

しかし,xrdp の設定ファイル (xrdp.ini) には,公開鍵認証に関する項目が無さそうです.
また,Windows のリモートデスクトップ接続にも,秘密鍵を指定するようなオプションは無さそうです.

公開鍵認証を諦めて別の方法を探してみると,PAM と Google Authenticator を組み合わせることで CentOS 8 の xrdp を PW と OTP の二要素認証にする方法 [1] を見つけました.
これを参考にすることで Ubuntu 20.04 (Cuckoo Server の OS) でも実現したので,その手順をブログに書き残します.

手順

  1. [2, 3, 4, 5] 等を参考にして RDP や Google Authenticator のインストールや初期設定を行う.
  2. sudo cp /etc/pam.d/common-auth /etc/pam.d/ga-auth 等で common-auth をコピーする.
  3. sudo nano /etc/pam.d/ga-auth 等を用いて auth [success=1 default=ignore] pam_unix.so nullok の前の行に auth required pam_google_authenticator.so forward_pass を追加する.
  4. sudo nano /etc/pam.d/xrdp-sesman 等を用いて @include common-auth@include ga-auth へ変更する.
  5. RDP でサーバに接続する.
  6. username にはユーザ名,password の欄にはパスワードと Google Authenticator の確認コードを結合した文字列を入力する.

6. の場合のみ認証が成功すれば,正しい設定です.
パスワード,あるいは確認コードを入力するだけで認証に成功している場合,設定を間違えている可能性があります.

補足

[1] と比べると少ない手順で実現できたので,そこに辿り着くまでの思考の過程も書き残します.

[1] の Normal CentOS 8 PAM stack for xrdp-sesman より,CentOS 8 Example での xrdp-sesmangdm-password をインクルードし,その gdm-passwordpassword-auth をインクルードしています.
また,gdm-passwordpassword-auth は以下のように説明されています.

gdm-password is a file which ships with the gdm RPM.
Its function is to ensure the pam_gnome_keyring.so modules gets called as required, and that the password-auth file is also included appropriately.

password-auth is called by many other PAM files.
It performs generic password-based authentication.

[1] matt335672: Using Authy or Google Authenticator for 2FA with XRDP.

また,2FA CentOS 8 PAM stack for xrdp-sesman で,編集すべきモジュールのタイプを説明しています.

This only needs to be done for the auth module type. The accountpassword and session module types are not affected.

[1] matt335672: Using Authy or Google Authenticator for 2FA with XRDP.

したがって,Ubuntu 20.04 の xrdp-sesman の中で編集すべき箇所の候補は common-auth となります.
また,この xrdp-sesmancommon-auth をインクルードするだけで,その common-auth は別のモジュールをインクルードしていません.
そのため,Ubuntu 20.04 では common-auth を編集するだけで良さそうです.

次に,どのように common-auth を編集するかを検討します.
[1] の Data flow を見る限り,auth ... pam_unix.so ... よりも上の行に auth required pam_google_authenticator.so forward を追加すれば良さそうです.
Ubuntu 20.04 の common-auth を確認すると,auth [success=1 default=ignore] pam_unix.so nullok と類似の文字列が見つかりました.
試しに,この上の行に auth required pam_google_authenticator.so forward を追加してみることにしました.
[1] では,「必要に応じて pam_unix.so 等に use_first_pass も追加しましょう」と説明されていますが,今は気にしないことにします.

その後,手順 4. 以降を行うと,無事に PW + OTP 認証で RDP に接続することができました.

終わりに

今回は xrdp に OTP 認証を追加する手順を紹介しました.
意外と単純な手順で実現できるので,セキュリティの向上や勉強のために是非ともやってみましょう.

参考

  1. matt335672:Using Authy or Google Authenticator for 2FA with XRDP(オンライン),入手先〈https://github.com/neutrinolabs/xrdp/wiki/Using-Authy-or-Google-Authenticator-for-2FA-with-XRDP〉(参照 2022-08-13).
  2. hoto17296:Ubuntu 20.04 に xrdp を入れてリモートデスクトップできるようにする,Qiita(オンライン),入手先〈https://qiita.com/hoto17296/items/0e3e5bd407351fd2e6ca〉(参照 2022-08-14).
  3. tukiyo3:Ubuntu 20.04 の xrdp 使用中の問題と解決策,Qiita(オンライン),入手先〈https://qiita.com/tukiyo3/items/8793ede62180a0e32a22〉(参照 2022-08-14).
  4. Satoru Izaki:5分でできる!SSH + Google Authenticator 二段階認証設定(CentOS7),あぱーブログ(オンライン),入手先〈https://blog.apar.jp/linux/12502/〉(参照 2022-08-14).
  5. luciferous_report:Google Authenticatorを使ってSSHに二段階認証を組み込んでみる,はてなブログ(オンライン),入手先〈https://luciferous-report.hatenablog.com/entry/2016/11/18/021234〉(参照 2022-08-14).

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です