kakiro-webカキローウェブ

システム開発情報とコンピューター書籍の紹介サイト

CentOS7.2 64bit SSHで公開鍵認証を使用

CentOS7.2 64bitをインストールした直後の状態では、SSHによる外部からの接続は、どのユーザーでもパスワード認証で行えるようになっています。

外部からの接続はSSHの設定で特定のユーザーやホストに制限したり、firewalldの設定で特定のホストに制限したりすることもできますが、公開鍵認証を使用することで鍵を所有している特定の端末から、特定のユーザーでの接続のみを許可するように制限することができます。

※TCP Wrappersを使用した設定ファイル「/etc/hosts.allow」、「/etc/hosts.deny」によるアクセス制御は、OpenSSHのバージョン6.7で使用できなくなっているようです。(OpenSSH6.7のrelease notesを参照)

※CentOS7.2の標準リポジトリからインストールできるOpenSSHのバージョンは6.6のため、TCP Wrappersを使用することはできるようになっています。

ここでは、CentOS7.2の標準リポジトリからインストールできるOpenSSH6.6.1p1で公開鍵認証を使用して、SSHによる外部からの接続は、指定の鍵を所有する端末から、指定のユーザーによる接続のみを許可するように制限する方法を、以下に示します。

公開鍵認証の概要

初めに公開鍵認証の概要を簡単でありますが、記載しておきます。

  • 公開鍵認証では、秘密鍵と公開鍵のペアを使用します。

  • 秘密鍵で暗号化したデータは、ペアとなる公開鍵でのみ復号化が可能となります。

  • 接続元の端末が秘密鍵を所有し、接続先の端末が公開鍵を所有するようにします。

  • 接続元の端末が秘密鍵で暗号化したデータと、暗号化前のデータを接続先に送信します。接続先の端末が受信した暗号化されたデータを公開鍵で復号化し、暗号化前のデータと一致することで、データを送信したのが秘密鍵を持つ端末であることを確認します。

  • 公開鍵は一般に公開しても問題にはなりませんが、秘密鍵は絶対に外部には漏れないようにする必要があります。

  • 認証時に送信するデータは認証のためだけに使用されるものなので、外部に漏れても問題にはなりません。

SSHで接続用のユーザーを作成

SSHでの外部からの接続にrootユーザーを使用するのはセキュリティー上思わしくないため、接続用のユーザーを別途作成します。

以下のコマンドを実行して、ユーザーの作成を行います。

# useradd user01
  • ユーザーの作成には、「useradd」コマンドを使用します。

  • コマンドの引数に、作成するユーザーの名前を指定します。

    ここでは、ユーザー名を「user01」としています。

以下のコマンドを実行して、作成したユーザーにパスワードを設定します。

# passwd user01
  • ユーザーのパスワードの設定には、「passwd」コマンドを使用します。

  • コマンドの引数に、パスワードを設定するユーザーの名前を指定します。

    ここでは、ユーザー「user01」のパスワードを設定しています。

  • コマンドを実行するとパスワードの入力を2回求められますので、同じパスワードを2回入力します。

公開鍵認証用の秘密鍵と公開鍵のペアを作成

公開鍵認証用の秘密鍵と公開鍵のペアの作成は、本来であれば接続元の端末で作成し、接続元の端末から接続先の端末に公開鍵を送信することで、秘密鍵を持っているのが接続元の端末であることを認証できるのが望ましいです。

鍵の作成を接続先の端末や、接続元とは別の端末で行う場合は、作成した秘密鍵を接続元の端末に送信する際に、絶対に外部には漏れないように注意する必要があります。

以下のようなコマンドを実行して、公開鍵認証用の秘密鍵と公開鍵のペアの作成を行います。

※rootユーザーで実行する必要はありません。

