ConoHaのVPS(CentOS7.5)にSSH接続する手順

#はじめに
ConoHaのVPSにMacOSのTerminalからSSH接続しようと思ったのですが，行き詰まったので，備忘録として自分なりの手順をまとめてみました．色々と調べてから，実践したのですが，やはり，やりながら試行錯誤するのが一番です．．．

###サーバー環境
リージョン: 東京
サービス: メモリ 512MB, 630円/月,CPU 1Core, SSD 20GB
イメージタイプ: OS CentOS 7.5(64bit)
root パスワード: 好きなもの
ネームタグ: 任意

オプション
追加ディスク: 使用しない
接続許可ポート IPv4: 全て許可
接続許可ポート IPv6: 全て許可
SSH Key: 使用しない
スタートアップスクリプト: 使用しない

2018/10/06更新
CentOS7.5でも接続確認できました．

#SSH接続
サーバーを構築したら，早速TerminalからSSH接続します．

```terminal:~(client)
$ ssh root@(IPAddress)
```

IPAddressは，ConoHaの管理ページから，サーバー　=>　IPAddressを知りたいサーバーのネームタグ　=>　IPアドレスを使用します．
実行すると，おそらく，初めて接続する方は，以下のような文が出ると思います．

```terminal:~(client)
The authenticity of host '(IPAddress) ((IPAddress))' can't be established.
ECDSA key fingerprint is (...).
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '(IPAddress)' (ECDSA) to the list of known hosts.
root@(IPAddress)'s password: 
```

これに関しては，要勉強．
通信を続けますかと聞かれるので，yesを入力すると，.ssh下のknown_hostsにIPアドレスと上記の(...)の部分に記載されているフィンガープリントが追加されます．また，次の接続時からこの文は出なくなります．
一番下で，rootのパスワードが聞かれているので，サーバー構築時に入力したrootパスワードを入力します．

```terminal:~(client)
[root@(IPAddress) ~]# 
```

上記が表示されたら，接続完了です．

#VPS設定
SSH接続した状態で，VPSの中身を編集していきます．

##一般ユーザー追加
はじめに，一般ユーザーを追加し，wheelグループに追加します．

```console:~(vps)
ユーザー追加
# adduser (UserName)

パスワード設定
# passwd (UserName)
New password: (Password)
Retype new password: (Password)
passwd: all authentication tokens updated successfully.

wheelグループに追加(注意)
# usermod -G wheel (UserName)
```

