SSH通信のセキュリティを強化する!(OpenSSH)

SSH通信のセキュリティ強化方法をまとめます。

はじめに

SSH通信の概要について整理します。
・SSH通信の用途
・SSH通信の仕組み
・SSH通信を行うためのソフトウェア

SSH通信のセキュリティ強化として以下の方法を整理します。
・公開鍵の生成と配送の問題
・SSHのプロトコルの選択
・認証方式の選択
・公開鍵の暗号化方式の選択
・公開鍵の鍵長の選択
・鍵交換方式の選択
・共通鍵による暗号化通信方式の選択
・メッセージ認証コードの選択
・IPアドレスによるアクセス制限
・ポート番号の変更

SSHサーバ設定のセキュリティ強化として以下の方法を整理します。
・ログイン成功までの時間
・rootユーザのログイン禁止
・設定ファイルの権限の検証

その他のSSHに関するトピックを取り上げます。
・パスワードエージェントの利用

SSH通信のセキュリティ強化を実践してみます。
・OpenSSHのセキュリティ情報を収集
・OpenSSHのバージョン確認
・OpenSSHによるデフォルト設定での接続と暗号化方式の確認
・OpenSSHのログ設定とログ確認
・OpenSSHのホスト鍵の生成と変更(サーバ側)
・OpenSSHの認証用の鍵の生成と配置(クライアント側)
・鍵のバックアップを取得
・認証方式を公開鍵認証のみに制限
・使用される暗号化方式の確認と制限

SSH通信の概要

SSH通信の概要について整理します。

SSHの用途

SSHは以下の用途で使用します。
・TELNETの代替として使用して、ターミナル機能を暗号化します。
・FTPの代替として使用して、ファイル転送を暗号化します。
・Rコマンドの代替として使用して、リモート実行の機能を暗号化します。
・X11転送機能を使用して、X11の通信を暗号化します。
・ポートフォーワーディング機能を使用して、様々なプロトコルの通信を暗号化します。

SSHの仕組み

SSHの仕組みの概略を示します。
<構成>
・サーバソフトウェアとクライアントソフトウェアで構成されます。
<SSH接続時開始時(暗号化通信前)>
・サーバとクライアントで使用可能な暗号化方式の交換を行い、暗号化方式を決定します。
・サーバは、ホスト鍵の公開鍵をクライアントに送付します。
・クライアントは、保管済みのホスト名と公開鍵の指紋の組み合わせが存在するか確認します。
・ホスト名と公開鍵の指紋の組み合わせが存在する場合は、暗号化通信を開始します。
・ホスト名と公開鍵の指紋の組み合わせが存在しない場合は、公開鍵を受け入れるかユーザに確認し、受け入れた場合は公開鍵の指紋を保管し、暗号化通信を開始します。
・ホスト名と公開鍵の指紋の組み合わせが異なる場合は、公開鍵の改ざんの可能性があることをユーザに警告します。
<暗号化方式決定後(暗号化通信)>
・暗号化通信は、DH鍵交換方式などを使用して、共通鍵による暗号化通信を行います。

SSH通信を行うためのソフトウェア(サーバ)

代表的なSSHサーバとして、以下のソフトウェアが使用できます。
・OpenSSH(UNIX,Linux)

SSH通信を行うためのソフトウェア(クライアント)

代表的なSSHクライアントとして、以下のソフトウェアが使用できます。
・OpenSSH(CUI/UNIX,Linux,macOS)
・TeraTerm Pro (GUI/Windows)
・Putty (GUI/Windows)
・WinSCP(GUI/Windows)

SSH通信のセキュリティ強化

SSH通信のセキュリティを強化する方法について整理します。

ホスト鍵の生成

ホスト鍵は、サーバソフトウェアをインストールする際に自動的にインストールされますが、他のサーバと同じ鍵が使用されている可能性を排除したり、弱い鍵が使用されることを避けるため、自分で安全な鍵を生成します。

認証用の鍵の生成

認証用の鍵は、クライアントの公開鍵認証に使用します。クライアント側で安全な鍵を生成します。

鍵の配送

暗号化通信の大きな問題は、暗号化前の最初の鍵配送を安全に行うことが難しいことです。この問題は、公開鍵暗号を使用することで解消を試みますが、それでもネットワーク通信によって配送した公開鍵が改ざんされていないことは、事前に安全な方法で入手した公開鍵の指紋と照合することで、正しい公開鍵であることを確認する必要があります。

SSHのプロトコルの選択

SSHのプロトコルとして、以下が選択可能です。
・SSH1(使用しない)
・SSH2
SSH1は脆弱性が指摘されているため、SSH2のみを使用可とします。