# ssh-keygen -t rsa -f /xxx/ssh/user01-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /xxx/ssh/user01-key.
Your public key has been saved in /xxx/ssh/user01-key.pub.
The key fingerprint is:
bd:67:e5:77:05:47:44:b5:cc:b3:5e:96:b0:a9:96:fa root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|               o*|
|              o..|
|             ..=.|
|         .    +o+|
|        S .  o.o+|
|           .oo..o|
|          .+o ..o|
|          oo   ..|
|         ..E     |
+-----------------+
  • 公開鍵認証用の秘密鍵と公開鍵のペアの作成には、「ssh-keygen」コマンドを使用します。

  • 「-t」オプションで、作成する鍵の種類を指定します。

    「rsa」と指定すると、SSHプロトコルのバージョン2用のRSA鍵が作成されます。公開鍵暗号の方式には主にRSAが使用されますので、ここでもRSAを使用するように指定しています。

  • 「-f」オプションで、作成する秘密鍵の名前を指定します。

    ここでは、ディレクトリ「/xxx/ssh/」に「user01-key」という名前の秘密鍵を作成するようにしています。

    公開鍵の名前は、秘密鍵の名前の後ろに「.pub」が付いたものになります。

    「-f」オプションを指定しなかった場合は、コマンドの実行時に秘密鍵の名前の入力を求められ、入力しなかった場合は、コマンドを実行しているユーザーのホームディレクトリ配下に「.ssh/id_rsa」という名前で作成されます。

  • コマンドの実行時に秘密鍵に設定するパスフレーズの入力を2回求められますので、同じパスフレーズを2回入力します。

    このパスフレーズは、接続元の端末で秘密鍵を使用する際に指定が必要なものとなり、接続先の端末には送信されません。

  • このコマンドの実行により、秘密鍵「/xxx/ssh/user01-key」と、公開鍵「/xxx/ssh/user01-key.pub」が作成されます。

  • ※鍵のサイズを「-b」オプションで指定することもできます。指定しなかった場合は、2048ビットとなり、鍵の強度として十分なものになります。

作成された秘密鍵の内容

作成された秘密鍵の内容は、以下のようになります。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9A2BF4E76383FEF9E240C7AA83D0D289

3uSm0SgXwXXqvx7TJwQNAq7aFzziEprmtl9Wc/rqU94Pbo8Zg6NRB2yGFmQsFirZ
Xt7P/3mZe/CaEtSBudhuTk3kbhkgIyJayxdMdqvmwLWDJ2TnB6CrcXKeGZ4jafCq
voygrFr/Ul7am+W9uVBKnG4BILbr7LCRTYPiwhFjbMfb1PqK3UdqA7jVHMnhGWFa
iacYsPPO7EjxoXoQQz+NiRYIBcMyh/9/dmzMo8aE6Cd3dc/CIVTvyJOhGqnwYhJo
wYBtvVkXyJFwI5/BtIC2VA+KXPW2ScR9Yr2xQgP4Uga7q2Ji9L3wJZIkqGS8NWdm
SeK3WKKHn6a330ZLqcUCVrPPvxfc8S3cOQoE8fefbU9avP9doVSzxXbJuAJCLL8Q
IbM/KOJvXIV012KO1IqIVjRFfow8Ka2oacKq7tawtqg8uKgCV2809gyi8VCUyvmU
CcYQwyIecx4w9NdvHNOIQTYFa2x8yn6a+b6UXWK4RO+ESrIDFQ7eqGQXqjNFmgps
4eEkptyI3nnEPVU07XBQV17uKf3E59H3k/YYZOxY2IwruyAXBTdLY45OZUQAtPq3
KRB1+jXykNHUQrwkrEfSke+7PTCZ/d4X+MaUAnl+xr1ECP8+HUk6ldHdtd3DX/rh
QlgJYX0ar3VFM/k8507g26BnP0rKfibDOK5nwQlZa/zQbeK6jnlS1U0MiA5nLhrH
bEfI0XLNTNFQ64JZsIxYij19sDQ2yBpxDykzjLlEFGHqSB7H7uGhyS/DsdRCy+Ux
t6YH8GxAGuJpwjrtcgHm5C5PorJXjhHsYWsHVxKxt0LjXHG49O7W0rfqyivvvI3p
7cRfTt5AZpI2L2AHIkKFq8EyZ8Ahg90hLCH7r8WJ6t6tt/shxx4NLQKU0am+ibKF
v3I78Lh9FSr8zLYe8oOKWAaPR5nGhX6mosFpC0sBLtpfR5a9/fau6npY8ke9gPeF
L6yc71PxY39ZmXLhFFqcX/uvZGKJ/duBQYcqC28KN3acrD+n1DIfM1uM1tVGItuM
0B+NENfydO/7PezvAdFklXYdRRt0xbv8F8/TojCeXfntFhuyZ/XoGXr+4QVZ72hK
sMHClCRdfzkxSJa+GPZUBKZUOoq6522zWywD3oRTXL8qrxikyFb7G0kjzirBSPv+
kqlTTW624Hko1znODlkdch1YHwe7/ObV7IEmPuTwAMlNrJpaR8qiJoGd8L0bWq7E
GT6gS2aMLqszLUmk4BpU1BN9FHIAB+1dz+oJmyJxY5USz5DhwDM9Mfipr+/a3M9P
2veoiQm2GVcv8cEkMm1M0HY+XV28fo/YCaJpq9qXi7Po+msjfNM9xSIrDvdpuOcT
6jb39A8X50w6RYw2N5+yEG3DkUAOnddj8a7JqX3bejNEWXUYEc5jAYkt/yLJH1IN
t1KiEAOiS7aXzYgtx+TWs3sqlPwWiHnsltsgghYsIGBEnNKNuGd0PYjrt6SurLQZ
DmkR1paVNrwBPZMWU3nwcbSzZgivtAA3AwqAqDKSESshj3Rzd1RiA3VkLsplPg+Y
w/JJUWh5hXcG06X+QGTUGJ0Gv59ar74Z2+jsWMcZQPfdR++0ERKNSAcGIFMcNrik
-----END RSA PRIVATE KEY-----

