リモートデスクトップ環境を構築したい Part.1 SSH編 (Ubuntu 22.04 LTS)

リモートデスクトップ環境を構築したい Part.1 SSH編 (Ubuntu 22.04 LTS)

programming
PC関連

お外でお家とか会社だとかのPCにアクセスしたいな と思ったから やり方をここにまとめておきます

前提

・VPN等で接続先サーバーのIPに到達できる状態であること ・それなりの気合

今回の構成

ホスト(Ubuntu22.04) ←→ VPN ←→ クライアント(Windows) VPN上にあるリバースプロキシからそれぞれのIPを取得できる構成になっています

やること

Ubuntu 22.04 標準搭載のRDPが一番早いのでそれを第一選択にしたい が、一度ログインしてからでないとRDPが繋がらないのでログインだけxrdpを使う また、RDP中にログアウトしないまま同一セッションでログインすると画面が表示されなくなる対策のためにSSHを設定しておく 長くなりそうなので今回はSSH編。 VS Codeから使うだけとか、CLIだけで済む用事ならSSHだけ設定しておけば良いと思います

1. Host側でopensshのインストール

bash

sudo apt install openssh-server

2. Host側でsshの設定をいじる

初期設定だとセキュリティガバガバノーガード戦法のまま全世界に挑戦状を叩きつけることになります 私はチキンなので設定を変えておきます (今回はviで編集していますが、GUIが使える環境ならgeditで良いです) bash

cd /etc/ssh/
sudo vi /etc/ssh/sshd\_config

ポート変更

22番ポートに総当たり攻撃してくる輩が存在するので、コメントアウトして接続先のポートを変更します このあたりを参考にして、他のサービスで使われていないポートを適当に選定(例では10022にしています) vi

#port 22 これをコメントアウトして以下のように書き換える
port 10022

パスワード認証を無効化

パスワード認証は辞書攻撃だとか総当たり攻撃を食らうので公開鍵方式でしか認証できないように設定する vi

#PasswordAuthentication yes これをコメントアウトして以下のように書き換える
PasswordAuthentication no

Rootログイン無効

Rootでログインしなきゃいけないようなことはローカル環境でやりましょう sudoで十分です vi

#PermitRootLogin no これをコメントアウトして以下のように書き換える
PermitRootLogin no

タイムアウトの設定

ぷちぷち接続が切れるのがいやなので vi

#ClientAliveInterval 0
#ClientAliveCountMax 3
ClientAliveInterval 60
ClientAliveCountMax 3

sshd_configの整合性チェック

編集時におてんばなミスをしていなければ通るはず bash

sudo sshd -t -f sshd\_config

3. 公開鍵の設定

クライアント(接続元)とホスト(接続先)の双方で作業が必要です。 まずクライアント側(接続元)の公開鍵を作成します。

クライアント側(Windows)

公開鍵の作成 PowerShell

> ssh-keygen -t ed25519

初期設定ではssh-agentが立ち上がっていないので管理者権限でそのあたりを設定する PowerShell(管理者モード)

# ssh-agentサービスを設定
> Get-Service ssh-agent | Set-Service -StartupType Automatic
> Start-Service ssh-agent
# Runnningが帰ってくればOK
> Get-Service ssh-agent
# ssh-agentに鍵を登録
> ssh-add $env:USERPROFILE\.ssh\id\_ed25519

ホスト側(Ubuntu)

クライアントの公開鍵の内容(ssh-ed25519~User@ComputerName)を/home/ユーザー名/.ssh/authorized_keysに追記(なければつくる) 複数のクライアントから接続する必要があるときは改行して追記 bash(ホスト側)

cd /home/ユーザー名/.ssh
# authorized\_keysを作ったり追記したりした後は読み書きの権限をユーザーのみに限定しておかないと怒られる
chmod 600 authorized\_keys

4. ホスト側でSSHのサービスを開始する

上の設定が全部終わったら満を持してsshサービスを起動します(わくわく) bash(ホスト側)

sudo systemctl restart sshd.service

5. クライアントからSSHに接続

あとはクライアントから接続できれば成功です。わくわく。 PowerShellでもbashでも同じコマンドでつながるはずです bash

ssh -p 10022 [email protected]

最初の接続時にはFingerprint合ってる?と聞かれるので、問題なければyesと答えてください

6. VS Codeから繋ぐ

Remote Development拡張機能の中のRemote-SSHが入っていればVS CodeからSSH接続ができます

![](/articles/remote-desktop-ssh/01-スクリーンショット 2024-02-11 003204.png)

「SSHファイルを選択」と言われるのでとりあえず「C:\Users\ユーザー名.ssh\config」を選んで以下のように追記します VS Code

# Read more about SSH config files: https://linux.die.net/man/5/ssh\_config
Host hogehoge(接続名)
HostName xxx.xxx.xxx.xxx (ホストのIP or ホスト名)
User host-username(ホスト側ユーザ名)
Port 10022(設定したポート番号)
UserKnownHostsFile /dev/null
PreferredAuthentications publickey
PasswordAuthentication no
IdentityFile /Users/ユーザ名/.ssh/id\_ed25519.pub
IdentitiesOnly yes
LogLevel FATAL
ServerAliveInterval 60

あとは接続するだけ

![](/articles/remote-desktop-ssh/02-スクリーンショット 2024-02-11 005142.png)

またVSCodeでSSHを使う際、ファイル監視を有効にしているとssh接続の際にサーバーに負荷がかかるらしいので、 設定→Watcher Excludeのパターンに「**」を追加しておく 参考:【VSCode使用者注意】サーバーリソース食い散らかすマンから解放される唯一の方法       

おまけ

接続元がUbuntuである場合

接続元がssh-copy-idコマンドを使える場合はホスト側でauthorized_keysを編集する必要がなくてべんり bash(クライアント側)

ssh-keygen -t ed25519
ssh-copy-id -i ~/.ssh/id\_ed25519.pub -p 10022 [email protected]

RDP接続時に画面が表示されない場合

同じユーザーで他のログインセッションが立ち上がっている場合、他の端末からは画面が見えなくなる。 実機でログインされている場合や、RDP(Xrdp含む)をログアウトせずに他のセッションを繋いだときなどに発生する。 その場合でもSSH接続は可能なので、上記の症状が発生したら適当な端末から以下のコマンドを送信してGUIのセッションをころしてあげると良い(GNOMEの場合) bash

pkill gnome-session

参考

Ubuntu 22.04サーバー構築入門 SSHサーバのセキュリティを強化したい sshのセキュリティ設定 Linux サーバー:SSH 設定(2021年2月更新) SSH接続でのタイムアウト対策 Remote Development using SSH Visual Studio Code で Remote SSH する。