FreeBSD QandA 2002年8月24日 更新分

QandA
QandA Project
登録・更新 QandA 一覧

管理番号 2229 (新規) 更新履歴
Q. FreeBSD 4.6-RELEASE で /stand/sysinstall や rc.conf で 
   sendmail_enable="NO" としているにもかかわらず、sendmail が
   デーモンとして起動されます
 

A. sendmail が 8.12.x に変更されたためです。

   sendmail では、その機能実装のために root の setuid 
   が必要ですが、sendmail 8.12.x ではセキュリティ強化
   のために MSP (Mail Submission Program) を root の
   setuid から切り離して独立させました。

   このために sendmail 8.12.x では MSP もデーモンモード
   で稼働させる必要があります。したがってセキュリティの
   確保を目的として sendmail をデーモンモードで起動させ
   ないつもりで sendmail_enable="NO" と設定しても、MSP 
   としての sendmail がデーモンモードで起動します。この
   MSP として起動されている sendmail デーモンには、従来
   指摘されてきた脅威の可能性はありません。

   qmail や postfix のような sendmail 以外の MTA を使って
   いる場合や、その他の方法で MSP を起動する場合などで 
   rc.conf で MSP としての sendmail の起動も不要な場合には、
   rc.conf に sendmail_enable="NONE" ("NO" ではないことに
   注意)と設定します。

   参考: [FreeBSD-users-jp 68867] から始まるスレッド


管理番号 2231 (新規) 更新履歴
Q. ノートパソコン (IBM ThinkPad s30) で外部CRT (プロジェクタなど) への
   出力がうまくいきません。切り替えスイッチ (Fn+F7 など) で出力先を切り替
   えても、外部 CRT の画面は真っ黒か、NO SIGNAL かです。時々本体側のモニ
   タが徐々に白くなったりします。

A. 本体の外部ディスプレイ出力と外部モニタとを接続した後に X を(再)起動
   し、外部 CRT 出力に切り替えてみてください。X 起動後に接続してしまうと、
   どうやってもうまくいかないようです。この様な現象は他にも IBM ThinkPad
   240Z や SONY C1VS などの機種の一部で発生することが報告されています。原
   因はわかりません。

   参考: [bsd-nomads:16326] から始まるスレッド
         <URL:http://www.clave.gr.jp/ml/bsd-nomads/200206/msg00001.html>


管理番号 130 (更新) 更新履歴
Q. カレントディレクトリを PATH に含めてはいけないと言われた
   のですが、どうしてですか?

A. セキュリティホールになりうるからです。

   もしカレントディレクトリが PATH に含まれている状態で、
     % cd /tmp
     % ls
   としたとき、/tmp/ls というファイルがあったら、/bin/ls でなく
   /tmp/ls が実行されてしまいます。

   もしかしたら /tmp/ls には
     #!/bin/sh
     /bin/rm -rf $HOME &
   と書いてあるかもしれません。その場合、あなたのホームディレクトリは
   全て消えてしまいます。同様に、他人のホームディレクトリを ls で覗いた
   場合、そこに置いてある得体の知れない ls を実行してしまうかもしれません。

   どうしてもカレントディレクトリを PATH に含めたいならば、せめて PATH の
   最後にしましょう (でもやめておいた方がよいと思います)。


     「と言っても、カレントディレクトリにあるコマンドを実行するとき
       タイプ量が増えてしまいのがイヤだから…」

   という方は、tcsh・bash・zsh などの高機能なシェルを使って、補完
   機能を活用しましょう (FreeBSD 4.1-RELEASE 以降での csh(1) は、
   tcsh(1) と全く同じです)。

   カレントディレクトリに a.out がある状態で
     % ./a(TAB を押す)
   とすると
     % ./a.out
   と展開されます。他に a から始まるファイルがある場合は
     %  ./a.(TAB を押す)
   とします。


管理番号 690 (更新) 更新履歴
Q. コマンドの実行例を教えてもらったので、さっそく実行しましたが 
   "Command not found." と叱られました。

