💻️

Google Cloud で X 環境を構築する(今更ながらの Chrome Remote Desktop のススメ)

2024/12/23に公開

Google Cloud で Chrome Remote Desktop を活用!セキュアな X デスクトップ環境を構築しよう

Title Image

tl;dr

  • Google Cloud の管理に便利な Linux GUI デスクトップ環境の構築方法をご案内
  • Cloud Shell では対応できない、X 環境が必要なアプリケーションの実行や VPC 内のブラウザ アクセス環境として活用可能
  • 途中で接続を切っても、ログインセッションは残るので、長時間実行処理の実行環境としても活躍
  • デスクトップへは Google アカウントによるログインが必要なので、VNC を利用するセキュリティリスクを回避。要塞ホストとしても活用可能
  • アクセスに必要なクライアントはブラウザのみ

皆さん、こんにちは。
今年は Google Cloud と Oracle のパートナーシップの発表 があって、Oracle データベースのインストールをする機会が増えました。
Oracle のインストールといえば、皆様おなじみの runInstaller や Net Manager など GUI で動く構成ツールが必要で、どうしても X 環境が欲しくなります。
普段 Google Cloud の利用では、Cloud Shell 経由での CLI アクセスがとても便利ですが、X 環境を利用する場合は Chrome Remote Desktop が便利です。
そこで今更ながらかも知れませんが、 本記事では Chrome Remote Desktop のススメとして、Chrome Remote Desktop がなぜ便利なのかと、実際の利用手順を紹介したいと思います。

Chrome Remote Desktop のメリット

1. Cloud Shell では対応できない GUI 環境の提供

Google Cloud の Cloud Shell は便利なツールですが、GUI アプリケーションの実行には対応していません。Chrome Remote Desktop を利用することで、Cloud Shell では実現できない GUI 環境での作業が可能になります。
例えば、Web ブラウザを利用したプライベートなネットワークへのアクセス、GUI ベースのテストツールや開発ツールの利用など、幅広い用途で活用できます。

2. 長時間実行処理に最適

リモートデスクトップ接続が途中で切断されても、ログインセッションは保持されるため、長時間実行される処理の実行環境として安心して利用できます。
例えば、Oracle のような大規模ソフトウェアのメディア ダウンロードやインストールの実行などをリモートデスクトップ上で実行し、途中で接続が切れても、処理を中断することなく完了させることができます。

3. 安全な Google アカウントログイン

VNC のようなリモートデスクトップツールはパスワード認証が一般的ですが、セキュリティ上の懸念が残ります。
Chrome Remote Desktop は Google アカウントを利用したログイン認証のため、VNC よりも安全な認証を提供します。また、二段階認証を設定していれば、さらにセキュリティが向上します。
このため、要塞ホストとしても利用でき、よりセキュアなアクセス環境を構築できます。

4. クライアントはブラウザのみ

Chrome Remote Desktop にアクセスするためのクライアントは、Web ブラウザのみです。特別なソフトウェアをインストールする必要はなく、どのデバイスからでも手軽にリモートデスクトップ環境を利用できます。
OS を選ばずに利用できる点も大きなメリットです。

Chrome Remote Desktop の導入方法

ここでは、Linux インスタンスへの Chrome Remote Desktop の導入方法を簡単に説明します。
こちらのドキュメント に詳細な手順が載っているので、ここでは要点に絞ってご案内します。

下記の環境を、順を追って構成してみましょう。
接続イメージ

1. Google Cloud で Compute Engine Linux インスタンスを作成

  • X 端末となる Compute Engine インスタンスを作成 します。
    構成においては、下記の点に気をつけましょう。
    • OS: Debian (Default) を選択
    • 外部IPv4アドレス: セキュリティのため無効化も可能。無効化した場合は、このあとに作成する NAT 経由での接続となります。

例) Cloud Shell を起動 し、gcloud コマンドでインスタンスを作成します。

gcloud compute instances create crd1 \
    --zone=us-central1-a \
    --machine-type=e2-medium \
    --no-address

2. Cloud NATインスタンスを構成

  • X 端末インスタンスの外部 IPv4 アドレスを無効化した場合、サービスとの通信のため NAT を経由したインターネット接続を構成します。
  • インスタンスを作成した VPC ネットワークに Cloud RouterCloud NAT ゲートウェイを作成 します。

例) Cloud Router と Cloud NAT を Default VPC 内に作成

gcloud compute routers create router1 \
    --region=us-central1 \
    --network=default
gcloud compute routers nats create nat1 \
    --router=router1 \
    --region=us-central1 \
    --auto-allocate-nat-external-ips \
    --nat-all-subnet-ip-ranges

3. SSH 設定を追加

  • Cloud Shell から X 端末インスタンス と X 端末インスタンスから VPC 内の他のインスタンスへアクセスするために、ファイアーウォールルールの追加と、SSH 秘密鍵の複製を行います。