他の一般ユーザーをwheelグループに追加したことがある場合は，[こちらの記事](https://qiita.com/tk1024/items/16e98031b84a31df469b)を参考に別のコマンドで，もしくは，オプションを追加して，wheelグループに追加してください．
以下のコマンドで，wheelグループに追加されているか確認できます．

```console:~(vps)
(UserName)のグループを確認
# groups (UserName)
(UserName) : (UserName) wheel

wheelグループに所属しているユーザーの確認
# getent group wheel
wheel:x:10:(UserName)
```

`groups`で所属先にwheelがある,また，`getent group`でwheelに所属していれば，追加完了です．
一般ユーザーにログインできるか，確認してみます．

```console:~(vps)
[root@(IPAddress) ~]# su (UserName)
[(UserName)@(IPAddress) root]$
```

上記のように表示されていればログイン成功です．
また，一度接続を切って，以下のコマンドで一般ユーザーに接続できるか試してみましょう．

```terminal:~(client)
$ ssh (UserName)@(IPAddress)

(UserName)@(IPAddress)'s password: 
Last login: (...)
[(UserName)@(IPAddress) ~]$ 
```

パスワードを入力して，上記のようになったら，接続成功です．
基本的に，これからは，rootではなく，こちらの一般ユーザーを使用します．

#鍵認証によるSSH接続設定
公開鍵認証で，VPS接続を行うための設定を行います．
流れとしては，クライアント側で公開鍵と秘密鍵を生成し，公開鍵をVPSに`scp`コマンドでアップロードし，それらの鍵を用いて，SSH接続を行います．

##VPSでの前準備
まず，前準備として，VPS上にクライアントの公開鍵を置くディレクトリを作成します．今回は，.ssh下に置きたいので，.sshディレクトリを作成します．

```console:~(vps)
$ mkdir .ssh
$ chmod 700 .ssh
```

鍵をアップロードする際に存在しないディレクトリを指定すると，ファイルのアップロードができないので，予定のディレクトリは必ず作成してください．また，パーミッションも700に変更します．パーミッションの確認は以下のコマンドです．

```console:~(vps)
$ ls -al
...
drwx------ ... .ssh
...
```

上記のように表示されていたら，完了です．

また，鍵認証を行うためにあらかじめSSHの設定ファイルを編集します．ここでは，鍵認証ができるようにするだけですが，後々再び編集を加えます．
記述箇所は離れていたり，コメントアウト，もしくは，そもそも記述されていない場合があるので，場合に応じて，コメントアウトして書き換えたり，書き加えてください．

```console:~(vps)
$ sudo vim /etc/ssh/sshd_config
```

```config:/etc/ssh/sshd_config
#公開鍵認証を許可
PubkeyAuthentication yes

#RSA認証を許可（必要なし？）
RSAAuthentication yes

#clientの公開鍵の場所と名前を指定
AuthorizedKeysFile      .ssh/authorized_keys
```

```console:~(vps)
$ sudo systemctl restart sshd.service
```

clientの公開鍵の場所と名前の指定では，以下で公開鍵をアップロードする予定の場所を記述してください．

##クライアントで鍵生成
vpsから切断し，クライアント側で鍵を生成します．

```terminal:~(client)
$ cd .ssh

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/.../.ssh/id_rsa): 　(鍵の作成箇所と名前を指定)
Enter passphrase (empty for no passphrase): 　(パスフレーズの任意入力)
Enter same passphrase again: 　(もう一度パスフレーズの入力)
Your identification has been saved in /.../.ssh/id_rsa.
Your public key has been saved in /.../.ssh/id_rsa.pub.
The key fingerprint is:
...
The key's randomart image is:
...

$ ls
id_rsa id_rsa.pub
```

ConoHaでは2048bitのRSA暗号を用いるため，`ssh-keygen`のオプションとして，`-t`で生成する鍵の種類をRSAに，`-b`で生成する鍵のビット長を2048に指定しました．([こちら](https://euske.github.io/openssh-jman/ssh-keygen.html)参照，他のオプションもこちらに載っています．)
鍵の作成箇所の指定で，作成箇所と名前を変更することができます．デフォルトで.ssh下にid_rsaとid_rsa.pubを作成するようになっています．これからも別のサービス等で鍵を用いる場合，わかりやすいように別名で作成すると良いかもしれません．
また，パスフレーズは，空欄でも構いませんが，万が一盗まれた場合などのことを考えると，入力しといた方が良いです．

##公開鍵をアップロード
作成した二つの鍵のうち，公開鍵(~.pub)をVPSにアップロードします．

```terminal:~/.ssh(client)
$ scp id_rsa.pub (UserName)@(IPAddress):~/.ssh/authorized_keys
(UserName)@(IPAddress)'s password: 
id_rsa.pub                                      100%  ...    ...KB/s   00:00
```

以上の表記となったら，アップロード完了です．
上記のコマンドの`authorized_keys`の部分は変更しても構いません．ただし，先ほど編集したVPS上のsshd_configに記載した場所と同じにしてください．
もし，デフォルトのままなら，鍵認証の設定は完了です．（保存先や名前を変えた場合，もしくは，保存先を間違えた場合はまだ，鍵認証はできないので，パスワード認証でログインします．）

```terminal:~(client)
$ ssh (UserName)@(IPAddress) -i '(PathToSecretKey)'
Enter passphrase for key '(PathToSecretKey)': 
```

鍵生成時にパスフレーズを入力したなら，ここで，パスフレーズの入力が求められます．パスフレーズを入力していない場合，コマンドを実行するだけで，接続ができます．
また，毎回秘密鍵のパス入力が面倒臭いので，.ssh/configに以下の内容を追加します．

```terminal:~(client)
$ vim .ssh/config
```

```config:/.ssh/config
Host example_vps
     HostName (IPAddress)
     Port 22
     User (UserName)
     IdentityFile (PathToSecretKey)
```

ここでは，名前をexample_vpsとしたので，以降，以下のコマンドで接続できます．（パスフレーズは入力しなければいけませんが．．．）

```terminal:~(client)
$ ssh example_vps
```

##鍵認証でしかログインできないようにする+セキュリティ設定
ログインを鍵認証のみにするのと同時に，セキュリティの設定を行います．
先ほど鍵認証を行うために書き換えた/etc/ssh/sshd_configの中身を再び書き換えます．

```console:~(vps)
$ sudo vim /etc/ssh/sshd_config 
[sudo] password for (UserName):　(UserName'sPassword)
```

このファイルに以下のように設定を変更します．記述箇所は離れていたり，コメントアウト，もしくは，そもそも記述されていない場合があるので，場合に応じて，コメントアウトして書き換えたり，書き加えてください．

```config:/etc/ssh/sshd_config
#セキュリティの観点からポート番号を変更
Port 10022

#rootログインを無効化
PermitRootLogin no

#パスワードでのログイン無効化
PasswordAuthentication no

#パスワードなしでのログイン無効化
PermitEmptyPasswords no
```

書き換えたら，設定を反映させます．

```console:~(vps)
$ sudo systemctl restart sshd.service
```

ここで，ログアウトしてしまうと，ファイアウォール側でポート変更の設定を行なっていないため，SSH接続ができなくなります．なので，以下のファイアウォールの設定も一気に行うことをお勧めします．
（上記の設定の反映を一番最後にするのもありです．）

#ファイアウォールの設定
CentOS7から，firewalldというものが，デフォルトで入っています．ただ，CentOS6以前は触ったことがないので，よく知らないのですが，iptablesというものが主流だったっぽい？ここでは，それぞれの導入の仕方を説明します．どちらが良いのかについては，他のサイトや記事に任せます．
また，SElinuxというセキュリティ制御機能があるのですが，デフォルトでオフになっていたかと思います．ここでは，SElinuxの設定はせず，セキュリティ関連の設定はファイアウォールのみにしたいと思います．

##iptablesで設定
（firewalldで設定するなら，飛ばしてください．）
CentOS7ではデフォルトでiptablesサービスが入っていないので，まずは，iptablesサービスをインストールします．

```console:~(vps)
$ sudo yum install iptables-services
```

実行すると，何をダウンロードするか現れて，これで良いかと聞かれるので，`y`(yes)と入力します．
`Complete!`と出たら，インストール完了です．

iptablesを設定していきます．

```console:~(vps)
$ sudo vim /etc/sysconfig/iptables
```

このファイルの中で，色々と設定ができます．今回はとりあえず，入ってくる通信を全て拒否し，その後で，SSHで使用する10022番ポートのみを許可するように設定しました．この設定に関しては，[こちらのサイト](https://knowledge.sakura.ad.jp/4048/)を参考にさせていただきました．

```config:/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

...

-A INPUT -p tcp -m state --state NEW -m tcp --dport 10022 -j ACCEPT
```

iptablesの設定を反映し,自動起動を有効にします．また，firewalldは使用しないので，無効にします．

```console:~(vps)
#iptablesの設定を反映
$ sudo systemctl restart iptables.service

#iptablesの自動起動を有効に
$ sudo systemctl enable iptables.service

#firewalldを止める
$ sudo systemctl stop fireawlld.service

#firewalldの自動起動を無効に
$ sudo systemctl disable firewalld.service
```

これで，iptablesによるファイアウォールの設定は完了です．

##firewalldで設定
デフォルトで入っているfirewalldでファイアウォールの設定をします．（iptablesで設定したなら，飛ばしてください．）
firewalldには，ゾーンというものがあり，それによって，サービスやポートを制御するらしいのですが，ここでは，そこまで深く述べず，単純に任意のポートでSSH接続をできるようにするまでの手順を示します．

まず，以下のコマンドで，firewalldの現在の設定を確認します．

```console:~(vps)
$ sudo firewall-cmd --list-all
public (active)
　　　　...
  interfaces: eth0
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  ...
```

この場合，現在，sshとdhcpv6-clientというサービスがfirewalldで許可されている状態です．
まず，dhcpv6-clientサービスを削除します．（この処理がどのような影響を及ぼすか不明．削除して使用していますが，特に問題はまだ起きていません．各自の判断にお任せします．）

```console:~(vps)
$ sudo firewall-cmd --remove-service=dhcpv6-client --zone=public --permanent
success
```

ここでは，念のため，sshサービスは残していますが，後で削除します．
次に，ポートを変更したsshの設定を行います．以下のコマンドで，デフォルト設定のファイルが置いてあるディレクトリ（`/usr/lib/firewalld/services/`）から，カスタマイズを反映させるためのディレクトリ（`/etc/firewalld/services/`）にsshの設定ファイル（ssh.xml）をコピーします．ここでは，名前をssh_ver2.xmlに変更しました．

```console:~(vps)
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh_ver2.xml
```

コピーしたら，ssh_ver2.xmlの中のポート番号を22から10022に変更します．

```console:~(vps)
$ sudo vim /etc/firewalld/services/ssh_ver2.xml
```

```xml:/etc/firewalld/services/ssh_ver2.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
        <short>SSH</short>
        <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
        <port protocol="tcp" port="10022"/>
</service>
```

そして，このssh_ver2をサービスとして，firewalldに設定します．

```console:~(vps)
$ sudo firewall-cmd --add-service=ssh_ver2 --permanent
```

設定を反映させて，確認してみましょう．

```console:~(vps)
$ sudo firewall-cmd --reload
success

$ sudo firewall-cmd --list-all
public (active)
  ...
  interfaces: eth0
  sources: 
  services: ssh ssh_ver2
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  ...
```

先ほどのと比べて，dhcpv6-clientサービスが削除され，新たにssh_ver2が追加されています．
（`--reload`は，今回はここでまとめてやりましたが，不具合時のことなどを考えると，設定を変えるたびの行う方が良いと思います．）

最後に，もともとあったsshサービスを削除し，設定を反映します．（sshd_configでポート番号を書き換えているので必要はないかと思いますが，一応．．．）

```console:~(vps)
$ sudo firewall-cmd --remove-service=ssh --zone=public --permanent

$ sudo firewall-cmd --reload
success

$ sudo firewall-cmd --list-all
public (active)
  ...
  interfaces: eth0
  sources: 
  services: ssh_ver2
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  ...
```

サービスがssh_ver2のみになっていれば，ファイアウォール側でのsshのポート変更は完了です．


#クライアント側で接続先ポート変更
クライアントに戻って，接続先ポートを変更して，試してみましょう．

```terminal:~(client)
$ vim ~/.ssh/config
```

```config:/.ssh/config
Host example_vps
     HostName (IPAddress)
     Port 10022
     User (UserName)
     IdentityFile (PathToSecretKey)
```

```terminal:~(client)
$ ssh example_vps

Enter passphrase for key '(PathToSecretKey)': 
Last login: (...)
[(UserName)@(IPAddress) ~]$
```

無事ログインすることができました！これにてようやくSSH接続の設定は終了です．
ConoHaでは，ディスクイメージを保存することができるので，ここまで完了したら，次回以降のために，テンプレートとして残しておくと良いかもしれません．ただし，このテンプレートからサーバー追加したところ，sshd_configの一部の設定が元に戻っていたので，他の部分にも初期化される部分があるかもしれません．

#補足
##iptables, firewalldの設定がどうなっているか確認
現在，iptablesやfirewalldが作動中かどうかは以下のコマンドで確認できます．

```console:~(vps)
#firewalldの確認
$ systemctl status firewalld
...
Active: inactive (dead) <= 作動していない

#iptablesの確認
$ systemctl status iptables
...
Active: active (exited) <= 作動中
```

また，自動起動が有効かどうかは，以下のコマンドで確認できます．

```console:~(vps)
$ systemctl list-unit-files | grep -e firewalld -e iptables
firewalld.service                             disabled
iptables.service                              enabled 
```

enabledは有効，disabledは無効です．

#終わりに
備忘録として，試行錯誤しつつまとめながらやっていたら，想像以上に時間がかかりました．なかなか大変でしたけど，コマンドの知識やパーミッション等の知識が少なからずつくので悪くないですね．
セキュリティの怖いところはこれで本当に十分なのかどうなのか心配なところです．もし，何かこれもしといた方が良いよというものや文面的におかしい部分があれば，ご指摘お願いします．

#参考サイト
1. [ご利用ガイド｜VPSならConoHa](https://www.conoha.jp/guide/)
2. [ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で！ - Qiita](https://qiita.com/ongaeshi/items/bb17ebfbd4d22057c8fd)
3. [サーバー借りたらセキュリティ意識を高めよう！最初にやるべき6つの設定 | GMOクラウドアカデミー](https://academy.gmocloud.com/advance/20150803/595)
4. [評判のConoHa VPSを使うときに最初にやっておきたいこと(CentOS編)&nbsp;|&nbsp;レンタルサーバー・自宅サーバー設定・構築のヒント](https://server-setting.info/blog/conoha_vps_centos_first_setup.html)
5. [usermodでグループを追加するのは危険 - Qiita](https://qiita.com/tk1024/items/16e98031b84a31df469b)
6. [SSH-KEYGEN (1)](https://euske.github.io/openssh-jman/ssh-keygen.html)
7. [ファイアウォールiptablesを簡単解説～初心者でもよくわかる！VPSによるWebサーバー運用講座(4) | さくらのナレッジ](https://knowledge.sakura.ad.jp/4048/)
8. [【さくらVPS】【CentOS7】Firewalld を設定する | 100%レンタルサーバーを使いこなすサイト](https://go-journey.club/archives/5103)
9. [CentOS 7 で sshd のポート番号を変更する方法 | WEB ARCH LABO](https://weblabo.oscasierra.net/openssh-sshd-centos7-change-port/)