A. どのように入力しましたか?

   1. "# foo" と入力しなさいと言われたので、そのまま "# foo" と入力した場合:

     コマンドの実行例を示す時に、プロンプトをつけて説明することがあります。
     今回の場合、"#" 自体がプロンプトで、入力するのは "foo" だけになります。

     プロンプトには、"#" のほかに "%" や "$" があります。これらの違いは、
     [管理番号 639] を参照してください。


   2. "foo" だけ入力した場合:

     そのコマンドがインストールされていないか、そのコマンドのあるディレクトリ
     にパスが通っていません。

     まずそのコマンドが存在するか確認してください。次のように find(1) を使う
     と簡単です。

        % find / -name foo -print

     これで foo が見つからなければ、インストールされていません。

     見つかったならば、パスが通っていません。絶対または相対パス付でコマンドを
     指定してください。たとえば、find(1) によって /usr/local/sbin/foo と表示
     されたら

       /usr/local/sbin/foo

     と入力してください。よく使うコマンドならば、そのディレクトリをパスに
     追加しましょう。

       % setenv PATH ${PATH}:/usr/local/sbin (csh・tcsh 系の場合)
       % PATH=${PATH}:/usr/local/sbin        (sh ・bash 系の場合)

     これで "foo" と入力しただけで /usr/local/sbin/foo が実行できるようになります。
     なお、カレントディレクトリ (.) はパスに加えないようにしましょう。
       → [管理番号 130]

   3. 絶対パスまたは相対パスを指定してもダメな場合:

     foo は、スクリプトでありませんか? スクリプトを実行するプログラムが見つから
     ないときにも、このエラーメッセージが表示されます。foo の 1行目が

       #!/dokokano/nanntoka

     のようになっているなら、/dokokano/nanntoka が存在して実行可能であることを
     確かめてください。nanntoka が別のところにあれば、正しいディレクトリ指す
     ようにさすように 1行目を書き換えてください。

     それでも Command not found となる場合は、
       % head -1 foo | hd
     として、1行目をダンプしてみてください。もし

       00000000  23 21 2f 64 6f 6b 6f 6b  61 6e 6f 2f 6e 61 6e 6e  |#!/dokokano/nann|
       00000010  74 6f 6b 61 0d 0a                                 |toka..|

     となっているなら、Windows・DOS の改行コード 0x0D 0x0A になっているため、

       #!/dokokano/nanntoka(0x0D)

     というコマンドを実行しようとして失敗している、ということです。UNIX の
     改行コードは 0x0A ですので、

       00000000  23 21 2f 64 6f 6b 6f 6b  61 6e 6f 2f 6e 61 6e 6e  |#!/dokokano/nann|
       00000010  74 6f 6b 61 0a                                    |toka.|

     となるように修正して下さい。お手軽な改行コード変換の方法としては、

       % qkc -u file

     があります。qkc は japanese/qkc として port/package に含まれています。


管理番号 1578 (更新) 更新履歴
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 等を
      利用できるようになります。


管理番号 2245 (新規) 更新履歴
Q. root では X server を起動出来るのですが、一般ユーザーでは起動できません。
   なお、X は XFree86 version 4 系列を使っています。
   (または、FreeBSD 4.6-RELEASE 以降をインストールしました)。

A. XFree86 の version 4 系列では、セキュリティを高める為に X server を 
   root に setuid しないようになりました。
   インストール時に表示されるメッセージは、

       pkg_info -D XFree86-4.2.0_1,1

   などとして表示できますが、そこにこの問題に該当する下記のような注意事項
   があります。

   Install notice:
   ************************************************************************
   * To improve security, the X server is installed without an SUID bit.  *
   * This is suitable for use with xdm, but not with a startx script.     *
   * If you need to use a startx script, install the x11/wrapper package. *
   ************************************************************************

   これを読むと、xdm 経由で login する場合は問題ありませんが、そのままで
   は startx (や xinit) script から起動する場合はうまくゆかないので、
   ports/x11/wrapper をインストールして使えばよいことがわかります。


管理番号 2246 (新規) 更新履歴
Q. 私はホイール (wheel) 付きのマウスを使っています.ホイールを回転させても
   スクロールしないのですが、使えないのですか?

A. /etc/XF86Config の Pointer セクションに以下の記述をしてみてください。
   Buttons の数を5 にする事と ZAxisMapping を 4 5 にセットする事がポイントです。

   * XFree86 のバージョンが 3.X の例

       Section "Pointer"
               Protocol        "Auto"
               Device          "/dev/sysmouse"
               Resolution      100
               Buttons         5
               ZAxisMapping    4 5
       EndSection

   * XFree86 のバージョンが 4.X の例

       Section "InputDevice"
             Identifier  "Mouse0"
             Driver      "mouse"
             Option      "Protocol" "Auto"
             Option      "Device" "/dev/sysmouse"
             Option      "Buttons"  "5"
             Option      "ZAxisMapping" "4 5"
       EndSection

   # 参考
   # /usr/X11R6/lib/X11/doc/README.mouse


