SSH暗号設定の強化

#はじめに
職場のネットワーク管理部門からsshのセキュリティ強化について求められました。外部からセキュリティ検査ツールを使い、脆弱性を指摘されました。

内容としては以下のとおりです。

- 暗号化方式arcfourをやめろ
- ssh version 1のサポートをやめろ

上記の改善を求められました。

#sshの設定ファイル
設定変更前にsshの設定ファイルについて注意点をあげておきます。

おもな設定ファイルは次の二つです。名前は似てますが違うものです。

> /etc/ssh/ssh_config
> /etc/ssh/sshd_config (dが多い)

ssh_configは内側から外側への通信の時の設定ファイルです。
sshd_configは外側から内側への通信の時の設定ファイルです。

今回は外部からの検査で指摘されたので主にsshd_configの修正になります。ついでにいうと、外部からの検査ではssh_configの中身は知りようがないです。

##作業場の注意(remote login)
今回の作業はremote loginでの作業は危険です。もしsshの設定を誤ったらログインできなくなります。

基本的にサーバのコンソールで作業を行なってください。

##暗号化方式arcfour
聞いたことがない名前だなぁ。と思ってググったら

> RC4
> https://ja.wikipedia.org/wiki/RC4

RC4のことでした。RC4の脆弱性はよく話題になりますね。

設定ファイルsshd_configを修正し、RC4を無効にします。

現在サポートされている暗号化方式はオンラインマニュアルに掲載されていました。man sshd_configをしてみてください。

注意: この記述内容はOS依存です。かならずお使いのOSで確認ください。

```
$ man sshd_config (抜粋)
     Ciphers
             Specifies the ciphers allowed for protocol version 2.  Multiple
             ciphers must be comma-separated.  The supported ciphers are
             “3des-cbc”, “aes128-cbc”, “aes192-cbc”, “aes256-cbc”,
             “aes128-ctr”, “aes192-ctr”, “aes256-ctr”, “arcfour128”,
             “arcfour256”, “arcfour”, “blowfish-cbc”,
             “rijndael-cbc@lysator.liu.se”, and “cast128-cbc”.  The default
             is:

                aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,
                aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,
                aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se

```

この中からarcfourが含まれる文字列を除いてCiphersに加筆します。

注意: この記述内容はOS依存です。かならずお使いのOSで確認ください。

まずsshd_configは最後に加筆で問題ないかと思います。最後に改行を忘れずに。

```bash:/etc/ssh/sshd_config
Ciphers  aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se
```

次にssh_configですがちょっと注意して作業してください。

ファイルを確認しもし

```bash:/etc/ssh/ssh_config
Host *
  ...
  ...
```

という感じの行がなければ「Host * 」を加筆してください。

つづいて、Host *で始まる段落(?)の最後の行にTABキーを押したあとにCiphers……と書いてください。 

注意：アルファベットで「(TAB)」と入力するんじゃないですよ。あと最後に改行をわすれずに。

```bash:/etc/ssh/ssh_config
Host *
  ...
  ...　
(TAB)Ciphers  aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256
```

# ssh version 1のサポートをやめろ

最近のOSではほとんどssh version1は無効になっていますが、古いsshクライアント対応のためssh version 1が有効になっている場合や管理者が有効にしている場合があります。

CentOS6.xでは標準では設定で無効になっています。CentOS7.xではversion1の機能そのものが無効です。

設定はsshd_configの中にあります。

```bash:/etc/ssh/sshd_config
Protocol 2,1
```

こちらから1を削れば無効になります。

```bash:/etc/ssh/sshd_config
Protocol 2
```

# ssh daemonの再起動

注意点を再掲しますが、コンソールで作業していますね？？

上記の設定後sshのdaemonを再起動する必要あります。再起動しないと有効になりません。

Linux系ならだいたいこんな感じでしょうか。(rootでの作業)

```
$ /sbin/service sshd restart
```

FreeBSDではこんな感じでしょうか。(rootでの作業)

```
$ /etc/rc.d/sshd restart
```

つづいて設定したサーバ自体にログインして試してみてください。

```
$ ssh localhost
```

つづいて別のPCなどからもsshでログインを試してください。

#再検査
可能なら職場のネットワーク管理部門などに再検査を依頼してください。

#蛇足:複数ポートでsshを立ち上げる。

内部向けのsshは22番で立ち上げておきたいが、sshの22番をそのまま外部公開とするとportscanでのクラッキングの嵐になります。

その場合、内部向けのssh(22)と外部向けのssh(tcp/100xx)とか、port番号を切り替えるという技があります。

以降CentOS6.9依存の話になりますが、xinetd起動を併用すると簡単にできます。他のOSでもxinetdが使えるなら同様の設定でいけると思います。

まずポート番号を決めてください。1024以上65535以下の任意の数字となります。とりあえず100xxとします。

次に、内部向けのssh(tcp/22)はFirewallなどで外部から閉塞してください。外部向けのssh(tcp/100xx)は外部からアクセス可能にしてください。このあたりはネットワーク管理部門と調整ください。

つぎに設定です。

パッケージ xinetd導入

```
$ yum install xinetd
```

外部向けのssh設定ファイルsshd_config-world作成。外部向けはPublic key認証に限定するのがおすすめ。

```
$ cd /etc/ssh
$ cp -p sshd_config sshd_config-world
$ vi sshd_config-world
```

```
$ diff -u sshd_config sshd_config-world
--- sshd_config 2018-01-23 14:18:57.407999187 +0900
+++ sshd_config-world   2018-01-23 14:19:32.449026965 +0900
@@ -63,7 +63,7 @@
 # To disable tunneled clear text passwords, change to no here!
 #PasswordAuthentication yes
 #PermitEmptyPasswords no
-PasswordAuthentication yes
+PasswordAuthentication no

 # Change to no to disable s/key passwords
 #ChallengeResponseAuthentication yes
@@ -78,9 +78,9 @@

 # GSSAPI options
 #GSSAPIAuthentication no
-GSSAPIAuthentication yes
+GSSAPIAuthentication no
 #GSSAPICleanupCredentials yes
-GSSAPICleanupCredentials yes
+GSSAPICleanupCredentials no
 #GSSAPIStrictAcceptorCheck yes
 #GSSAPIKeyExchange no

```

サービスを登録。

```bash:/etc/services
# 加筆
ssh-worldwide   100xx/tcp 
```

xinetd起動の設定作成。

```bash:/etc/xinetd.d/sshd-worldwide
# 新規作成
service ssh-worldwide
{
        disable = no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/sshd
        server_args     = -i -f /etc/ssh/sshd_config-world
        log_on_failure  += USERID
        rlimit_cpu = 3600
}
```

サービス起動。

```
$ /sbin/service xinetd restart
$ /sbin/chkconfig xinetd on
```

つづいてOSそのもののfirewallでtcp/100xxを開放してください。system-config-firewall-tuiで設定できると思います。具体的設定方法はお調べください。

つづいて設定したサーバ自体にログインして試してみてください。(もしpublic key限定にした場合は事前に個人のpublic keyの設定を行ってください。)

```
$ ssh localhost -p 100xx
```

これで成功したら、外部ネットワークのPCからテストしてみてください。

以上です。