参考:IAP TCP 転送用のファイアウォール ルールを作成する

例) ファイアーウォールルールの追加と、SSH 秘密鍵の複製

# IAP TCP 転送による SSH を許可するファイアウォール ルールを作成
gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20
# X 端末インスタンスと VPC(10.0.0.0/8) 内の他のインスタンス間の SSH を許可するファイアウォール ルールを作成
gcloud compute firewall-rules create allow-ingress-ssh \
--allow=tcp:22 \
--source-ranges="10.0.0.0/8"
# SSH 秘密鍵の複製
gcloud compute scp ~/.ssh/google_compute_engine crd1:/tmp --zone=us-central1-a --tunnel-through-iap 
# X 端末インスタンスへ接続
gcloud compute ssh crd1 --zone=us-central1-a --tunnel-through-iap

4. Chrome Remote Desktop のインストール

例)

curl https://dl.google.com/linux/linux_signing_key.pub \
    | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/chrome-remote-desktop.gpg
echo "deb [arch=amd64] https://dl.google.com/linux/chrome-remote-desktop/deb stable main" \
    | sudo tee /etc/apt/sources.list.d/chrome-remote-desktop.list
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive \
    apt-get install --assume-yes chrome-remote-desktop

5. X Windows System デスクトップ環境(Xfce)のインストール

  • X 端末インスタンスへ X Windows System デスクトップ環境 (Xfce) をインストールします。

例)

# Xfce デスクトップ環境の導入
sudo DEBIAN_FRONTEND=noninteractive \
    apt install --assume-yes xfce4 desktop-base dbus-x11 xscreensaver
# Xfce デスクトップ環境をデフォルトへ設定
sudo bash -c 'echo "exec /etc/X11/Xsession /usr/bin/xfce4-session" > /etc/chrome-remote-desktop-session'
# Chrome ブラウザをインストール
curl -L -o google-chrome-stable_current_amd64.deb \
https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install --assume-yes --fix-broken ./google-chrome-stable_current_amd64.deb
# Color Manager を停止
sudo systemctl stop colord
sudo systemctl disable colord

6. リモートデスクトップの設定

Chrome リモートデスクトップ

  • "開始" > "次へ" > "承認" と選択すると、Deban Linux 用の設定コマンドが出力されるため、コピーして X 端末インスタンスで実行します。
  • 途中入力する PIN コードは、以降の接続で必要となります。

例)

$ DISPLAY= /opt/google/chrome-remote-desktop/start-host --code="XXXXX" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=$(hostname)
Enter a PIN of at least six digits: (認証用の任意の6桁以上の数字を入力)
Enter the same PIN again: (再度入力)

7. Chrome Remote Desktop への接続

アクセス

  • クリックして PIN コードを入力すると、無事にX デスクトップ環境へアクセスできました

PIN
メニュー

  • ブラウザからクリップボードへのアクセスの許可を求められた場合は、ローカル端末とのコピペを可能にするため許可を選びましょう。

コピー許可

8. X 転送設定の確認

  • 次に X アプリケーションの実行環境(仮に db1 とします) から X 端末への X 転送が出来るかを試します。
  • 例えば Chrome Remote Desktop に対応していない Redhat インスタンス等で X アプリケーションを利用するときはこの方法を利用します。
  • 転送を行う前に、 X アプリケーション実行環境で、sshd が問題なく設定されているかを確認します。
  • sshd で "X11Forwarding yes" となっており、SSH による X 転送が許可されていることを確認します。

例) X アプリケーション実行環境 (db1)

db1$ sudo grep ^X11 /etc/ssh/sshd_config 
X11Forwarding yes
  • 併せて xauth がインストールされていることも確認します。

例) X アプリケーション実行環境 (db1)

db1$ which xauth
/usr/bin/xauth

9. X 画面の転送確認

  • X デスクトップにてターミナルを起動し、X アプリケーション実行環境 (db1) へ SSH 接続をします。
  • ssh 接続では、-X オプションを付けることで、X 転送を有効にします。
# 先に複製しておいた、秘密鍵ファイルをデフォルトのパスへ移動
mv /tmp/google_compute_engine  ~/.ssh/id_rsa
# SSH 接続
ssh -X db1
  • 試しに xterm を起動すると、無事に起動が確認できました。

X 転送

  • sudo で実行した X プログラムを転送する場合は、先に xauth の設定が必要です。
sudo xauth `xauth list`
  • こちらも試しに sudo コマンドで xterm を起動すると、無事に起動が確認できました。

SUDO X 転送

まとめ

Google Cloud における Chrome Remote Desktop は、セキュアかつ無料でリモートデスクトップ環境を構築できる非常に便利なツールです。Cloud Shell では難しい GUI アプリケーションの利用や、長時間実行処理の環境として、ぜひ活用してみてください。

Google Cloud Japan

Discussion