管理番号 2247 (新規) 更新履歴
Q. フレッツ ADSL と ppp(8) を使ってインターネットに接続しています。
   自動リダイアルモード (-ddial) で、PPPoE 接続が切れても、
   自動的に再接続してくれません。

A. フレッツ ADSL の場合、 PPPoE 接続が切れたことを ppp で
   認識できないことがあります。
   これを改善するためには、なんらかの方法で PPPoE 接続が
   切断されたかどうかを調べる必要があります。

   対策としては、以下の方法があります。

   1. PPP 設定ファイルで、 "enable lqr" とする。
      この場合、 ppp は、30 秒に 1 度、 PPPoE 接続先に
      LQR パケットを送る。 LQR パケットが連続して 5 回無視されたら
      (つまり、 PPPoE 接続先から 150 秒応答がなければ)、
      ppp は自動的に PPPoE 接続を切断する。

   2. 以下のようなスクリプトを書く。
      「 PPPoE 接続先 (ifconfig で tun* のデバイスを見た時、 -> の
      右側に書いてある IP アドレス ) に ping を飛ばす。
      飛ばないようなら PPPoE 接続が切断されたとみなし、
      ppp を再起動する。」

   [FreeBSD-user-jp 63734] から始まるスレッドが参考になるでしょう。


管理番号 1646 (更新) 更新履歴
Q. FireWall を構築しました。破棄 (deny) したパケットの log を取りたいので
   すが、どのようにすればよいでしょうか?

A. 次のオプションを含めてカーネルを構築してください。
 
      options         IPFIREWALL_VERBOSE
      options         "IPFIREWALL_VERBOSE_LIMIT=30"

   オプションの詳しい解説はファイル「/usr/src/sys/i386/conf/LINT」を読ん
   でください。

   次に、rc.firewall に記述している ipfw のルールに 「log」を追加してくだ
   さい。

   例えば次のようなルールを記述していたら、

      $fwcmd add 65000 deny all from any to any

   「deny」の次に「log」という引数を追加してください。

      $fwcmd add 65000 deny log all from any to any

   記述したら reboot してください。

   成功したら次のようなメッセージが console に表示されます。

     ipfw: 65000 Deny P:2 123.456.789.012 224.0.0.2 out via mx0
     ipfw: 65000 Deny ICMP:9.0 123.456.789.012 224.0.0.1 in via mx0

   以上は FreeBSD 3.4-RELEASE にて確認されました。
   以下の参考文献を参照してお使いのシステムに当てはまるかどうか確認して下さい。

   参考文献: ipfw(8)
             FreeBSDハンドブック 「6.4 ファイアウォール」
             <URL:http://www.jp.freebsd.org/www.FreeBSD.org/ja/handbook/firewalls.html>
             ファイル 「/usr/src/sys/i386/conf/LINT」


管理番号 411 (更新) 更新履歴
Q. PostScript 対応でないプリンタを FreeBSD で使いたいのですが、なにか
   良い方法がありませんか?

A. お使いのプリンタによって、以下の方法があります。

   1. エプソン製のインクジェットプリンタの場合、エプソンコーワが配布して
      いる PIPS を使うことで、 PostScript プリンタのように扱えます。
        <URL:http://www.epkowa.co.jp/linux/pips.html>
      ports/packages が japanese/pips* として用意されていますので、そこから
      インストールして下さい。

      # PM-700C 用のドライバはありませんが、ヘッドの仕様が同じ (たぶん)
        PM-670用のドライバで動かせます。

      PIPS は PNG フォーマットの入力を Epson の inkjet プリンタコードに変
      換するソフトで、エプソンコーワより配布されています。Ghostscript と
      組み合わせたフィルタを利用することにより、PostScript の印刷時にも活
      用できます (そのためのフィルタなどが付いているはず)。
      Ghostscript による mjc720 や uniprint ドライバなどの Epson inkjet 用
      出力に比べて 6色インクのサポートなどにより Windows ドライバ並の良い
      画質が得られます。

      他にも似たようなやり方をするものには、HP の inkjet の低価格機種など
      で、gs の出力を別のプログラムで制御コードに変換することにより印刷が
      可能になるものがあります (詳しい情報求む)。

   2. その他のプリンタの場合、 Ghostscript を使うことにより PostScript
      プリンタのように扱えるものもあります。

      Ghostscript については、[管理番号 1458] を参照してください。


