Chienomi

【ConoHa Advent Calendar 2020】ConoHa VPS経由 外出先で宅内のマシン/データにアクセスする

Live With Linux::server

  • TOP
  • Articles
  • Live With Linux
  • 【ConoHa Advent Calendar 2020】ConoHa VPS経由 外出先で宅内のマシン/データにアクセスする

まえがき

Hi There!! はるかみです!!1

今年もこの季節がやって参りました、ConoHa Advent Calendar。

今年はコロナ禍の影響で軒並みコンピュータ関係のイベントはオンライン開催となった。 もともとオンラインとの親和性が高いハッカーたちは積極的にオンラインイベントを採用していたようだ。 現状ではそれは正解ではあるが、結果的に私としては今年は発表の場がなかった。結果的に去年のConoHa Advent Calendar以来、私は何も発表していないのだ!!

例年、ConoHa Advent CalendarはChienomiらしからぬ、初心者向けの記事を掲載してきた。 2017年はVPSをビジネスに使う話、2018年はArch Linuxの入門記事、2019年はWINGの紹介と活用に関する記事だ。

本来、今年はConoHa WINGで使われているLSAPIの話など、いつもとは趣向を変えて難しい話をする予定であった。 しかしながらLSAPIの件は問い合わせの結果、非常に後味の悪い結果になってしまったし、今年は時間もないので例年通り初心者向けの記事とすることにする。

なお、この記事の内容は、Chienomiでは既出となっているものであるが、 こちらは初心者向けに編纂したものになるため、ご容赦いただけると幸いである。

外から宅内ネットワークへのアクセスにはいくつかの問題がある。

第一に、アクセス方法である。 一般的に家庭に振られるIPアドレスは可変である。それに加え、IPv4アドレスであるならば、NATを経由している可能性が高く、ネットワーク内のマシンに到達できない。 これに対する一般的な解はDDNSとルーターのポートフォワーディングの利用であるが、私はこれが良い方法だとは思えない。 (それにこの方法だとConoHaは関係ない)

次に認証と防御である。インターネット上からアクセス可能であるということは、即ちインターネット上にホストを晒すという意味であるから、公開されているインターネットサーバーと同レベルの保護が求められる。

OpenSSHの概要

OepnSSHを単なるログインツールだと思っている人がいるが、それは違う。

OpenSSHは前提として、「経路暗号化」「認証」「マルチチャンネル通信」の3つの機能を担っている。 そして、これを基として様々な機能が提供されているし、逆にこれら「だけを」行うものとして使うこともできる。

例えば、VPN機能がある。まず、最初の認証を経て経路暗号化を施した上でユーザーの認証を行い、リモートホスト上へのアクセスを獲得する。 そして、通信経路用のチャンネルを確保し、このチャンネルにSSHパケットにくるまれた通信パケットを流すのだ。 OpenSSHはTUNを用いたL3VPNとTAPを用いたL2VPNをサポートしている。

このVPN機能を使えば、PCとConoHa VPSをつないだ場合、PCからの通信はConoHa VPSから出ていくし、ConoHa VPSからの通信はPCから出ていく。 もちろん、そういうルートを設定する必要があるし、そのルートだけではならない。 もしそのルートだけであれば、経路を張っているSSHのパケット自体がインターネットを経由して届けられなくなるからだ。

OpenSSH VPNを使う方法は臨時のVPNを作成する上で簡単な方法だが、初心者にはちょっとハードルが高い。 そこで今回はPCのSSHサーバーにConoHa VPS経由でアクセスするという話をする。

そうすれば、直接に使えるのはそのPCだけだが、そのPCからアクセスできるホストにログインすることもできるし、そのPCからアクセスできるデータも使える。

なお、Windowsの場合OpenSSHサーバーは存在しているが、WindowsでSSHログインしたところでコマンドライン環境が使い物にならないかもしれない。 もし仮にそうだとしても、Windowsを使っているのが悪いのであり、Windowsなんかを使ってしまっている自分を呪うか、今すぐWindowsを投げ捨ててLinux、それもArchlinuxに移行するか、あるいは10000歩譲ってDragonflyBSDをインストールするしかない。

