ConoHaサーバ構築（SSHログイン編）備忘録

# サーバ情報

■ 契約プラン
- リージョン：東京
- メモリ：1GB
- CPU：2コア
- SSD：100GB

■ OS情報

```
$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
```

■ CPU情報

```
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping        : 1
microcode       : 0x1
cpu MHz         : 2397.222
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit
bogomips        : 4794.44
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping        : 1
microcode       : 0x1
cpu MHz         : 2397.222
cache size      : 4096 KB
physical id     : 1
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit
bogomips        : 4794.44
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:
```

■ メモリ情報

```
$ cat /proc/meminfo
MemTotal:         841024 kB
MemFree:          221220 kB
MemAvailable:     543912 kB
Buffers:          104976 kB
Cached:           325808 kB
SwapCached:            0 kB
Active:           331072 kB
Inactive:         186516 kB
Active(anon):      87972 kB
Inactive(anon):    15072 kB
Active(file):     243100 kB
Inactive(file):   171444 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         86856 kB
Mapped:            81360 kB
Shmem:             16244 kB
KReclaimable:      43428 kB
Slab:              74596 kB
SReclaimable:      43428 kB
SUnreclaim:        31168 kB
KernelStack:        1760 kB
PageTables:         7276 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2517660 kB
Committed_AS:     356324 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:     10240 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:       90104 kB
DirectMap2M:      958464 kB
DirectMap1G:           0 kB
```

■ ストレージ情報

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        396M     0  396M   0% /dev
tmpfs           411M     0  411M   0% /dev/shm
tmpfs           411M   16M  395M   4% /run
tmpfs           411M     0  411M   0% /sys/fs/cgroup
/dev/vda2        50G  3.8G   44G   8% /
tmpfs            83M     0   83M   0% /run/user/0
tmpfs            83M     0   83M   0% /run/user/1000
```

## サーバ構築
### 【STEP1】一般ユーザの作成
ユーザを作成

```
$ useradd [ユーザ名]
```
作成したユーザのパスワードを変更

```
$ passwd [ユーザ名]
```

スーパーユーザ権限でコマンドを実行できるように変更

```
$ gpasswd -a [ユーザ名] wheel
```

ちょっと疑問に思ったこと・・・
リンク：[なぜ、Wheelグループと呼ばれるのか？](http://codaholic.org/?p=1757)

```
$ su [ユーザ名]
```

### 【STEP２】SSH ログイン環境の整備

SSHの設定ファイルを編集する前にバックアップ

```
$ cd /etc/ssh
$ cp -pi sshd_config sshd_config.org
```

Rootログインを禁止する

```
$ vi sshd_config
---------------
PermitRootLogin yes -> no
---------------
```

SSHのポート番号を変更する
※ ここでは例として10099を設定する

```
$ vi sshd_config
---------------
Port 22 -> 10099
---------------
```

ウェルノウンポートを設定しないように注意！
リンク：[ウェルノウンポート](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7)

パスワード無しログインを禁止する

```
$ vi sshd_config
---------------
PermitEmptyPasswords yes -> no
---------------
```

特定のユーザのみ、SSHでログイン可能とする

```
$ vi sshd_config
---------------
# １ユーザだけ許可する場合
AllowUsers [ユーザ名]

# 複数のユーザを許可する場合
AllowUsers [ユーザ名１] [ユーザ名２] [ユーザ名３]
---------------
```

設定ファイルの構文チェックを実施する
※ 何も表示されなければ、問題なし。

```
$ sshd -t
```

sshdサービスを再起動して、設定を反映させる

```
$ systemctl restart sshd.service
```

SSHの設定反映は完了したが、ファイアウォールで22番ポートを未許可に変更し、10099番ポートを許可へ変更する必要がある。

まずは、ファイアウォールのステータスを確認する

```
$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor p>
   Active: active (running) since Wed 2020-04-08 17:48:55 JST; 39min ago
     Docs: man:firewalld(1)
 Main PID: 701 (firewalld)
    Tasks: 2 (limit: 5056)
   Memory: 30.6M
   CGroup: /system.slice/firewalld.service
           mq701 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork ->

```

active (running) なので、ファイアウォールが動作している。

ファイアウォールの設定を確認する

```
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

ssh(22番ポート)が許可状態にあるため、22番ポートを許可対象から除外する

```
# 恒久的にsshを許可対象から除外する
$ firewall-cmd --permanent --remove-service=ssh

# ファイアウォールの設定を反映する
$ firewall-cmd --reload
```

ssh(22番ポート)が未許可状態になったことを確認する