管理番号 405 (更新) 更新履歴
Q. /etc/newsyslog.conf を編集して httpd 等のログをローテーションしようと
   しましたが、ローテーション後も名前が変更された古いファイルにログが
   出力されつづけます。

A. 一般的な UNIX では、プロセスがファイルをオープンしているときに
   そのファイルのリネームを行った場合、プロセス側からは引続きリネーム
   後のファイルをオープンしているように動作します。

   newsyslog(8) はログローテーションを行った後に syslogd(8) に HUP
   シグナルを送ることで、ローテーションを行ったことを伝えるように
   なっています。よって、syslogd を利用しているデーモンならば
   ローテーション後に新しいログファイルにログが出力されるはずです。

   もし syslogd を使わず独自でログファイルに記録しているデーモンが
   あるなら、そのデーモンのプロセス ID が書かれているファイル (pid
   ファイル) を /etc/newsyslog.conf に指定することで、そのデーモンに
   HUP シグナルが送られるようになります。

   また、
     - pid ファイルがない
     - HUP シグナルを送ってもログローテーションを認識しない
   というデーモンの場合でも、logger(1) によって syslogd に送るという
   手もありますので、うまく工夫すれば newsyslog で処理することができます。


管理番号 2255 (新規) 更新履歴
Q. cron 等から起動されるバッチ処理の中で ssh を利用したいのですが、
   ログインを自動化するにはどうすればよいですか?

A. 二つの方法があります。

   一つは、ホストベース認証を使う方法です。詳しい設定方法は
   [管理番号 1578] で紹介されていますので、そちらを参照して下さい。

   もう一つは、パスフレーズの設定されていない秘密鍵を使う方法です。
   [管理番号 1578] では、公開鍵認証で ssh-agent を使う方法を紹介していますが、
   これは ssh-agent をあらかじめ起動しておく必要があるため、cron 等からの
   利用には向いていません。

   もちろん、秘密鍵ファイルにパスフレーズを設定しないということは
   パスワードを生でテキストファイルに保存しているのと同義ですから、
   より厳重に鍵ファイルを管理しなければなりません。
   そこで、万が一秘密鍵ファイルを盗まれた場合のリスクを軽減するため、
   利用制限付きの認証鍵を作成する方法を紹介します。

   以下の手順は、OpenSSH 2.9 と 3.4p1 で実行できることを確認しています。

   1. パスフレーズのない認証鍵を新しく作成します。
         % ssh-keygen -t rsa1 -N "" -f ~/.ssh/backup
      SSH2 を使う場合は '-t rsa1' を '-t dsa' や '-t rsa' に変えて下さい。

   2. 作成された公開鍵ファイル ~/.ssh/backup.pub の先頭に「オプション」を
      追加します。
         % vi ~/.ssh/backup.pub
         ...
         % cat ~/.ssh/backup.pub
         command="/usr/bin/tar czf - hoge",no-pty,no-port-forwarding 1024 35 1472731(以下略)
      この例では、"/usr/bin/tar czf - hoge" というコマンドだけが実行可能な
      ように指定しています。オプションには他にも多くの種類があります。
      詳しくは sshd(8) を参照して下さい。

   3. 編集した公開鍵ファイルをリモートホストへ転送します。
         % cat ~/.ssh/backup.pub | ssh remotehost 'cat >> .ssh/authorized_keys'

   これで、準備は完了です。
      % ssh -q -i ~/.ssh/backup remotehost > backup.tgz
   とすると、リモートホストでの "/usr/bin/tar czf - hoge" の出力が
   ローカルホストの backup.tgz に格納されます。
   また、万が一 ~/.ssh/backup の内容が洩れたとしても、
   この鍵では "/usr/bin/tar czf - hoge" というコマンドしか実行できないので
   被害を最小限に押えることができます。

   なお、/etc/ssh/sshd_config に以下のように記述しておくと、
   通常の root ログインを禁止しながら、command オプションを指定した
   公開鍵認証のみを許可することができます。
      -----------
      PermitRootLogin forced-commands-only
      -----------
   この機能はリモートバックアップ等を実行する場合に非常に便利です。


QandA
QandA Project
登録・更新 QandA 一覧