ConoHa VPSを用意する

ConoHaのコンクトロールパネルにログインし(あなたがもしまだConoHaアカウントを持っていないのならばまずサインアップし)、新しいVPSを立ち上げる。

この際、root用の鍵を登録すべきだ。でないと、VPSはやや危険な状態で立ち上がる。 後述する通りED25519鍵が使えないため、ECDSA鍵を生成する。

$ ssh-keygen -t ecdsa -b 512 -f ~/.ssh/conoha-root_ecdsa

これはConoHa VPS上のrootアカウントのキーになるものだが、間違ってもrootユーザーの鍵として生成してはならない。 念の為に言い換えると、あなたのローカルマシンの一般ローカルユーザーのアカウントでこのコマンドを実行するのである。このコマンドはWindows 10でも変わらない。

このあたりの手順は2018年のAdvent Calendarに書いたので参考にしてほしい。 2018年の時点ではECDSA鍵を勧めるべきであるという断定ができなかったためRSA鍵を使っているが、2020年としては脆弱なRSA鍵を使ってはならない。なお、RSAの4kb鍵は2kb鍵より堅牢というわけではない。

生成したらSSH Key→キーを新規作成→インポートの「パブリックキー」のところに~/.ssh/conoha-root_ecdsa.pubを貼り付ける。 間違っても秘密鍵を貼り付けないこと。貼り付けるのは.pubのついているほうだ。

スタートアップスクリプトは特に指定する必要はない。

サーバーのOSはもちろん、この世界で最も優れたOSであるArchlinuxを選択すべきだ。むしろそれ以外はありえない。人類たるものサーバーOSはArchlinux一択!2

プランは特に他に用途がないのであれば512MBで事足りる。 ただし、なにか公開サーバー等を立てるのであれば十分なスワップファイルを用意すること。

また、ファイアウォール設定でSSHだけを通すように設定することも忘れてはならない。 ユーザーの作成や初期設定などは、やはり2018年の記事を参考にしてほしい。 ただ、時代はPowerlevel9kではなくPowerlevel10kであることにも注意が必要だ。これは2020年最新の知識だから、2018年の記事も2019年の記事もPowerlevel9kの話をしているので注意してほしい。(そういえば、Windows Terminalの話もしていない)

サーバーサイドの安全な設定

サーバー設定は/etc/ssh/sshd_configにある。

ConoHa VPSでArchlinuxサーバーを立ち上げたとき、デフォルトでPasswordAuthenticationChallengeResponseAuthenticationnoになっている。 このためパスワードログインできかのように見えるが、それは正しくないのでちゃんとAuthenticationMethodsを書こう。

AuthenticationMethods publickey

ついでに、SSHログインするのがまともなPCだけであるならば、chacha20もいらないので

AuthenticationMethods publickey
Ciphers aes256-ctr,aes192-ctr,aes256-gcm@openssh.com

とするとだいぶ軽く・速くなる。

これはプロセッサに内臓されているAES-NIという命令を経由して専用チップにAESによる暗号化・復号化処理がオフロードされるためで、暗号処理自体はChaCha20のほうが軽いが、マシン的にはAES-NIが使えるのであればAESのほうがずっと高速に処理できるしCPU負担がない。

Intel CPUは下位グレードのCPUにはAES-NIを搭載してこなかったが、Skylake以降はCeleronにすら搭載している。 AtomだってAES-NIが使える。

AMDのAES-NIの性能はIntelに劣るが、最新のRyzenプロセッサはなかなかの性能を見せる。AMDはAES-NIを搭載しているプロセッサが多く、最近は搭載していて当たり前。

スマートフォンユーザーはプロセッサによる、といったところであるが、最新スマートフォン(本当に最新のもの)のSnapdragonについてはAES支援は効く傾向である。

