自宅から研究室のサーバにsshでアクセスする方法

#はじめに

リモートワークが推進される中、ドライな実験を行っている学生は自宅から研究室の計算資源の豊富なPCにアクセスしたいと思う機会が多いと思います。
この記事は僕が実際やってみると「あれ、意外と面倒くさいな」と思ったので備忘録として、また研究室内のリモート接続のチュートリアルとして書いています。これより簡単なやり方もたくさんあるのでしょうが、とりあえずはこれで出来たので紹介します。

#目次
1.環境
2.ローカルサーバでの準備
3.リモートサーバでの準備
4.ssh認証でサーバにログインしてみる


#1.環境
この記事では、リモートサーバのUbuntu18.04に、ローカルのmacOSからsshを使用してアクセスし、リモートサーバ上でJupyter notebookを操作することを目的としています。リモートサーバにanacondaが入っていない人は[インストール](https://www.anaconda.com/products/individual)しておいて下さい。
また、ローカルホストで作成した鍵をリモートサーバに送るときにGithubのアカウントがあると便利なので、[Githubのアカウント](https://github.com)も作成しておきましょう。

#2.ローカルサーバでの準備
###公開鍵の作成
以下のようにして、鍵のペアをフォルダに作成する。

```:ternamal
$ install -m 0700 -d ~/.ssh
$ cd ~/.ssh

$ ssh-keygen -t rsa -b 4096 -C "youremail@example.com" -f ~/.ssh/id_rsa
```
メールアドレスには適当な自分のメールアドレスを打ち込んでください。パスフレーズを求められますがEnterすれば無しで進むこともできます。

```:terminal
$ ls ~/.ssh
id_rsa  id_rsa.pub

$ pbcopy < ~/.ssh/id_rsa.pub
```
id_rsa:　    (秘密鍵)ローカルサーバに配置、他人に知られてはいけない。
id_rsa.pub:  (公開鍵)リモートサーバに配置。

公開鍵の中身をクリップボードにコピーします。ファイルの中身を見て直接コピーでもなんでもいいです。


###公開鍵をGitHubに登録
Githubのアカウントを開き、右上のアイコンをクリックしてSettingを開きます。
すると下のような画面になるので![スクリーンショット 2020-10-13 11.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517662/240c55b3-d5b6-0e1e-579a-6f03a302545f.png)


左のタスクバーから　SSH and GPG keys　を選択します。
Add SSH key　をクリックし、Titleを入力し先ほどコピーした公開鍵の中身をペーストして登録すれば終了。
TitleはどのPCの鍵か判別がつけば良い(例：macPC)

#3.リモートサーバでの準備
###IPアドレスのチェック
自分のPCのIPアドレスを確かめてメモしておきましょう。Ubuntuなら

```:terminal
$ ifconfig
eno1: flags=xxxx<UP,BROADCAST,RUNNING,MULTICAST>  mtu xxxx
        inet xxx.xx.xx.xxx  netmask xxx.xxx.xxx.x  broadcast xxx.xx.xx.xxx
        inet6 fe80::37ed:5553:a031:bd1d  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (イーサネット)
        RX packets 340713  bytes 399015141 (399.0 MB)
        RX errors 0  dropped 6543  overruns 0  frame 0
        TX packets 50130  bytes 15982607 (15.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xa4100000-a4120000
```
などで見れるのでinet に続くIPアドレスを控えておきましょう。

###公開鍵の取得
ローカルホストにて作成した秘密鍵と公開鍵のうち、公開鍵をGithubに登録しました。あとはリモートサーバ上に公開鍵のコピーがあれば完成です。ここではGithubアカウントから公開鍵を取得する方法でやります。

```:terminal
$  curl -sS https://github.com/username.keys >> ~/.ssh/authorized_keys

$  ls ~/.ssh
authorized_keys
```
([こちら](https://s8a.jp/distribution-of-ssh-key#%E9%9D%A2%E5%80%92%E3%81%AA%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E9%85%8D%E5%B8%83%E3%82%92%E7%B0%A1%E7%B4%A0%E5%8C%96%E3%81%99%E3%82%8B)の記事を参照)

githubのユーザーページのURLの後ろに.keyをつけると公開鍵を取得できます。上記のコードは実際にはusernameのところに自分のGithubのユーザーネームを入れてください。

authorized_keysの中身はリモートサーバのrsa_id.pubの中身と同じになっているはずなので、心配な方はlessで見るなりして目視で確認したらいいと思います。4.VPN接続で学内サーバに入る
一応「~/.ssh」ディレクトリと「~/.ssh/authorized_keys」にパーミッションを設定します

```:terminal
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
```

#ssh接続の設定
ssh接続を行う際の設定をいじっていきます。正直よくわからないので[この記事](https://qiita.com/gotohiro55/items/36a22516de2b381b3c6e#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4sshd%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4)を参考にしました。
まずは/etc/ssh/ディレクトリ下にあるsshd_configファイルをいじっていくのですが、root権限に上がる必要があります。まだrootを設定していない人は下記の手順で設定しましょう。

```:terminal
$ sudo passwd root
Enter new UNIX password:　rootパスワードを設定
Retype new UNIX password:　再度入力
passwd: password updated successfully
```


rootで入ります。

```:terminal
su - 
Password: 先程設定したpassを入力

root@Ubuntu:~#  ←プロンプトが#に変わる
#  vi /etc/ssh/sshd_config
```
rootのログインに成功したらconfigファイルをいじっていきます。ここではvimを使っていますが、vimの操作は個人的になんかややこしいので好きなエディタがあればそれでいじって下さい。

まず、以下の行のコメントを外して有効化します。

```:sshd_config
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile
```

ここでvimの操作方法を最低限だけ紹介します。

```
delete １文字消せます(挿入モードだと消せない)
a 挿入モード
esc 挿入モード解除
:  コマンドモード(挿入モードだと開けない)
(コマンド状態で)q そのままファイルを閉じる
(コマンド状態で)wq ファイルを保存して閉じる
```

という感じですが、とにかく挿入モードだと操作がよくわからないの、で、書きたい行を挿入モードで書き、よくわからなくなったら取り敢えずescを押します。そして失敗した部分をdeleteしていく感じで使っています。
詳しい操作方法を知りたい方は[こちら](https://qiita.com/one-a/items/a4e1d5a736d8408fd089)を参照していただければと思います。


続いて以下のように設定しましょう

```:sshd_config
PermitRootLogin no
:rootのログイン禁止

PasswordAuthentification no
:Password認証を禁止できるが、公開鍵認証がうまく行かないうちにパスワード認証をnoにするとログインできなくなる恐れがあるので最後に設定するのがベター。

Port XXXX
:ポート番号を変更します。初期設定は22のはずです。
```

###Jupyter notebookの設定

このあとローカルPCからsshでリモートサーバに入り、リモートサーバ上のJupyter notebookを動かすことを考えるので、そのための設定を少しします。[この記事](https://sishida21.github.io/2019/12/12/remote-jupyter-notebook/)を参考にしました。



```:terminal
$  jupyter-notebook --generate-config
$  vi .jupyter/jupyter_notebook_config.py
```

このコマンドでjupyter notebookのconfigファイルを生成し、/.jupyter/jupyter_notebook_config.pyの中身をvimで編集していきます。c.NotebookAppの記述があるところまでスクロールして、取り敢えず以下のように編集しましょう。

```:jupyter_notebook_config.py
c.NotebookApp.ip = 'localhost'
c.NotebookApp.open_browser = False
c.NotebookApp.port = xxxx  ここの数字は自分で設定してください。
c.NotebookApp.token = u''
```
次にnotebookを開くためのpasswordを設定します。まずは以下のコマンドを打ちましょう

```:terminal
$  jupyter-notebook password
$  less .jupyter/jupyter_notebook_config.json
```
すると以下のようなファイルになっているはずです。

```:jupyter_notebook_config.json
{
  "NotebookApp": {
    "password": "#####"
  }
}
```
このpasswordの部分(sha1:を含む""で囲まれたすべての文字列)をコピーして、先程のjupyter_notebook_config.pyを再度開きます。そして以下の行を付け加えます。(下の####の部分にコピーしたパスワードを貼り付けます)

```:jupyter_notebook_config.py
c.NotebookApp.password = "####"
```

以上でリモートサーバ側の設定は終了です。

#4.sshでサーバにログインしてみる

（※当ラボの方はこちらを読んで下さい）
さて実際に暗号鍵認証を使用してsshでリモートサーバにログインする時に、いきなり研究室内のネットワークに入っていくのではなく、一度学内ネットに入る必要があります。
これにはVPN接続を使用しますが、立命館のサイト([こちら](http://www.ritsumei.ac.jp/rainbow/service-vpn/))を参考に自宅から学内ネットに入れることを確かめて下さい。
よって、以下の操作は学内ネットに入れている状態を仮定して進めていきます。
ーーーー


全ての準備が整っているはずなので、以下のコマンドをターミナルに打ち込んでリモートサーバにアクセスします。

```:terminal
$  ssh -p port　user@xxx.xx.xx.xxx -L jupyterport:localhost:jupyterport
```

ここで

```
port: ポート番号。sshd_configで設定したport番号

user: ユーザー名。リモートサーバでターミナルを開いた時に、プロンプト($)の左に出てくる「###@oooo」の###の部分

xxx.xx.xx.xxx: IPアドレス。最初に確認しておいたリモートサーバのIPアドレス

jupyterport: ポート番号。jupyter_notebook_config.pyで設定したport番号
```

である。以上によってsshに成功したらターミナルでのユーザー表記がリモートサーバーのそれに変わるはずである。試しにjupyter notebookを開いてみる。

```:terminal
$  jupyter notebook
[I 14:22:20.209 NotebookApp] Serving notebooks from local directory: /home/user
[I 14:22:20.210 NotebookApp] The Jupyter Notebook is running at:
[I 14:22:20.210 NotebookApp] http://localhost:portnumber/
[I 14:22:20.210 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[I 14:22:25.665 NotebookApp] 302 GET / (127.0.0.1) 1.20ms
```

となり、ローカルPCのブラウザにURL(`http://localhost:portnumber/`となっている部分)をコピー＆ペースとして開ければ成功です。

以上で一連の流れは終了ですが。正直所々で発生するエラーへの対処法などについては全く拾えてないので、逐一追記していきたいと思います。

###追記
なんだかよく分からないが、jupyterのport番号を変更したのにうまく反映されてない場合があったのでその対処法(?)について。
そういう時はリモートサーバーでjupyter notebookを起動します。URLの`http://localhost:portnumber/`となっている部分のportnumberが実際にリモートサーバーでjupyter notebookを立ち上げている際に使っているポート番号なので、その番号を使ってsshすればとりあえずはうまくいく(ハズ)。