認証方式の選択

SSHの認証方式として、以下が選択可能です。
・パスワード認証
・公開鍵認証
・チャレンジレスポンス認証
パスワード認証は簡便ですが、セキュリティを強化したい場合には、公開鍵認証を使用します。

公開鍵の暗号化方式の選択

公開鍵暗号として、以下が選択可能です。
・RSA1(使用しない)
・DSA(使用しない)
・RSA
・ECDSA
・ED25519
RSA1は、SSH1用のため使用しません。OpenSSHでは、複数の鍵を登録できますので、危殆化が指摘されているDSA以外のRSA、ECDSA、ED25519それぞれについて、安全な鍵を作成します。

公開鍵の鍵長の選択

RSAでは、以下の鍵長が使用可能です。
・1024(使用しない)
・2048
・4096
1024ビットは危殆化が指摘されているので、2048ビット以上を使用します。

ECDSAでは、以下の鍵長が使用可能です。
・256
・384
・521

ED25519では、以下の鍵長のみが使用可能です。
・256

IPアドレスによる接続制限

クライアント側のIPアドレスが固定である場合には、IPアドレスによる接続制限を行うことができます。

ポート番号の変更

サーバ側のデフォルトのポート番号は「22」ですが、ポート番号の変更を検討します。

その他

その他のSSHに関するトピックを取り上げます。

パスワードエージェントを利用

パスワードエージェントを使用することで、同じクライアント上でSSHを使用するたびに認証を行う手間を省くことができます。利便性が増しますが、セキュリティのレベルが低下する可能性があるので、仕組みを理解して使用します。

SSH通信のセキュリティ強化を実践

SSH通信のセキュリティ強化を実践してみます。サーバ側もクライアント側もUbuntu 16.04 LTSのOpenSSHを使用してみます。

OpenSSHのセキュリティ情報を収集

OpenSSHのサイトで最新のセキュリティに関する情報を確認します。
OpenSSH Security

OpenSSHのバージョン確認

「ssh -V」コマンドを使用して、OpenSSHクライアントのバージョンを確認します。脆弱性のある古いバージョンでないことを確認します。バージョンが古い場合には、OpenSSHを脆弱性のないバージョンにバージョンアップします。

$ ssh -V
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g 1 Mar 2016

OpenSSHによるデフォルト設定での接続と暗号化方式の確認

「ssh -vvv」オプションを使用して、実際に接続で使用している暗号化方式を確認します。サーバ側とクライアント側のバージョンや、使用可能な暗号化の種類、選択された暗号化方式など様々な情報が確認できます。

$ ssh -vvv user0001@serv0001
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g  1 Mar 2016
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "serv0001" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to serv0001 [X.X.X.X] port 22.
debug1: Connection established.
<省略>
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 pat OpenSSH* compat 0x04000000
debug2: fd 3 setting O_NONBLOCK
debug1: Authenticating to serv0001:22 as 'user0001'
debug3: send packet: type 20
debug1: SSH2_MSG_KEXINIT sent
debug3: receive packet: type 20
debug1: SSH2_MSG_KEXINIT received
debug2: local client KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,ext-info-c
debug2: host key algorithms: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com,zlib
debug2: compression stoc: none,zlib@openssh.com,zlib
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug2: peer server KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1
debug2: host key algorithms: ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com
debug2: compression stoc: none,zlib@openssh.com
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug3: receive packet: type 31
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:2GxRY9LjL9OXDFdtVUCW8BEylz0RsKvuWrcRoW2aHeo
The authenticity of host 'serv0001 (X.X.X.X)' can't be established.
ECDSA key fingerprint is SHA256:2GxRY9LjL9OXDFdtVUCW8BEylz0RsKvuWrcRoW2aHeo.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'serv0001' (ECDSA) to the list of known hosts.
<省略>
debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
<省略>
user0001@serv0001's password:
<省略>
$
$ ls -l
total 4
-rw-r--r-- 1 user0001 user0001 222  2月 18 10:49 known_hosts
$ cat known_hosts
|1|7b69bvx4LoOEaDUe6mKHBRZEFYg=|qJgM1T9z3+20p+95CjSj1Og6m9s= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJJIEUX2ugh4Yx5EMVteTtUiUuzd6NddKyzZbbsxmlDhqE0KSOB62xS7uR7+IkArsflcdgTkXEyfB9puwY1AHgI=

OpenSSHのログ設定とログ確認

