UNIX講習会#6 SSH編



## Secure Shell とは？

* リモートで Linux などの Unix 系システムを操作するためのもの
* 昔は Secure でない Remote Shell (rsh) が使われていたが，簡単にパスワードを傍受できるので今は ssh しか使わない
* スパコンを使うときには ssh でリモートから操作するのが一般的
  * 他の手段はないことはないが，あまり使われない

---

## 接続する

* OS X には OpenSSH と呼ばれる ssh クライアント＆サーバーが標準で搭載されている

```bash
$ ssh -p PORT USER NAME@HOSTNAME
```

という形式で接続する．ポート番号とユーザー名，ホスト名はシステム管理者から与えられる．ポート番号が22番のときは省略可能

---

## 接続する

* 初回起動時には確認がある

```plain
The authenticity of host '172.16.xx.xx (172.16.xx.xx)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?
```

* RSA key fingerprint が正しいことを確認してから接続する
* 偽のサーバーに誘導されていないかを確認できる
* 一度接続すると`~/.ssh/known_hosts`に記録される
* **もし，サーバーが変更されていないにもかかわらず警告が出た場合には接続してはならない！**



* **以下の画面が表示されたときにはサーバー管理者に問い合わせる**
  
```plain
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /Users/hoge/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/hoge/.ssh/known_hosts:71
RSA host key for 172.16.xx.xxx has changed and you have requested strict checking.
Host key verification failed.
```


* **先ほどの画面が出た場合には Man In The Middle Attach (MITM Attach，中間者攻撃)が疑われる**
* **~/.ssh/known_hostsを書き換えれば接続できるようになるが，原則としてやってはならない**
* **自分が管理しているサーバーで，再インストールした場合など，なぜこの表示が出るのかを理解してない限り，続行してはならない**


---

## 操作する

* 接続後はすべての操作がサーバー上で行われる
* ファイルなども手元にあるものは見れずサーバー上のものが見える
* ネットワークアクセスもサーバーから行われる

