はじめに
コンピューターにリモートアクセスを行いたいことがあります。この際の方法やTipsをまとめてみました。扱う方法はSSH,VNC,RDPです。
SSHでリモート接続を行う
SSHで外部からリモート接続を行う場合、セキュリティを考えると、多段階認証を行ったほうが良いです。多段階認証のサーバーは存在するとして、設定方法を記します。コンピュータの名前は以下のようにします。
- 踏み台サーバー
- ターゲット(SSHでアクセスされるコンピュータ)
- クライアント(SSHでアクセスするコンピュータ)
下準備としてすべてのコンピュータにSSHをインストールし、ipアドレスの固定を行ってあるものとします。
またクライアント以外のOSはUbuntu 20.04を前提としますがほかのOSでもほぼ同様に可能です。
鍵を生成する
SSHでは、パスワードによる認証もできますが、セキュリティを鑑みると公開鍵認証による認証を利用するべきです。そこで公開鍵認証を行うための鍵を生成していきます。RSA,ed25519が現在よく利用されています。ed25519は、楕円曲線を利用した暗号でとりあえずこれを利用しておけば問題ありませんが、レガシーな環境ではed25519に対応していないOpen sshを利用していることがあり、そのような際にはRSAで鍵を作成します。RSAで鍵を生成する際には鍵長を4096以上に指定します。
1# ed25519
2$ ssh-keygen -t ed25519 -C "" -f ~/.ssh/id_ed25519
3
4# RSA (legacy)
5$ ssh-keygen -t rsa -b 4096 -C "" -f ~/.ssh/id_rsa
-Cオプションはコメントです。これをつけないと自動的に鍵を作成したコンピュータのusername@hostnameとコメントが入ってしまいます。ユーザー名とホスト名が入ってしまっても問題はないケースがほとんどだと思いますが、個人的に気になるのでコメントを消しています。GitHubの公式ドキュメントでは、メールアドレスをコメントにしています。-fオプションは、鍵の生成されるパスです。
コマンドを実行するとパスワードを聞かれますが、そのままEnterキーを押します。
コマンドが完了したら、指定したパスに鍵があることを確認します。*.pubが公開鍵であり、拡張子がないものが秘密鍵です。秘密鍵は外部に漏れることのないように管理する必要があります。
鍵を踏み台サーバーに配置する
生成された公開鍵を踏み台サーバーの~/.ssh/authorized_keysに追記します。ファイルがなければ新たに作成します。公開鍵の内容をただコピー&ペーストすればよいです。鍵を移動させる方法については、USBメモリなどで直接運ぶ方法、scpコマンドを利用する方法とssh-copy-idを利用する方法があります。可能であれば、ssh-copy-idを利用したほうが簡単です。
1# scp
2scp [client pub key path] server_username@server_hostname:[path_on_host]
3# ssh-copy-id
4ssh-copy-id -i [client pub key path] server_username@server_hostname
鍵が、authorized_keysに書き込まれたことを確認しましょう。
鍵生成から、鍵を配置するまでの一連の流れをターゲットに対しても行います。
Configに設定を追記する
クライアントの~/.ssh/configファイルに設定を記述しておくことで短いコマンドでSSHを行うことができます。
1ServerAliveInterval 120
2ServerAliveCountMax 3
3
4Host server
5 Hostname [ip addr or hostname]
6 User [server_username]
7 Port [port number]
8 IdentityFile [path to private ssh key for server]
9Host terget
10 Hostname [ip addr or hostname]
11 User [terget_username]
12 Port [port number]
13 IdentityFile [path to private ssh key for terget]
14 ProxyCommand ssh server -W %h:%p
ServerAliveIntervalとServerAliveCountMaxは接続が切れないようにする設定です。sshでコマンドをしばらくたたかないと自動的に接続が切れてしまいます。それを防ぐためにsshd側が一定期間クライアントと通信していないときに、応答確認を行います。ServerAliveIntervalはその確認する感覚の秒数であり、ServerAliveCountMaxは試行回数です。
最終的に以下のコマンドでターゲットへのsshが完了すれば成功です。
1$ ssh terget
ターゲットのsshdの設定
ServerAliveIntervalとServerAliveCountMaxのような設定をターゲットのsshd側ですることもできます。ターゲットの/etc/ssh/sshd_configを開き、
1ClientAliveInterval 120
2ClientAliveCountMax 3
を追記します。設定を反映するには、
1sudo service sshd restart
でサービスを再起動します。
VNCとRDP
晴れてSSHを行うことができるようになったわけですが、コマンドだけではなくディストップ環境が欲しい時もあります。そのようなときに活躍するものが、VNCとRDP(リモートデスクトッププロトコル)です。両方、リモートからデスクトップ環境を利用すために作られたものですが、実現する仕組みが異なっています。VNCは画面そのものを画像として送信しています。画像を送信する方法はRDPの方法より、重い一方、UbuntuやmacOSにはデフォルトでVNCを行うためのソフトが入っており、導入が比較的簡単です。RDPはMicrosoftが開発した方法で、画面の描画情報を送信(ウインドウの場所などの構成情報を送るイメージ)します。そのため、VNCと比べて軽いです。
VNCを利用する
Ubuntuには、Vinoと呼ばれるVNCサーバーが入っています。設定方法はここを参考にしました。
しかし、今回は2段階ssh環境でのVNCです。ターゲットに直接アクセスすることができません。そこでsshのポートフォワーディングを使います。これは、ターゲットの特定のポートをクライアントの任意のポートと接続できる機能です。先ほどのconfigファイルのtergetに以下を追記します。
1 LocalForward 5900 localhost:5900
これでターゲットの5900ポートをクライアントの5900に接続することができました。
よって接続はlocalhost:5900に対して行います。
また、私の環境では、
1$ gsettings set org.gnome.Vino require-encryption false
を行って暗号化の設定をoffにしても暗号化が解除されませんでした。
設定を変更するdconfをインストールします。
1$ sudo apt install dconf-editor
ソフトを起動し、org.gnome.desktop.remote-access require-encryptionをfalseに設定します。これでもう一度接続すると接続することができました。VNCの暗号化をoffにしてしまってもssh自体が暗号化されているため、安全に通信することができます。逆に言えば、sshを使っていなければ暗号化を止めてしまったため危険です。
RDPを利用する
1$ sudo apt install xrdp
2段階sshの環境でのRDPは上のVNCの場合と同様にポートフォワーディングが必要です。xrdpで利用するポートはデフォルトで、3389です。VNCの際と同じように設定を行います。
1 LocalForward 3389 localhost:3389
localhost:3389にRDPクライアントを接続すれば、利用することができます。クライアントソフトについては、ここが参考になります。