```
$ firewall-cmd --reloadlist-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

servicesの項目からsshが除外されていれば、設定反映は成功。

次に、ポート番号10099を許可対象として追加する

```
# ポート番号10099を許可対象として追加する
$ firewall-cmd --zone=public --add-port=10099/tcp --permanent

# ファイアウォールの設定を反映する
$ firewall-cmd --reload
```

ssh(10099番ポート)が許可状態になったことを確認する

```
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client
  ports: 10099/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

portsの項目に10099/tcpが追加されていれば、設定反映は成功。

SSH,ファイアウォールの設定反映が完了したため、以下のことを確認する

- RootユーザでSSHできないこと
- 一般ユーザでSSHできること
- ポート番号22でSSHできないこと
- ポート番号10099でSSHできること
- 未許可ユーザではSSHできないこと
- 許可ユーザではSSHできること

上記の結果がOKであれば、SSHの設定はひとまず完了。

### 【STEP３】SSH 鍵認証ログインの設定

公開鍵配置用のディレクトリを作成する

```
# 鍵認証ログインさせたい一般ユーザでホームディレクトリへ移動
$ cd ~

# 公開鍵配置用のディレクトリを作成
$ mkdir .ssh

# 所有者のみ公開鍵へのアクセスを許可する
$ chmod 700 .ssh
```

一旦、ローカル側の作業に移動する。
以下、公開鍵と秘密鍵を生成方法を説明する。

teratermを起動し、新しい接続が表示されたら[キャンセル]する

![新しい接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/332fbd75-3f40-add4-cb4b-7350b01c84df.png)

上段メニューの[設定]を選択する

![設定メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/832b54ed-de52-776a-9b4a-af542cf46557.png)

[SSH鍵生成]を選択すると、鍵生成画面が表示される

![生成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/b7a1634e-9e41-bf49-dbbf-dcfe47d3d67f.png)

[生成]を押下し、パスフレーズを入力する。
その後、[公開鍵の保存]と[秘密鍵の保存]を選択して、ローカルに公開鍵と秘密鍵を保存する。

![パスフレーズ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/561047b3-8cf8-92e4-da8b-c8c3b5ad07b1.png)

ここでサーバ側の作業に戻る。
鍵認証ログインさせたい一般ユーザのホームディレクトリへ移動する

```
$ cd ~
```

teratermに対して、先ほど生成した公開鍵をドラッグ＆ドロップする

![scp_149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/b3f74627-6128-beee-b82f-d6ef8b76f600.png)


[SCP]を選択すると、一般ユーザのホームディレクトリに公開鍵が配置される

```
$ ls
id_rsa.pub
```

公開鍵をauthorized_keysへ結合する

```
# 公開鍵をauthorized_keysへ結合する
$ cat id_rsa.pub >> ~/.ssh/authorized_keys

# 不要となった公開鍵は削除する
$ rm id_rsa.pub

# authorized_keysのパーミッションを600で制限する
$ chmod 600 authorized_keys
```

公開鍵の配置が完了したので、teraterm等のSSHクライアントを使用して、秘密鍵を使用した接続ができるか確認してみる。

![鍵認証ログイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/b95abc2c-cbb5-f587-972b-0269e74e11c6.png)

ログインに成功すれば、ひとまず鍵認証ログインは成功であるが、まだ通常のパスワードログインが可能であるため、SSHの設定を変更する。

パスワード認証によるログインを禁止する

```
# SSHの設定ファイルがあるディレクトリへ移動する
$ cd /etc/ssh

# 設定変更前にSSHの設定ファイルをバックアップする
$ cp -pi sshd_config sshd_config.YYYYMMDDHHMM

# パスワード認証を禁止するように、設定を修正する
$ vi sshd_config
---------------
PasswordAuthentication yes -> no
---------------

# 構文チェックを実施する
$ sshd -t

# sshdサービスを再起動して、設定を反映する
$ systemctl restart sshd.service
```

設定反映が完了したので、パスワード認証ログインができず、鍵認証のみでログインができればOKである。

#### Teraterm から自動ログインするマクロ

```auto_login.ttl
;=====================================================================
; 接続情報
HOSTADDR = 'ホストアドレス'
USERNAME = 'ユーザ名'
PASSWORD = 'パスフレーズ'
KEYFILE  = '秘密鍵のフルパス'
;=====================================================================

; 処理ディレクトリを現在ディレクトリに変更
getdir DIR
setdir DIR

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':[ポート番号] /ssh /2 /auth=publickey /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEYFILE

; 接続
connect COMMAND

end
```