OpenSSHの動作および不正アクセスを確認するためには、OpenSSHのサーバ側のログの確認が必須になります。「/etc/ssh/sshd_config」と「/etc/rsyslog.d/50-default.conf」の設定から「/var/log/auth.log」に出力されます。
・/etc/ssh/sshd_config

SyslogFacility AUTH
LogLevel INFO

・/etc/rsyslog.d/50-default.conf

auth,authpriv.*			/var/log/auth.log

SSHのプロトコルをSSH2に制限

SSHの通信プロトコルがSSH2に制限されていることを確認します。
・/etc/ssh/ssh_config

$ grep Protocol /etc/ssh/ssh_config

・「sshd -T」コマンド

$ sudo /usr/sbin/sshd -T | grep protocol
protocol 2

・SSH1で接続

$ ssh -1 user0001@serv0001
Protocol major versions differ: 1 vs. 2

OpenSSHのホスト鍵の生成と変更

ホスト鍵を生成し、変更します。

<ホスト鍵の確認>
サーバ側で、「ssh-keygen -l」コマンドを使用して、ホスト鍵の暗号化方式と鍵長を確認します。

$ ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
1024 SHA256:MzlKLYVl2lxIP/g0h9S5zNqDGaAJMGRKg8EOI4mP6E0 root@serv0001 (DSA)
$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 SHA256:L7XUvrkkJzDd0hLbRbdwiCIWVly19yCEtyDyKKtofhE root@serv0001 (RSA)
$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:2GxRY9LjL9OXDFdtVUCW8BEylz0RsKvuWrcRoW2aHeo root@serv0001 (ECDSA)
$ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:qCbno8Mg3RmCz85qb1512Bkes4OsVAdTooYZFUy9hDA root@serv0001 (ED25519)

<ホスト鍵の生成>
ssh-keygenコマンドでホスト鍵を作成します。ホスト鍵のパスフレーズは、無しで作成します。作業は、ホスト鍵の秘密鍵をサーバ側に送付しなくて済むように、サーバ側で行います。また、ホスト鍵の指紋は、初回接続の確認用に控えておきます。

・RSA

$ ssh-keygen -t rsa -b 4096 -C "root@serv0001 serialno=1"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user0001/.ssh/id_rsa): /home/user0001/.ssh/ssh_host_rsa_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user0001/.ssh/ssh_host_rsa_key.
Your public key has been saved in /home/user0001/.ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:fAYqa74xSClOHRhd9BfBgcjJH3UbX9NGxX00TENeaeo root@serv0001 serialno=1
The key's randomart image is:
+---[RSA 4096]----+
| .. =oo +=oo  +@X|
|  o. =.o .o + o+@|
| . .  ..o. . .oo.|
|  ...  +..   .   |
|..o.. . S o .    |
|oo . o   o   E   |
| .. =            |
|   o o           |
|    o.           |
+----[SHA256]-----+

・ECDSA

$ ssh-keygen -t ecdsa -b 521 -C "root@serv0001 serialno=1"
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/user0001/.ssh/id_ecdsa): /home/user0001/.ssh/ssh_host_ecdsa_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user0001/.ssh/ssh_host_ecdsa_key.
Your public key has been saved in /home/user0001/.ssh/ssh_host_ecdsa_key.pub.
The key fingerprint is:
SHA256:4GwvIwK/NPAFGkCIOwJZG0DNFFHc3CLQExT0Rj7RPPc root@serv0001 serialno=1
The key's randomart image is:
+---[ECDSA 521]---+
|B**=X*=o+        |
|*  = =++.= .     |
|o.o   +=. o .    |
|+o . o...    E   |
|=.  . + S        |
| = . . .         |
|  * . o .        |
| . + . o         |
|  .              |
+----[SHA256]-----+

・ED25519

$ ssh-keygen -t ed25519 -C "root@serv0001 serialno=1"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user0001/.ssh/id_ed25519): /home/user0001/.ssh/ssh_host_ed25519_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user0001/.ssh/ssh_host_ed25519_key.
Your public key has been saved in /home/user0001/.ssh/ssh_host_ed25519_key.pub.
The key fingerprint is:
SHA256:d3857YdEFCBWe/PSJsBusSNd4lKZibEjPLs4pq5AKTE root@serv0001 serialno=1
The key's randomart image is:
+--[ED25519 256]--+
|          +.o... |
|       . . * =.  |
|E       + + @.+  |
| o.      + * B.+ |
|.o      S + O.o +|
|o      . o = o.+o|
|.     + .    ..+o|
| .   o .      .oo|
|  .oo           o|
+----[SHA256]-----+