ChaCha20を使わない設定にすることにより、ConoHa側の処理も軽くなる。データ転送効率が変わるので、結構な違いになる。

SSH鍵のデフォルトはRSAだが、今はED25519が望ましいだろう。 クライアント側でそれぞれConoHa VPS用に鍵を作る。

$ ssh-keygen -t ed25519 -f ~/.ssh/conoh-vps_ed25519

これをサーバーサイドに一般ユーザーとして(~/.ssh/authorized_keysに)鍵を登録する。(rootとして鍵を登録してはならない)

ちなみに、ConoHaはVPSもWINGもコントロールパネルからED25519鍵が登録できない。 だが、システム的にはConoHa VPSのすべてのLinuxテンプレートイメージ及びWINGでED25519鍵が使用可能である。ED25519鍵への対応は何度かアンケート等で要望を出しているのだが、叶っていない。最初にコントロールパネルで鍵登録するときはECDSA鍵を登録するより他にないだろう。 少なくともRSA鍵を使うべきではない。ECDSA鍵は256, 384, 512bitが選択可能で、512bitに関してはED25519よりもセキュアである(ただし、ED25519は256bit鍵で高速かつ堅牢である)。

また、Archlinuxイメージを使う場合はSK鍵が利用可能だ。SK鍵はハードウェア鍵を利用するもので、一般的にはYubiKeyが使われている。秘密鍵がハードウェアキーとパスフレーズという2要素で保護されるため、より強い。

クライアント(ログインされる宅内ホスト)の安全な設定

クライアントはlocalhostだけをlistenすれば良い。

というのは、ConoHa VPSとClient hostの間にトンネルが張られている場合、ConoHa VPS経由でClient hostにアクセスすると、通信はClient hostから出る。他のLAN内ホストからはClient hostからアクセスされたように見えるし、localhostが意味するものはClient hostだ。

そのため、localhostだけをlistenするようにsshd_configを設定する。

ListenAddress 127.0.0.1

これでOKなのだが、もしClient hostがLAN内からアクセスされるのであれば、この方法は使えない。 そこで、まずはサーバー同様に公開鍵認証に限るようにする。

AuthenticationMethods publickey
Ciphers aes256-ctr,aes192-ctr,aes256-gcm@openssh.com

LAN内ホスト数が多い場合、公開鍵を全ホストに相互登録するのはなかなか大変だ。 そのため、LAN内に限ってパスワード認証を許可したい場合、次のようにする。

Match Address 127.*.*.*,192.168.*.*,10.0.*.*
  DenyUsers root
  AuthenticationMethods publickey password

IPv6の場合制御が大変3なので、IPv4に限ったほうが良いだろう。

AddressFamily inet

そして~/.ssh/configに設定を書く。

Host conoha-forward
  User foouser
  Port 22
  HostName conoha.vps.ip.address
  RemoteForward localhost:22222 localhost:22
  IdentityFile ~/.ssh/conoha-forward_ed25519
  ServerAliveInterval 10
  ServerAliveCountMax 3
  TCPKeepAlive yes

もちろん、SSHサーバーを起動すること。

$ sudo systemctl start sshd
$ sudo systemctl enable sshd

Systemdで自動制御されるようにしたほうが良いだろう。 ユーザーレベルなので、ユーザーユニットにしたほうが良い。 ユーザーユニットは~/.config/systemd/user以下に記述する。この場合は、 ~/.config/systemd/user/conoha-forward.serviceとする。

[Unit]
Description=Control reverse forward via ConoHa
After=network.target

[Service]
Type=simple
ExecStart=ssh conoha-forward
Restart=always

[Install]
WantedBy=default.target

有効化。

$ systemctl --user enable conoha-forward

Windowsの場合は、追加パッケージとしてSSHサーバーのインストールが必要だ(Windows 10に限る)。 SSHコマンドの自動実行についてもWindowsの流儀に合わせることになる。

ラップトップからのアクセス

