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) でも実現したので,その手順をブログに書き残します.
手順
- [2, 3, 4, 5] 等を参考にして RDP や Google Authenticator のインストールや初期設定を行う.
sudo cp /etc/pam.d/common-auth /etc/pam.d/ga-auth
等でcommon-auth
をコピーする.sudo nano /etc/pam.d/ga-auth
等を用いてauth [success=1 default=ignore] pam_unix.so nullok
の前の行にauth required pam_google_authenticator.so forward_pass
を追加する.sudo nano /etc/pam.d/xrdp-sesman
等を用いて@include common-auth
を@include ga-auth
へ変更する.- RDP でサーバに接続する.
- username にはユーザ名,password の欄にはパスワードと Google Authenticator の確認コードを結合した文字列を入力する.
6. の場合のみ認証が成功すれば,正しい設定です.
パスワード,あるいは確認コードを入力するだけで認証に成功している場合,設定を間違えている可能性があります.
補足
[1] と比べると少ない手順で実現できたので,そこに辿り着くまでの思考の過程も書き残します.
[1] の Normal CentOS 8 PAM stack for xrdp-sesman より,CentOS 8 Example での xrdp-sesman
は gdm-password
をインクルードし,その gdm-password
が password-auth
をインクルードしています.
また,gdm-password
と password-auth
は以下のように説明されています.
gdm-password
is a file which ships with thegdm
RPM.
Its function is to ensure thepam_gnome_keyring.so
modules gets called as required, and that thepassword-auth
file is also included appropriately.[1] matt335672: Using Authy or Google Authenticator for 2FA with XRDP.
password-auth
is called by many other PAM files.
It performs generic password-based authentication.
また,2FA CentOS 8 PAM stack for xrdp-sesman で,編集すべきモジュールのタイプを説明しています.
This only needs to be done for the
[1] matt335672: Using Authy or Google Authenticator for 2FA with XRDP.auth
module type. Theaccount
,password
andsession
module types are not affected.
したがって,Ubuntu 20.04 の xrdp-sesman
の中で編集すべき箇所の候補は common-auth
となります.
また,この xrdp-sesman
は common-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 認証を追加する手順を紹介しました.
意外と単純な手順で実現できるので,セキュリティの向上や勉強のために是非ともやってみましょう.
参考
- 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).
- hoto17296:Ubuntu 20.04 に xrdp を入れてリモートデスクトップできるようにする,Qiita(オンライン),入手先〈https://qiita.com/hoto17296/items/0e3e5bd407351fd2e6ca〉(参照 2022-08-14).
- tukiyo3:Ubuntu 20.04 の xrdp 使用中の問題と解決策,Qiita(オンライン),入手先〈https://qiita.com/tukiyo3/items/8793ede62180a0e32a22〉(参照 2022-08-14).
- Satoru Izaki:5分でできる!SSH + Google Authenticator 二段階認証設定(CentOS7),あぱーブログ(オンライン),入手先〈https://blog.apar.jp/linux/12502/〉(参照 2022-08-14).
- luciferous_report:Google Authenticatorを使ってSSHに二段階認証を組み込んでみる,はてなブログ(オンライン),入手先〈https://luciferous-report.hatenablog.com/entry/2016/11/18/021234〉(参照 2022-08-14).