SSHを楽にしたい...

## そもそもSSHでリモートするのに、まだパスワード使ってるの？

...というのも現代において、使えるものはたくさん増えてきた。
だから使えるものを使って、使い魔くる!

これを実行すれば、最終的には、`ssh dev-sv`だけで接続できるようになる。

## 環境準備
### 前置き
環境はまず整えてからじゃなきゃ使えないものだ。
エンジニアになって、一番難しいのは、環境を整える事だと思う。
毎回、同じならいいけど...何故だか？同じにならないこともあるし、全く別物になったりする。
今回紹介する内容は、macOSでの接続となっている。(windowsで開発した事ない...てか、したくないw)

接続する予定のサーバはCentOS7である。
”SELiunx"も"firewall"も同時に起動されている。
接続に使う回線は、ローカルでもグローバルでもどちらでも対応可能だと思う。

### 本題
はじめに、接続先のサーバ側の設定。
この操作は、全て`"root"`で行っている。
設定する順番はどちらでも構わない。

##### 接続するための情報
* 接続ユーザー: hoge (なお、"hoge"を自分のユーザー名に置き換えてください。)
* 接続先ホスト: example.com ("example.com"は、例です。自分のリモート先と置き換えてください。)


```shell
# sshの設定ファイルを更新する
# 証明書で接続できるようにするためにコメントアウトを外す。
sed -i -e "s/#PubkeyAuthentication/PubkeyAuthentication/g" /etc/ssh/sshd_config
sed -i -e "s/#AuthorizedKeysFile/AuthorizedKeysFile/g" /etc/ssh/sshd_config
# or
vi /etc/ssh/sshd_config
# "#PubkeyAuthentication yes"                => "PubkeyAuthentication yes"
# "#AuthorizedKeysFile .ssh/authorized_keys" => "AuthorizedKeysFile .ssh/authorized_keys"

# firewallの設定する
# デフォルトで接続してる場合は、serviceで許可をしておくといい。
firewall-cmd --add-service=ssh --zone=public --permanent
# or
# SSHの許可をする。ポートで指定してる場合、一番目のポート番号を変える。
firewall-cmd --add-port=22/tcp --zone=public --permanent
# 設定を反映する
firewall-cmd --reload

# 設定を確認する
firewall-cmd --list-all-zones
# public (active)
#  ...
#  services: ssh <=これが追加されていることを確認
#  ports: 22/tcp <=もしくは、指定したポート番号
#  ...
# ----　一般ユーザー権限の場合は、ここまで　-----

# ----　管理者権限に移行できるようにする　　-----
# 次に接続するためのユーザーを追加する
useradd hoge # ユーザーを作成
passwd hoge # 作成したユーザーのパスワードを設定、初期接続時に必要となるため。

# 必要に応じて、"wheel" グループに追加する。基本的に、管理者にならないのであれば、いらない。
usermod -aG wheel hoge
cp -p /etc/pam.d/su /etc/pam.d/su.b # ファイルが壊れた時のために、バックアップ用のコピーを取っておく。

# 設定ファイルのコメントアウトを外す。
sed -i -e "$(cat /etc/pam.d/su | grep -n 'pam_wheel.so' | awk -F':' '{print $1}') s/# //g" /etc/pam.d/su
# or
vi /etc/pam.d/su
# "#auth		required	pam_wheel.so use_uid" => "auth		required	pam_wheel.so use_uid"
# 反映後、exitで抜け。追加ユーザでログインでき、rootユーザになれることを確認する。可能であれば、sshからも試す。
```

#### クライアント変(mac側)
大抵の記事では、`scp`でリモート先に公開鍵を送信し、コピーして権限付与まで行っているが、
`ssh-copy-id`を使えば、接続先に"authorized_keys"が自動で登録される。

```shell

whoami # hogeと表示される。

# もしリモート先の登録ユーザーと"whoami"が異なる場合は、"$(whoami)"の部分を"hoge"に読み替えて、変更する。
ssh-keygen -C "$(whoami)@$(hostname)-$(date -I)"
ssh-copy-id -i ~/.ssh/id_rsa.pub hoge@example.com

vi ~/.ssh/config
# 以下を追加する
# Host ex-sv # わかりやすい名前をつけておく
#    User hoge # 接続許可されたユーザー名
#    HostName example.com # 接続先ホストドメイン or IPアドレス
#    port 22 # 接続可能なポートに合わせる
#    IdentityFile ~/.ssh/id_rsa # リモート先に送ったシークレットキーの公開じゃない方

# 最後に、"ssh ex-sv"を実行して、接続が可能であることを確認する
ssh ex-sv
```

### 最後に...
証明書でログインができることを確認したら、以下の設定を実行しておくと、
他者からのログインや攻撃を防ぐことが可能。

```
vi /etc/ssh/sshd_config
# PermitRootLogin yes => no
# PasswordAuthentication yes => no
```

### macのターミナルにあるツール
ターミナルにあるツールに、"shift+command+K"で起動する"新規リモート接続"というものがある。
これは、事前にコマンドを登録しておけるので、覚えておく必要がなくなる。
以下に、イメージだけ貼っておく。
詳しい説明はここではしないことにする。

左の"+"でサービス名を登録する。

![スクリーンショット 2020-10-15 16.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12007/771005a8-f11a-2802-2942-8f5cde8002b5.png)

右の"+"で、接続先を登録できる。その際、ホスト名ではなく、`config`に登録した"Host"名を指定する。

![スクリーンショット 2020-10-15 16.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12007/0d566fc0-3a23-0c54-0c6f-32e319a42b29.png)