はじめに
以前、Amazon DCVの基本的な内容をまとめた記事を書きました。
本記事では、Amazon DCVのPAM認証機構を活用して、認証突破と同時にDCVセッションを自動作成する方法を解説します。
やりたいこと
そもそも、Amazon DCVでログインするためには、まずDCVのセッションを作成しないといけません。具体的には、以下のようなコマンドを実行してあげる必要があります。
# コンソールセッションの作成
sudo dcv create-session "console" --type=console --owner "user1"
このようにownerがuser1のセッションを作成すると、user1でログインできるようになります。
ただ、これだと
- sshでインスタンスにログインする
- DCVセッションをコマンドで作成する
- DCVの認証画面でIDとパスワードを入れて認証する
とDCVで認証する前にsshでインスタンスにログインする必要があります。それは面倒です。そこで、DCVの認証を突破した直後に、裏で自動的にセッションを作成したいというのが、今回の目的です。
前提
- OSはRHEL9
- Amazon DCVや関連するパッケージはインストール済み
やってみる
大まかにどういう仕組みで実現できるかを説明します。
DCVの認証は、デフォルトだと、Linuxのユーザー認証の仕組みであるPAM(Pluggable Authentication Modules)を使います。このPAMは、設定ファイルを変更すると、認証時の動作を変更できます。
それを使って、認証の動作の中にDCVセッションを作成するシェルスクリプトを実行するように仕込みます。こうすることで、DCV認証を突破したらそのシェルスクリプトが実行され、DCVセッションが自動で作成されます。
PAMサービスの変更
上記を参考に、PAMのファイルを変更します。
/etc/pam.d/dcv
がデフォルトの設定ファイルですが、以下のようになっています。これが、デフォルトの認証時の動作です。
auth include password-auth
account include password-auth
そのデフォルトの設定ファイルは変更せずに、/etc/pam.d/dcv-custom
を新しく作成して、以下のような内容に編集します。
auth required pam_exec.so /usr/local/bin/dcv-auto-session.sh
auth include password-auth
account include password-auth
1行目が、シェルスクリプトを仕込んだ部分です。このシェルスクリプトは次で作成します。
※ auth
やaccount
等の意味は、こちらの記事が参考になります
shファイルの作成
以下のコマンドで、シェルスクリプトを作成します。
sudo touch /usr/local/bin/dcv-auto-session.sh
そして、以下の内容に編集します。
#!/bin/bash
sudo dcv create-session "$PAM_USER" --owner "$PAM_USER" --type=console
$PAM_USER
は、現在の認証ユーザーを示しています。つまり、DCVの認証画面で入力されたUsernameです。ownerをそのUsernameで指定することで、そのユーザーが使えるDCVセッションが作成されます。
セッション名もユーザー名にしていますが、ここは固定の名前でもOKです。
今回は、最低限セッションを作成するだけのかなりシンプルなものにしています。実際は、既にセッションが作成されているか確認したり、ログを出力したりすることになると思います。
DCVのconfig修正
また、上記を参考に、/etc/dcv/dcv.conf
を編集して、[authentication]
セクションを以下のように書き換えます。
[authentication]
pam-service=dcv-custom
これで、先ほど作成したPAMの設定が使用されるようになりました。
dcv Userにsudo権限付与
DCVサービスが先ほどのシェルスクリプトを実行することになるが、現在の権限設定だと実施ができません。そのため、dcv Userにsudo権限を付与します。
以下を実行すして、sudo権限の設定ファイルを開きます。
sudo visudo
一番下の行に以下を追加します。
dcv ALL=(ALL) NOPASSWD: /bin/dcv
これで、dcv Userにパスワード認証なしでsudoが実行できるようになりました。
sudo権限を付与することで、意図しない操作が可能になるケースもあるのでご注意ください。
DCVサーバー再起動
以下を実行して、DCVサーバーを再起動します。
sudo systemctl restart dcvserver
接続してみる
DCVでの接続の前に、sshでログインして、セッションが作成されていないことを確認します。
[ec2-user@ip-172-12-13-456 ~]$ dcv list-sessions
There are no sessions available.
さて、この状態でDCVの認証を突破してみます。普通なら、セッションが無いので接続できないはずです。
Sign inを押すと・・・
入れました!!
改めて、ssh接続している方でセッションを確認してみます。
[ec2-user@ip-172-12-13-456 ~]$ dcv list-sessions
Session: 'ec2-user' (owner:ec2-user type:console)
無事にセッションが作成されていました。
デフォルトだと、DCVが起動した際に自動でセッションが作成されるはずですが、今回の設定をする場合はその機能をオフにしておきましょう。
おわりに
デスクトップ接続できるのがウリなのに、最初にセッション作っておかないといけないってちょっと不便ですよね。今回の記事のようなことが、デフォルトで出来るようにならないかなぁと思っております。
では、今後も快適なDCV生活をお過ごしください。