リモートデスクトップ接続したいだけなのにわざわざVPNを繋ぎたくない

リモートデスクトップ接続したいだけなのにわざわざVPNを繋ぎたくない

を動機にして、sshトンネルを利用してRDP接続してみた

環境

[Ubuntu PC]−(インターネット)→[Ubuntu Server]→[Windows PC]

設定メモ

Ubuntu Server側の設定(その1)

  • openssh-serverのインストール
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo apt install openssh-server

Ubuntu PC側の設定(その1)

  • 認証鍵の生成
┌─╼ | up 17 days, 3:25, 0 users | [~]
└────╼ $ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/administrator/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/administrator/.ssh/id_rsa
Your public key has been saved in /home/administrator/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:4zSR4vvXaVogzA54V3eTGtM2gXpq63/ZnkFoN4Dql98 administrator@lenovo
The key's randomart image is:
+---[RSA 4096]----+
|             ..  |
|         .  o. o |
|      . o .o+.B  |
|     o + oo..*oo |
|    . + S..o.o + |
|     . B.+o.o o .|
|      . oo =.. + |
|       .  +.= + +|
|        .oo+.o E.|
+----[SHA256]-----+
  • 生成した鍵をUbuntu Serverへ転送する
┌─╼ | up 17 days, 3:28, 0 users | [~]
└────╼ $ ssh-copy-id -i ~/.ssh/id_rsa.pub administrator@gatekeeper
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/administrator/.ssh/id_rsa.pub"
The authenticity of host 'gatekeeper (*.*.*.*)' can't be established.
ECDSA key fingerprint is SHA256:ZfTcNolCYmEZ+YK/JZZ3HirCMhQo5WWaDg2YaVT8uJM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'administrator@gatekeeper'"
and check to make sure that only the key(s) you wanted were added.

Ubuntu Server側の設定(その2)

  • 必要な認証鍵の転送が終わったら、パスワード認証での接続を無効化する
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo nano /etc/ssh/sshd_config
PasswordAuthentication no
  • ついでにrootのログインも無効にしておくとベター
PermitRootLogin no
  • sshd_configを書き換えたらsshサーバーを再起動する
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo systemctl restart sshd

2つ目以降の認証鍵は、USBメモリなどに生成されたid_rsa.pubをコピーして、既に設定済みの端末から該当のアカウントの.ssh/authorized_keysファイルに追記するようにします
パスワード認証も無効にしないでおけば都度scpコマンドで転送したり、sshコマンドで接続してコピペもできるのでしょうが、どれだけ複雑なパスワードを設定していたとしても外向きに公開しているサーバーでパスワード認証を使えるようにしたままにしておくのは絶対に止めましょう

  • 2つ目以降の接続アカウントを作成する
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo groupadd -f RASUsers
オプション意味
-gグループが既に存在していた場合はエラーにならず終了する
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo useradd -m -N -g RASUsers -s /bin/false staff01
オプション意味
-mユーザーのホームディレクトリが存在しない場合に作成する
-Nユーザーと同じ名前のグループを作成しない
-gユーザーが属するプライマリグループを指定する
-sユーザーのログインシェルをフルパスで指定する
  • 作成したアカウントのホームディレクトリに.sshディレクトリを作成する
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo mkdir /home/staff01/.ssh
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo touch /home/staff01/.ssh/authorized_keys
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo chown -R staff01:RASUsers /home/staff01/.ssh
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo chmod 700 /home/staff01/.ssh
┌─╼  administrator@gatekeeper : [~]
└────╼ [ssh] $ sudo chmod 600 /home/staff01/.ssh/authorized_keys

適切なアクセス権が設定されていないとPermission deniedで接続できません

Ubuntu PC側の設定(その2)

  • 接続テスト
┌─╼ | up 17 days, 3:45, 0 users | [~/.ssh]
└────╼ $ ssh administrator@gatekeeper
  • RDPクライアントのインストール
┌─╼ | up 17 days, 3:52, 0 users | [~]
└────╼ $ sudo apt -y install freerdp2-x11
[sudo] password for administrator:
  • sshトンネルを経由してWindows PCにRDP接続する
┌─╼ | up 17 days, 3:55, 0 users | [~]
└────╼ $ nano RDPviaSSH.sh
#!/bin/bash
TunnelCMD="ssh -N -L 13389:172.29.100.253:3389 administrator@gatekeeper"

#Establish SSHTunnel
pgrep -f -x "$TunnelCMD" > /dev/null 2>&1 || $TunnelCMD &
sleep 1

# Connect RDPSession
xfreerdp /v:localhost:13389 /sound /sound:sys:alsa /clipboard /w:1440 /h:1050 /audio-mode:0 /u:user /p:Password1! /floatbar:show:always

#Purge SSHTunnel
PID=`pgrep -f -x "$TunnelCMD"`
kill "$PID"

これでRDPするためだけにわざわざVPNを繋がなくてよくなりました