<ホスト鍵の置き換え>
作成した鍵で以下のホスト鍵を置き換えます。
・/etc/ssh/ssh_host_rsa_key
・/etc/ssh/ssh_host_ecdsa_key
・/etc/ssh/ssh_host_ed25519_key

<DSA鍵の無効化>
「/etc/ssh/sshd_config」を修正して、DSA鍵を無効化します。

#HostKey /etc/ssh/ssh_host_dsa_key

<サーバの再起動>
SSHサーバを再起動します。

$ sudo service sshd restart

<テスト>
再接続を試みるとホスト鍵が変更されて、ログインに失敗します。

$ ssh user0001@serv0001
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:4GwvIwK/NPAFGkCIOwJZG0DNFFHc3CLQExT0Rj7RPPc.
Please contact your system administrator.
Add correct host key in /home/user0001/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user0001/.ssh/known_hosts:1
  remove with:
  ssh-keygen -f "/home/user0001/.ssh/known_hosts" -R localhost
ECDSA host key for serv0001 has changed and you have requested strict checking.
Host key verification failed.

登録済みのホスト鍵の指紋を削除して、接続し直します。控えておいたホスト鍵の指紋と照合し、正しければ接続を行います。

$ ssh-keygen -R serv0001
# Host localhost found: line 1
/home/user0001/.ssh/known_hosts updated.
Original contents retained as /home/user0001/.ssh/known_hosts.old
$ ssh user0001@serv0001
The authenticity of host 'serv0001 (X.X.X.X)' can't be established.
ECDSA key fingerprint is SHA256:4GwvIwK/NPAFGkCIOwJZG0DNFFHc3CLQExT0Rj7RPPc.
Are you sure you want to continue connecting (yes/no)? yes

OpenSSHの認証用の鍵の生成と配置(クライアント側)

認証用の鍵を、クライアント側で生成します。

<認証用の鍵の作成>
ssh-keygenコマンドで認証用の鍵を作成します。認証用の鍵では、パスフレーズの設定を忘れずに行います。作業は、認証用の鍵の秘密鍵をクライアント側に配送しなくて済むように、クライアント側で行います。

・RSA

$ ssh-keygen -t rsa -b 4096 -C "user0001@client01 serialno=1"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user0001/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user0001/.ssh/id_rsa.
Your public key has been saved in /home/user0001/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WDjNcNey1iCmpx85YQGrqLrNg67Bw4MEMZC6B4Xo75o user0001@serv0001 serialno=1
The key's randomart image is:
+---[RSA 4096]----+
|*o    o.. ..     |
|+o.    B+.o .    |
|+.    +o+o =     |
|+. . ..++ o .    |
| +o . .+S+       |
|*...  . +        |
|+B.    . o       |
|o+=.    .        |
|*E+.             |
+----[SHA256]-----+

・ECDSA

$ ssh-keygen -t ecdsa -b 521 -C "user0001@client01 serialno=1"
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/user0001/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user0001/.ssh/id_ecdsa.
Your public key has been saved in /home/user0001/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:RctV77/+rSTNEIcO8RelCX/fJZobp/SZXw2X1GfPXD8 user0001@serv0001 serialno=1
The key's randomart image is:
+---[ECDSA 521]---+
|          o o.o..|
|         o = + =.|
|          = + B.O|
|         . o *.BX|
|        S   B oEX|
|           . X =+|
|            + B +|
|             o .+|
|              o+=|
+----[SHA256]-----+

・ED25519

$ ssh-keygen -t ed25519 -C "user0001@client01 serialno=1"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user0001/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user0001/.ssh/id_ed25519.
Your public key has been saved in /home/user0001/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:9C8A0k5ukUod3jvbvnte4dzEoSCYvH4pzoodCJzI6hQ user0001@serv0001 serialno=1
The key's randomart image is:
+--[ED25519 256]--+
|      .          |
|     +.+o        |
|    o O+o. .   . |
|+ .. * +.o. . ...|
|.E  . +.S .  .. o|
|. o ...  =.. o + |
|.. . . o.oo . + .|
|o   o + o. ...   |
| . . o.o  +=.    |
+----[SHA256]-----+

公開鍵暗号方式として、ECDSAを使用することとし、以下の公開鍵をサーバに移送します。
・id_ecdsa.pub
※できれば、ネットワーク越しは避けたいが・・・

$ scp ./id_ecdsa.pub user0001@serv0001:/home/user0001

公開鍵を配置するディレクトリを作成します。