ネットワークのアクセス元を確認する．手元では
[確認君](http://www.ugtop.com/spill.shtml)にアクセスすると現在のIPが分
かる

```bash
$ w3m http://www.ugtop.com/spill.shtml
```

* `w3m`はターミナルで動くブラウザ
  * <kbd>q</kbd>を押すことで終了できる

---

## 切断する

* 切断は`exit`と打てば切断される
* <kbd>Control-z</kbd>でサスペンドしていたプロセスは終了される
* ネットワークの不調などで切断されてしまった場合には，実行中のプロセスも一緒に終了されてしまうので注意

---

## ファイルを転送する

* サーバーとのファイルの転送には`scp`を用いる
* `cp`を`ssh`経由で接続できるようにしたもの


```bash
scp -P PORT LOCALPATH USERNAME@HOSTNAME:REMOTEPATH
scp -P PORT USERNAME@HOSTNAME:REMOTEPATH LOCALPATH
```

* `-P`が大文字であることに注意
* 送り先と送り元の両方をリモートとすることはできない
* フォルダの転送には`-r`を使う（`-R`ではない）
* 他はだいたい`cp`と使い方は同じ

---

## 公開鍵認証を使う

* SSHの認証方法にはいくつかある
* 通常はパスワード認証だが，パスワードは総当たり攻撃に弱く認証できる回数に制限を設けないと安全ではない
* 公開鍵認証を用いることで，総当たり攻撃では突破不可能な認証ができる
* パスワードを入力する必要もなくなる

---

## 公開鍵をつくる

* 鍵は`~/.ssh/id_rsa`に生成される
* 既に存在する人はスキップして良い


```bash
$ ssh-keygen -t rsa -b 4096
Enter file in which to save the key (/home/HOGE/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

* 2行目が表示されたらそのまま<kbd>Enter</kbd>を押してよい
* 3行目と4行目では鍵を暗号化するためのパスワードを入力する
* パスワードを必ず設定すること

---

## 公開鍵について

* 公開鍵と秘密鍵のペアが作成されている
  * `~/.ssh/id_rsa`が秘密鍵
  * `~/.ssh/id_rsa.pub`が公開鍵
* 秘密鍵は絶対に公開してはならない
  * 万が一，漏れてしまった場合には，対応するすべての公開鍵を削除し，鍵を作り直す

---

## 公開鍵認証できるようにする

* サーバー側に公開鍵を設置することでログインできるようになる
* サーバー側の`~/.ssh/authorized_keys`というファイルに公開鍵を設置する
  * `~/.ssh/authorized_keys`には何行書いても良い
* サーバー側のPermissionを適切に設定する必要がある
  * `chmod 700 ~/.ssh`
  * `chmod 600 ~/.ssh/authorized_keys`

---

## 公開鍵認証でログインしてみる

* いつも通りログインしてみる
* もし，`USERNAME@HOSTNAME's password: `と表示され，パスワードが聞かれ
  た場合には設定がうまくいっていない
* `Enter passphrase for key '/Users/HOGE/.ssh/id_rsa':`のようにパスワードを聞かれるか，ターミナルとは別にパスワード入力画面が開いた場合にはうまくいっている（OS Xの場合）
* OS X の場合にはパスワードをキーチェーンに記憶させれば，パスワードなしでログインできる
  * キーチェーンはログインパスワードで暗号化されているので，パソコンを盗まれてもすぐには漏れない（パスワードを突破されるまで）

---

## ショートカットを用意する

* 毎回接続に必要なオプションをコマンドからすべて設定するは面倒なので，
  あらかじめ設定ファイルに書いておくことでショートカットができる
* 設定ファイルはローカルの`~/.ssh/config`にある
  * ローカルで`chmod 600 ~/.ssh/config`を実行し，Permissionを適切に設定する

```plain
Host SHORTCUT_NAME
     HostName HOSTNAME
     Port PORTNUMBER
     user USERNAME
```

SHORTCUT_NAME, HOSTNAME, PORTNUMBER, USERNAME は適切な文字列に置き換える

---

## ショートカットを用意する

* 設定をすると以下のコマンドで接続できるようになる

```bash
$ ssh SHORTCUT_NAME
```

* 頻繁に接続するホストは`~/.ssh/config`に並べておくと良い
* コマンドで入力するには面倒なオプションもsshにはいろいろあるが，全部並べておくと楽になる
* `scp`でも利用可能で，ここでポート番号を設定しておけば`-P`は不要

---

## フォルダを転送する

* `scp`ではフォルダ転送ができなかったので，`rsync`を使う
* `rsync`は差分を検出し，変更があったところだけ転送してくれる

```bash
$ rsync -av SHORTCUT_NAME:REMOTEPATH LOCALPATH
$ rsync -av LOCALPATH SHORTCUT_NAME:REMOTEPATH
```

* オプションを変更することでいろいろ設定できるが，ここでは一部だけ説明する
  * `-a`はフォルダ構造をまるごと転送する．変更日時などもすべてコピーされる
  * `-v`でファイル単位の，`-P`で詳細な進捗を表示

---

## フォルダを転送する

* `rsync`はリモートのサーバーにもインストールされている必要がある
* `rsync`にSSHのオプションを渡すことは，`-e`でできなくはないが，ショートカット名を設定しておくのがよい

---

## 接続を切断しても作業が中断しないようにする

* SSHは通常は接続が切れると，実行中のコマンドが終了されてしまう
* SSHが切れた後も実行し続けられるようにするためには`screen`や`tmux`を使うとよい
  * `nohup`もあるが私は使わない
* `tmux`はどこでも入っているコマンドではないが，便利なので紹介する

---

### tmux の使い方 1

* おすすめの設定ファイルを
  [Gist](https://gist.github.com/informationsea/7296b86b9966a6a81121)
  からダウンロードしていることを前提として説明する

![tmux-1.png](https://qiita-image-store.s3.amazonaws.com/0/56302/8833be30-13ba-962d-b292-431c77356010.png "tmux-1.png")


---

### tmux の使い方 2

* tmux を立ち上げるためには`tmux`と打つ
* tmux を操作するためには<kbd>Control-z</kbd>を使う
* 本来の<kbd>Control-z</kbd>を使いたい場合には<kbd>Control-z z</kbd>と入力する

#### 一時的切断

* <kbd>C-z d</kbd>で一時的に切断できる
  * このあとログアウトしても良い
* 再接続には`tmux attach`とする
  * 作業を中断したところで再開される
* 接続元が変わっていても良い
* 私の設定ファイルを利用している場合には`t`だけでOK

---

### tmux の使い方 3

#### タブを増やす

* <kbd>C-z c</kbd> でタブを増やせる
  * <kbd>C-z p</kbd>と<kbd>C-z n</kbd>でタブの切り替えができる
  * 直前まで使っていたタブに移動するときには<kbd>C-z C-z</kbd>

#### 画面を分割する

* <kbd>C-z %</kbd>で画面を横に分割できる
* <kbd>C-z "</kbd>で縦に分割できる
* <kbd>C-o</kbd>で分割したパネルの間のカーソルを移動する


---

### tmux の使い方 4

#### 終了する

* `exit`ですべてのパネルを閉じれば終了する
* `tmux ls`で実行中の`tmux`を確認できる

#### スクロールする

* <kbd>C-z [</kbd>でスクロールモードに入る
* <kbd>C-v</kbd>, <kbd>Alt-v</kbd>でスクロールできる
* Emacsと同じ要領で検索したり，コピーしたりできる
* <kbd>q</kbd>でスクロールモードを抜ける
* ペーストはスクロールモードの外で<kbd>C-z ]</kbd>

---

## まとめ

* SSH はリモートサーバーにログインするために使われる
* `~/.ssh/config`に設定を書いておくことで楽ができる
* ファイル単位の転送には`scp`を，フォルダを丸ごとでは`rsync`を使う
* `tmux`を用いることで接続を切断しても，途中から再開できる