今さらながらのSSH纏め

# sshd_config

|sshd_config|設定項目|
|---|---|
|Port|SSHで使うポート番号、基本22|
|Protocol|バージョン、今は2系|
|ListenAddress|接続を受け付けるアドレス|
|HostKey|ホスト鍵ファイルのパス|
|syslogFacility|ログのファシリティ|
|LogLevel|ログのプライオリティ|
|LoginGraceTime|ログインを試みることのできる接続時間|
|PermitRootLogin|rootログインの許可/禁止|
|StrictModes|パーミッションを厳密にチェックするかどうか|
|MaxAuthTries|認証を試みることのできる最大回数|
|PubkeyAuthentication|公開鍵認証を許可するかどうか|
|AuthorizedKeysFile|公開鍵を登録するファイル|
|PasswordAuthentication|パスワード認証の有効/無効|
|PermitEmptyPasswords|空パスワードの有効/無効|
|UsePAM|PAMを使用する|
|X11Forwarding|X11フォワーディングの有効/無効|
|AllowUsers|ログインを許可するユーザー|
|DenyUsers|ログインを拒否するユーザー|
|AllowGroups|ログインを許可するグループ|
|DenyGroups|ログインを拒否するグループ|
|Subsystem|外部システムを指定|
|IgnoreRhosts|認証を行わずに無条件にログインできるホスト・ユーザを設定可能にする|
|Match|Group:特定グループのSSH接続設定<br>Host:特定の接続元IPアドレスのSSH接続設定<br>LocalAddress:特的のLISTENするIPアドレスのSSH接続設定<br>LocalPort:特定の接続先ポート番号のSSH接続設定|




# ホスト認証とユーザー認証

## ホスト認証

- 公開鍵暗号方式を用いて、ホストの正当性を確認する
- 公開鍵暗号方式では、公開鍵と秘密鍵のペアを使って認証を行います
- OpenSSHをインストールすると、ローカルホスト用の公開鍵と秘密鍵が作成されます
- 秘密鍵は外部に漏れないように管理してください。（アクセス権は、所有者であるrootのみ読み書き可能となっています。）
- ホストの公開鍵と秘密鍵はユニークなものです
- SSHでの接続ごとに、ホストの公開鍵（ホスト鍵）がクライアントへ送信されます
- クライアントは、所属しているホスト鍵と一致するかどうかを確認することで、ホストに正当性を確認でできます
- ホスト鍵は**~/.ssh/known_hosts** に格納されます。
- 初回接続時には、~/.ssh/known_hosts にはホスト鍵が登録されていないため、登録するメッセージが表示され、ホスト鍵が登録されます
- 次回以降は、接続先ホストから送られてきたホスト鍵を known_hosts内の鍵と比較し、問題がなければ、ユーザー認証に進みます

## 公開鍵認証

- ホスト認証を終えると、次にユーザー認証に進みます
- ユーザー認証はまず公開鍵認証が試されます
- 公開鍵認証は、一組の公開鍵と秘密鍵を使います
- 公開鍵で暗号化したデータは、ペアとなる秘密鍵でのみ復号できます
- 秘密鍵となる電子署名は、ペアとなる公開鍵で検証できます

公開鍵と秘密鍵のペアを **ssh-keygen** で作成します。

```
# ssh-keygen -t rsa
```

次に、ユーザーの公開鍵ファイルを接続先ホストの **~/.ssh/authorized_keygen** に登録します。
鍵ファイルはあらかじめ、scp などで転送しておきます。(**ssh-copy-id** を使うと、簡単に公開鍵を接続先ホストに登録できます。)

```
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

SSHで接続します。

```
$ ssh testuser@server.naata.com
```

# セキュリテイ

## パスワード認証の禁止

```sshd_config
PasswordAuthentication no
```

## rootログインの禁止

```sshd_config
PermitRootLogin no
```

## ログインユーザーの制限

※指定しなかったユーザーは全て禁止となります。

```sshd_config
AllowUsers testuser
```

## 無条件にログインできるホスト・ユーザの禁止

```
IgnoreRhosts no
```

# ポートフォワーディング

|オプション|説明|
|---|---|
|-L|ローカルからリモートへポート転送する|
|-R|リモートからローカルへポート転送する|
|-N|コマンドを実行せず、ポート転送のみ行う|
|-f|sshをバックグランドとして実行する|
|-g|ポート転送するとき、ローカルホスト以外からも転送元ポートを利用できるようにする|

[sshポートフォワーディング](https://qiita.com/mechamogera/items/b1bb9130273deb9426f5)
[SSHポートフォワーディングを知った話](https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81)

# 設定例

- サーバー　　server.naata.com(192.168.250.100) user01
- クライアント　client.naata.com(192.168.250.200) user02


```sshd.config

Port 22
ListenAddress 0.0.0.0

HostKey	/etc/ssh/ssh_host_key
HostKey	/etc/ssh/ssh_host_key_rsa_key	
HostKey	/etc/ssh/ssh_host_key_dsa_key

SyslogFacility	AUTHPRIV
LogLevel INFO

LoginGraceTime 2m
PermitRootLogin	no
StricModes yes
MaxAuthTries 6

#公開鍵認証
PubkeyAuthentication	yes
AuthorizedKeysFile	.ssh/authorized_keys

#パスワード認証
PasswordAuthentication yes
PermitEmptyPasswords	no

UsePAM yes
X11Forwarding	yes
```

パスワード認証でログインしてみる。
なお、空パスワードでの認証は no なので、パスワードは必須である。
[host名でアクセスを設定する](https://qiita.com/salty-vanilla/items/a0ab6217a637a1b7ef7a) 場合も参照。

```
$ ssh user01@192.168.250.100
もしくは
$ ssh user01@server.naata.com
```

公開鍵認証をやってみる。
まず、クライアント側で公開鍵と秘密鍵を作成します。

```
$ ssh-keygen -t rsa
```

公開鍵をサーバー側へコピーする。

```
$ ssh-copy-id -i .ssh/id_rsa.pub user01@server.naata.com
```

秘密鍵を使って、ログインをしてみる。

```
$ ssh -i id_rsa nginx-usero1@server.naata.com
```

また、.ssh/config 使って簡単に接続できるようになるので、↓の記事も参考になります。
[~/.ssh/configについて](https://qiita.com/passol78/items/2ad123e39efeb1a5286b)