server-memo.net

ssh公開鍵認証方式で接続

      2016/01/22

SSH鍵認証について

sshの接続には、通常のユーザ名とパスワードによる認証方式「パスワード認証」以外にも、公開鍵、秘密鍵と呼ばれるものを使用した「公開鍵認証方式」があります。
この公開鍵認証方式は、サーバ側に公開鍵を置いておき、秘密鍵を持っているクライアントから接続できるという接続方式です。

この方式のメリットは、秘密鍵さえ漏れなければ意図しない第三者がサーバに接続することが出来なくなるという点です。
パスワード認証方式では、ユーザ名とパスワードが漏れてしまえば、どのクライアントからでも簡単に接続可能となるので、鍵認証方式の方が安全性がより高いものとなります。

ただし、この「公開鍵認証方式」のデメリットとしては、秘密鍵がなければ接続出来ないので、外出先からサーバにSSH接続したい場合など、秘密鍵がないクライアントからサーバのメンテナンスが出来なくなってしまう点です。(いつも秘密鍵を持ち歩いていれば良いだけですが・・・)

鍵認証設定

鍵の作成について

鍵はどっちで作るのが良いの?

公開鍵認証方式でSSH接続を行うために、まず公開鍵と秘密鍵を作成していくのですが、この鍵作成作業はサーバ側、クライアント側どちらでも作成することが出来ます。

では、この鍵生成作業はどちらで実行するのが良いのでしょう?

色々と調べてみたのですが、鍵作成作業はクライアント側で作成したほうが良いらしいです。
SSHでサーバに接続し鍵を作成すると、作成した秘密鍵をクライアントに持ってくる作業が発生します。scpなどを使えば通信経路は暗号化されているとはいえ、インターネットやLAN上に秘密鍵が流れてしまうのは、セキュリティ上あまり良くないということでした。

また、サーバ側で秘密鍵の削除し忘れなどが起こった場合、そこから秘密鍵が漏れてしまうといった可能性もあるため、クライアント側で作成したほうが良いといった理由もあるようです。

秘密鍵・公開鍵作成

