公開鍵方式でパスワードなしのssh接続を行う
最近linuxをちょっと触る機会があったので、そのとき毎回パスワード入れてアクセスするの面倒だなぁ・・と思っていたら
パスワードなしでssh接続が出来るというのが分かったのでやってみました。
・ssh接続とは
Secure Shell(セキュアシェル)の略称で、リモートコンピュータと通信するためのプロトコル。
Windowsでいう「リモートデスクトップ」と同じ役割です。
ssh接続での認証方式には、パスワード認証と公開鍵認証があります。
デフォルトではパスワード認証になっています。
■ パスワード認証の場合
[user1@clientserver ~]$ ssh tomcat@192.168.137.127
(もしくは、[user1@clientserver ~]$ ssh tomcat@hostserver.sample-net.com としてもOK)
と入れると
tomcat@hostserver.sample-net.com's password:
パスワードを聞かれます。
これがおなじみのパスワード認証です。
■ 公開鍵認証の場合
あらかじめ、接続元でカギを作っておいて、そのカギで通信します。
パスワード認証だと適当にパスワードを入れて中に入られてしまう危険があります。
誰がサーバーに接続しているかは、「/var/log/secure」のログを見ると分かります。
Sep 5 16:25:40 aaaserver login[8276]: FAILED LOGIN SESSION FROM (null) FOR sakurai,Authentication failure
Sep 5 16:26:40 aaaserver login[8276]: FAILED LOGIN SESSION FROM (null) FOR sakurai,Authentication failure
Sep 5 16:26:59 aaaserver login[8276]: FAILED LOGIN SESSION FROM (null) FOR sakurai,Authentication failure
こんなのがずらっと並んでると思います。
上記では"sakurai"というユーザーが何度もパスワードを入れて失敗しているのが分かります。
外部からのアクセスかもしれませんし、社内であれば予想されるパスワードを入れて悪用するといったことも考えられます。
公開鍵方式の場合は、接続元で秘密鍵と公開鍵を作成し、接続先には公開鍵だけ渡します。
接続先は渡された公開鍵で暗号化し、接続元に送ります。
これを秘密鍵で復号化します。
(公開鍵暗号方式の説明はこのリンクの図が分かりやすいです)
viral-community.com
***************************
今回はこの公開鍵方式を利用して、ssh接続をパスワード入力なしで行ったときのつまずいた箇所を書き留めておきます。
(公開鍵の作成方法はネットを見れば沢山情報があるかと思うので割愛します)
・気を付けたいこと(超初心者向け)
■ 接続するユーザーで鍵を作り、接続されるユーザーに鍵を登録する
私が見たネットの説明だと「root権限で鍵を作る」と書いてありました。
何も考えず鵜呑みにしてrootで作ったら失敗しました。
接続される側の/root/.ssh/authorized_keysを確認すると分かりますが
ssh-rsa xxxABC9876564321・・・・ root@sampleserver
ssh-rsa xxxZYX1234567890・・・・ ninomiya@sampleserver
といったように、ユーザーごとに公開鍵の情報が登録されているためです。
公開鍵を作ったのにまだパスワードを聞かれるぞ・・・となったら、
ログインしようとしているユーザーの「/home/ユーザー/.ssh」以下を確認し、id_rsa.pub(公開鍵)
が存在しているか確認してください。
■ 別のツールから実行する場合、PasswordAuthenticationがyesになっていることを確認する
SSH pluginを利用してjenkinsからリモートサーバーのコマンドを実行するように設定した。
そしたら以下のエラーが発生
[SSH] Exception:Auth fail
com.jcraft.jsch.JSchException: Auth fail
at com.jcraft.jsch.Session.connect(Session.java:452)
at com.jcraft.jsch.Session.connect(Session.java:150)
at org.jvnet.hudson.plugins.SSHSite.createSession(SSHSite.java:141)
at org.jvnet.hudson.plugins.SSHSite.executeCommand(SSHSite.java:151)
at org.jvnet.hudson.plugins.SSHBuilder.perform(SSHBuilder.java:60)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:782)
at hudson.model.Build$BuildExecution.build(Build.java:205)
at hudson.model.Build$BuildExecution.doRun(Build.java:162)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
at hudson.model.Run.execute(Run.java:1738)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:410)
Build step 'Execute shell script on remote host using ssh' marked build as failure
認証に失敗。。。
/etc/ssh/sshd_config の PasswordAuthentication がnoになってました。
参考:PowerVM クラウド・プロバイダーからのエクスポートの状況が「Auth fail」になる
http://www.ibm.com/support/knowledgecenter/ja/SSGRP3_2.1.0/doc/ICON/topics/tsicn_authfail.html
「PasswordAuthentication」は冒頭に書いたパスワード認証のことなので、これはyesにしておいたほうが良いと思います。
・・と、色々と躓きましたが公開鍵を使うとパスワードなしでssh接続ができて、セキュリティ的にも、操作的にもメリットが沢山あります。
これでパスなし接続が出来るようになりました!ばんざい。