Linux SSH

今度は安全リモート通信のSSHについて書きます。

AWSの中で行うので、実際に行うには準備をお願いします。

# SSH
離れた場所にあるサーバの中で作業を行いたい場合に
暗号や認証の技術を利用して
安全にリモートコンピュータと通信するためのプロトコルのことです。

## リモート
離れた場所にあるサーバのことを「リモートサーバ」や「リモート環境」、省略して「リモート」と呼びます。

## ローカル
自身のコンピュータを「ローカルサーバ」や「ローカル環境」、省略して「ローカル」と言います。

# SSHのメリット
* 通信を盗聴危険性を回避して、安全操作
* サーバ上でのファイル操作、設定ファイルの編集ができる
* バックアップを要する時、サーバ上で圧縮（ZIP）して、ファイルの一括ダウンロードできるので時間短縮ができる

# SSHでログイン
リモートサーバにログインする方法は2つあります。

* パスワード認証
* 公開鍵認証

この二つです。

# SSHの利用準備
SSHを利用するためには、リモートにSSHサーバ
ローカルにSSHクライアントというソフトウェアをインストールする必要があります
しかし、LinuxサーバやMac OSには標準でインストールされているのでインストールする必要はありません。

```bash:ターミナル 
$ ssh [ ログインユーザー名 ]@[ IPアドレス ] # これでリモートサーバにログインできます。
```

## SSHクライアント
リモートにインストールさせる
## SSHサーバ
ローカルにインストールさせる

# 鍵
サーバに入れる人を制限する設定
サーバに入れる人を制限するためには「秘密鍵」と「公開鍵」という2つのファイルを使います。

```bash:ターミナル
$ ssh-keygen -t rsa # SSH通信で必要になる、公開鍵と秘密鍵の両方が生成されます。
```
## 公開鍵
公開鍵は、サーバへのSSHを始めるときに一緒に送ります。
そこで暗号が生成されます。
鍵穴というイメージといえばわかりやすいです。
## 秘密鍵
秘密鍵は、ローカル環境内に保存しておきます。
そこで公開鍵の暗号が解読されます。
そのまま鍵といえばわかりやすいです。
## 通信手順
通信を行う際は
1,サーバへのSSHを始めるときに一緒に送った公開鍵を元に暗号が生成(鍵穴を作成する)
2,ローカル環境ではサーバから送られてきた暗号を秘密鍵を基に解読します。(鍵を作って開ける)
このようにして、サーバーとローカル環境間の情報のやりとりが安全に行われます。

# 公開鍵でログイン
手順は三つ
①公開鍵と秘密鍵を生成（ローカル環境側）
②公開鍵をサーバ側に設置（ローカル環境側→サーバ側）
③公開鍵認証でログインできるか確認

## ①公開鍵と秘密鍵を生成

```bash:ターミナル(ローカル)
~ $ cd .ssh # .sshディレクトリへ移動
.ssh $ ssh-keygen -t rsa  # 公開鍵と秘密鍵を作成
```

上記のコマンドを入力後、以下のように表示され
秘密鍵の保存場所と秘密鍵に設定するパスワードを入力します。

```bash:ターミナル(ローカル)
# 秘密鍵を保存するときの名前は、デフォルト（id_rsa）のままで良いので何もせずにenterキーを押します。
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_rsa): [秘密鍵の置き場所]　
# ここで.sshディレクトリに秘密鍵が置かれます。

# 秘密鍵に設定するパスワードを入力（忘れないよう覚えておきましょう）
Enter passphrase (empty for no passphrase): [パスワード] #パスワードを設定してください。
Enter same passphrase again: [パスワード] #もう一度同じパスワードをうってください。
```

ローカル環境の公開鍵と秘密鍵の保存場所はデフォルトで決まっています。
公開鍵は ~/.ssh/id_rsa.pub
秘密鍵は~/.ssh/id_rsaに保存されています。

以下のコマンドを入力して、出力結果に以下の2つが含まれていれば作成成功です。

```bash:ターミナル(ローカル)
$ ls
=> [鍵の名前]_key_rsa　[鍵の名前]_key_rsa.pub
```

### catコマンド
catコマンドは、catと入力した後に記述するファイルの中身を確認するコマンドです。

公開鍵と秘密鍵を作成できたか、catコマンドを使って公開鍵の中身を確認します。

```bash:ターミナル(ローカル)
# 公開鍵の中身を確認
$ cat [公開鍵]_key_rsa.pub

#秘密鍵の中身を確認
$ cat [秘密鍵]_key_rsa
```

コマンドを実行すると、複雑な文字列がターミナル上に表示されます。
これが、先ほど作成した公開鍵と秘密鍵の中身になります。

## ②公開鍵をサーバ側に設置
公開鍵をサーバ側に設置するため2つの処理を行います。

* リモートサーバにローカル環境の公開鍵のファイル（id_rsa.pub）をコピー
* ローカル環境の公開鍵のファイル（id_rsa.pub）の中身をリモートサーバの公開鍵のファイル（~/.ssh/authorized_keys）に追記

### scpコマンド
scpコマンドとは、送信先のディレクトを指定してファイルを送ることができるコマンドです。

```bash
# .sshディレクトリにローカル環境の公開鍵のファイル（id_rsa.pub）をコピー
$ scp ~/.ssh/id_rsa.pub [ユーザー名]@ [IPアドレス]:~/.ssh
```

### AWSの場合
AWSの場合は、あらかじめ秘密鍵(pem)でsshができるようになっているので以下のようにするのが一般的です。

```bash
$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]
```

###  実際の手順
ローカル環境の公開鍵のファイル（id_rsa.pub）の中身を
リモートサーバの公開鍵のファイル（~/.ssh/authorized_keys）に追記

今までローカル環境では
公開鍵はid_rsa.pubに保存しましたが、リモートサーバでは公開鍵は ~/.ssh/authorized_keysに保存します。

```bash:ターミナル
# リモートサーバにログイン
$ ssh [ユーザー名]@ [IPアドレス]

# .sshディレクトリへ移動
$ cd ~/.ssh  

# リモートサーバの公開鍵のファイル（~/.ssh/authorized_keys）を作成
touch .ssh/authorized_keys

# 公開鍵の中身を追記
$ cat ~/id_rsa.pub >> authorized_keys
```

最後に.sshディレクトリとauthorized_keysファイルの権限を設定します。 .sshディレクトリには読み・書き・実行のすべての権限、authorized_keysファイルには読み・書きの権限を設定します。

```bash
# .sshディレクトリとauthorized_keysファイルの権限を設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
```

## 公開鍵認証でログインできるか確認
作業が終わったので
公開鍵認証でログインできるか確認します。

```bash
# リモートサーバにログイン
$ ssh [ユーザー名]@ [IPアドレス]
```

コマンドを打った後、下記のような表示がされます。
①公開鍵と秘密鍵を生成の# 秘密鍵に設定するパスワードを入力のところで記述したパスワードを入力します。
その後[ユーザー名]@ [IPアドレス]%　と表示されていればログイン成功です。

 ```bash
Enter passphrase for key '~/.ssh/id_rsa': 　←パスワードを入力 
[ユーザー名]@ [IPアドレス]%　　←SSHサーバにログイン成功
```