最終更新日 2024年10月24日
この記事はこんな人におすすめ!
公開鍵認証の設定方法について知りたい
仮想マシンで公開鍵認証の勉強をする場合、どのような設定が必要か知りたい
1から公開鍵認証の設定をやってみたい
記事の概要
公開鍵認証をするためにどのような設定をするのか、公開鍵認証はどのような動作をするのか知るために、
Linuxで仮想マシンを2つ使用して、公開鍵を作成し、その公開鍵を仮想マシンに登録、SSHで公開鍵を使用して
ログインするということを行いました。
仮想マシンは作成したばかりのものを使用したため、1から公開鍵認証の設定を行う方法が分かります。
OpenSSH7.0を使用して公開鍵を作成していますが、このバージョンでは「dsa」のタイプの公開鍵はサポートされていないようです。そのため、「RSA」を使用して公開鍵を作成しています。
公開鍵認証について
ホストからホストへ(あるサーバーから別のサーバーへ)ログインする際に使用する認証には、
パスワードを使用して認証する以外に、公開鍵認証という方法があります。
公開鍵認証では、通信を行うホスト間で、一対である公開鍵と秘密鍵のペアを使用して認証を行います。
そのため、公開鍵認証を行うためには、事前に公開鍵を使用してログインする側(クライアント側)のユーザーの
公開鍵を、ログインされる側(サーバー側)に登録する必要があります。
公開鍵認証の検証内容
今回の検証では、仮想マシン2台を使用して、1から設定を行います。
やはり、1から設定を行うことで、公開鍵認証に必要な設定も理解することが出来、非常に勉強になります。
公開鍵認証について理解するには、公開鍵、秘密鍵を作成するだけでは不十分だと感じました。
公開鍵で認証するためには、いくつか設定ファイルを編集したり、使用する公開鍵を送ったりと
様々な作業が発生します。
これらの作業を身をもって体験するには、やはり、仮想マシンで実際に自分で作業を行う必要があると感じています。
<使用するもの>
・VMware 仮想マシンA Centosバージョン7
・VMware 仮想マシンB Debian 11x
※上記の仮想マシンA、Bはデフォルトの設定状態で使用。(仮想マシン出来立てほやほや)
※WindowsのPC(メモリ8G)で上記の2種類の仮想マシンを動作させました。
そのため、メモリの使用率が高かったです。
1.仮想マシンAと仮想マシンBで「/etc/ssh/sshd_config」ファイルの設定内容を変更。
2.仮想マシンAと仮想マシンBでsshdサービスを再起動。
3.仮想マシンBで「authorized_keys」というファイルを作成。
4.仮想マシンAでRSA鍵を作成。
5.仮想マシンAからSCPコマンドを使用して、仮想マシンBに公開鍵を転送。
6.仮想マシンAから仮想マシンBにSSH接続し、SCPで転送したファイルを「authorized_keys」に上書き。
7.仮想マシンAから仮想マシンBに公開鍵認証でSSH接続。
「/etc/ssh/sshd_config」ファイルの設定内容を変更
まず、sshでの接続方法などの設定が記述されている、「/etc/ssh/sshd_config」ファイルの設定内容を変更します。
この設定変更を行わないと、公開鍵での認証が出来なかったりします。この設定変更は仮想マシンAと仮想マシンBの
両方で、「/etc/ssh/sshd_config」ファイルの設定内容を変更していきます。
※「/etc/ssh/sshd_config」ファイルの設定内容の詳細は↓のサイトでご確認いただければ幸いです。
sshd_configの設定項目の理解を目指す | Unskilled?
仮想マシンAの「/etc/ssh/sshd_config」ファイルを変更する
変更する部分は以下の2つです。
・「#PubkeyAuthentication yes」⇒「PubkeyAuthentication yes」
※「#」を抜くことでアンコメントアウトし、公開鍵認証を有効にしています。
・「UsePAM yes」⇒「UsePAM no」
変更する方法は、/etc/ssh/sshd_configファイルの、上記2項目を書き換えて保存するだけで大丈夫です。
変更後の仮想マシンAの「/etc/ssh/sshd_config」ファイルの中身は↓のような感じです。
[root@centosvm ~]# cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes
# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
# problems.
UsePAM no
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation sandbox
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
[root@centosvm ~]#
仮想マシンBで「/etc/ssh/sshd_config」ファイルを変更する
仮想マシンBでも同様にファイルの中身を変更します。
基本的に仮想マシンAと同じ内容にしてもらえれば大丈夫です。
仮想マシンBで変更した項目
・「#HostKey /etc/ssh/ssh_host_rsa_ke」⇒「HostKey /etc/ssh/ssh_host_rsa_key」
・「#HostKey /etc/ssh/ssh_host_ecdsa_key」⇒「HostKey /etc/ssh/ssh_host_ecdsa_key」
・「#HostKey /etc/ssh/ssh_host_ed25519_key」⇒「HostKey /etc/ssh/ssh_host_ed25519_key」
・「#PubkeyAuthentication yes」⇒「PubkeyAuthentication yes」
・「UsePAM yes」⇒「UsePAM no」
・「#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2」⇒「AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2」
設定変更後の仮想マシンBの「/etc/ssh/sshd_config」ファイルの中身です。
※仮想マシンAはcentos、仮想マシンBはdebianということで、デフォルトの設定内容が異なり、
仮想マシンBは変更する項目が多かったです。
@debianvm:~$ cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
Include /etc/ssh/sshd_config.d/*.conf
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
PubkeyAuthentication yes
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM no
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
@debianvm:~$
仮想マシンAと仮想マシンBでsshdサービスを再起動
「/etc/ssh/sshd_config」ファイルの設定内容を変更したので、設定内容を読み込んでサービスを起動してもらうために、
仮想マシンAと仮想マシンBで、sshdを再起動させます。
1.仮想マシンAでsshdを再起動
コマンド:systemctl restart sshd.service
[root@centosvm ~]# systemctl restart sshd.service
[root@centosvm ~]#
2.仮想マシンBでsshdを再起動
コマンド:systemctl restart sshd.service
[root@debianvm ~]# systemctl restart sshd.service
[root@debianvm ~]#
仮想マシンBで「authorized_keys」ファイルを作成
注意:すでにこちらのファイルが作成されている場合は、別途作成する必要はありません。
仮想マシンBでの公開鍵認証を設定(/etc/ssh/sshd_config ファイル)では、「~/.ssh/authorized_keys」という
ファイルに記載されている、公開鍵を使用して認証を行うように設定されています。
そのため、公開鍵を使用して認証(仮想マシンBにアクセスしてくるクライアントを公開鍵を使用して認証)するには
仮想マシンBにアクセスしてくるサーバーの公開鍵をこちらのファイルに登録する必要があります。
コマンド:touch ~/.ssh/authorized_keys
[root@debianvm ~]# touch ~/.ssh/authorized_keys
[root@debianvm ~]#
仮想マシンAでRSA鍵を作成
仮想マシンA(仮想マシンBにアクセスする側)で公開鍵認証で使用する公開鍵(RSA)を作成します。
コマンド:ssh-keygen -t rsa
[root@centosvm ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Yx0rQdxzccD0YkwunrWCDHtoLRyofwOD63bt1BcCT/k root@centosvm.goritarou.com
The key's randomart image is:
+---[RSA 2048]----+
| ... o=o. |
| . ...o+oo |
| . + + oo* . |
| o . @ * B o |
| o o * S E . |
| o + = + o |
| . ..+ . . |
| .. .o.. . |
| ... .. |
+----[SHA256]-----+
[root@centosvm ~]#
<補足>
SSHの鍵を作成したときに入力する項目の内容を↓に記載します。
Enter file in which to save the key (/root/.ssh/id_rsa):デフォルトのままエンター
Enter passphrase (empty for no passphrase):設定するパスワードを入力
Enter same passphrase again:設定するパスワードを入力
Your identification has been saved in /root/.ssh/id_rsa:秘密鍵の保管場所
Your public key has been saved in /root/.ssh/id_rsa.pub:公開鍵の保管場所
仮想マシンAからSCPコマンドを使用して、仮想マシンBに公開鍵を転送
仮想マシンAで作成した、公開鍵を仮想マシンBに、ファイル名「publickey」として転送します。
コマンド:scp /root/.ssh/id_rsa.pub username@debianvm.goritarou.com:publickey
[root@centosvm ~]# scp /root/.ssh/id_rsa.pub username@debianvm.goritarou.com:publickey
username@debianvm.goritarou.com's password:
id_rsa.pub 100% 409 234.9KB/s 00:00
[root@centosvm ~]#
※上記のコマンドを使用して名前解決が出来ないというエラーが出たときは、
/etc/hostsファイルを編集するなどして名前解決の設定をしてください。
名前解決の設定方法は↓の記事を確認してみてください。
仮想マシンAから仮想マシンBにSSH接続し、SCPで転送したファイルを「authorized_keys」に上書き
・仮想マシンAから仮想マシンBにSSH接続
コマンド:ssh username@debianvm.goritarou.com
[root@centosvm ~]# ssh username@debianvm.goritarou.com
wakisakakotaro@debianvm.goritarou.com's password:
Last login: Thu Aug 11 06:29:02 2022 from 192.168.74.140
wakisakakotaro@debianvm:~$
・仮想マシンBで「publickey」を「authorized_keys」に上書き
コマンド:cat publickey > ~/.ssh/authorized_keys
username@debianvm:~$ ls
1 publickey ダウンロード テンプレート デスクトップ ドキュメント ビデオ 音楽 画像 公開
username @debianvm:~$
username @debianvm:~$
username @debianvm:~$ cat publickey > ~/.ssh/authorized_keys
・「authorized_keys」ファイルを所有者のみ読み書きできるように変更する
コマンド:chmod 600 ~/.ssh/authorized_keys
username @debianvm:~$ chmod 600 ~/.ssh/authorized_keys
username @debianvm:~$
仮想マシンAから仮想マシンBに公開鍵認証でSSH接続
仮想マシンAから仮想マシンBにSSH接続する。
コマンド:ssh usename@debianvm.goritarou.com
[root@centosvm ~]# ssh usename@debianvm.goritarou.com
Enter passphrase for key '/root/.ssh/id_rsa':
Last login: Thu Aug 11 06:31:24 2022 from 192.168.74.140
公開鍵認証に失敗したときの対処方法
公開鍵にかかわらず、認証に失敗したときはログを確認しましょう。
認証に失敗したときに確認するログは↓に格納されています。
格納場所:/var/log/auth.log
コマンド:cat /var/log/auth.log
root@debianvm:/home/username# cat /var/log/auth.log
Aug 11 06:31:06 debian sshd[4385]: Disconnected from user username 192.168.74.140 port 37102
Aug 11 06:31:20 debian sshd[4413]: userauth_pubkey: key type ssh-dss not in PubkeyAcceptedKeyTypes [preauth]
Aug 11 06:31:20 debian sshd[4413]: userauth_pubkey: key type ssh-dss not in PubkeyAcceptedKeyTypes [preauth]
Aug 11 06:31:24 debian sshd[4413]: Accepted password for username from 192.168.74.140 port 37104 ssh2
Aug 11 06:32:36 debian sshd[4415]: Received disconnect from 192.168.74.140 port 37104:11: disconnected by user
Aug 11 06:32:36 debian sshd[4415]: Disconnected from user username 192.168.74.140 port 37104
上記のログはdsaのタイプの鍵は使用できないという旨のログです。
OpenSSH7.0以降のバージョンでは、dsaは使用できないようです。
■参考資料:
OpenSSH 7.0 以降は DSA 鍵が利用できない (cles.jp)