作成された公開鍵の内容

作成された公開鍵の内容は、以下のようになります。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8KKmC9iYe4xo4fyyuq70Y7gU5eMZBx85Fo0Xl1uYufRzYr/ddwtRGUdnr7v9nbK3IfEuc3WFpsU0bExrSOan/dvdZV+SmB7PVgqtMW29Arw2gqfvISNDuOpl9h0Nb/s3kG5+xeDhLxSkrT3Xjt5Hj7XpGTWruaiE9jcML4fxanN1aHHEFIwp6BOBUQh0kKsT7mfWroDL5v5bcoSVWvZIINSBng3EkMTeTbNKcx+QBP8R0xXctztP40m/SWqbC3HIMNXkoNbVxb5kK4wNOfSM4ruWkNNVNLbkqHYa9tVkIk4T5rRsfunW16yeNbjN1X8t9AkOlbHj1lptsyQdIteo5 root@localhost.localdomain

公開鍵認証用の公開鍵を接続先の端末に登録

公開鍵認証用の秘密鍵と公開鍵のペアを作成したら、公開鍵を接続先の端末に登録する必要があります。

公開鍵の登録は、接続先の端末で接続ユーザーのホームディレクトリ配下のファイル「.ssh/authorized_key」に公開鍵の内容を追加する形で行います。

接続先の端末に接続用のユーザーでSSHのパスワード認証による接続が可能な場合

接続先の端末に、接続用のユーザーでSSHのパスワード認証による接続が可能な場合、以下のようなコマンドを実行して、公開鍵の登録を行うことができます。

※rootユーザーで実行する必要はありません。