今回はクライアント側で鍵を作成し、サーバへ転送する方式で設定を行っています。
クライアント側の作業はTeraTermを使用した場合を例にして、手順を説明します。
※TeraTerm以外の鍵作成方法はそれぞれ別ページで説明します。

  • CentOSでの鍵作成方法
  • TeraTerm起動

    TeraTermを起動し、「設定」-「SSH鍵生成」を選択します。

    TeraTerm鍵作成

    「鍵の種類」欄で作成する鍵の暗号方式を選択し、「生成」ボタンを押下します。

    今回は暗号化強度が高い「ECDSA-521」を選択していますが、サーバ側やクライアント側が「ECDSA」方式に対応していない場合は、「RSA」方式を選択し、ビット数は2048以上が良いと思います
    ※「ECDSA」はopenssl-5.7から対応しています。

    ssh鍵作成-TeraTerm002

    秘密鍵・公開鍵の保存

    鍵のパスフレーズを入力し、「公開鍵の保存」「秘密鍵の保存」ボタンを押下し、鍵を任意の場所に保存します。

    「ECDSA」方式で生成した鍵の名前はそれぞれ下記のとおりとなります。

    • 秘密鍵 id_ecdsa
    • 公開鍵 id_ecdsa.pub

    ssh鍵作成-TeraTerm009

    ※RSA方式で作成するとこんな感じのファイル名になります。

    • 秘密鍵 id_rsa
    • 公開鍵 id_rsa.pub

    鍵の生成と保存が完了しましたら、右上の「×」を押下し画面を閉じます。

    秘密鍵にパスフレーズを設定しない場合

    「秘密鍵の保存」ボタンを押下した際に、「空のパスワードを使用しますか?」と警告画面がでます。「はい」ボタンを押下することで、SSHで接続する際にパスワードの入力が必要無い鍵を作成することが出来ます。

    ただし、この場合、秘密鍵があるクライアントからは、何の認証もなくサーバへログイン出来てしまいますので、クライアントの管理を十分に注意して運用する必要があります。

    ssh鍵作成-TeraTerm001

    公開鍵の転送

    作成した公開鍵を、サーバ側に転送するのですが、今回は「scp」を使用した方法を解説します。

    サーバへ接続

    「ファイル」-「新しい接続」と選択し、公開鍵を設定するサーバに今作成した鍵を使用するユーザで接続します。
    ※私は「tamohiko」ユーザで鍵認証接続をしたいので、このユーザで接続しました。

    ssh鍵作成-TeraTerm006

    サーバに接続した状態のまま、「ファイル」-「SSH SCP」と選択します。

    ssh鍵作成-TeraTerm010

    「TTSSH:Secure File Copy」画面が表示されるので、「...」ボタンを押下し、先ほど作成した公開鍵を選択し、「Send」ボタンを押下し、公開鍵をサーバに転送します。

    ssh鍵作成-TeraTerm011

    公開鍵はユーザのホームディレクトリに転送されます。
    ※私の場合は「/home/tamohiko/id_ecdsa.pub」に転送されています。

    公開鍵の設置

    ここからはサーバ側での作業となります。

    公開鍵の内容は、「ユーザホームディレクトリ/.ssh/authorized_keys」ファイルに記述する必要があります。

    私の場合ですと、以下のファイルとなります。
    /home/tamohiko/.ssh/authorized_keys

    このファイルが無い場合は自分で作成する必要がありますので、ファイルを作成するところからの手順を下記に記述します。

    「authorized_keys」ファイル作成

    ※ファイルがある場合はこの手順は飛ばして下さい。

    $ cd   (自分のホームディレクトリに移動)
    $ mkdir .ssh
    $ chmod 700 .ssh/
    $ touch .ssh/authorized_keys
    $ chmod 600 .ssh/authorized_keys
    

    公開鍵の転記

    「authorized_keys」ファイルの作成が完了しましたら、先ほど転送した公開鍵の内容を「cat」コマンドを使用して転記していきます。

    $ cat id_ecdsa.pub >> .ssh/authorized_keys
    

    sshサーバ設定

    「/etc/ssh/sshd_config」を編集しパスワード認証を出来ないようにし、秘密鍵がないクライアントからの接続を拒否するようにします。

    $ su -
    # cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_yyyymmdd
    # vi /etc/ssh/sshd_config
    

    設定変更箇所

    変更前

    PasswordAuthentication yes

    変更後

    PasswordAuthentication no

    設定反映

    sshdを再起動することで設定反映することが出来ます。

    注意点!!

    現在SSHで接続しているのならば、その接続はそのまま接続して置いたままにしてください。
    接続試験は、新しくSSHクライアントを立ち上げて行います。でなければ設定が失敗した場合に、SSHでサーバに接続することが出来なくなり、サーバのある場所にダッシュするはめになります・・・

    # service restart sshd
    # service sshd restart
    

    ※2015.09.02 コマンドが間違っていたので修正しました。

    CentOS7ならsystemctlコマンドでも再起動できます。

    # systemctl restart sshd
    

    接続試験

    新しくTeraTermを立ち上げて接続試験をします。

    「ユーザ名」と「パスフレーズ」を入力します。
    (パスフレーズは鍵を作成した際に設定したものを入力します)

    「RSA/DSA/ECDSA/ED25519鍵を使う」にチェックを入れ、「秘密鍵」ボタンを押下し秘密鍵を選択し、「OK」ボタンを押下します。

    ssh鍵作成-TeraTerm015

    設定に問題がなければ無事ログインできるはずです。

    ssh鍵作成-TeraTerm017

    パスワード認証が出来ないことの確認

    通常のパスワード認証で接続が出来ないことも確認してください。

    接続できないことが確認できたら、作業完了となります。
    お疲れ様でした。

     - SSH