必要なのはConoHaへのアクセスと、ログインするホストへのアクセスだ。 ConoHaではAgentForwardingが許されている必要がある。

Host conoha
  User foouser
  Port 22
  HostName conoha.vps.ip.address
  IdentityFile ~/.ssh/conoha_ed25519

Host mydesktop
  User foouser
  Port 22222
  HostName localhost
  IdentityFile ~/.ssh/desktop_ed25519
  ProxyJump conoha

2つのエントリが必要なのは、まずConoHaへの接続方法を定義する必要があるためだ。 これはもちろん、直接ConoHa VPSへのアクセスに使うこともできるが、この場合ProxyJump conohaという項目で利用される。

だから、ConoHaへのアクセスについてはmydesktopの項目ではなくconohaの項目で設定されている。 mydesktopに書くのはその先の話だ。

RemoteForward localhost:22222 localhost:22 とあるため、トンネルが起動されるとConoHa VPSの22222番ポートへのアクセスがローカルの22番ポートへと転送されることになる。つまり、ConoHa VPSからlocalhost:22222にアクセスすると宅内マシンのSSHサーバーにつながる。

ラップトップからconohaにアクセスした状態から見ても、やはりlocalhost:22222にアクセスすることで宅内マシンのSSHサーバーにつながる状態だから。だから、mydesktoplocalhost:22222にアクセスするように書かれている。

このため、

$ ssh mydesktop

とするだけでログインが可能なわけだ。

データの利用

もちろん、ログインすればリモートマシンを利用できるわけだが、それ以外にもSFTPを使う方法がある。

WindowsではWinSCPのようなソフトウェアを使うことになるし、LinuxならばNemo, Nautilus, Thunarなどはsftp://mydesktop/という形でアクセスできる。 あるいは、SSHFSを利用しても良い。(gvfs-sftpを使うよりもずっと安定している)

他のマシンへの直接アクセスをしたいのであれば、ProxyJump mydesktopを持つエントリを作れば良い。(もちろん、ターゲットホストにアクセスできるようにした上で)。 そうすることでLAN内の他のマシンに対するSFTPアクセスも可能になる。他のマシンがLAN内のマシンに対してパスワード認証を許可しているならば、特に公開鍵を登録しておく必要もない。

注意すべきは、 外出するときにちゃんとログイン対象のマシン、及び中継するマシンの電源を入れて出ることだ。

NASにアクセスしたい場合は、もっとも手っ取り早いのはNASにアクセス可能なホストでNASをマウントしておくことである。 SFTPが利用可能なのであれば、やはりProxyJumpを使ってSFTPクライアントでアクセスするという方法もある。

結びに

今年は簡単なもので駆け足になったが、いかがだっただろうか。

実際、今この状況下ではあまり外から自宅環境にアクセスしたいということは少ないだろうが、OpenSSHは使いこなせば色々と便利なので、ここで紹介した。

ConoHa VPSは多くのインスタンスを4気軽にぽんっと立てて潰してとできるので、プライベートな用途でさくっと立てるのにも向いている。 VPSというと1契約で1インスタンスであることが多いので、使い方もかなり練って決めなければならなかったものだ。

また、ConoHa VPSはOSの選択肢の広さも良い。 多くのVPSはOS自体は完全に固定であるか、選べてもせいぜいCentOSかUbuntuくらいしかなかったりするが、ConoHa VPSはArchlinuxが選べるのがとても大きい。 また、OpenBSDやNetBSDも選択可能であり、また、その気になればDragonflyBSDやillumosを使うことも可能だ。5

最後に宣伝。

より高度な内容を求める場合は、Chienomiの他の記事をぜひ読んでみてほしい。 Linuxに興味があるなら、まずはLive With Linuxカテゴリーから読むと良いだろう。

また、この記事よりも詳細に詳しく教わりたい、という場合、ぜひMimir Yokohamaへ。 老若男女、レベル問わず大歓迎だ。現在、授業はリモートで実施しているが、その分普段よりも丁寧な内容になっている。