$ mkdir /home/user0001/.ssh
$ chmod 700 /home/user0001/.ssh
$ ls -ld /home/user0001/.ssh
drwx------ 2 user0001 user0001 4096  2月 18 20:48 /home/user0001/.ssh

移送した公開鍵を、接続先ユーザの「authorized_keys」ファイルに追記します。

$ cat ./id_ecdsa.pub >> /home/user0001/.ssh/authorized_keys
$ chmod 600 /home/user0001/.ssh/authorized_keys
$ ls -l /home/user0001/.ssh/authorized_keys
-rw------- 1 user0001 user0001 282  2月 18 20:48 /home/user0001/.ssh/authorized_keys
$ rm -i ./id_ecdsa.pub

クライアント側で、別のターミナルを起動して、認証鍵を使用してリモートログインできることを確認します。

$ ssh user0001@serv0001
Enter passphrase for key '/home/user0001/.ssh/id_ecdsa':

鍵のバックアップを取得

クライアント側での鍵の消失対策として、以下のバックアップを取得しておきます。
・クライアント側の秘密鍵と公開鍵
・サーバ鍵の指紋(known_hosts)
※サーバ側の鍵のバックアップは、秘密鍵が漏洩しないように取得する必要があります。安易にネットワーク越しに転送しないようにしましょう。

認証方式を公開鍵認証のみに制限

現状では、パスワード認証も引き続き可能になっていますので、パスワード認証を不可にして、公開鍵認証のみに制限します。

以下の通り、/etc/ssh/sshd_configの設定を変更します。

PasswordAuthentication no

念のため、以下であることも確認します。

PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes

SSHサーバを再起動します。

$ sudo service sshd restart

鍵なしの場合は、以下のようにアクセスできなくなります。

$ ssh user0001@serv0001
Permission denied (publickey).

以降、厳密に鍵なしではアクセスできなくなるため、鍵の紛失や設定ミスに備えて、複数の管理者IDを用意するなどは検討したほうが良いと思います。

使用される暗号化方式の確認と制限

使用される暗号化方式を確認します。脆弱性が指摘されているプロトコルが含まれている場合は、無効化します。
<サーバ側で使用される暗号化方式の確認>
サーバ側で使用される暗号化方式を確認します。脆弱性が指摘されているプロトコルが含まれている場合は、設定ファイル「/etc/ssh/sshd_config」で無効化します。
・公開鍵暗号(ホスト鍵、認証用の鍵の生成に使用する暗号化方式)

$ sudo /usr/sbin/sshd -T | grep pubkeyacceptedkeytypes
pubkeyacceptedkeytypes ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa

・鍵交換アルゴリズム(通信に使用する共通鍵の鍵交換方式)

$ sudo /usr/sbin/sshd -T | grep kexalgorithms
kexalgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1

・共通鍵暗号(通信に使用する共通鍵暗号化方式)

$ sudo /usr/sbin/sshd -T | grep ciphers
ciphers chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com

・メッセージ認証コード(通信の改ざんチェックを行う方式)

$ sudo /usr/sbin/sshd -T | grep macs
macs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1

<クライアント側で使用される暗号化方式の確認>
クライアントでは、以下のコマンドで使用可能な暗号化方式が表示されます。
・公開鍵暗号「ssh -Q key」
・鍵交換アルゴリズム「ssh -Q kex」
・共通鍵暗号「ssh -Q cipher」
・メッセージ認証コード「ssh -Q mac」
デフォルトで有効になっている暗号化方式や優先順位は、「man 5 ssh_config」コマンドで確認する必要があります。暗号化方式の有効化、無効化は以下の方法で行います。
・システム全体の設定「/etc/ssh/ssh_config」
・ユーザ毎の設定「~/.ssh/config」
・コマンドラインによる指定

IPアドレスによるアクセス制限

アクセスする端末のIPアドレスが固定で決まっている場合には、「/etc/ssh/ssh_config」の「AllowUsers」の指定を使用して、特定のIPアドレスからのみのアクセスを許可するように設定することができます。

AllowUsers *@X.X.X.X

ポート番号の変更

必要に応じて、「/etc/ssh/ssh_config」のポート番号の設定を変更します。インターネット上のサーバの場合は、デフォルトの「22」を1024以上の値に変更すると不正アクセスを減らすことができるかもしれません。

Port 22

SSHサーバのセキュリティ強化

必要に応じて、「/etc/ssh/ssh_config」の以下の設定を変更します。
・ログイン成功までの時間
・rootユーザのログイン禁止
・設定ファイルの権限の検証

LoginGraceTime 120
PermitRootLogin prohibit-password
StrictModes yes

参考情報

OpenSSH

広告(書籍)