# ssh-copy-id -i /xxx/ssh/user01-key.pub user01@xxx.xxx.xxx.xxx
  • 公開鍵認証用の公開鍵の登録には、「ssh-copy-id」コマンドを使用します。

  • 「-i」オプションで、登録する公開鍵を指定します。

    ここでは、上記で作成した公開鍵「/xxx/ssh/user01-key.pub」を指定しています。

    「-i」オプションを指定しなかった場合は、コマンドを実行しているユーザーのホームディレクトリ配下にある「.ssh/id*.pub」(「*」は任意の文字列)という名前のファイルが自動的に使用されます。

  • コマンドの引数に、公開鍵を登録する接続先のユーザーとホストを「ユーザー名@ホスト」の形式で指定します。

    ここでは、IPアドレス「xxx.xxx.xxx.xxx」の端末のユーザー「user01」に公開鍵の登録を行うようにしています。

  • コマンドの実行時に、接続ユーザーのパスワードの入力を求められますので、パスワード認証用のパスワードを入力します。

    ※上記の接続ユーザーの作成で、passwdコマンドで指定したパスワードになります。

  • このコマンドの実行により、接続先の端末の接続ユーザーのホームディレクトリ配下にファイル「.ssh/authorized_keys」が作成され、公開鍵「user01-key.pub」の内容がこのファイルに書き込まれます。

    ここでの登録先のファイルは、「/home/user01/.ssh/authorized_keys」となります。

接続先の端末に接続用のユーザーでSSHのパスワード認証による接続が不可能な場合

接続先の端末に、接続用のユーザーでSSHのパスワード認証による接続が不可能な場合、公開鍵認証用の公開鍵を接続先の端末に別の方法で配置し、以下のようなコマンドを実行して、公開鍵の登録を行います。

接続先の端末で秘密鍵と公開鍵のペアの作成を行っている場合も同様となります。

# cat user01-key.pub >> /home/user01/.ssh/authorized_keys
  • catコマンドとリダイレクトによる追記を使用して、公開鍵「user01-key.pub」の内容をユーザー「user01」のホームディレクトリ配下のファイル「.ssh/authorized_key」に追加するようにしています。

    ここでの登録先のファイルは、「/home/user01/.ssh/authorized_keys」となります。

公開鍵を登録後のファイル「authorized_keys」の内容

公開鍵を登録後のファイル「authorized_keys」の内容は、以下のようになります。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8KKmC9iYe4xo4fyyuq70Y7gU5eMZBx85Fo0Xl1uYufRzYr/ddwtRGUdnr7v9nbK3IfEuc3WFpsU0bExrSOan/dvdZV+SmB7PVgqtMW29Arw2gqfvISNDuOpl9h0Nb/s3kG5+xeDhLxSkrT3Xjt5Hj7XpGTWruaiE9jcML4fxanN1aHHEFIwp6BOBUQh0kKsT7mfWroDL5v5bcoSVWvZIINSBng3EkMTeTbNKcx+QBP8R0xXctztP40m/SWqbC3HIMNXkoNbVxb5kK4wNOfSM4ruWkNNVNLbkqHYa9tVkIk4T5rRsfunW16yeNbjN1X8t9AkOlbHj1lptsyQdIteo5 root@localhost.localdomain

公開鍵の内容がそのまま登録されるようになります。

ファイル「authorized_keys」には複数の公開鍵を登録することもでき、そのときは以下のような内容になります。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8KKmC9iYe4xo4fyyuq70Y7gU5eMZBx85Fo0Xl1uYufRzYr/ddwtRGUdnr7v9nbK3IfEuc3WFpsU0bExrSOan/dvdZV+SmB7PVgqtMW29Arw2gqfvISNDuOpl9h0Nb/s3kG5+xeDhLxSkrT3Xjt5Hj7XpGTWruaiE9jcML4fxanN1aHHEFIwp6BOBUQh0kKsT7mfWroDL5v5bcoSVWvZIINSBng3EkMTeTbNKcx+QBP8R0xXctztP40m/SWqbC3HIMNXkoNbVxb5kK4wNOfSM4ruWkNNVNLbkqHYa9tVkIk4T5rRsfunW16yeNbjN1X8t9AkOlbHj1lptsyQdIteo5 root@localhost.localdomain
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDO/D82guBkwnUr6x2HhgYLD6Wbz6SlK9goraT7/k1zFSDqLLXfI9SaNPrswhE5I64z3ujx7pAvh/y/nzQE58aIrFgpCjUa8ELTbGp9Mf+1ffyje6kx01GgtpFTSg8xmOaKcjhcLllyD+DxOBFAxOhl+B882yN1XP1r9OWP5aEpFNZfbO4hBp3IdJKDZHEyA/ffvMocFvF8fl/ChK5mwPlv8mD2Knm3L4r+jgixhTWz9+UEKAcn3GcpfOFhe5rWg9mryEO121dSdS6DklK+EmwK6y9+C8wHy/6P6GcfVN9qonIE3fCs+8N4svMeCwtaOSdvwbikvQIIKEjKmaoOTtOf root@localhost.localdomain

