FreeBSD QandA 1578

FreeBSD QandA

Q. ssh, slogin, scp, sftp を使うたびに、毎回パスワード/パスフレーズを
   入力するのが面倒なのですが、省略することは出来ませんか?

A. 面倒な作業を楽にするためには、何らかの形でマシンに接続情報を残すことに
   なります。そのマシンがクラックされた場合、いもづる式に他のマシンも
   クラックの対象になってしまいます。セキュリティに対して責任を持てる場合
   以外は楽をするべきではありません。このことを認識したうえでお読み下さい。

   なお、この QandA の内容は OpenSSH のバージョン 2.9 以降に基づいています。
   (OpenSSH2.9 は FreeBSD 4.5-RELEASE および 4.6-RELEASE に付属しています。)
   古いバージョンの OpenSSH や、他の SSH の実装 (ports の security/ssh 等)
   では、一部の機能が使えなかったり、設定方法が異なる場合があります。

   SSH で使われる認証方法を分類すると以下のようになります。

      A. パスワード認証
         PasswordAuthentication (SSH1, SSH2)

      B. 公開鍵認証
         PubkeyAuthentication (SSH2)
         RSAAuthentication (SSH1)

      C. ホストベース認証
         HostbasedAuthentication (SSH2)
         RhostsRSAAuthentication (SSH1)

      D. その他

   このうち、公開鍵認証やホストベース認証を使っている場合は
   パスワード/パスフレーズの入力を省略することができます。

   [公開鍵認証の場合]
      公開鍵認証を行なうためには、まず認証鍵の作成が必要です。
      [管理番号 1948] [管理番号 1949] を読んで認証鍵の設定をして下さい。

      秘密鍵は絶対に洩れてはいけない情報ですので、ファイルに記録される際は
      安全性を考えて鍵作成時に入力したパスフレーズによって暗号化されています。
      ssh 接続時にパスフレーズの入力を求められるのは、認証を行なうために
      暗号化された秘密鍵を復号する必要があるからです。

      そこで、あらかじめ復号済みの秘密鍵を記憶しておくことで
      接続のたびにパスフレーズを入力する手間を省いてくれる
      ssh-agent というコマンドが用意されています。
      もちろん、復号済みの秘密鍵は ssh-agent プロセスのメモリ内だけに
      記憶されているので、メモリの内容を直接覗かれたりしない限り
      秘密鍵が洩れる心配はありません。

      ssh-agent を利用するには以下の 2 つの手順が必要です。
         1. ssh-agent を起動する。
         2. ssh-add を使って、秘密鍵を復号し ssh-agent に登録する。

      1. ssh-agent を起動する。
         ssh-agent の起動方法は 2 つあります。

         ひとつは
            % ssh-agent tcsh
         として新しいシェルを起動する方法です。
         この場合、新しく起動したシェルの中からだけ ssh-agent の機能を
         利用することができます。シェルが終了すると ssh-agent も
         自動的に終了します。

         もうひとつは
            % eval `ssh-agent -c`
            %  ...(ssh-add, ssh, scp 等の利用)...
            % eval `ssh-agent -c -k`
         として、現在のシェルに対し ssh-agent の情報を eval によって
         伝える方法です。この場合は、ssh-agent は自動的には終了しないので
         eval `ssh-agent -c -k` で終了させるのを忘れないようにして下さい。
         また、bash や zsh など sh 系のシェルを使っている場合は
         ssh-agent -c の代わりに ssh-agent -s と指定して下さい。

      2. ssh-add を使って、秘密鍵を復号し ssh-agent に登録する。
         ssh-agent が起動できたら、続いて認証鍵の登録を行ないます。
         引数に秘密鍵のファイル名を指定して ssh-add を実行して下さい。
            % ssh-add ~/.ssh/identity
         パスフレーズを入力してやれば鍵の登録は完了です。

         また、X を使用している場合は
            % ssh-add ~/.ssh/identity < /dev/null
         とすることで GUI のパスフレーズ入力ウインドウを開くことができます。
         ただし、あらかじめ port/package から security/openssh-askpass を
         インストールしておく必要があります。

      ssh-agent の起動と認証鍵の登録が終れば、パスフレーズを入力することなく
      ssh, scp 等が利用できるようになります。

      上記の手順をさらに自動化する方法も紹介します。

      a. pam_ssh を使う。
         4.6-RELEASE からは、pam_ssh module を使うことが出来ます。
         /etc/pam.conf を適切に設定してやれば、
         ログイン時に ssh-agent の起動や認証鍵の登録を、
         ログアウト時に ssh-agent の終了を自動で行なってくれるようになります。

         /etc/pam.conf の xdm 部分の設定例は次のようになります。

            xdm     auth    required        pam_unix.so
            xdm     auth    optional        pam_ssh.so      use_first_pass
            xdm     account required        pam_unix.so
            xdm     session optional        pam_ssh.so
            xdm     session required        pam_permit.so
            xdm     password required       pam_deny.so

         このように設定し、UNIX パスワードと同じパスフレーズで
         SSH の秘密鍵を作成しておくと、ログイン時に自動で
         ssh-agent が起動し、その秘密鍵が登録されるようになります。
         また、起動した ssh-agent はログアウト時に自動的に終了します。
         詳しくは、pam_ssh(8), pam.conf(5) を参照して下さい。

      b. スタートアップスクリプトで ssh-agent を起動させる。
         pam_ssh を使わない場合は、~/.login 等のスタートアップスクリプトで
         ssh-agent を起動する方法があります。

         コンソールからログインしている人は、~/.login の最後に
            eval `ssh-agent -c`
         としておいて、~/.logout に
            eval `ssh-agent -c -k`
         と書いておくとよいでしょう。

         xdm を使用している人は ~/.xsession に
            -----------
            #!/bin/sh
            eval `ssh-agent -s`
            twm &                   # ウィンドウマネージャを起動
            PID=$!
            ...(kterm などの起動)...
            wait $PID               # ウィンドウマネージャの終了を待ち
            eval `ssh-agent -s -k`  # ssh-agent を kill
            -----------
         と書いたり、
            -----------
            #!/bin/sh
            xrdb .Xresources
            exec ssh-agent fvwm     # ウィンドウマネージャを ssh-agent の制御下で起動
            -----------
         と書いておくとよいでしょう。

         次に、ssh-add でパスフレーズを入力しなければいけませんが
            -----------
            #!/bin/sh
            if [ -z "${SSH_IDENT}" ]; then
              SSH_IDENT="${HOME}/.ssh/identity"
            fi
            if [ -n "${SSH_AUTH_SOCK}" -a -z "${SSH_CLIENT}" -a -f "${SSH_IDENT}" -a -f "${SSH_IDENT}.pub" ]; then
              FINGERPRINT=`ssh-keygen -l -f "${SSH_IDENT}.pub" | awk '{print $2}'`
              if ! ssh-add -l | grep "${FINGERPRINT}" >/dev/null; then
                if [ -z "${DISPLAY}" -o -z "${SSH_ASKPASS}" ]; then
                  ssh-add "${SSH_IDENT}"
                else
                  ssh-add "${SSH_IDENT}" </dev/null
                fi
              fi
            fi
            exec "/usr/bin/${0##*/}" "$@"
            -----------
         というスクリプトを ~/bin/{ssh,slogin,scp,sftp} に置いておけば
         (PATH の先頭に ~/bin を加えておく)、初回のみ自動的に
         パスフレーズを聞いてきて ssh-add で鍵を登録してくれるように
         なります。

         また、X を使用している場合は、スタートアップスクリプト内で
         ssh-add < /dev/null も実行させるのもよいでしょう。

   [ホストベース認証の場合]
      ホストベース認証とは、リモートマシンの ~/.shosts に、
      パスワード無しでのログインを許可するホスト名とユーザ名を
      指定する方法です。
      rsh(1)rlogin(1) とよく似ていますが、通信路を暗号化したり、
      ホスト鍵を用いた認証でなりすましを防止したりするので、
      安全な接続を行なうことができます。

      ホストベース認証はデフォルトでは無効になっているので、
      利用するにはあらかじめ設定を変更しておく必要があります。
      まず、リモートマシンの /etc/ssh/sshd_config に以下のように記述し、
      sshd を再起動させます。
         -----------
         # SSH2 プロトコルを使用する場合
         HostbasedAuthentication yes
         # SSH1 プロトコルを使用する場合
         RhostsRSAAuthentication yes
         # これは安全でない認証方法なので yes にしてはいけない
         RhostsAuthentication no
         # ~/.shosts および ~/.rhosts を有効にするために必要
         IgnoreRhosts no
         -----------
      次に、ローカルマシンの /etc/ssh/ssh_config に以下のように記述します。
         -----------
         # SSH2 プロトコルを使用する場合
         HostbasedAuthentication yes
         PreferredAuthentications hostbased,publickey,password
         # SSH1 プロトコルを使用する場合
         RhostsRSAAuthentication yes
         -----------
      さらに、ホストベース認証を利用するにはローカルマシンの ssh の
      バイナリが root に setuid されていなければなりません。
      root になって以下のコマンドを実行して下さい。
         # chmod 4555 /usr/bin/ssh
      OpenSSH 3.3 以降で SSH2 を利用している場合は、特権が必要な処理が
      ssh-keysign というコマンドへ分離されたので、ssh の代わりに
      こちらを setuid します。
         # chmod 4511 /usr/libexec/ssh-keysign

      以上でホストベース認証自体の有効化は終わりですので、次に
      各ユーザ毎に必要な手順を説明します。

      まず、リモートマシンの ~/.shosts にログインを許可する
      ホスト名とユーザ名をスペースで区切って記述します。
      ユーザ名は省略可能で、その場合はリモートマシンと同じ名前の
      ユーザを許可することになります。
      たとえば、~hoge/.shosts に以下のように記述したとすると
      local.example.ne.jp のユーザ hoge と somewhere.example.ne.jp の
      ユーザ fuga に対してログインを許可することになります。
         -----------
         local.example.ne.jp
         somewhere.example.ne.jp fuga
         -----------
      最後に、~/.ssh/known_hosts(known_hosts2) にログインを許可したホストの
      ホスト鍵を登録します。この作業は、リモートマシンからローカルマシンへ
      ssh で一度ログインすれば自動的に行なうことができます。

      以上の設定が完了すると、パスワードを入力することなく ssh 等を
      利用できるようになります。

同一グループへのリンク

グループ名: ssh


間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。