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
参考情報
広告(書籍)