公開鍵は1つにつき1行のデータで登録されるようになっています。

登録した公開鍵の削除を行いたい場合は、ファイル「authorized_keys」から対象の公開鍵のデータを削除します。

パスワード認証での接続を不可能にする

SSHでパスワード認証による接続を不可能にするには、SSHサーバーの設定ファイル「/etc/ssh/sshd_config」を、以下のように変更します。

:(略)
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes
↓変更
PasswordAuthentication no
:(略)
  • 「PasswordAuthentication」に「no」と指定すると、パスワード認証が不可能になります。

設定ファイルの変更を有効化するには、以下のコマンドを実行してSSHのサービスを再起動します。

# systemctl restart sshd.service

これにより、rootユーザーも公開鍵認証の公開鍵の登録を行っていない状態では、接続ができなくなります。

特定のユーザーのみパスワード認証を可能にしたい場合

特定のユーザーのみパスワード認証を可能にしたい場合は、SSHサーバーの設定ファイル「/etc/ssh/sshd_config」の末尾に、以下のような設定を追記します。

Match User user02
PasswordAuthentication yes
  • 「Match User」に、これ以降の設定を反映させたいユーザーを指定します。

    ここでは、「user02」を指定しています。

    「Match」による指定は、次の「Match」が出現するまで有効になります。

  • 「PasswordAuthentication」に「yes」と指定すると、パスワード認証が可能になります。

    これによって、「user02」のみパスワード認証が可能となります。

設定ファイルの変更を有効化するには、以下のコマンドを実行してSSHのサービスを再起動します。

# systemctl restart sshd.service

SSHで公開鍵認証を使用して接続する

sshコマンドで接続する場合

sshコマンドで公開鍵認証を使用して接続するには、以下のようなコマンドを実行します。

※rootユーザーで実行する必要はありません。

# ssh -i /xxx/ssh/user01-key user01@xxx.xxx.xxx.xxx
  • sshコマンドの「-i」オプションで、接続先に登録した公開鍵とペアになっている秘密鍵を指定します。

    ここでは、上記で作成した秘密鍵「/xxx/ssh/user01-key」を指定しています。

  • 接続先の指定は、パスワード認証のときと同様です。

    ここでは、IPアドレス「xxx.xxx.xxx.xxx」の端末に、ユーザー「user01」で接続するようにしています。

  • コマンドの実行時に、秘密鍵に設定されているパスフレーズの入力を求められます。

    秘密鍵と公開鍵のペアの作成時に指定した秘密鍵のパスフレーズを入力します。

WindowsでTera Termを使用して接続する場合

WindowsでTera Termを使用して接続する際に公開鍵認証を使用するには、SSH認証の画面で以下のように行います。

接続先に登録した公開鍵とペアになっている秘密鍵が、Windowsの端末に保存されている必要があります。

※掲載している画面は、Windows8.1でTera Termのバージョン4.90を使用したものになります。

  • 「RSA/DSA/ECDSA/ED25519鍵を使う」にチェックを入れ、「秘密鍵」ボタンをクリックして接続先に登録した公開鍵とペアになっている秘密鍵を選択します。

  • 「パスフレーズ」には、秘密鍵と公開鍵のペアの作成時に指定した秘密鍵のパスフレーズを入力します。

CentOS7.2 64bit SSHで公開鍵認証を使用については、以上です。

Linuxの基礎知識に関するおすすめの書籍

当サイトの書籍紹介ページで、Linuxの基礎知識に関するおすすめの書籍の紹介も行っておりますので、ご覧ください。

暗号技術に関するおすすめの書籍

当サイトの書籍紹介ページで、暗号技術に関するおすすめの書籍の紹介も行っておりますので、ご覧ください。