diff --git a/ja_JP.eucJP/books/handbook/bibliography/chapter.sgml b/ja_JP.eucJP/books/handbook/bibliography/chapter.sgml
index b9b2e8fa2a..73a2e2c53f 100644
--- a/ja_JP.eucJP/books/handbook/bibliography/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/bibliography/chapter.sgml
@@ -1,666 +1,680 @@
参考図書
訳: &a.jp.nakai;, 1996 年 10 月 12 日.
FreeBSD オペレーティングシステムの個々の部分については
マニュアルページで定義のような説明がなされていますが,
それらにはどうやってその部分どうしをつなぎあわせて
オペレーティングシステム全体を円滑に動作させるかを
説明していないという欠点がよく指摘されます.
それを補うためには Unix システム管理についてのよい本や,
すぐれた利用者向けのマニュアルが欠かせません.
FreeBSD 専門の書籍および雑誌
非英語文化圏の 書籍 & 雑誌:
FreeBSD 入門與應用 (中国語).
FreeBSD入門キット 98版第二版. 宮嵜忠臣 著.
秀和システム. ISBN 4-87966-535-5 C3055 2900 円.
FreeBSD入門キット AT互換機版 第二版. 宮嵜忠臣 著.
秀和システム. ISBN 4-87966-535-5 C3055 2900 円.
ここまでできる FreeBSD パワーガイド.
霜山 滋, 仲道 嘉夫, 山中 右次 著. 秀和システム.
ISBN 4-87966-637-8 2600円.
FreeBSD徹底入門.
あさだ たくや / 天川 修平 / 衛藤 敏寿 / 浜田 直樹 / 細川 達己 / 三田 吉郎 著.
翔泳社.
ISBN 4-88135-473-6 3600 円.
パーソナル UNIX スターターキット FreeBSD.
民田 雅人 / 古場 正行 / 増田 佳泰 / 天池 健 / 宮川 晋 共著.
アスキー.
ISBN 4-7561-1733-3 3000 円.
FreeBSD ハンドブック (日本語版).
アスキー.
ISBN 4-7561-1580-2 3800 円.
FreeBSD mit Methode (ドイツ語版).
Computer und Literatur Verlag/Vertrieb Hanser 発行.
1998. ISBN 3-932311-31-0
FreeBSD インストール & 活用マニュアル,
毎日コミュニケーションズ発行.
Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo 著
FreeBSD を使ったインターネットサーバの構築 (Building Internet Server with
FreeBSD) (インドネシア語),
Elex Media Komputindo 発行.
英語の書籍 & 雑誌:
The Complete FreeBSD,
BSDi 発行.
The
FreeBSD Corporate Networker's Guide,
Addison-Wesley 発行.
利用者向けのガイド
Computer Systems Research Group, UC Berkeley.
4.4BSD User's Reference Manual.
O'Reilly & Associates, Inc., 1994.
ISBN 1-56592-075-9
Computer Systems Research Group, UC Berkeley.
4.4BSD User's Supplementary Documents.
O'Reilly & Associates, Inc., 1994.
ISBN 1-56592-076-7
UNIX in a Nutshell.
O'Reilly & Associates, Inc., 1990.
ISBN 093717520X
Mui, Linda.
What You Need To Know When You Can't Find Your UNIX
System Administrator.
O'Reilly & Associates, Inc., 1995.
ISBN 1-56592-104-6
オハイオ州立大学による
UNIX Introductory Course.
オンラインで HTML 版と PostScript 版が利用可能.
FreeBSD 友の会 jpman プロジェクト. FreeBSD User's
Reference Manual (日本語訳). 毎日コミュニケーションズ
, 1998. ISBN4-8399-0088-4 P3800E.
Edinburgh
University による
UNIX 環境の初心者向け
オンラインガイド.
管理者向けのガイド
Albitz, Paul and Liu, Cricket. DNS and
BIND, 4th Ed.
O'Reilly & Associates, Inc., 2001.
ISBN ISBN 1-59600-158-4
(訳注: 邦訳は以下のものが出版されています.
高田 広章 / 小島 育夫 監訳 , 小舘 光正 訳.
DNS & BIND 第 3 版.
オライリー・ジャパン, 1999.
ISBN 4-900900-91-5)
Computer Systems Research Group, UC Berkeley.
4.4BSD System Manager's Manual.
O'Reilly & Associates, Inc., 1994.
ISBN 1-56592-080-5
Costales, Brian, et al.
Sendmail, 2nd Ed. O'Reilly &
Associates, Inc., 1997.
ISBN 1-56592-222-0
(訳注: 邦訳は以下の 2 分冊のものが出版されています.
原著の 3 章までが「システム管理」, 4 章が「リファレンス」
に対応します.
中村 素典 監訳, 鈴木 克彦 訳.
sendmail システム管理 (Volume1).
オライリー・ジャパン, 1997.
ISBN 4-900900-40-0
中村 素典 監訳, 鈴木 克彦 訳.
sendmail システム管理 (Volume2).
オライリー・ジャパン, 1998.
ISBN 4-900900-41-9)
Frisch, Æleen. Essential System
Administration, 2nd Ed. O'Reilly &
Associates, Inc., 1995. ISBN 1-56592-127-5
(訳注: 邦訳は以下のものが出版されています.
谷川 哲司 監訳, 黒岩 真吾 / 株式会社ユニテック 訳.
UNIX システム管理入門 改訂版.
オライリー・ジャパン, 1998.
ISBN 4-900900-14-1)
Hunt, Craig. TCP/IP Network Administration, 2nd Ed.
O'Reilly & Associates, Inc., 1997.
ISBN 1-56592-322-7
(訳注: 邦訳は以下のものが出版されています.
村井 純 監訳.
TCP/IP ネットワーク管理 第 2 版.
オライリー・ジャパン, 1998.
ISBN 4-900900-68-0)
Nemeth, Evi. UNIX System Administration
Handbook. 3rd Ed. Prentice Hall, 2000.
ISBN 0-13-020601-6
(訳注: 邦訳は以下のものが出版されています.
井上 尚司 監訳.
UNIX システム管理入門.
ソフトバンク, 1992.
ISBN 4-89052-362-6
原本は第 3 版だが, 訳出は第 1 版のみ)
Stern, Hal Managing NFS and NIS
O'Reilly & Associates, Inc., 1991.
ISBN 0-937175-75-7
(訳注: 邦訳は以下のものが出版されています.
砂原 秀樹 監訳, 倉骨 彰 訳,
NFS & NIS.
アスキー,
1992.
ISBN 4-7561-0273-5)
FreeBSD 友の会 jpman プロジェクト. FreeBSD System
Administrator's Manual (日本語訳).
毎日コミュニケーションズ,
1998. ISBN4-8399-0109-0 P3300E.
プログラマ向けのガイド
Asente, Paul, Converse, Diana, and Swick, Ralph.
X Window System Toolkit. Digital Press,
1998. ISBN 1-55558-178-1
Computer Systems Research Group, UC Berkeley.
4.4BSD Programmer's Reference Manual.
O'Reilly & Associates, Inc., 1994.
ISBN 1-56592-078-3
Computer Systems Research Group, UC Berkeley.
4.4BSD Programmer's Supplementary Documents.
O'Reilly & Associates, Inc., 1994.
ISBN 1-56592-079-1
Harbison, Samuel P. and Steele, Guy
L. Jr. C: A Reference Manual. 4rd ed. Prentice
Hall, 1995. ISBN 0-13-326224-3
(訳注: 邦訳は以下のものが出版されています.
斎藤 信男監訳.
新・詳説C言語リファレンス
[H&Sリファレンス].
ソフトバンク, 1994.
ISBN 4-89052-506-8
原本は第4版だが, 訳出は第3版のみ.)
Kernighan, Brian and Dennis M. Ritchie.
The C Programming Language..
PTR Prentice Hall, 1988.
ISBN 0-13-110362-9
(訳注: 邦訳は以下のものが出版されています.
石田 晴久 訳.
プログラミング言語 C 第2版(訳書訂正版)
共立出版, 1989.
ISBN 4-320-02692-6)
Lehey, Greg.
Porting UNIX Software.
O'Reilly & Associates, Inc., 1995.
ISBN 1-56592-126-7
Plauger, P. J. The Standard C
Library. Prentice Hall, 1992.
ISBN 0-13-131509-9
(訳注: 邦訳は以下のものが出版されています.
福富 寛 / 門倉 明彦 / 清水 恵介 訳.
標準 C ライブラリ ANSI/ISO/JIS C規格.
トッパン, 1995.
ISBN 4-8101-8541-9)
Stevens, W. Richard. Advanced
Programming in the UNIX Environment.
Reading, Mass. : Addison-Wesley, 1992
ISBN 0-201-56317-7
(訳注: 邦訳は以下のものが出版されています.
大木 敦雄 訳.
詳解 UNIX プログラミング. トッパン, 1994.
ISBN 4-89052-524-6)
Stevens, W. Richard. UNIX Network
Programming. 2nd Ed. PTR Prentice Hall, 1998.
ISBN 0-13-949876-1
(訳注:
第 1 版の邦訳は以下のものが出版されています.
篠田 陽一 訳.
UNIX ネットワークプログラミング.
トッパン, 1992.
ISBN 4-8101-8509-5)
第 2 版の邦訳は以下のものが出版されています.
篠田 陽一 訳.
UNIX ネットワークプログラミング 第 2 版 Vol.1.
トッパン, 1999.
ISBN 4-8101-8612-1)
Wells, Bill. Writing Serial Drivers for UNIX
.
Dr. Dobb's Journal. 19(15), December
1994. pp68-71, 97-99.
オペレーティングシステム内部
Andleigh, Prabhat K.
UNIX System Architecture.
Prentice-Hall, Inc., 1990.
ISBN 0-13-949843-5
Jolitz, William. Porting UNIX to the 386
.
Dr. Dobb's Journal. January 1991-July
1992.
Leffler, Samuel J., Marshall Kirk McKusick,
Michael J Karels and John Quarterman The Design and
Implementation of the 4.3BSD UNIX Operating
System. Reading, Mass. : Addison-Wesley, 1989.
ISBN 0-201-06196-1
(訳注: 邦訳は以下のものが出版されています.
中村 明 / 相田 仁 / 計 宇生 / 小池 汎平 訳.
UNIX 4.3BSDの設計と実装. 丸善, 1991.
ISBN 4-621-03607-6)
Leffler, Samuel J., Marshall Kirk McKusick,
The Design and Implementation of the 4.3BSD
UNIX Operating System: Answer Book.
Reading, Mass. : Addison-Wesley, 1991.
ISBN 0-201-54629-9
(訳注: 邦訳は以下のものが出版されています.
相田 仁 / 計 宇生 / 小池 汎平 訳.
UNIX 4.3BSDの設計と実装.
アンサーブック, トッパン, 1991.
ISBN 4-8101-8039-5)
McKusick, Marshall Kirk, Keith Bostic, Michael J Karels,
and John Quarterman. The Design and
Implementation of the 4.4BSD Operating
System. Reading, Mass. : Addison-Wesley, 1996.
ISBN 0-201-54979-4
+
+ (この本の第二章が FreeBSD ドキュメンテーションプロジェクト
+ の一部として オンライン
+ で公開されています. また, 第九章は
+ ここ にあります.)
Stevens, W. Richard. TCP/IP Illustrated,
Volume 1: The Protocols.
Reading, Mass. : Addison-Wesley, 1996.
ISBN 0-201-63346-9
Schimmel, Curt.
Unix Systems for Modern Architectures.
Reading, Mass. : Addison-Wesley, 1994.
ISBN 0-201-63338-8
Stevens, W. Richard. TCP/IP Illustrated,
Volume 3: TCP for Transactions, HTTP, NNTP
and the UNIX Domain Protocols.
Reading, Mass. : Addison-Wesley, 1996.
ISBN 0-201-63495-3
(訳注: 邦訳は以下のものが出版されています.
中本 幸一 / 石川 裕次 / 田中 伸佳 訳.
詳解 TCP/IP Vol.3: トランザクション
TCP, HTTP, NNTP, UNIX ドメインプロトコル,
アジソンウェスレイパブリッシャーズジャパン, 1998.
ISBN 4-8101-8039-5)
Vahalia, Uresh.
UNIX Internals -- The New Frontiers.
Prentice Hall, 1996.
ISBN 0-13-101908-2
Wright, Gary R. and W. Richard Stevens.
TCP/IP Illustrated, Volume 2:
The Implementation.
Reading, Mass. : Addison-Wesley, 1995.
ISBN 0-201-63354-X
+
+
+ Messmer, Hans-Peter. The Indispensable PC Hardware Book, 4th Ed.
+ Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN
+ 0-201-59616-4
+
+
セキュリティの参考資料
Cheswick, William R. and Steven M. Bellovin.
Firewalls and Internet Security:
Repelling the Wily Hacker.
Reading, Mass. : Addison-Wesley, 1995.
ISBN 0-201-63357-4
(訳注: 邦訳は以下のものが出版されています.
川副 博 監訳. ファイアウォール.
ソフトバンク, 1995.
ISBN 4-89052-672-2)
Garfinkel, Simson and Gene Spafford.
Practical UNIX & Internet Security.
2nd Ed. O'Reilly & Associates, Inc., 1996. ISBN
1-56592-148-8
(訳注: 邦訳は以下のものが出版されています.
山口 英 監訳. UNIX セキュリティ.
アスキー, 1993.
ISBN 4-7561-0274-3
原本は第 2 版だが, 訳出は第 1 版のみ)
Garfinkel, Simson.
PGP Pretty Good Privacy
O'Reilly & Associates, Inc., 1995.
ISBN 1-56592-098-8
ハードウェアの参考資料
Anderson, Don and Tom Shanley.
Pentium Processor System Architecture.
2nd Ed. Reading, Mass. : Addison-Wesley, 1995.
ISBN 0-201-40992-5
Ferraro, Richard F. Programmer's Guide
to the EGA, VGA, and Super VGA Cards.
3rd ed. Reading, Mass. : Addison-Wesley, 1995.
ISBN 0-201-62490-7
Intel Corporation は, 自社の CPU
やチップセットに関する文書を自社の 開発者向け Web
サイト で公開しています. 文書のフォーマットは通常
PDF です.
Shanley, Tom. 80486 System
Architecture. 3rd ed. Reading, Mass. :
Addison-Wesley, 1995.
ISBN 0-201-40994-1
Shanley, Tom. ISA System
Architecture. 3rd ed. Reading, Mass. :
Addison-Wesley, 1995.
ISBN 0-201-40996-8
Shanley, Tom. PCI System Architecture.
4th ed. Reading, Mass. : Addison-Wesley, 1999. ISBN
0-201-30974-2
Van Gilluwe, Frank. The Undocumented PC, 2nd Ed.
Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN
0-201-47950-8
Unix の歴史
Lion, John Lion's Commentary on UNIX, 6th Ed.
With Source Code.
ITP Media Group, 1996.
ISBN 1573980137
Raymond, Eric s. The New Hacker's Dictionary,
3rd edition. MIT Press, 1996.
ISBN 0-262-68092-0
Also known as the
Jargon File
Saulus, Peter H. A quarter century of UNIX.
Addison-Wesley Publishing Company, Inc., 1994.
ISBN 0-201-54777-5
Simon Garfinkel, Daniel Weise, Steven Strassmann.
The UNIX-HATERS Handbook.
IDG Books Worldwide, Inc., 1994.
ISBN 1-56884-203-1
Don Libes, Sandy Ressler Life with UNIX
— special
edition. Prentice-Hall, Inc., 1989.
ISBN 0-13-536657-7
(訳注: 邦訳は以下のものが出版されています.
坂本 文 監訳. Life with UNIX.
アスキー, 1990.
ISBN 4-7561-0783-4
邦訳が Special 版の訳出か否かは不明)
BSD 系 OS の系譜図. 1997年.
ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/src/share/misc/bsd-family-tree
または, FreeBSD-current マシンの
ローカルファイル.
BSD リリース告知コレクション. 1997.
http://www.de.FreeBSD.ORG/de/ftp/releases/
Networked Computer Science Technical Reports Library
.
http://www.ncstrl.org/
Computer Systems Research group (CSRG) からの古い
BSD リリース集
http://www.mckusick.com/csrg/:
この 4 枚 CD セットには, 1BSD から 4.4BSD までと 4.4BSD-Lite2
が含まれます (残念ながら 2.11BSD は含まれていません).
また 4 枚目の CD には, 最終ソースおよび SCCS
ファイルが含まれています.
雑誌とジャーナル
The C/C++ Users Journal. R&D Publications
Inc. ISSN 1075-2838
Sys Admin — The Journal for UNIX System
Administrators
Miller Freeman, Inc., ISSN 1061-2688
diff --git a/ja_JP.eucJP/books/handbook/kernelopts/chapter.sgml b/ja_JP.eucJP/books/handbook/kernelopts/chapter.sgml
index bdb3fd8902..608efc58db 100644
--- a/ja_JP.eucJP/books/handbook/kernelopts/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/kernelopts/chapter.sgml
@@ -1,204 +1,212 @@
+
+
+
+ Jörg
+ Wunsch
+ 原作
+
+
+
+
カーネルコンフィグレーションの
新しいオプションを追加する
- 原作: &a.joerg;
-
訳: &a.jp.yoshiaki;, 1996 年 12 月 29 日.
この章をお読みになる前に FreeBSD
カーネルのコンフィグレーション の章の内容を
理解しておいてください.
そもそもカーネル
オプションって何?
カーネルオプションの使い方は基本的には
FreeBSD
カーネルのコンフィグレーション
の章に書いてあります.
そこには伝統的な形式
と新しい形式
のオプションの説明があります.
すべてのカーネルのオプションを新しい形式のものに置き換え,
コンフィグファイル
を修正して &man.config.8; を実行した後に
カーネルのコンパイルディレクトリで
make depend を実行すれば,
ビルドプロセスが自動的に変更された
オプションを検出し, 必要なファイルだけを
再コンパイルするようにすることが
最終的な目的です. &man.config.8;
を実行するたびに古いコンパイルディレクトリ
を消してしまう現在のやりかたは,
やがておこなわれなくなるでしょう.
基本的に, カーネルオプションはカーネルのコンパイルプロセスの
C プリプロセッサのマクロの定義にすぎません. 実際に選択的に make
できる ようにするためには, 対応する部分のカーネルソース
(またはカーネルの .h ファイル)
がオプションを使えるようにあらかじめ書かれていなければ
なりません.
つまりデフォルト値をコンフィグファイルのオプションで置き換え
られるようになっていなければなりません.
これは普通は次のようになっています.
#ifndef THIS_OPTION
#define THIS_OPTION (some_default_value)
#endif /* THIS_OPTION */
この場合,
管理者がコンフィグファイルのオプションに別の値を記述すれば,
デフォルトの設定を打ち消して新しい値に置き換えられます. 当然,
新しい値はプリプロセッサによってソースコード中で
置き換えられるため, デフォルトの値が使われていた場所において C
の式として有効な値でなければ なりません.
また, 単に特定のコードを有効にするか
無効にするかを設定するための
値を持たないオプションも作ることができます.
#ifdef THAT_OPTION
[あなたのコードが入ります]
#endif
コンフィグファイルに THAT_OPTION
と記述するだけで (値の有無 にかかわらず)
対応する部分のコードが組み込まれます.
C 言語にくわしい人であれば
コンフィグオプション
とされているもの
は少なくとも一つの #ifdef
で参照されているということはすぐに理解 できるでしょう. ところで,
ごく一部の人たちは次のようなものを試して
みようとするかもしれません.
options notyet,notdef
このようにコンフィグファイルをしておくと,
カーネルのコンパイルは うまく行きません.
(訳注: たとえば MATH_EMULATE のように
有効/無効のためのパラメタを 持たないオプションの場合,
無効とするためのパラメタをつけて, オプション
で「無効とする」と明示することはできないという意味です)
明らかに,
任意のオプション名がカーネルソースツリー全体でどのように
使われているかを追いかけることは非常に難しいことです. このことが
新しい形式
のオプションの機構を採り入れる理由の背景です.
ここではそれぞれのオプションは
カーネルコンパイルディレクトリにある別々の
.h ファイルとなり,
opt_foo.h
という名前に されます. この方法では, 通常の Makefile
の依存関係が適用され, make
プログラムはオプションが変更された時に再コンパイルが必要な
ものを見つけることができます.
古い形式のオプションの機構は,
局部的なオプションや実験的なオプション
のような一時的に利用されると考えられるオプションにおいては
有効です. つまり #ifdef
をカーネルのソースに追加するのは簡単であり,
それがそのままカーネルコンフィグオプションになります. この場合,
管理者はオプションの利用において
依存関係を把握しておく責任があります (また,
手動でカーネルの一部分を
強制的に再コンパイルする必要があるかもしれません).
サポートされている
オプションのすべてについて一つでも変更があると, &man.config.8;
は サポートされていないオプションがコンフィグファイルの中に
あるという警告 を出しますが, カーネルの Makefile
内にはそれを含めます.
ではどのようにして追加するのでしょう?
最初に sys/conf/options (または
sys/<arch>/conf/options.<arch>, たとえば sys/i386/conf/options.i386)
を編集し, 新しいオプション を含めるのに最適な
opt_foo.h
ファイルを選びます.
新しいオプションの必要がなくなったとしたら,
これを取り除きます. たとえば, SCSI
サブシステムに関するすべてのふるまいについてのオプション
の変更は opt_scsi.h に入れられます.
デフォルトでは, 適切 なオプションファイルに単に記述されます.
たとえば FOO であれば 値は対応するファイルの
opt_foo.h に格納されます. これは右端に別
のファイル名を書いて置き換えることができます.
新しいオプションを加えるのに使えそうな
opt_foo.h
がない場合は新しい名前を作ってください. 意味のある名前を作り
options[.<arch>]
ファイル に新しいセクションのコメントをつけてください.
&man.config.8; は自動的
に変更を検出して, 次の実行からは (訳注: 新しい
.h) ファイル を作ります.
ほとんどのオプションはヘッダファイルに入れられます.
大量のオプションを一つの
opt_foo.h
にまとめると
コンフィグファイルの一つのオプションを変更したときに
多くのファイルが 再コンパイルされる原因になります.
新しいオプションに依存するカーネルファイルは
最終的には見つけ出されます.
ただし, オプションを作っただけで対応するソースがどこにもない場合は別です.
&prompt.user; find /usr/src/sys -type f | xargs fgrep NEW_OPTION
オプションに対応するソースを見つけるのに上記のコマンドは便利です.
見つけたすべてのファイルで編集, 追加をおこないます.
#include "opt_foo.h"
ファイルの先頭の, すべての
#include <xxx.h> より前に入れます.
この場合, オプションによって次のようにしてデフォルト値
を持たせている標準のヘッダファイル内の値を置き換えるため,
順番は非常に 重要です.
#ifndef NEW_OPTION
#define NEW_OPTION (something)
#endif
システムヘッダファイル (たとえば
/usr/include/sys/ にある ファイル)
をオプションで置き換えることは, ほとんどの場合で失敗します.
そうすると, ヘッダファイルを深刻な状態に破壊してしまうので,
include しないとオプションの値によって
不整合が起きてしまう場合を除き, それらの ファイルに
opt_foo.h
を include しないでください.
そう, 現在このような例がいくつか存在していますが,
必ずしも正しい方法 ではありません.
diff --git a/ja_JP.eucJP/books/handbook/policies/chapter.sgml b/ja_JP.eucJP/books/handbook/policies/chapter.sgml
index 69c0078de9..ac15cc5411 100644
--- a/ja_JP.eucJP/books/handbook/policies/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/policies/chapter.sgml
@@ -1,516 +1,516 @@
Poul-Henning
Kamp
寄稿:
ソースツリーのガイドラインおよび方針
訳者: &a.jp.mihoko;, 1996 年 9 月 6 日.
本章は, FreeBSD
のソースツリーについてのさまざまなガイドラインや
ポリシーについて書かれています.
Makefile 中の MAINTAINER
port 保守担当(ports maintainer)
1996 年 6 月.
FreeBSD 配布物の特定の部分が, 一人の人やグループによって保守
されている場合は, ソースツリーの当該
Makefile に
MAINTAINER= email-addresses
が付け加えられています. これを記述することによって,
この部分が誰によって保守管理されているかを世界中のユーザに
伝えることができます.
この意味は次のとおりです:
保守担当者がそのコードを所有し, そのコードに対する責任を持っ
ています. すなわち,
その人がそのコードに関するバグの修正やトラブル報告
に対する回答をします. また,
そのコードが寄贈ソフトウェアの場合には, そのソフトウェアの
新しいバージョンに適切に追従させる作業をその人が行い
ます.
保守担当者が決められているディレクトリに対して
変更をおこなう場合は, 変更をおこなう前に,
その変更内容を保守担当者に送って,
保守担当者にレビューをしてもらってください. 保守担当者が,
電子メールに一定期間応答しない場合にのみ,
保守担当者がレビューすることなしに,
変更をおこなうことが認められます. しかしながら,
そのような場合でも可能な限り, 変更点を第三者にレビュー
してもらうようにしてください.
もちろん, この義務を引き受けることができない人やグループを
保守管理者として追加することはできません. また,
保守管理者がソースツリー管理者 ("committer") である必要は
ありません.
Poul-Henning
Kamp
寄稿:
David
O'Brien
寄贈ソフトウェア
寄贈ソフトウェア
訳者: &a.jp.mihoko;
FreeBSD 配布物のうちのいくつかのソフトウェアは FreeBSD
プロジェクト 以外のところで保守されています. 歴史的な経緯から,
私たちはこれを 寄贈 ソフトウェアと
呼んでいます. perl や gcc
patch などがその例です.
ここ数年来, この種のソフトウェアの取り扱いには,
さまざまな方法が 取られてきましたが,
どの方法にもいくつかの利点と欠点があります.
これまで欠点のない明確な方法はありませんでした.
議論した結果, これらの方法のうちの一つが
公式な
方法として選択され ました. その方法が, 今後,
この種のソフトウェアを取り込む場合に, 使用 されます. その上,
この方法では, だれもが(cvs
にアクセス権のない人でさえ)公式
バージョンのソースに対する差分を簡単に得ることができます.
これは古い方法にはなかった大きな利点です. ですから,
既存の寄贈ソフトウェアも,
この方法に収束していくことを強く望んでいます.
この方法を使用することにより, 寄贈ソフトウェアの主な開発者に,
変更 点を返すのがとても容易になります.
しかしながら結局, 寄贈ソフトウェアの取扱は,
実際に作業を行って いる人々に委ねられています.
もしこの方法を使用することが, その人が扱っているパッケージには
極端に合わないような場合には, コアチームの承認さえあれば,
これらの ルールに反しても,
他の開発者の一般的な合意は得られるでしょう.
将来にわたってパッケージを保守できるということは,
大変重要な事柄に なってきます.
RCS のファイルフォーマットと CVS
のベンダブランチの使用には不幸な設計上の制限があります.
したがって,
ベンダブランチの内容をいまだに引きずっているファイルに
対して小さな, 些細な変更, そして / あるいは
膨大な変更を加えることには,
強い反対があります.
誤字訂正
はもちろんこの中に入りますし,
しかも膨大な
の範疇に入るので, リビジョンが
1.1.x.x
であるファイルに対する誤字訂正は避けられることになっています.
一文字の変更したことによるリポジトリの肥大は,
非常に劇的なものになり得るのです.
プログラミング言語 Tcl は,
この方法が活用されているよい例になっています:
src/contrib/tcl には,
このパッケージの保守管理者が 配布したソースが含まれています.
この中からは FreeBSD に完全には適用
できない部分が削除されています. Tcl の場合は,
mac, win,
compat というサブディレクトリは, FreeBSD
に取り込む前に削除されて いました.
src/lib/libtcl には,
ライブラリを生成したり, ドキュ
メントをインストールする際に使用される, 標準の
bsd.lib.mk の 規則を使用した
bmake スタイルの
Makefile だけが含まれています.
src/usr.bin/tclsh には,
bsd.prog.mk 規則 を使用して,
tclsh
プログラムや関連するマニュアルページを生成 /インストール する
bmake スタイルの Makefile
だけが含まれています.
src/tools/tools/tcl_bmake には, Tcl
ソフトウェアを更新する必要が生じたときの助けになる2つのシェルス
クリプトが含まれています. これらは,
ソフトウェアを構築するのに使用し たり,
インストール対象になるソフトウェアではありません.
ここ重要なのは, src/contrib/tcl
ディレクトリが, 規則にしたがっ て作られているということです.
つまり, できるだけ FreeBSD に特化した
変更をおこなわないようにしたソースを(RCS
のキーワードを拡張しないで, CVS のベンダブランチに)おくようにし
ています.
freefall 上の「簡易取り込み」ツールは,
寄贈ソフトウェアを取り込む手助けとなります. けれども,
このツールの実行方法に疑問が生じた場合は, まずはじめに質問して,
失敗をしないようにしてください. そして,
その疑問を解決して
からツールを使用してください.
CVS に寄贈ソフトウェアを取り込む際には,
事故があってはいけません.
よくあるような間違いをおかさないように,
十分注意してください.
先ほど述べたように, 残念なことに CVS
にはベンダブランチという設計制限があります. このため, CVS
に寄贈ソフトウェアを取り込むには, オリジナル配布ソースに
適用されるベンダからの公式
パッチと,
ベンダブランチに逆輸入された 結果が必要です.
ベンダブランチの一貫性を破壊したり, 将来,
新しいバージョンを取り込む
時に衝突を起こしてしまったりというような
困難な事態に陥らないように しなければなりません. そのために,
FreeBSD が管理しているバージョンに 対して,
公式パッチを決して当ててはいけませんし, 公式パッチを "commit"
してはいけません.
多くのパッケージが, 他のアーキテクチャや他の環境と FreeBSD
との互換性を保ためのファイルをいくつか含んでいます. そこで,
スペースを節約するために, FreeBSD
にとっては無意味な配布ツリー上の一
部を削除することが許されています. けれども,
削除されずに残ったファイルに対する, 著作権の通知やリリース
ノートのような情報を含んだファイルは, 決して削除しては
いけませ ん .
bmake Makefile
が何らかのユーティリティによって, 配布ツリー
から自動的に生成できると, うまくいけば, 新しいバージョンへの
アップグレードをより簡単におこなうことができます.
もしこのようなユーティリティを作成できた場合には, 将来の管理者に
とって便利になるように, 移植の際に,
src/tools ディレクトリ上に, (必要に応じて)
そのユーティリティを必ずチェックインしてください.
src/contrib/tcl
レベルのディレクトリには, FREEBSD-upgrade
と 呼ばれるファイルが追加されており, そのファイルでは
次のような内容が 記述されています.
ディレクトリ上に存在するファイル
オリジナルの配布物をどこから入手すればよいか また,
公式配布 サイトはどこか
オリジナルの作者にパッチを送り返すためには,
どこに送ればよいか
FreeBSD に特化した変更点の概要
しかしながら, 寄贈ソースと一緒に
FREEBSD-upgrade ファイルを
取り込まないでください. それよりむしろ,
(訳注:このファイルを)初回に取り込んだ後は, コマンド cvs
add FREEBSD-upgrade ; cvs ci を実行してください.
src/contrib/cpio を例にすると,
次のようになります:
このディレクトリは「ベンダ」ブランチ上のオリジナル配布ファイル
の初期ソースが含まれています. いかなる事情があっても,
パッチや cvs コミットによってこのディレクトリ上のファイルを
アップグレードしてはいけません.
(訳注:ベンダから配布された)新しいバージョンや公式パッチだけが
(訳注:このディレクトリに)取り込まれなくてはいけません.
ベンダの RCS Id が CVS に入ってしまうのを避けるために, "-ko" オプ
ションをつけてインポートすることを忘れないで下さい.
GNU cpio 2.4.2 を取り込むためには, 以下のファイルが削除されました:
INSTALL cpio.info mkdir.c
Makefile.in cpio.texi mkinstalldirs
cpio を新しいバージョンにアップデートするためには, 次の作業を
おこないます:
1. 空のディレクトリに新しいバージョンを取り出します.
[ファイルに「いかなる変更」も加えてはいけません]
2. 上記にリストされたファイルと, FreeBSD には無意味な
ファイルを削除します.
3. 次のコマンドを実行します:
cvs import -ko -m 'Virgin import of GNU cpio v<version>' \
src/contrib/cpio GNU v<version>
例えば, バージョン 2.4.2 を取り込むためには, 次のように
タイプします:
cvs import -ko -m 'Virgin import of GNU v2.4.2' \
src/contrib/cpio GNU v2.4.2
4. FreeBSD に対するローカルな変更と, 新しいバージョンとの間での
矛盾を解消するために, ステップ 3 で出力された命令を実行します.
いかなる事情があっても, この手順から外れてはいけません.
cpio にローカルな変更を加えたい場合には, メインブランチ(別名 HEAD)に対して
パッチを実行し, コミットしてください.
決して GNU のブランチにローカルな変更を加えないでください.
ローカルにおこなわれたすべての変更を次のリリースに含めるために,
"cpio@gnu.ai.mit.edu" に提出してください.
obrien@FreeBSD.org - 30 March 1997
ソース管理上注意が必要なファイル (Encumbered Files)
場合によっては FreeBSD のソースツリーの中にソース管理上
注意が必要なファイルを含む必要があるかも知れません. 例えば, デバイス
を操作する前に, そのデバイスに小さなバイナリコードをダウンロード
する必要があり, しかも我々が そのソースコードを持っていない場合,
そのバイナリファイルのことをソース管理上注意が必要である(encumbered)
と言います.
以下に挙げるガイドラインでは, ソース管理上注意が必要なファイルを
FreeBSD ソースツリーにいれる方法を示します.
システムのCPU(s)によってインタプリタされたり
実行されたりするファイルで, しかもソース形式でないファイルは
すべて, ソース管理上注意が必要なファイルです.
BSD または GNU よりも制限されたライセンスを持つファイルは
すべて ソース管理上注意が必要なファイルです.
ハードウェアによって使用されるダウンロード可能な
バイナリコードを含むファイルは, (1) または (2) の条件が
当てはまらなければ, ソース管理上注意が必要なファイル
ではありません.
そのようなファイルはアーキテクチュアに依存しない
ASCII 形式(file2c または uuencode が推奨されます)で保存
します.
コアチーム(core team)
ソース管理上注意が必要なファイルはすべて, CVS リポジトリ
に加える前に,
コアチーム(core team) からの特別な承認
が必要です.
ソース管理上注意が必要なファイルは src/contrib
または src/sys/contrib に入ります.
すべてのモジュールは一緒に置きます. ソース管理上とくに注意
を必要としないコードとコードを共有していない限りは,
モジュールの置場を分ける必要はありません.
オブジェクトファイルは
arch/filename.o.uu> と命名されます.
カーネルファイル;
必ず
conf/files.* (構築を簡単にするため
) に記述するようにして下さい.
必ず LINT に記述して下さい,
ただし, それをコメントアウトすべきかどうかは
Core team がその都度
判断します.
もちろん Core team は
あとでそれを変更することもできます.
リリースエンジニア(release engineer)
リリースエンジニア
は, それをそのリリースにいれるかどうかを決定します.
ユーザ領域のファイル;
Core team は, そ
のコードが make world の中で構築される
べきかどうかを決定します.
リリースエンジニア
は, それをそのリリースにいれるかどうかを決定します.
Satoshi
Asami
寄稿:
Peter
Wemm
David
O'Brien
共有ライブラリ
もしあなたが共有ライブラリをサポートする機能を port
に追加した り,
共有ライブラリをサポートしていない他のソフトウェアに追加する
場合には, 共有ライブラリのバージョン番号を次の規則にしたがって
つけてください. 一般的には, この規則は,
ソフトウェアのリリースバージョンとは 全く関係ありません.
共有ライブラリを作成する三つの重要な規則は
次の通りです:
1.0 から始める
過去のバージョンに互換性のある変更の場合は,
マイナー番号を増やす(ELF システムでは
マイナー番号が無視されることに注意して下さい)
互換性のない変更の場合は, メジャー番号を増やす
例えば, 機能追加とバグ吸収の場合は,
マイナー番号を増やします. 機能削除,
関数呼び出しのシンタックスなどが変更された場合は,
強制的にメジャー番号を変更します.
メジャー.マイナーー
(x,y)
の形式のバージョン番号を使用します. FreeBSD における
a.out 形式のダイナミックリンカは,
x.y.z
という形式のバージョン番号 は扱えません.
この場合, y の後のバージョン番号
(つまり三つ目の数字)は,
どのライブラリがリンクされているかを決めるために, 共有ライブラ
リ番号を比較する際に, すべて無視されます.
小さな
リビジョンだけが
異なる二つの共有ライブラリが指定 されると,
ld.so は,
リビジョンの大きい方の共有ライブラリを リンクします. すなわち,
もしあなたが libfoo.so.3.3.3 をリンク
していたとすると, リンカは頭の 3.3
という部分だけを認識し, libfoo.so.3
ではじまり その後に 3
以上の数字が続くもののうち,
最も大きい番号
の付いているライブラリをリンクします.
ld.so はいつも最も大きい
マイナー
リビジョンのものを使うことに
注意してください. 例えば, プログラムがはじめ
libc.so.2.0 を リンクしていたとしても,
libc.so.2.0 よりも
libc.so.2.2 を優先して使用します.
さらに, ELF ダイナミックリンカはマイナーバージョンを全く扱いません.
しかし, 作成した Makefile がそのようなシステムでも
「きちんと動作できる」ように, メジャー番号およびマイナー番号を
指定する必要があります.
移植されていないライブラリに対しては,
共有ライブラリのバージョン番号はリリースごとに一度だけ変更し,
また, 主要な共有ライブラリのバージョン番号は, OS の主リリースごとに
一度だけ変更する, というのが私たちのポリシーです.
つまり, X.0 は (X+1).0 になります.
あなたがシステムライブラリのバージョン番号を上げた場合は,
Makefile の commit ログを確認してください.
結果としてそのリリースには, 共有ライブラリのバージョン番号が
アップデートされた Makefile
に入るので, 最初にその変更を 確かめるのがソースツリー管理者
("committer") の責務です. その後のどんな変更も,
そのリリースには入りません.
diff --git a/ja_JP.eucJP/books/handbook/printing/chapter.sgml b/ja_JP.eucJP/books/handbook/printing/chapter.sgml
index e482297911..08fed6989a 100644
--- a/ja_JP.eucJP/books/handbook/printing/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/printing/chapter.sgml
@@ -1,5315 +1,5315 @@
プリンタの利用
原作: Sean Kelly kelly@ad1440.net, 1995 年 9 月 30 日.
改訂: &a.jim;, 2000 年 3 月
訳: &a.jp.kimura;, 1996 年 9 月 3 日
この章では
LPD スプーリングシステム
印刷
FreeBSD でプリンタを使用するためには,
バークレーラインプリンタスプーリングシステム
(LPD スプーリングシステムとしても知られています)
が機能するようにプリンタをセットアップする必要があります.
本章では設定例を通して, LPD スプーリングシステム
(大抵の場合, 単に LPD と呼ばれる)
について紹介します.
もし, LPD
や他のプリンタスプーリングシステムについてすでに詳しい知識をお持ちの方は,
スプーリングシステムのセットアップから読み始めても構いません.
はじめに
LPD はあるホストのプリンタに関する制御の一切を行ないます.
ここで言う制御としては, 次のことがあげられます.
ホストに接続されたプリンタ,
あるいはネットワーク上の他ホストに接続されたプリンタに対するアクセス制御を行ないます.
プリントジョブ
ファイルをプリントする要求に対して許可を与えます.
この要求は特にジョブと呼ばれています.
各々のプリンタのキューを管理することにより,
複数のユーザがあるプリンタに対して同時にアクセスすることを防ぎます.
ヘッダページ
(バナーまたは
バーストページとしても知られています)
をプリントすることができます.
これにより,
プリントアウトの山の中から自分がプリントしたジョブを見つけやすくなります.
シリアルポートに接続したプリンタ用に通信パラメータを管理します.
ネットワーク経由で他のホスト上の
LPD スプーラにジョブを送ることができます.
様々なプリンタ言語やプリンタの能力に応じてジョブの形式を整えるため,
特別なフィルタを起動することができます.
プリンタの使用に対して課金を行なうことができます.
設定ファイルを通して, あるいは特別なフィルタプログラムを用いることにより,
多種多様なプリンタ機器に対して,
上述の機能の全部または一部を LPD システムに行なわせることができます.
どうしてスプーラを使うべきなのか
あなたのシステムを利用するのがあなた一人だけだとしたら,
アクセス制御もヘッダページも
プリンタ利用に対する課金も必要ないのに,
なぜわざわざスプーラに煩わされなければならないのか疑問に思うかも知れません.
プリンタに対する直接アクセスを許可することもできるのですが,
とにかくスプーラを使用するべきです. その理由は,
LPD はジョブをバックグラウンドで処理します.
データがプリンタに送信されるまで待つ必要がなくなります.
TeX
LPD ではジョブをフィルタを通してプリントすることが簡単にできます.
これにより, 印刷物のヘッダに時刻や日付を入れたり,
特別なファイル形式 (TeX の DVI ファイルなど)
をプリンタが処理できる形式に変更することができ,
これらの作業を手動で行なう必要がなくなります.
プリント処理を行なうフリー,
または商用のプログラムのほとんどは,
システムのスプーラとやりとりするように作られています.
スプーリングシステムをセットアップすることで,
今後加えるかもしれない, あるいは,
すでに持っている別のソフトウェアをより簡単にサポートすることができるでしょう.
基本的なセットアップ
LPD スプーリングシステムを用いてプリンタを使用するためには,
プリンタ機器と LPD 用ソフトウェアの両方を準備する必要があります.
本文書では次の二段階のレベルに分けて説明をします.
プリンタを接続する方法,
プリンタにどのように通信するかを LPD に指示する方法や,
プレインテキストをプリンタで印字する方法については,
プリンタの簡単な設定をご覧ください.
様々な形式のファイルを印字する方法,
ヘッダページを印字する方法,
ネットワーク経由でプリンタに印字する方法,
プリンタを制御する方法,
プリンタの使用に対する課金を行なう方法についてはプリンタ設定
上級編をご覧ください.
プリンタ設定導入編
この節では, プリンタ機器やプリンタを使用するための
LPD 用ソフトウェアを設定する方法について述べます.
この節の概要は次のとおりです.
プリンタ機器の設定では,
プリンタをコンピュータに接続するためのヒントがいくつか書かれています.
ソフトウェアの設定では,
LPDのスプーラ設定ファイル
/etc/printcap
の設定方法について書かれています.
データをプリンタに送るためにシリアルまたはパラレルインタフェースではなく,
ネットワークプロトコルを使用する場合は,
ネットワークにおけるデータストリームインタフェースを持つプリンタをご覧ください.
この節のタイトルはプリンタ設定導入編
ですが,
実際の設定はかなり複雑です.
プリンタをコンピュータに接続し,
LPD スプーラを起動させることは一番困難な作業です.
ヘッダページを出力させたり課金したりするオプションの設定は,
一度プリンタがうまく動くようになればとても簡単です.
プリンタ機器の設定
この節では, プリンタに PC
を接続するための様々な方法について説明しています.
ここでは, ポートやケーブルの種類,
FreeBSD がプリンタとの通信に必要なカーネルコンフィグレーションについても言及しています.
もしプリンタが既に接続されていて,
他のオペレーティングシステム上でプリンタからの印字に成功している場合は,
ソフトウェアの設定まで読み飛ばすことが多分できるでしょう.
ポートとケーブル
最近の PC
用のプリンタほとんどには次のインタフェースの一つもしくは両方がついています.
プリンタ
シリアル
シリアルインタフェースでは,
プリンタにデータを送信するためにコンピュータにあるシリアルポートが使用されます.
シリアルインタフェースはコンピュータ業界で共通して使用されています.
そのケーブルは容易に手に入りますし, 簡単に自作することもできます.
シリアルインタフェースの場合は時々,
特別なケーブルや何か複雑な通信方式選択の設定が必要になることがあります.
プリンタ
パラレル
パラレルインタフェースではプリンタにデータを送信するために,
コンピュータにあるパラレルポートを使用します.
パラレルインタフェースは PC 業界では良く使われます.
ケーブルの入手は容易ですが,
自作するのはシリアルよりも困難です.
パラレルインタフェースには通常, 通信方式の選択はなく,
設定は極めて単純です.
セントロニクス
パラレルプリンタ
パラレルインタフェースはセントロニクス
インタフェースとして知られています.
これは, プリンタ用のコネクタタイプとして採用された後に名付けられました.
シリアルインタフェースはパラレルインタフェースよりも普通はデータの伝送速度が遅くなります.
パラレルインタフェースでは, 通常,
(コンピュータからプリンタへの) 単方向通信のみを行なうのに対して,
シリアルインタフェースは双方向通信を行ないます.
FreeBSD でも IEEE1284 準拠のケーブルを使えば,
最近のパラレルポートとプリンタの多くで双方向通信を行なうことができます.
PostScript
通常, プリンタで双方向通信が必要となるのは, プリンタが
PostScript 言語に対応しているときだけです.
PostScript プリンタは非常に冗長に動作させることができます.
事実, PostScript によるジョブでは, プログラムを本当にプリンタに送信します.
このことは, 印字作業を必ずしもする必要がないことを意味しますし,
そのプログラムの結果はコンピュータに直接返されるかも知れません.
PostScript プリンタでは双方向通信を使って
PostScript プログラムのエラーや紙づまりといった問題をコンピュータに報告します.
ユーザはそれらの情報を知りたいと思うかも知れません.
また, PostScript プリンタで課金作業をもっとも効率よく行なうためには,
双方向通信が必要となります.
この方法ではまず, プリンタの現在のページカウント
(起動してから今まで何枚の紙を印字したか) の情報を得ます.
次に, ユーザのジョブを実行し, 終了後, 再びページカウントを得ます.
この二つの数を差によって,
課金対象となる紙の枚数を知ることができるのです.
パラレルポート
プリンタをパラレルインタフェースを使って接続する場合は,
セントロニクスケーブルでプリンタとコンピュータを接続してください.
詳しい説明はプリンタやコンピュータに付属する説明書に書かれているはずです.
その際,
どのパラレルポートを使用したかを覚えておいてください.
FreeBSDでは最初のポートは /dev/lpt0,
二番目 /dev/lpt1 であ り,
三番目以降も同様に続きます.
シリアルポート
シリアルインタフェースを使ってプリンタを使う場合は,
適切なシリアルケーブルでプリンタとコンピュータを接続してください.
詳しい説明はプリンタ, コンピュータ, あるいは両方に付属する説
明書に書かれているはずです.
適切なシリアルケーブル
が良くわからないときは,
次のどれかを試してみてください.
モデム用ケーブルでは,
それぞれのピンは他方のコネクタの対応するピンと線でつながっています.
このタイプのケーブルは DTE-DCE
間ケーブルとしても知られています
(訳注:
日本ではストレートケーブルという名前で売られています).
ヌルモデム用ケーブル
ヌルモデム用ケーブルでは,
あるピンは対応するピンとを接続していますが,
あるピン
(たとえば, データ送信用とデータ受信用のピン)
が交差して接続したり,
いくつかのピンは内部で短絡していたりします.
このタイプのケーブルは,
DTE-DTE
間ケーブルと呼ばれています
(訳注:
日本ではクロスケーブルという名前で売られています).
A シリアルプリンタ用ケーブルは,
ある特定のプリンタで必要とされるものです.
ヌルモデムケーブルと似ていますが,
内部で短絡させる代わりに,
ある信号を他方側に送るために使用しています.
ボーレート
パリティ
フローコントロールプロトコル
この他に,
プリンタ用の通信パラメータを設定する必要があります.
通常,
プリンタのフロントパネルや DIP スイッチによって制御します.
コンピュータとプリンタの双方で設定できる最高の通信速度
[bps] (ビット/秒.
ボーレートと示されているときもある)
を選んでください. そして, データビット (7 または 8),
パリティ(偶/奇/なし), ストップビット (1 または 2)
を選んでください.
そして, フローコントロールの有無
(制御なし, または XON/XOFF (イン・バンド
または
ソフトウェア
フローコントロールとも呼ばれる))
を選びます.
以下に続くソフトウェアの設定のために,
ここでの設定を覚えておいてください.
ソフトウェアの設定
本節では FreeBSD の LPD
スプーリングシステムで印字をおこなうために
必要となるソフトウェアの設定について説明しています.
本節の概要は次のようになります.
プリンタで使用するポートのために, 必要があれば,
カーネルの書き変えをおこないます. 「カーネルの変更」で,
このためにしなくてはならないことを説明しています.
パラレルポートを使用している場合は,
パラレルポートのための通信モードの設定します. 詳細は, 「
パラレルポートの通信モードを設定する
」で説明しています.
オペレーティングシステムからプリンタにデータが送ら
れているかをテストします. 「
プリンタとの通信状況を調べる」で,
どのようにテストするかの提案をいくつかおこなっています.
ファイル/etc/printcapを変更し,
LPDの設定を おこないます. この節で, どのように変更するかを
説明しています.
カーネルの変更
オペレーティングシステムのカーネルの
コンパイルをおこなうことによって,
指定されたのデバイスが機能するようになります. シリアル,
または, パラレルインタフェースをプリンタで使用する場合,
必要なデバイスがこの指定の中に含まれていなくてはなりません.
したがって,
必要なデバイスがカーネルに組み込まれていない場合,
追加のシリアル, または, パラレルポートをサポートするために,
カーネルの再コンパイルが必要となるかもしれません.
シリアルポートが現在使用しているカーネルで
サポートされているかどうかを調べるためには,
次のように入力します.
&prompt.root; dmesg | grep sioN
ここで, N
はシリアルポートの番号を示し, この番号は0から 始まります.
次のような出力があった場合,
カーネルはそのポートをサポートしています.
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
パラレルポートが現在使用しているカーネルで
サポートされているかどうかを調べるためには,
次のように入力します.
&prompt.root; dmesg | grep lptN
ここで, N
はパラレルポートの番号を示し, この番号は 0 から始まります.
次のような出力があった場合,
カーネルはそのポートをサポートしています.
lpt0 at 0x378-0x37f on isa
上記の出力が得られない場合, プリンタを使うため,
オペレーティングシステムにパラレル, または,
シリアルポートを認識し, 使用できるようにするためには
カーネルを変更する必要があります.
シリアルポートをサポートさせるには, 「
FreeBSDカーネルのコンフィグレーション」の節をご覧く
ださい. パラレルポートをサポートさせる場合も, その節と,
あわせて,
この節に続く節もご覧ください.
ポート用エントリを /dev
に追加する
カーネルがシリアル, または, パラレルポートを通じての通
信をサポートしていたとしても, システム上で動いているプログ
ラムがデータの送受信をおこなうための
ソフトウェアインタフェースがさらに必要になります.
そのインタフェースは, /dev
ディレクトリにあるエントリに相当します.
/dev
エントリにポートを加えるために
&man.su.1; コマンドで root になります. suコマンド
でパスワードを聞かれたら, ルート用のパスワードを入力し
ます.
/dev
ディレクトリに移動します.
&prompt.root; cd /dev
次のように入力します.
&prompt.root; ./MAKEDEV port
ここで, port は,
作成するポート名です. 1番目 のパラレルポートのときは
lpt0 に, 2番目のときは
lpt1 になり, 以降同様になります.
1番目のシリア ルポートのときは,
ttyd0 に, 2番目のときは
ttyd1 になり,
これも以降同様となります.
次を入力し, デバイスのエントリができたか確認します.
&prompt.root; ls -l port
パラレルポートの通信モードを設定する
パラレルインタフェースを使用している場合, FreeBSDでは,
割り込み駆動型にするか,
プリンタとの通信の状況をカーネルに監
視させるかのいずれかを選択できます.
GENERIC
カーネルでは割り込み駆動方式が,
デフォルトになっています. この方式では,
オペレーティングシ
ステムはプリンタがデータを受け付けられるかどうかを調べ
るために, IRQ ラインを一つ使用します.
監視方式では,
オペレーティングシステムにプ
リンタがもっとデータを受け付けられるかどうかを繰り返し
尋ねるように指示します. そして, 受け付けるという応答を
受けたとき,
カーネルはさらなるデータを送信します.
割り込み駆動方式は, いくらか高速になりますが, 貴重な
IRQ ラインを一つ消費します.
うまく機能するものをお使いください.
通信モードを設定するためには2つの方法があります.
1つはカー
ネルを変更することで, もう一つは
&man.lptcontrol.8; プログラムを使用する方法です.
カーネルを設定することによって,
通信モードを変更する.
カーネルコンフィグレーションファイルを変更します.
lpt0
のエントリを探すか追加してください. 2番目
のパラレルポートを設定するときは, 代わりに
lpt1 を使います. 以下,
3番目のポートは lpt2 となってい
きます.
イベント駆動方式にする場合は,
irq 指定を追加します.
device lpt0 at isa? port? tty irq N vector lptintr
ここで, N
はパラレルポート用の IRQ 番号です.
監視方式を使用する場合は,
irq を追加してはいけません.
device lpt0 at isa? port? tty vector lptintr
ファイルをセーブし, config プログラムを起動し,
カーネルの構築, インストールをおこないます. そして,
リブートしてください. 詳細は, 「
FreeBSDカーネルのコンフィグレーション」を参照
してください.
&man.lptcontrol.8;
で通信モードを設定する場合
lptN
をイベント駆動方式に設定する場合は,
次のように入力します.
&prompt.root; lptcontrol -i -u N
lptN
を監視方式に設定する場合は, 次のように入力します.
&prompt.root; lptcontrol -p -u N
これらのコマンドを /etc/rc.local
ファイルに追加
しておくと, システムをブートする度に通信モードを設定する
ことができます. 詳細については,
&man.lptcontrol.8; をご覧ください.
プリンタとの通信状況を調べる
スプーリングシステムの設定に進む前に, オペレーティング
システムがプリンタにデータを送ることに成功しているかどうか
を確かめるべきでしょう. これにより, 印字がうまくいかないと
き, プリンタとの通信が問題なのか, スプーリングシステムが問
題なのかを分けて調べることがかなり容易になります.
プリンタをテストするためには,
プリンタに何かのテキストを送
信してみます. 送信した文字をすぐに印字してくれるプリンタに
は, &man.lptest.1; コマンドを使うと有用です. このコマンドは印
字可能な96文字のASCII文字すべてを96行生成します.
PostScript
PostScript (または他の言語に対応した) プリンタの場合
は, もっと巧妙なテストが必要になります. 次のような, 簡単な
PostScript プログラムを使えば十分でしょう.
%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto
/Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage
上の PostScript コードはファイルに保存し,
以降の節で例として示されているように利用することができます.
PCL
このドキュメントでプリンタ用言語を参照するときは,
PostScript のような言語を仮定しており, Hewlett Packard
の PCL は考慮していません. PCL は非常に機能的なの
ですが,
プレインテキストにエスケープシーケンスを混ぜること
ができます. PostScript ではプレインテキストを直接印字
することはできません.
このような種類のプリンタ言語に対しては,
特別な対応をおこなわなければなりません.
パラレルポートのプリンタとの接続を調べる
プリンタ
パラレル
この節では, FreeBSDがパラレルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について説明し
ています.
パラレルポートのプリンタをテストするために
&man.su.1; コマンドで root になります.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合,
&man.lptest.1; コマンドを使います.
次のように入力してください.
&prompt.root; lptest > /dev/lptN
ここで, N
はパラレルポートの番号で, 番号は
0から始まります.
プリンタが PostScript か他のプリンタ
言語を使用している場合, そのプリンタに簡単なプロ
グラムを送信してください. 次のように入力します.
&prompt.root; cat > /dev/lptN
そして, 一行一行,
プログラムを慎重に入力して
下さい. RETUREN または ENTER キーを入力してしま
うと, その行は編集できなくなります. プログラムの
入力が終わったら, CONTROL+Dか, あなたが設定して
いるファイル終了のキーを押してください.
もしくは, プログラムを入力したファイルがある
場合は, 次のように入力してください.
&prompt.root; cat file > /dev/lptN
ここで, file
はプログラムが格納されていて,
プリンタに送信するファイルの名前です.
これで何かがプリントされることでしょう.
印字されたテキ
ストがおかしくても心配しなくても構いません. それについ
ては, 後で修正します.
シリアルポートのプリンタとの接続を調べる
プリンタ
シリアル
この節では, FreeBSDがシリアルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について述べられ
ています.
シリアルポートのプリンタをテストするために
&man.su.1; コマンドで root になります.
/etc/remote
ファイルを編集します. 次のエントリを加えてください.
printer:dv=/dev/port:br#bps-rate:pa=parity
bit/秒
シリアルポート
パリティ
ここで, port
シリアルポート (ttyd0,
ttyd1 など) のデバイスエントリで,
bps-rateは
プリンタとの通信の転送速度[bit/秒],
parityはプリ
ンタとの通信で必要とされるパリティ
(even, odd,
none,
zeroのいずれか) を表わしていま
す.
次の例は,
プリンタをシリアルケーブルでパリティなし, 転送速度
19200bpsで第3番目のシリアルポートに接続した場
合です.
printer:dv=/dev/ttyd2:br#19200:pa=none
&man.tip.1; コマンドでプリンタと接続します.
次のように入力してください.
&prompt.root; tip printer
これがうまくいかなかった場合は,
/etc/remoteを編集して,
/dev/ttydN
の代わりに
/dev/cuaaN
を試してみてください.
プリンタにデータを送ります.
プリンタがプレインテキストを印字できる場合,
&man.lptest.1; コマンドを使います.
次のように入力してください.
~$lptest
プリンタが PostScript か他のプリンタ
言語を使用している場合, そのプリンタに簡単なプロ
グラムを入力します. 一行一行,
プログラムを慎
重に入力してください.
バックスペースキーや他の編集用のキーは,
プリンタの制御コードに割り当てられ
ているかもしれません. プログラムが終了したことを
プリンタに伝えるための特別なファイル終了キーを入
力する必要があるかもしれません. PostScript
プリンタの場合, CONTROL+Dを入力します.
もしくは, プログラムを入力したファイルがある
場合は, 次のように入力してください.
~>file
ここで, file
はプログラムが格納されているファイル名です.
&man.tip.1; コマンドでファイルを送信した後は,
ファイル終了を表わすキーを入力する必要があります.
これで何かがプリントされることでしょう.
印字されたテキ
ストがおかしくても心配しなくても構いません.
それについては, 後で修正します.
スプーラに許可を与える:
/etc/printcap ファイル
ここまでで, プリンタはコンピュータに接続され, (必要なら)
プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ
リンタに送信することができているはずです. これで, LPDにプリ
ンタへのアクセスを
制御させる設定をおこなう準備が整いました.
LPDの設定は /etc/printcap
を編集することでおこないます.
LPDスプーリングシステムはスプーラが使われる毎にこのファイル
を参照します. そのため, ファイルを更新するとすぐにその変更が
反映されます.
プリンタ
ケイパビリティ
&man.printcap.5; ファイルの書式は簡単です.
/etc/printcap
の編集はお好みのテキストエディタをお
使いください. このファイルの書式は,
/usr/share/misc/termcap や
/etc/remote
といった他のケイパビリティファイルと一致しています.
この書式
のついての詳細な情報については
&man.cgetent.3; をご覧ください.
スプーラの単純な設定法は,
次のステップでおこないます.
プリンタに名前 (と簡単な別名2〜3個) を付け, それを
/etc/printcap ファイルに記述します.
これについては, 「
プリンタに名前を付ける」
を参照してください.
ヘッダページ
sh の項目を追加することで,
ヘッダページの出力を禁止します (デフォルトは許可).
これについては, 「
ヘッダページの印字を禁止する」
を参照してください.
スプール用のディレクトリを作成し, その位置を
sd 項目で指定します. これについては,
「
スプーリングディレクトリの作成」
を参照してください.
プリンタを使用するために /dev
エントリを設定し, /etc/printcap の
lp 項目でそのエントリを指定します.
これについては, 「
プリンタデバイスの特定」 を参照してください.
プリンタをシリアルポートに接続した場合は,
fs, fc,
xs, xc
の項目を設定する必要があります. こちらについては,
「
スプーラのための通信パラメータの設定」
を参照してください.
プレインテキスト用の入力フィルタのインストールを
おこないます. 「
テキストフィルタのインストール」
を参照してください.
&man.lpr.1; コマンドで何かを印字することで設定のテス
トをおこないます.
印字してみよう と
トラブルシューティング を参照してください.
PostScript プリンタのような,
プリンタ言語を使用しているプリンタには,
プレインテキストを直接印字させることができません.
上にアウトラインを示し,
以下の節で説明する簡単な設定方法の説明では,
そのようなプリンタを設置している場合は,
プリンタが認識できるファイルだけを印字の対象としているという
仮定をしています.
多くの場合,
利用者はシステムに設置されているプリンタすべてで
プレインテキストが印字できることを期待しています.
印字作業をおこなうために LPD
のインタフェースを利用するプログラムでも,
通常, そのような仮定を置きます.
プリンタ言語を使用するプリンタを設置しており,
そのプリンタ言語で記述されたジョブと,
これに加えて,
プレインテキストのジョブも印字できるようにしたいならば,
上で示した簡単な設定方法に加えて,
さらなる設定をおこなうことを強くお勧めします. すなわち,
原始的なプレインテキストから PostScript (もしくは,
他のプリンタ言語)
に変換するプログラムをインストールしてください. 「
プレインテキストのジョブを PostScript
プリンタで印字する」
で, それをどのようにおこなえばよいのかが説明されています.
訳注
日本語を印字したい場合は, プリンタ言語を使用し
ていない「日本語プリンタ」についても,
プリンタ固有のエスケープシーケンスを送る必要があります.
また, 漢字コードをプリン
タが設定しているものに変換したりする必要があり,
各プリンタ毎に, 日本語用のフィルタが必要になります.
プリンタに名前を付ける
最初の (簡単な) ステップで, プリンタの名前を考えます.
プリンタには別名をいくつか付けることもできるので,
機能的な名前
でも風変わりな名前でもどちらを選んでもまったく
問題はありません.
少なくとも1つのプリンタには,
/etc/printcap の中で,
lp という別名を持たせるべきでしょう.
この名前はデフォルトのプリンタ名になっています.
ユーザが環境変数 PRINTER を設定しておらず,
かつ, LPDコマンドのコマンドラインで
プリンタの名前が指定されていない場合, lp
がデフォルトのプリンタ名となり,
そのプリンタに出力されます.
それから, これは共通の慣習ですが,
プリンタの最後の別名には,
メーカーやモデル名を含むプリンタの完全な名称をつけることに
なっています.
名前と別名のいくつかを決めたら,
/etc/printcap ファイルに設定します.
プリンタ名は一番左のカラムから書き始めます.
別名はそれぞれ縦棒によって区切られ,
最後の別名の後ろにコロンを置きます.
次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと
Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義
されている /etc/printcap
のスケルトンを記しています.
#
# /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
この例では, 最初のプリンタに rattan
という名前と別名として, line,
diablo, lp そして
Diablo 630 Line Printer
が付けられています. 別名とし て lp
があるので, このプリンタはデフォルトのプリンタとなっ
ています. 2 番目は bamboo と名付けられ,
別名として, ps と
PS, S,
panasonic, Panasonic KX-P4455
PostScript v51.4 が付けられています.
スプーリングディレクトリの作成
プリンタスプール
プリントジョブ
スプーラの簡単な設定の次のステップでは,
スプーリングディレクトリを作成します.
プリンタに送られるジョブは,
その印字が終了するまでこのディレクトリに置かれます. また,
他のたくさんのスプーラもこのディレクトリにファイルを置きます.
様々な事情によりスプーリングディレクトリは, 通常, 慣例
として /var/spool の下に置きます.
また, スプーリングディレクトリの内容は
バックアップをする必要はありません.
&man.mkdir.1; によってディレクトリを
作るだけでスプーリングディレクトリの復旧は完了します.
スプーリングディレクトリの名前は, これも慣例ですが,
次のようにプリンタの名前と同じにします.
&prompt.root; mkdir /var/spool/printer-name
しかしながら, ネットワーク上に使用可能なプリンタがたく
さんあるならば, LPDで印字するための専用のディレクトリに
スプーリングディレクトリを置きたいと思うかもしれません.
例に出てきたプリンタ rattan と
bamboo について, この方式を採用すると,
次のようになります.
&prompt.root; mkdir /var/spool/lpd
&prompt.root; mkdir /var/spool/lpd/rattan
&prompt.root; mkdir /var/spool/lpd/bamboo
各ユーザが印字するジョブのプライバシを守りた
いと考えているならば, スプーリングディレクトリを保護し
て, これを誰からでもアクセスできないようにしたいと思う
かもしれません. スプーリングディレクトリは, deamon ユー
ザと daemon グループに所有され, 読み込み, 書き込み, 検
索可能であり, 他からはアクセスできないようにするべきで
す. 例題のプリンタに対して, 次のようにすることにしましょ
う.
&prompt.root; chown daemon:daemon /var/spool/lpd/rattan
&prompt.root; chown daemon:daemon /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan
&prompt.root; chmod 770 /var/spool/lpd/bamboo
最後に, /etc/printcap ファイルで,
これらのディ レクトリの位置を LPD に伝える必要があります.
スプーリ ングディレクトリのパス名は sd
項目で指定します.
#
# /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:
プリンタ名が最初のカラムから始まっており, そのプリンタ
に関して記述される他のエントリは TAB で字下げされてい
ること, 各行がバックスラッシュで終わっていることに注意
してください.
sd
によりスプーリングディレクトリが指定されていな い場合,
スプーリングシステムは /var/spool/lpd
デフォルト値として使用します.
プリンタデバイスの特定
「ポート用エントリを /dev
に追加する」では, FreeBSD でプリン
タとの通信に使用される /dev
ディレクトリ内のエントリを特定します. そして, LPD
にその情報を伝えます. 印字するジョブを受け取ると,
スプーリングシステムは,
(プリンタにデータを渡す義務がある) フィルタプログラムに
代わって指定されたデバイスをオープンします.
/etc/printcap ファイルで
lp 項目を使って
/dev エントリを記入します.
ここでの例では, rattan
は1番目のシリアルポートに, bamboo
は6番目のシリアルポートに接続されていることにしましょう.
このとき, /etc/printcap には
次のようになります.
#
# /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:
/etc/printcap でプリンタの
lp 項目が指定 されていない場合は, LPD
はデフォルトとして /dev/lp
を使用します. /dev/lp は, 現在の
FreeBSD には存在していません.
設置したプリンタがパラレルポートに
接続されている場合は,
「
テキストフィルタのインストール」
まで読み飛ばしてください.
そうでない場合は, 次節の説明に続いてください.
スプーラのための通信パラメータの設定
プリンタ
シリアル
シリアルポートにプリンタを接続した場合,
プリンタにデータを送信するフィルタプログラムに代わり,
通信速度やパリティ,
その他のシリアル通信パラメータを設定することができます.
このことによる利点は,
/etc/printcap
を編集するだけで,
様々な通信パラメータを試してみることができます.
フィルタプログラムを再コンパイルする必要はありません.
スプーリングシステムで,
シリアル通信の設定が異なっているかもしれない複数のプリンタに
同じフィルタプログラムを使うことが可能になります.
次の /etc/printcap の項目で,
lp で指定された
デバイスのシリアル通信パラメータを制御できます.
br#bps-rate
デバイスの通信速度を
bps-rate に設定します.
ここ で, bps-rate は 50,
75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400,
4800, 9600, 19200, 38400[bit/秒]
のいずれかです.
fc#clear-bits
デバイスをオープンした後で,
sgttyb 構造体の
clear-bits
フラグビットをクリアします.
fs#set-bits
sgttyb 構造体の
clear-bits
フラグビットをセットします.
xc#clear-bits
デバイスをオープンした後で, ローカルモードビット
clear-bits
をクリアします.
xs#set-bits
ローカルモードビット
set-bits
をセットします.
fc, fs,
xc, そして xs
のビットに関する詳しい情報については,
/usr/include/sys/ioctl_compat.h
を参照してください.
項目 lp で指定されたデバイスを LPD
がオープンするとき, LPD は sgttyb
構造体のフラグビットを読み出します. そして, 項目
fc の全ビットをクリアします. 次に,
項目 fs のビットをセットし,
その結果を設定します.
ローカルモードビットに関しても同様におこなわれます.
例題のプリンタで6番目のシリアルポートに接続された
プリンタの設定を追加してみましょう.
通信速度は38400bpsに設定します.
フラグビットとして, TANDEM, ANYP, LITOUT,
FLUSHO, PASS8 をセットします. ローカルモードビットでは,
LITOUT と PASS8 フラグをセットします.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
テキストフィルタのインストール
プリントフィルタ
ここまでで,
プリンタにジョブを送るために使うテキストフィ ルタを LPD
に設定する準備が整いました.
テキストフィルタとは,
入力フィルタとしても知られていますが,
印字するジョブがあるときに LPD が起動するプログラムです.
LPD がプリンタのためにテキストフィルタを起動するとき, LPD
はフィルタの標準入力からプリントするジョブを入力し,
フィルタの標準出力に項目 lp
で指定されたプリンタデバイスを接続します. フィルタは,
標準入力からジョブを読み込み,
プリンタのための必要な変換をおこなった後,
その結果を標準出力に出力する,
これにより印字がなされることを期待されています.
テキストフィルタについての更に詳しい情報については, 「
フィルタはどのように機能しているか」
をご覧ください.
ここでの簡単なプリンタ設定では,
プリンタにジョブを送るため, /bin/cat
を実行するだけの簡単なシェルスクリプトで間に合います.
FreeBSD に標準で付属している lpf
というフィルタでは, バックスペース文字を使った
下線引きの動作をおこなう文字ストリームをうまく扱うことができない
プリンタのための代替処理をおこなってくれます.
もちろん,
他のどんなフィルタプログラムを使っても構いません.
フィルタ lpf については, 「テキストフィルタ
lpf」で詳しく説明します.
最初に, 簡単なテキストフィルタであるシェルスクリプト
/usr/local/libexec/if-simple
を作ってみましょう.
次のテキストをお好みのテキストエディタでファイルに
書き込んでください.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
/bin/cat && exit 0
exit 2
そして, このファイルを実行可能にします.
&prompt.root; chmod 555 /usr/local/libexec/if-simple
LPD
にこのテキストフィルタを使うことを設定するためには,
/etc/printcap に
if 項目を使って指定します. これまでの
/etc/printcap の例のプリンタ 2 台に,
このフィルタを加えてみましょう.
#
# /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\
:if=/usr/local/libexec/if-simple:
LPD を起動します
&man.lpd.8; は lpd_enable 変数に従って
/etc/rc から実行されます. この変数の
デフォルト値は NO です. まだ
そうしていなかったならば
lpd_enable="YES"
の行を /etc/rc.conf に追加して
計算機を再起動するか, そのまま &man.lpd.8; を
起動してください.
&prompt.root; lpd
印字してみよう
簡単な LPD 設定も終わりにたどり着きました. 残念ながら,
設定はこれでおしまいというわけではありません. なぜなら,
さらに, 設定をテストし,
すべての問題点を解決しなくてはならないからです.
設定をテストするために,
何かを印字してみましょう. LPD システムで印字をするためには,
&man.lpr.1; コマンドを使います. このコマンドは,
印字するためのジョブを投入する働きをします.
&man.lpr.1; コマンドを
「
プリンタとの通信状況を調べる」で紹介した,
あるテスト用のテキストを生成してくれる
&man.lptest.1; プログラムと一緒に使うこともできます.
簡単な LPD
設定をテストするために:
次のように入力してください.
&prompt.root; lptest 20 5 | lpr -Pprinter-name
ここで, printer-name
は /etc/printcap
で指定したプリンタ名 (もしくはその別名) です. デフォルト
のプリンタを使用する場合は,
引数を付けないで
&man.lpr.1; を打ち込んでください. もう一度述べますが,
ポストスクリプトを期待しているプリンタをテストするならば,
&man.lptest.1; を使う代わりに PostScript で書かれた
プログラムをプリンタに送ってください.
プログラムを送るためには, プログラムをファイルに格納して,
lpr file
と打ち込みます.
PostScript プリンタの場合,
送信したプログラムによる結果が得られるでしょう.
&man.lptest.1; を使った場合は,
以下のような結果が見られるでしょう.
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678
更にプリンタをテストしたい場合は,
(言語ベースのプリンタのための) もっと大きなプログラムを送信するか,
引数を変えて
&man.lptest.1; を実行します. 例えば, lptest
80 60 で, それぞれ 80 文字の行を 60
行生成します.
プリンタがうまく動かなかった場合は, 次の節, 「
トラブルシューティング」をご覧ください.
プリンタ設定上級編
この節では, 特殊な形式のファイルを印字するためのフィルタ,
ヘッダページ, ネットワーク越しのプリンタへの印字, そして,
プリンタ使用の制限や課金について説明しています.
フィルタ
プリントフィルタ
LPD では, ネットワークプロトコル, キュー, アクセス制御,
そして, 印字のためのその他の側面について扱いますが,
実際の作業のほとんどは
フィルタ よっておこなわれています.
フィルタは, プリンタと通信し,
プリンタのデバイス依存性や特殊な要求を扱うプログラムです.
簡単なプリンタ設定では,
プレインテキストのためのフィルタをインストールしました.
このプレインテキストフィルタは,
ほとんどのプリンタで機能する極めて単純なものでした.
(「
テキストフィルタのインストール」を参照)
しかしながら, 形式変換やプリンタ課金, 特定のプリンタの癖,
など をうまく利用するためには,
フィルタがどのように機能するかという
ことを理解しておくべきです. これらの側面を扱うためには,
最終的には, フィルタの責任であるからです.
そして, これは悪い情報ですが, ほとんどの場合において,
あなた自身が
フィルタを供給する必要があるということです. また都合のよいことには,
たくさんのフィルタが一般的に利用できるということです.
もしフィルタがなかったとしても,
普通はフィルタを作るのは簡単です.
FreeBSD にも, プレインテキストを印字させることができる
/usr/libexec/lpr/lpf
というフィルタが1つ付いています.
(このフィルタはファイルに含まれるバックスペースやタブを扱います.
また, 課金をすることもできますが,
できることはこれだけしかありません.)
いくつかのフィルタとフィルタの構成要素は
FreeBSD Ports Collection にもあります.
この節で述べることは次の通りです.
「
フィルタはどのように機能しているか」では,
印字の過程におけ るフィルタの役割を概説します.
この節を読むことで, LPD がフィルタを使うときに,
見えないところで
何が
起こっているかが理解できるでしょう. このことを知っておくと,
プリンタそれぞれに様々なフィルタをインストールしたときに
遭遇するかもしれない問題を予期したり,
デバッグするときに役立つでしょう.
LPD では, すべてのプリンタからデフォルトで
プレインテキストを印字できることを期待しています. このことは,
プレインテキストを直接印字できない PostScript (また
は他の言語用の) プリンタでは問題を引き起こします. 「
プレインテキストのジョブを PostScript
プリンタで印字する」 で,
この問題を克服する方法について述べます.
PostScript プリンタをお持ちの方は,
この節をお読みになることをおすすめします.
PostScript は様々なプログラムのための有名な出
力形式です. ある人たちは (著者自身を含めて) PostScript
のコードさえも直接書いてしまいます. しかし, PostScript
プリンタは高価です. 「非 PostScript プリンタで
PostScript をシミュレートする」では, PostScript
データを非 PostScript プリンタに受けつけさせ,
印字させるために,
どのようにしてプリンタ用のテキストフィルタをさらに変更すればよいのか,
ということについて述べます. PostScript
プリンタを持っていない方は,
この節をお読みになることをおすすめします.
「
変換フィルタ」では,
図形や組版データといった特定のファイル形式を,
プリンタが理解できる形式へ変換する作業を自動的におこなわせる方法について述べます.
この節を読むと, troff のデータを印字するには lpr
-t, または, TeX DVI を印字するには
lpr -d,
ラスタイメージデータを印字するには lpr -v,
などといったようにユーザが入力することができるように
プリンタの設定をおこなうことができます.
この節もお読みになることをお薦めします.
「出力フィルタ」
では, あまり使われない LPD の機能のすべて, すなわち,
出力フィルタに関することが記述されています. ヘッダページ
(「
ヘッダページ」参照) を印字させていない場合は,
多分, この節は飛ばしても構わないでしょう.
「テキストフィルタ
lpf」では, lpf
についての説明が, ほぼ完全におこなわれています. これは
FreeBSD に付属するラ インプリンタ (または,
ラインプリンタのように動作するレーザプリンタ) のための,
単純なテキストフィルタです.
プレインテキストを印字したことに対して課金をおこなう方法が
至急必要な場合, もしくは, バックスペース文字を印字しようと
すると煙を発するプリンタを持っている場合は, 絶対に
lpf を検討するべきです.
フィルタはどのように機能しているか
既に言及したように, フィルタとは, プリンタにデータを送る際に,
デバイスに依存した部分を取り扱うために LPD
によって起動される実行プログラムです.
LPD がジョブ中のファイルを印字しようとするとき, LPD
はフィルタプログラムを起動します. このとき,
フィルタの標準入力を印字するファイルに,
標準出力をプリンタに, そして, 標準エラー出力を
エラーログファイル (/etc/printcap 内の
lf 項目で指定されたファイル, または,
指定されていない場合は, デフォルトとして
/dev/console) にセットします.
troff
LPD が起動するフィルタと, その引数が何であるかは,
/etc/printcap
ファイルの内容と, ジョブの起動時にユーザが指定した
&man.lpr.1; コマンドの引数に依存しています.
例えば, ユーザが lpr -t と入力した場合は,
LPD は出力先のプリンタ用の
tf 項目で指定されている troff
用のフィルタを起動させるでしょう.
ユーザがプレインテキストの印字を指示したときは,
if で指定されたフィルタが起動されるでしょう
(このことはほとんどの場合にあてはまります.
詳細については, 「
出力フィルタ」をご覧ください).
/etc/printcap
で指定可能なフィルタは次の3種類があります.
テキストフィルタ
(LPD のドキュメントでは紛らわしいことに
入力フィルタと呼んでいますが)
は一般のテキストの印字を扱います. これはデフォルトのフィルタと
考えてください. LPD では, すべてのプリンタに対して,
デフォルトでプレインテキストが印字できることを期待しています.
さらに, バックスペースやタブを正しく扱い, また,
他の特殊な文字が入力されてもプリンタに混乱を来さないように
するのはテキストフィルタの仕事であると考えています.
プリンタの使用に対して課金をしなくてはならない環境にあ
るときは, テキストフィルタが印字したページ数を数える作
業もしなくてはなりません. この作業は, 通常, 印字した行
数を数え, これをプリンタが1ページ当たりに印字できる行
数と比較することでおこなわれます.
テキストフィルタは, 次のような引数を付けて起動されます.
filter-name
-c
-wwidth
-llength
-iindent
-n login
-h host
acct-file
ここで,
lpr -l
によってジョブが入力されたときに与えられます.
width
/etc/printcap
で指定された pw (page width)
項目の値が与えられます. デフォルトは,
132です.
length
pl (page length)
項目で指定された値が与えられます.
デフォルトは66です.
indent
lpr -i
によって与えられた字下げの量で,
デフォルトは 0 です.
login
ファイルを印字したユーザのアカウント名が
与えられます.
host
ジョブが入力されたホスト名が
与えられます.
acct-file
af
項目で指定されている課金データファイル
の名前が与えられます.
プリンタ
フィルタ
変換フィルタは,
特定のファイル形式をプリンタ
が紙に印字できるようなものに変換します. 例えば,
プリンタで ditroff 組版データを直接印字することはできません.
しかし, ditroff データをプリンタが消化し,
印字することができる形式へ変換するために, ditroff
ファイル用フィルタをインストールすることができます.
「
変換フィルタ」
で, これらに関するすべてについて説明します.
プリンタの課金をする必要がある場合は,
変換フィルタでも印字ページを数える作業が必要となります.
変換フィルタは次の引数をとって起動されます.
filter-name
-xpixel-width
-ypixel-height
-n login
-h host
acct-file
ここで, pixel-width は,
px 項目で指定された値
(デフォルトは0),
pixel-height は,
py 項目で指定された値
(デフォルトは0) です.
出力フィルタは,
テキストフィルタが指定されて
おらず, かつ,
ヘッダページの出力が許可されている場合にのみ使われます.
「
出力フィルタ」で, これらのことについて説明します.
アウトプットフィルタに対する引数は次の2つだけです.
filter-name
-wwidth
-llength
ここで, と は,
テキストフィルタの場合と同じです.
フィルタは, 次に示すの終了状態をもってプログラムを
exit するべきです.
exit 0
フィルタがファイルを正常に印字した場合.
exit 1
フィルタはファイルの印字に失敗したが, LPD
に再度ファイルの印字を試みて欲しい場合.
この終了状態で終了した場合, LPD
はフィルタを再スタートします.
exit 2
フィルタはファイルの印字に失敗し, かつ, LPD
に再出力を試みて欲しくない場合. この場合, LPD
はそのファイルを放棄します.
FreeBSD に付属するテキストフィルタ
/usr/libexec/lpr/lpf は, FORM FEED
文字が送られたときやプリンタ使用に対する課金をどのようにするかを決定するために,
ページ幅やページ長の引数を利用します. また,
課金用のエントリを作成するため, ログイン名, ホスト名,
課金ファイル名の引数を利用します.
もし, フィルタの購入を検討しているならば, LPD
と互換性があるかどうかを確認してください. もしそうならば,
上述の引数リストをサポートしていなければなりません.
一般向けの使用のためにフィルタを作成する計画をしている場合は,
同じ引数リストと終了コードをサポートしてください.
プレインテキストのジョブを PostScript プリンタで印字する
プリントジョブ
コンピュータと PostScript (または, 他の言語に対応した)
プリンタをあなたしか使用しない場合は, プリンタにプレ
インテキストを絶対に送らない, そして,
プリンタにプレインテキストを送りたがっている
様々なプログラムの機能を決して使わないことにしてください. そうすれば,
この節に書かれたことに心を煩わせる必要はまったくなくなります.
しかし, PostScript
とプレインテキストの両方のジョブをプリンタへ送りたいと思っている場合は,
プリンタ設定についての要求が増えるでしょう.
両者をプリンタへ送信するためには,
到着したジョブがプレインテキストであるか
PostScript であるかを検出するテキストフィルタが必要です.
PostScript のジョブはすべて %!
で始まらなければならないことになっています
(他のプリンタ言語に関しては,
プリンタのドキュメントをご覧ください).
ジョブの最初の2文字がこれならば, PostScript であることが分かります.
したがって,
ジョブのそれ以降の部分をプリンタに直接送ることができます
(訳注: PostScript では, %
以降はコメントとして扱われるので, 最初の %! の行を読み捨てても問題はない).
最初の2文字が %! でない場合は,
フィルタはテキストを PostScript に変換し,
その結果を使って印字をおこないます.
この作業をどうやってやればよいのでしょうか.
プリンタ
シリアル
シリアルポートにプリンタを接続した場合は,
lprps をインストールすることをお勧めします.
lprps は PostScript 用のフィルタで,
プリンタとの双方向通信をおこないます.
このフィルタでは, プリンタからの冗長な情報を得ることで,
プリンタの状況を示すファイルが更新されていきます.
したがって, ユーザや管理者は
(トナー残量少や
紙詰まりといった)
プリンタの状況を正確に知ることができます. しかし,
もっと重要なことは, psif
と呼ばれるプログラムが含まれているということです.
このプログラムは,
入力されたジョブがプレインテキストかどうかを検出し,
これを PostScript に変換するために, textps
(lprps に付属する別のプログラム)
を呼び出します. そして, このジョブをプリンタに送るために,
lprps が使われます.
lprps は FreeBSD Ports Collection
に含まれています (Ports Collection
を参照してください).
もちろん,自分自身でプログラムを取ってきて, コンパイルし,
インストールすることもできます. lprps
をインストールした後は, lprps
の一部である psif
プログラムのパス名を指定するだけです. Ports Collection から
lprps をインストールしたときは,
/etc/printcap の中のシリアル接続した
PostScript プリンタのエントリに対して, 次を使ってください.
:if=/usr/local/libexec/psif:
LPD
にプリンタをリード・ライトモードでオープンさせるために,
rw 項目も指定すべきです.
パラレルポートに接続したプリンタの場合 (すなわち,
lprps が
必要としているプリンタとの双方向通信ができない),
テキストフィルタとして次のシェルスクリプトを使うことができます.
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
# Script version; NOT the version that comes with lprps
# Installed in /usr/local/libexec/psif
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# PostScript job, print it.
#
echo "$first_line" && cat && printf "\004" && exit 0
exit 2
else
#
# Plain text, convert it, then print it.
#
( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
exit 2
fi
上記のスクリプトにおいて, textps
はプレインテキストから PostScript
へ変換するために別にインストールしたプログラムです.
テキストから PostScript へ変換するのには, お好みのどんなプロ
グラムでも使うことができます. FreeBSD Ports Collection
(Ports Collection
を参照してください) には, a2ps
と呼ばれるテキストから
PostScript に変換するプログラムが入っています.
訳注
上記スクリプトでは,
先頭の行を読み込むために read を使っていますが,
困ったことに,
read は読み込んだ文字列の先頭の空白文字を取り除いてしまいます.
従って,
これらの空白文字は印字されないことになり,
印字結果がファイルのイメージと異なる場合が出てきます.
この事情は csh を利用した場合でも変わりません.
仮に, 先頭の空白文字を除去しない read コマンドを作ったとしても,
「echo $first_line」の $first_line
変数の内容をシェルが展開する際に $first_line
の先頭の空白文字が失われるため, 問題の解決にはなりません.
残念ながら,
訳者はこの問題をシェルプログラムだけで解決する方法をしりません.
perl か C 言語の力を借りないと解決できないと思います.
非 PostScript プリンタで PostScript
をシミュレートする
PostScript
エミュレーション
Ghostscript
PostScript
は質の高い組版と印字をおこなうための事実
上の標準です. しかしながら, PostScript は,
高価な標準です. ありがたいことに,
Alladin Enterprises から
Ghostscript と呼ばれる,
PostScript 互換の動作をするフリーのプログラムが出されていて,
FreeBSD で動きます.
Ghostscript はほとんどの PostScript ファイルを読むことができ,
これらの各ページをたくさんのブランドの非 PostScript プリンタを含む
様々なデバイス用に変換することができます.
Ghostscript をインストールし,
プリンタ用の特別なテキストフィルタを使うことによって,
非 PostScript プリンタをあたかも本物の PostScript
プリンタであるかのように動作させることができます.
Ghostscript は FreeBSD Ports Collection に入っていますので,
そこからインストールすることができます. また,
自分でソースプログラムを持ってきて, コンパイルし, インストー
ルすることもできます. この作業はとても簡単にできます.
PostScript プリンタをシミュレートさせる場合は,
テキストフィルタに PostScript
ファイルを印字しようとしているかどうかを検出させます.
PostScript ファイルでない場合は,
フィルタはそのファイルを直接プリンタに送ります
(訳注: テキストファイルを直接印字できない場合は, もちろん,
変換フィルタを通す必要があります). PostScript の場合は,
まず, Ghostscript を使い,
ファイルをそのプリンタが理解できる形式へ変換します.
次の例のスクリプトは, Hewlett Packard DeskJet 500
プリンタ用 のテキストフィルタです.
他のプリンタで用いるときは,
引数を gs (Ghostscript)
コマンドに変えてください. (gs -h
と入力すると, 現在インストールされている Ghostscript
でサポートされているデバイスのリストが得られます).
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/hpif
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it.
#
# Note that PostScript files are actually interpreted programs,
# and those programs are allowed to write to stdout, which will
# mess up the printed output. So, we redirect stdout to stderr
# and then make descriptor 3 go to stdout, and have Ghostscript
# write its output there. Exercise for the clever reader:
# capture the stderr output from Ghostscript and mail it back to
# the user originating the print job.
#
exec 3>&1 1>&2
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
-sOutputFile=/dev/fd/3 - && exit 0
#
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
&& exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
echo $first_line && cat && printf "\033&l0H" && exit 0
fi
exit 2
最後に, if 項目を通して, LPD
にこのフィルタを教えてやる必要があります.
:if=/usr/local/libexec/hpif:
これでおしまいです. lpr plain.text
とか lpr whatever.ps
と入力してみましょう. どちらも正常に印字されるはずです.
訳注
日本語を印字する場合は,
日本語対応の Ghostscript が必要です. 日本語対応版の
Ghostscript も Ports Collection に入っています.
変換フィルタ
「プリンタ設定導入編」
に書かれた簡単な設定が完了したら, 最初に,
やってみたいと思うことは, 多分(プレイン ASCII テキストに加えて)
好みのファイル形式のための変換フィルタをインストールすることでしょう.
なぜ, 変換フィルタをインストールするのか?
TeX
dvi ファイルの印刷
変換フィルタによって,
様々な種類のファイルを印字することが簡単になります. 例えば, TeX
組版システムでたくさんの仕事をしたと仮定しましょう.
そして, PostScript プリンタが接続 されているとします.
すると, TeX で DVI ファイルを作成する度に, DVI
ファイルを印字するために,
これを PostScript ファイルに変換する必要があります.
このコマンドは次のようになるでしょう.
&prompt.user; dvips seaweed-analysis.dvi
&prompt.user; lpr seaweed-analysis.ps
DVI ファイル用の変換フィルタがインストールしてあると,
LPD に 変換を肩代わりさせることで毎回毎回
おこなわなければならなかった面倒な変換作業を省くことができます.
つまり, DVI を生成したら,
次のような1回のコマンド入力だけで, これが印字されます.
&prompt.user; lpr -d seaweed-analysis.dvi
LPD に DVI ファイルの変換をさせるためには,
オプション を指定します.
変換オプションのリストは「
整形と変換に関するオプション」
に載せてあります.
変化のオプションのそれぞれをプリンタに
サポートさせるためには,
変換フィルタをインストールし,
そのパス名を /etc/printcap
の中で指定しなくてはなりません. 変換フィルタは,
プレインテキストを印字する代わりに, フィルタはファイルを
プリンタが理解できる形式に変換するところを除けば,
「プリンタの簡単な設定」で説明したテキストファイル
(「
テキストフィルタのインストール」 を見て下さい)
に似ています.
どの変換フィルタをインストールすべきか?
使いたいと思う変換フィルタをインストールすべきです.
DVI のデータを頻繁に印字するならば, DVI 変換フィルタ
をインストールするのが適切でしょう. 印字しなくてはなら
ない troff を大量に抱えている場合は, 多分,
troff フィルタが欲しくなるはずです.
次の表は, LPD で動作するフィルタと,
/etc/printcap
ファイルでのエントリする項目, そして,
lpr
コマンドで呼び出す方法をまとめたものです.
ファイル形式
/etc/printcap項目
lpr オプション
cifplot
cf
DVI
df
plot
gf
ditroff
nf
FORTRAN text
rf
troff
tf
raster
vf
プレインテキスト
if
なし, , または
先の例のように, lpr -d
を使うためには, 出力先のプリンタの
/etc/printcap 内のエントリで,
df
項目が必要であることが分かります.
fortran
反論はあるかも知れませんが, FORTRAN テキストや plot
のような形式は, 多分, 廃れてていくでしょう.
あなたのサイトで, 自前のフィルタをインストールするだけで,
プリントオプションのいくつか, あるいは,
全部に新しい意味を与えることができます. 例えば,
Prinerleaf ファイル (Interleaf
デスクトップパブリッシングプログラムによるファイル)
を直接印字したいとします.
そして, Printerleaf 用の変換フィルタを
gf 項目で
指定したパスにインストールすれば, lpr
-g の意味はPrinterleaf
ファイルを印字する
意味だとユーザに教えることができます.
変換フィルタのインストール
変換フィルタは FreeBSD
の基本システムのインストールとは別にインストールするプログラムなので,
変換フィルタは, 多分,
/usr/local ディレクトリの下に置くべきです.
フィルタは LPD だけが実行する特別なプログラム,
すなわち, 一般ユーザが実行する必要すらないプログラムなので,
/usr/local/libexec
ディレクトリに置くのが普通です.
変換フィルタを使用可能にするためには,
/etc/printcap
の目的のプリンタの適切な項目に
フィルタがあるパス名を指定します.
DVI 変換フィルタをプリンタ bamboo
のエントリに加えてみましょう. プリンタ
bamboo の df
項目を新たに加えた /etc/printcap
ファイルの例を以下に再掲します.
#
# /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
DVI フィルタは
/usr/local/libexec/psdf という
名前のシェルスクリプトです.
このスクリプトは次のようになっています.
#!bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
このスクリプトでは, dvips
をフィルタモード (引数 ) で,
標準入力上で起動しています. 標準入力は印字するジョブです.
それから, PostScript プリンタ用フィルタ
lprps (これについては「
プレインテキストのジョブを PostScript
プリンタで印字する」 を参照してください) を LPD
に与えられた引数を付けて起動します.
lprps
はこれらの引数を印字されたページ分の課金をおこなうために使われます.
変換フィルタのその他の例
変換フィルタのインストールには決まったステップがないので,
その代わりに, 例をもっと挙げることにします.
これを自分でフィルタを作る際のガイドにしてください.
適当な例があったら, それをそのまま使ってください.
次のスクリプト例は, Hewlett Packard LaserJet III-Si
のための, raster (ええと・・実は, GIF ファイル)
用の変換フィルタです.
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
ここでは, GIF ファイルから PNM (portable anymap)
形式に変換し, 次に PGM (portable graymap) 形式に変換してから,
LaserJet/PCL-互換データに変換しています.
上記のフィルタを使うプリンタのためのエントリを付け加えた
/etc/printcap
ファイルは次のようになります.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
次のスクリプトは, PostScript プリンタ
bamboo のための groff 組版システムの
troff データのための変換フィルタです.
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
上記のスクリプトではプリンタとの通信をおこなうため,
lprps をまた利用しています.
プリンタがパラレルポートに接続されている場合は, 代わりに,
次のスクリプトを使うかもしれません.
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
これで完成しました. 次に, フィルタを使用可能にするため
に /etc/printcap
に加える必要があるエントリを示します.
:tf=/usr/local/libexec/pstf:
次の例をみたら, FORTRAN のベテランは赤面するかもしれません.
この FORTRAN テキストフィルタは,
プレインテキストを直接印字できるすべてのプリンタで利用できます.
このフィルタをプリンタ teak
にインストールすることにしましょう.
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0
exit 2
そして, このフィルタを使用可能にするため, 以下の行を
/etc/printcap のプリンタ
teak のエントリに加えます.
:rf=/usr/local/libexec/hprf:
これが最後の, そして, 若干複雑な例です. 前に紹介した
LaserJet プリンタ teak に, DVI
フィルタを加える ことにしましょう. 最初に,
簡単な部分をおこないます. すなわち, DVI フィルタの位置を
/etc/printcap に書き加えます.
:df=/usr/local/libexec/hpdf:
さて, 難しい部分であるフィルタの作成をおこないます.
このために, DVI から LaserJet/PCL
への変換プログラムが必要です. FreeBSD の Ports Collection
(Ports Collection
を参照してください) には, それがあります.
dvi2xx というのがそのパッケージの名前です.
これをインストールすると, 必要なプログラム
dvilj2p が使えます. このプログラムは
DVI を LaserJet IIp, LaserJet III, そして LaserJet 2000
の互換コードへ変換してくれます.
dvilj2p はフィルタ
hpdf を極めて複雑にしています.
なぜなら, dvilj2p
は標準入力からデータを読み込むことができないからです.
このプログラムを働かせるためには, ファイル名が必要です.
もっと悪いことに, ファイル名は .dvi
で終わっている必要があり, 標準入力の代わりに,
/dev/fd/0 を使うのは問題があります.
この問題は, (.dvi で終わる)
一時的なファイル名から/dev/fd/0 に
(シンボリックな) リンクを張る
ことで回避することができます. これで,
dvilj2p
に強制的に標準入力からデータを読み込ませることができます.
もう1つの問題は, 一時的なリンクを張るために
/tmp
ディレクトリを使うことができないという事実です.
シンボリックリンクはユーザ, グループが bin
であるユーザに所有されています. フィルタはユーザ
daemon として起動します. そして,
/tmp
ディレクトリはスティッキービットが立っています.
フィルタはリンクを作ることができます. しかし,
リンクは別のユーザに所有されているため,
作業が終了したとき, このリンクを削除することができません.
その代わりに, シンボリックリンクは現在の作業ディレクトリ,
すなわち, スプーリングディレクトリ
(/etc/printcap の
sd 項目で指定する) に作ることにします.
フィルタが作業するにはここの場所は完璧な場所で, なぜなら,
特に, スプーリングディレクトリのディ スクの空き容量は
(ときどき) /tmp
ディレクトリよりもたくさんあるからです.
以下に示すのが最後のフィルタです.
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
自動変換: その他の変換フィルタ
ここまでに述べてきたフィルタによって,
印字環境の能率が上がったことと思います. しかし,
これはどのフィルタを使うかを ( &man.lpr.1; のコマンドライン上で)
ユーザが指定しなくてはならないという代価を支払って実現されています.
コンピュータの事情にあまり詳しくないユーザにとって,
フィルタのオプションを指定させられるということは
いらいらさせられるものになるでしょう. 更に悪いことに,
間違ったフィルタオプションを指定されると,
間違った形式のファイルがそのフィルタに適用されることになり,
その結果, 何百枚もの紙を掃き出すことになるかもしれません.
そのような結果になるならば,
変換フィルタをインストールするよりもむしろ,
テキストフィルタ (これがデフォルトフィルタなので)
に印字するよう要求されたファイルの形式を検出させ, 自動的に,
適切な変換フィルタを起動するようにしたいと思うかもしれません.
ここでは file
コマンドのようなツールを役立たせることができます.
もちろん, いくつかの
ファイル形式の違いを見分けることは難しいことでしょう.
そして, もちろん, それらのファイルに対しては,
変換フィルタを提供するだけで済ますこともできるのです.
apsfilter
プリンタ
フィルタ
apsfilter
FreeBSD Ports Collection には, apsfilter
と呼ばれる自 動変換をおこなうテキストフィルタがあります.
このフィルタは プレインテキスト, PostScript, DVI
ファイルを検出し, 適当な変換をおこなった後,
データを印字することができます.
出力フィルタ
LPD スプーリングシステムでは,
ここまでにまだ取り上げていないフィルタ形式,
出力フィルタをサポートしています. 出力フィルタは,
テキストフィルタのように,
プレインテキストのみを印字するために意図されたものですが,
非常に簡単化されています. テキストフィルタを用いずに,
出力フィルタを使っている場合は, 次のようになります.
LPD はジョブ中の各ファイルに一度ではなく,
ジョブ全体に対して一度だけ出力フィルタを起動します.
LPD は出力フィルタに対し,
ジョブ中のファイルの先頭や末尾を特定するための対策を
一切おこなっていません.
LPD はユーザのログイン名やホスト名をフィルタに渡しません.
したがって, 課金の処理をおこなうことは考えていません.
実際, 出力フィルタには, 以下2つの引数しか与えられません.
filter-name
-wwidth
-llength
ここで, width
は対象となるプリンタの pw 項目,
length は
pl 項目に指定された数です.
出力フィルタの簡便さに誘惑されてはいけません. もし,
ジョブ中のそれぞれのファイルに別のページ番号を付加しようとしても,
出力フィルタはうまく動作しないでしょう.
そのような動作を期待しているならば,
(入力フィルタとしても知られている) テキストフィルタを使ってください.
詳しくは, 「
テキストフィルタのインストール」をご覧ください.
さらに, 出力フィルタは, 実のところ,
もっと複雑になっています. まず,
特殊なフラグ文字を検出するために,
フィルタに送られてくるバイトストリームを検査する必要があります.
また, LPDに代わって,
自分自身にシグナルを送らなければなりません.
しかしながら, ヘッダページの印字をおこないたい場合,
また,
エスケープシーケンスやヘッダページを印字できるようにする
その他の初期化文字列を送信する必要がある場合,
出力ファイルが必要です.
1台のプリンタに対し, LPD では出力フィルタとテキスト,
または, 他のフィルタを両方使うことができます.
このような場合, LPD はヘッダページ (「
ヘッダページ」 を参照してください)
だけを印字させるために, 出力フィルタを起動させます.
それから LPD では, アウトプットフィルタに 2 バイトの文字
(ASCII 031 の次に ASCII 001) を送ることで,
出力フィルタが自力で停止することを期待しています.
2 バイト (031, 001) が出力フィルタに送られたとき,
出力フィルタは自分自身にシグナル SIGSTOP
を送ることによって停止するべきです.
LPD がその他のフィルタの起動を完了したとき,
LPD は出力フィルタにシグナル
SIGCONT を送ることで, 出力フィルタを再起動させます.
出力フィルタがあり,
テキストフィルタがない場合, LPD
はプレインテキストのジョブをおこなう際に,
出力フィルタを使います. 前述したように, 出力フィルタでは,
ジョブ中の各ファイルの並びの間に FROM FEED
文字や紙を排出する他の文字を入れることはしません.
この動作は多分,
あなたが求めているものとは異なっているでしょう.
ほとんどすべての場合において,
テキストフィルタが必要とされるはずです.
プログラム lpf は,
テキストフィルタの項で既に紹介しましたが,
出力フィルタとしても動作させることができます. もし,
簡便で極悪な出力フィルタが必要で, かつ,
バイトストリームを検査したりシグナルを送るコードを書きたくないときには,
lpf をお試しください.
あるいは, プリントが要求する初期化コードを送るために,
lpf
をシェルスクリプトに包んで使うこともできます.
テキストフィルタ lpf
プログラム /usr/libexec/lpr/lpf は,
FreeBSD の バイナリ配布に付属しているテキストフィルタ
(入力フィルタ) で, 出力を字下げしたり (lpr
-i でジョブが入力さ れたとき),
文字を未処理のままプリンタに送ったり (lpr
-l でジョブが入力されたとき),
ジョブ中のバックスペースやタブの印字位置を調節したり,
印字したページに対して課金したりすることができます. また,
このフィルタは出力フィルタとしても動作させることができます.
lpf
は多くの印字環境において使用することに適しています.
このフィルタには, プリンタに初期化文字列を送る機能はありませんが,
必要とされる初期化をおこない, それから
lpf
を実行させるためのシェルスクリプトを作成するのはたやすいことです.
ページ課金
課金
プリンタ
lpf に対して,
印字ページへの課金を正確におこなわせるためには,
/etc/printcap ファイルの中の
pw と pl
の項目に正確な値を入れておく必要があります. これらの値は,
どのくらいの量のテキストがページにフィットするか, また,
ユーザのジョブが何ページあるのかを調べるために使われます.
プリンタの課金についての詳しい情報については, 「
プリンタの利用に対する課金」をご覧ください.
リモートプリンタからの出力
プリンタ
ネットワーク
ネットワークプリンタ
FreeBSD では, ネットワーク越しの印字, すなわち,
ジョブをリモートプリンタに送ることをサポートしています.
リモートプリンタからの出力をするには, 一般に,
次の2つを参照してください.
リモートホストに接続されたプリンタにアクセスする方法.
プリンタがあるホストのシリアル,
または, パラレルインタフェースに接続されている場合,
ネットワーク上の他のホストからこのプリンタにアクセスできるように
LPD を設定します. 「リモートホストに
接続されたプリンタ」
でどのようにするかを説明します.
ネットワークに直接接続されているプリンタにアクセスする方法.
プリンタに, 旧来のシリアル, または,
パラレルインタフェースに加えて (もしくは, これらに代わって)
ネットワーク用のインタフェースがある場合.
そのようなプリンタは次のように動作するでしょう.
そのプリンタが LPD のプロトコルを理解でき,
リモートホストからのジョブを
キューに入れることさえできる場合. この場合,
プリンタは, LPD が起動している一般のホストのように振る舞います.
そのようなプリンタを設定するために,
「
リモートホストに接続されたプリンタ」
と同様の手順をおこなってください.
そのプリンタが,
データストリームによるネットワーク接続をサポートしている場合.
この場合, ネットワーク上の1つのホストとしてプリンタを
接続
します.
このホストは, ジョブをスプーリングする責任を負い,
スプーリングされたジョブはプリンタに送られます.
そのようなプリンタをインストールするためのいくつかの提案が
「
ネットワークにおけるデータストリームの
インタフェースを持つプリンタ」にあります.
リモートホストに接続されたプリンタ
LPD スプーリングシステムでは LPD (または LPD 互換のシステム)
が起動している他のホストへジョブを送る機能が
始めからサポートされています. この機能により,
あるホストに接続されたプリンタへ,
他のホストからアクセスできるようになります. また,
LPD プロトコルを理解するネットワークインタフェースを持ったプリンタに対しても,
この機能は働きます.
リモートプリンタへの出力を許可するためには, 最初に,
あるホスト (これを,
プリンタホストと呼びます)
にプリンタを接続します. そして, 「 プリンタ設定導入編」
に書かれた簡単なプリンタの設定をおこなってください.
必要ならば, 「プリンタ設定上級編」
にある, 更に進んだ設定をおこなってください. そして,
そのプリンタをテストしてうまく動作することを確認し, LPD
に許可した機能がうまく働くかどうかを見てください. さらに
ローカルホストが
プリンタホストの LPD サービスの使用を
許可されているか確認して下さい (「
リモートホストからのプリンタの利用を制限する
」参照).
プリンタ
ネットワーク
ネットワークプリンタ
LPD
互換のネットワークインタフェースを持つプリンタを使用している場合は,
そのプリンタ自身が以下で説明する
プリンタホストになります. そして,
プリンタ名とは,
そのプリンタに設定した名前のことを指します.
これについては, プリンタ, および (または),
プリンタのネットワークインタフェースに付属するドキュメントを参照してください.
ヒューレット・パッカード社の Laserjet シリーズを使用している場合には,
プリンタ名を text とすると,
自動的に LF から CRLF への変換が行なわれます.
そのため, hpif スクリプトは必要ありません.
次に,
そのプリンタにアクセスしたいと思っている他ホストにおいて,
そのホストの /etc/printcap
ファイルに次にあげるエントリを作ります.
名前のエントリ. どんな名前でもよいのですが, 簡単のため, 多分,
プリンタホストで設定されたプリンタ名や別名と同じものを使いたいと思うでしょう.
lp
項目で指定されるデバイスは明示的に空にする
(:lp=: とする).
スプーリングディレクトリを作成し,
sd 項目でその位置を指定する. LPD
では, プリンタホストにジョブを送信するまでの間,
このディレクトリにジョブを格納します.
rm
項目でプリンタホストの名前を指定します.
rp 項目で
プリンタホストに接続したプリンタ名を指定します.
これで終わりです.
変換フィルタやページの大きさやその他の事項を
/etc/printcap
に加える必要はありません.
次に,
リモートホストに接続されたプリンタで印字するための設定例
を示します. ホスト rose には2台のプリンタ
bamboo と rattan
が接続されています. これらのプリンタをホスト orchid
のユーザが使えるようにしましょう. 最初に
orchid の
/etc/printcap を示します
(このファイルは, 「
ヘッダページの出力を許可する」
で参照することができます). このファイルには, 既に, プリンタ
teak 用のエントリがありました. 以下では,
これに,
ホスト rose
にある2台のプリンタ用のエントリが加えられています.
#
# /etc/printcap for host orchid - added (remote) printers on rose
#
#
# teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
#
# rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
#
# bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
orchid
で必要となる作業はスプーリングディレクトリを作ることだけです.
&prompt.root; mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
これで, orchid のユーザが
rattan と bamboo で印字す
ることができるようになりました.
例えば, orchid のユーザが次のように入力したとします.
&prompt.user; lpr -P bamboo -d sushi-review.dvi
すると, orchid の LPD システムは,
ジョブをスプーリングディレクトリ
/var/spool/lpd/bamboo
にコピーし, これが DVI
ファイルを印字するジョブであることを記録します.
ホスト rose の
bamboo
用のスプーリングディレクトリに十分な容量が確保でき次第,
両者の LPD は, ジョブのファイルを rose に転送します.
このファイルは, そのすべてが印字されるまで, rose
のキューに留まります.
(bamboo は PostScript プリンタなので) DVI から PostScript
への変換は rose でおこなわれます.
ネットワークにおけるデータストリームの
インタフェースを持つプリンタ
プリンタのネットワークインタフェースカードは,
2種類に分類することができます.
1つはスプーラをエミュレートするもの (高価) で, もう 1
つはシリアルやパラレルポートを使うように
プリンタにデータを送ることができるだけのもの (安価) です. この節では,
後者の使い方を説明します. 前者のプリンタは, 前節「
リモートホストに接続されたプリンタ」
の方法が適用できます.
/etc/printcap ファイルでは,
シリアルかパラレルのインタフェースのどちらを使うのか,
そして, (シリアルインタフェースを使う場合)
そのボーレートはいくらであるか, フロー制御は使うのか,
タブのための遅延を加えるのか,
改行文字を変換するかなどの指定をおこなうことができます.
しかし, TCP/IP や他のネットワークポートからデータを受け取るプリンタを
接続するための指定をおこなうことはでき ません.
ネットワーク接続されたプリンタにデータを送るためには,
テキストフィルタと変換フィルタから呼び出すことができる
通信プログラムを開発する必要があります. 以下に,
そのようなプログラムの例を示します.スクリプト
netprint では,
標準入力から印字データをすべて受け取り,
ネットワーク接続されたプリンタにこれを送ります.
netprint
の最初の引数でプリンタのホスト名を,
2番目の引数で接続するポート番号を指定します.
このプログラムでは単方向通信 (FreeBSD からプリンタ)
のみをサポートしていることに注意してください.
ネットワークプリンタの多くは双方向通信をサポートしていますので,
その恩恵 (プリンタの状態を得たり,
課金をおこなうなど) にあずかりたいと思われるかもしれません.
#!/usr/bin/perl
#
# netprint - Text filter for printer attached to network
# Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
$printer_host = $ARGV[0];
$printer_port = $ARGV[1];
require 'sys/socket.ph';
($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
= gethostbyname($printer_host);
$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|| die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
このスクリプトは,
様々なフィルタが利用することができます. 仮に, Diablo 750-N
ラインプリンタを持っており,
これがネットワークに接続されているとしましょう.
プリンタはポート番号 5100 にて印字するデータを受け取ります.
プリンタのホスト名は scrivener とします. このとき,
このプリンタのテキストフィルタは次のようになります.
#!/bin/sh
#
# diablo-if-net - Text filter for Diablo printer `scrivener' listening
# on port 5100. Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
プリンタの利用に制約を与える
プリンタ
利用制限
本節では, プリンタの利用に制約を与えるための情報を記しています.
LPD システムでは, プリンタ (ローカル,
リモートのいずれに接続されていても)
にアクセスできる人を制限する機能,
複数部のコピーの印字の可否を制御する機能,
ジョブのサイズの最大値やプリンタキューに入る
ジョブの最大個数を制御する機能を提供しています.
複数部のコピーの印字を制限する
LPD
システムではユーザが複数部のコピーの印字を簡単におこなう
機能を提供しています. ユーザが, (例えば) lpr
-#5 コマンドを使ってジョブを印字すると,
ジョブのそれぞれのファイルのコピーを5部得ることができます.
これがよい機能であると思うかどうかは人それぞれでしょう.
複数部のコピーの印字によってプリンタが
必要以上に消耗してしまうと感じるならば,
/etc/printcap
ファイルに sc
項目を加えてください. これにより,
&man.lpr.1; の
オプションの使用が禁止されます.
このオプションが指定されているにも関らず,
オプションを使うと,
次のようなメッセージが表示され,
このオプションの利用できない旨を伝えます.
lpr: multiple copies are not allowed
リモートホストからプリンタをアクセスできる
設定にしている場合 (この 設定については, 「
リモートホストに接続されたプリンタ」
をご覧ください), そのリモートホストの
/etc/printcap にも同じように
sc
項目を追加する必要があることに注意してください.
そうしないと, ユーザは別なホストから複数部のコピーの
印字することができてしまいます.
例を使って説明しましょう. 次に示す
/etc/printcap ファイルは, ホスト
rose のものです. プリンタ
rattan は極めて頑丈なので,
複数部のコピーの印字は許可されています. しかし,
レーザプリンタの bamboo
はもう少しデリケートで,
このプリンタから複数部のコピーを印字することを sc
項目を追加することで禁止しています.
#
# /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
さらに, orchid の /etc/printcap
にも sc
項目を追加する必要があります (orchid
でこの編集をおこなっているときに, ついでに, プリンタ
teak
でも複数部のコピーの印字を禁止することにしましょう).
#
# /etc/printcap for host orchid - no multiple copies for local
# printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
sc 項目を指定することにより,
lpr -#
の使用を防ぐことができます. しかし, この状態では
&man.lpr.1; を複数回起動したり,
1回のジョブで次のように同じファイルを複数個指定することを防ぐまでには至っていません.
&prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
このような悪用を防ぐ方法は
(その指示を無視することも含めて) たくさんあります.
各自で調べてみてください.
プリンタを使用できる人を限定する
それぞれのプリンタを使用できる人を限定するには, Unix の
グループ権限のメカニズムを利用し, さらに,
/etc/printcap で rg
項目を指定することでおこないます.
あるプリンタにアクセスさせてもよいと思うユーザすべてを
Unix のあるグループに入れてください. そして,
そのグループ名を rg で指定します.
このとき, そのグループに含まれないユーザ
(root も含む) には, 次のようなメッセージが表示され,
プリンタの使用はできません.
lpr: Not a member of the restricted group
sc (suppress multiple copies :
複数部のコピーの印字を禁止する)
を指定するときと同様に, rg
が指定されたプリンタがリモートホストからもアクセスでき
(この設定については,
「
リモートホストに接続されたプリンタ」
をご覧ください), かつ,
そのホストでもプリンタを使用できる人を限定するのが
妥当であると思う場合は,
そのホストの /etc/printcap にも
rg
指定をおこなう必要があります.
例えば, プリンタ rattan
は誰でも利用できるが, bamboo はグループ
artists
に属している人のみが利用できるようにしてみましょう.
以下に, もうお馴染みとなったホスト
rose の /etc/printcap
を示します.
#
# /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
これ以外の /etc/printcap ファイル
(ホスト orchid のもの)
はそのままにしておくことにします. もちろん,
orchid のユーザは全員
bamboo を利用することができます. これは,
orchid
には特定のユーザのみにしかアクセスさせておらず,
そのユーザにはプリンタを利用させたいと思っているからなのかもしれませんし,
そうでないかもしれません.
1台のプリンタを複数グループのユーザに利用させることはできません.
入力可能なジョブのサイズを制限する
プリントジョブ
たくさんのユーザからプリンタが利用される場合には, 多分,
ユーザが印字要求を出すことができるファイルのサイズに
上限値を置く必要が生じるでしょう. 結局のところ,
スプーリングディレクトリ
が置かれているファイルシステムの空き容量がその
上限値になる訳ですが,
あるユーザがこれを独占的に使用すること避けるために,
他ユーザからのジョブ用の空き容量を確保する必要もあります.
プリントジョブ
制御
LPD では, mx
項目を指定することにより,
ジョブ中の個々のファイルのサイズの上限値を制限する機能を提供しています.
指定される ファイルサイズの単位は BUFSIZ ブロックで, 1
BUFSIZ ブロックは 1024バイトを表わします. この
mx 項目の値として 0 が指定されると,
ファイルサイズの制限はなくなります.
mx が指定されない場合は,
デフォルトの制限として 1000 ブロックが使われます.
この制限はジョブ中の各
ファイルに対して適用されるものであり,
ジョブ全体のサイズ
を制限するものではありません.
ところで,
プリンタに設定された上限値を超えるファイルサイズの
ファイルが入力された場合でも, LPD はこれを拒否しません.
その代わりに, このファイルは,
その先頭から上限値のファイルサイズまでしかキューに入れられません.
そして, その部分までが印字され,
残りの部分は捨てられます.
これが正しい動作といえるのかどうかは議論の余地があるところです.
それでは, 設定例に登場しているプリンタ
rattan と bamboo
の印字可能なファイルサイズに制限を加えてみましょう. artists
グループの人達が作る PostScript ファイルのサイズは
巨大になる傾向があるので, 上限値を5Mバイトとします.
それから,
プレインテキスト用のラインプリンタは無制限とします.
#
# /etc/printcap for host rose
#
#
# No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:mx#0:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
この場合もそうですが, この制限はローカル (ホスト rose)
のユーザのみに適用されます.
リモートホストからプリンタを利用できるように設定している場合は,
そのリモートホストのユーザはこの制限を受けません.
これらのユーザにも制限を加える場合は, リモートホストの
/etc/printcap の mx
を指定する必要があります.
リモートホストから印字するための詳しい情報については,
「
リモートホストに接続されたプリンタ」
を参照してください.
リモートホストに接続されたプリンタへのジョブの
サイズを制限する特別な方法は他にもあります. これについては,
「
リモートホストからのプリンタの利用を制限する」
を参照してください.
リモートホストからのプリンタの利用を制限する
LPD スプーリングシステムでは, リモートホストから要求された
ジョブの印字を制限するための方法がいくつか提供されています.
ホストの制限
ローカルの LPD
が印字要求を受け付けるリモートホストは, ファイル
/etc/hosts.equiv と
/etc/hosts.lpd
によって制御することができます. LPD では,
あるホストから印字の要求がきたとき,
このホストの名前がこれら2つのファイルのどちらかに含まれている
かどうかを調べます. これが含まれていない場合は, LPD
はこの要求を拒否します.
これらのファイルの形式は単純です.
各行にホストの名前を
1つずつ書いていきます. ファイル
/etc/hosts.equiv の方は
&man.ruserok.3; プロトコルでも利用され,
&man.rsh.1; や &man.rcp.1;
といったプログラムの動作に影響するので注意が必要です.
/etc/hosts.equiv
の記述は慎重におこないましょう.
例として, 以下にホスト rose の
/etc/hosts.lpd を示します.
orchid
violet
madrigal.fishbaum.de
この例では, rose はホスト
orchid, violet,
そして madrigal.fishbaum.de
からの要求を受け付けることになります.
その他のホストが rose の LPD
にアクセスしようと しても, LPD はそのジョブを拒否します
(訳注: 拒否されるのは, そのホストが
/etc/hosts.equiv
にも含まれていない場合です).
サイズの制限
スプーリングディレクトリがある
ファイルシステムに残しておく必要がある
空き容量の大きさを制御することができます.
ローカルプリンタ用のスプーリングディレクトリに
minfree
という名前のファイルを作成します. そして,
そのファイルの中にリモートホストからのジョブの
要求を受け付けるために必要な空き容量のディスクブロックサイズ
(1 ディスクブロック =512 バイト) を記します.
これで,
リモートホストのユーザにファイルシステムを満杯にされないことが保証されます.
この機能を使うと,
ローカルホストのユーザに対してある種の優先権を与えることもできます.
ローカルホストのユーザは,
minfree
ファイルで指定された値よりもディスクの空き容量が下回った後でもずっと,
ジョブをキューに入れることができるのです.
例えば, プリンタ bamboo 用の
minfree を作ってみましょう.
このプリンタのスプーリングディレクトリを調べるために,
/etc/printcap を調べてみましょう.
以下に, bamboo
のエントリ部分を示します.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
スプーリングディレクトリは
sd で指定されます. LPD
がリモートホストからのジョブを受け付けるために必要な
ファイルシステムの空き容量を 3M バイト
(=6144 ディスクブロック) にすることにしましょう.
&prompt.root; echo 6144 > /var/spool/lpd/bamboo/minfree
利用ユーザの制限
/etc/printcap の
rs 項目を指定することで,
ローカルプリンタを利用できるリモートホストのユーザを
制限することができます.
ローカルホストに接続されたプリンタ用のエントリに
rs 項目が指定されている場合, LPD
は印字を要求したユーザのアカウントと同じログイン名が
ローカルホストに登録されている場合に限り,
そのジョブが受け付けられます.
そうでないユーザからのジョブは LPD は拒否します.
この機能は, (例えば)
複数の部署がネットワークを共有しており,
この内のあるユーザが部署の境界を越えて活動している場合には特に有用です.
そのようなユーザに対して, システムのアカウントを与えるだけで,
これらのユーザは自分が所属する部署のシステムから
そのシステムに接続されているプリンタを使用することができます.
これらのユーザにはむしろ,
プリンタの使用だけを認め,
その他のコンピュータ資源を利用させたくないときは,
それらのユーザにはホームディレクトリを与えず,
ログインシェルはシェルとしては何の役にも立たない
/usr/bin/false などを指定して,
これらのユーザのアカウントはプリンタ用の形式的な
ものとします.
プリンタの利用に対する課金
課金
プリンタ
という訳で, 印字するためには料金をとることが必要です.
取らない理由などありましょうか. 紙やインクにはお金がかかります.
そして, プリンタの維持費もかかります.
プリンタには可動部分が搭載されており,
これらの部分は壊れやすいという傾向があります.
プリンタや, その利用形態, 維持費について調査をし, 1 ページ
(1 フィート, 1 メートルなど) 当たりにかかるコストを調べておいてください.
これに基づき, プリンタの利用に対する課金を, 実際に,
どのように始めればよいのでしょうか.
さて, 残念ながら, この部分に関しては LPD
スプーリングシステムはほとんど役に立ちません.
課金は使用しているプリンタの種類, 印字するもののファイルの形式,
プリンタの利用に対する課金での
あなた自身の要求に大きく左右されます.
課金システムを実現するためには, プリンタのテキストフィルタ
(プレインテキストのジョブに対して課金するため) と変換フィルタ
(その他のファイル形式に対して課金するため) を変更して,
印字したページを数えたり,
プリンタに印字したページ数を取得するための要求を送る必要があります.
ただし, 出力フィルタのみを利用している場合は,
課金をおこなうことができません. フィルタに関しては,
「
フィルタ」をご覧ください.
一般に, 課金方式には次の2つがあります.
定期的に課金する方法
はよく利用される方法です. この理由は,
恐らく比較的簡単に実現できるからです.
誰かがジョブを印字する度に, フィルタはそのユーザ名,
ホスト名, 印字したページ数を課金データファイルに記録します.
毎月, 毎学期, 毎年, その他お好みの時期に,
各プリンタの課金用ファイルを集め,
それぞれのユーザが印字したページ数を合計して
その分の課金をおこないます.
次回の課金期間をデータを 0 にして課金を再開するために,
すべてのログファイルを削除します.
利用毎に課金する方法
はあまり利用されていません. これは,
実現するのが比較的難しいからです. この方式では,
プリンタを使用したらすぐに,
フィルタがユーザにその利用に対する課金をおこないます.
ディスククオータのように, 課金作業は瞬時におこなわれます.
この方式では, ユーザのアカウントが赤字になる場合に,
ユーザが印字をおこなうことを拒否することができます.
また, ユーザにプリンタ版 quota
を調べたり,
調整したりする方法を提供したいと思うかもしれ ません.
これを実現するためには, ユーザとその quota を追跡するために,
あるデータベース用のコードが必要となります.
LPD スプーリングシステムでは,
両方式を簡単にですがサポートしています. これは, (ほとんどの場合で)
印字作業をフィルタがおこなっていたように,
課金作業もこのためのコードも用意することで実現されています.
しかし, 明るい面もあります.
それは, 課金方式に関して, 非常に大きな柔軟性が与えられたということです.
例えば, 「定期的に課金する方法」か,
「利用毎に課金する方法」のどちらかを選びまず, そして,
どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印字された頁数,
使用した紙の大きさ, 印字をするために要した時間など)
をログに記録するかを決めます.
以上のことをおこなうには, 上記の情報を保持するために,
フィルタを変更しなくてはなりません.
手軽なプリンタ課金方法
FreeBSD には, 「定期的に課金する方法」による課金を
すぐに設定できるように, 2個のプログラムを添付しています.
その内の1つはテキストフィルタ lpf で,
これについては, 「
テキストフィルタ lpf」をご覧ください. もう1つは,
&man.pac.8; で,
これはプリンタの課金データファイルからのエントリを集め,
これを合計するプログラムです.
「
フィルタはどのように機能しているか」で述べたように,
LPD ではテキストフィルタや変換フィルタを起動しますが,
そのコマンドラインで使用している課金データファイルの名前が指定されます.
両フィルタはこの引数を使って,
どの課金データファイルのエントリに書き込めばよいのかを知ることができます.
このファイルの名前は /etc/printcap 中の
af 項目によって指定されます.
このファイルが絶対パ スで指定されない場合は,
スプーリングディレクトリからの相対パスとして扱われます.
LPD は, 紙のページの幅と行数 (pw と
pl 項目で 指定される) を引数として
lpf を起動します. lpf
では, 何ページ印字したかを決定するためにこれらの引数を使用します.
ファイルをプリンタに送った後,
課金情報を課金データファイルに書き込みます.
このファイルは次のようになります.
2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang
課金データファイルはプリンタ毎に分けて作るべきです.
これは, lpf
にはデータファイルをロックする機構が組み込まれていないためです.
したがって, lpf
が2つ起動されたとき,
同じファイルに同時に書き込みをおこなった場合,
お互いのエントリが破壊されてしまうかもしれません.
課金用ファイルを各プリンタ毎に確実に分けるには,
/etc/printcap 中の
af=acct 項目を使います.
プリンタの利用に対してユーザに課金する準備ができたら,
スプーリングディレクトリに移動した後,
&man.pac.8; と入力してください.
次のような, ドル中心主義の課金リストが表示されます
(訳注: ドル中心主義という表現は,
表示がドルで出ることへの著者の皮肉でしょう.
セントがあるので小数点以下が表示されますが,
この機能も日本では邪魔ですね).
Login pages/feet runs price
orchid:kelly 5.00 1 $ 0.10
orchid:mary 31.00 3 $ 0.62
orchid:zhang 9.00 1 $ 0.18
rose:andy 2.00 1 $ 0.04
rose:kelly 177.00 104 $ 3.54
rose:mary 87.00 32 $ 1.74
rose:root 26.00 12 $ 0.52
total 337.00 154 $ 6.74
&man.pac.8; が受け付ける引数には次のようなものがあります.
プリンタ printer
の利用に対する課金リストを作成します.
このオプションは, /etc/printcap
の af
が絶対パスで指定されていた場合に限り, 動作します.
ユーザ名のアルファベット順ではなく,
課金額の低い順にリストを並べます.
課金データファイルにあるホスト名を無視します.
このオプションを使用すると, ホスト
alpha のユーザ
smith とホスト
gamma のユーザ
smith は同一人物として扱われます.
このオプションが指定されない場合は,
両者は別なユーザとして扱います.
/etc/printcap の
pc 項目で指定された値, または,
デフォルトの値 (2セント) に代わり, 紙1ページ, または,
1フィート当たりの価格を指定します.
price として,
浮動小数点数を指定することができます.
リストの並べる順番を逆順にします.
課金リストを作成し,
課金データファイルを削除します.
name …
ユーザ names
に対する課金情報のみを表示します.
&man.pac.8; が生成するデフォルトのリストには,
各ホストのユーザ別に印字ページ数が表示されます.
(ユーザがサイト内のすべてのホストを使用できるため)
ホスト名の情報が意味を持たない場合,
pac -m
を実行してください. 次のようなリストが得られます.
Login pages/feet runs price
andy 2.00 1 $ 0.04
kelly 182.00 105 $ 3.64
mary 118.00 35 $ 2.36
root 26.00 12 $ 0.52
zhang 9.00 1 $ 0.18
total 337.00 154 $ 6.74
課金額を決めるために,
&man.pac.8; は /etc/printcap
ファイルの pc
項目で指定された値 (デフォルト値は 200, すなわち1
ページ当たり2セント)
を使います. この項目で,印字物に課金したい
ファと思う 1 ページ当たり,
または, 1 フィート当たりの価格を100分の1セント単位で指定します.
&man.pac.8; を オプション付きで起動すると,
この値を置き換えることができます.
この オプションで指定する額の単位は,
100 分の 1 セント単位ではなく, ドル単位です. 例えば, 次の指定では,
1 ページ当たりの単価が 1 ドル 50 セントになります.
&prompt.root; pac -p1.50
このオプションを使うと,
実際の課金額を集計することができます.
最後に, pac -s
を起動すると, 課金情報は課金データ累計ファイルに保存されます.
このファイルの名前は, プリンタの課金データファイルの後ろに
_sum を付けたものとなります. そして,
課金データファイルは削除されます. 次に
&man.pac.8; が起動されると,
その時点までの累計金額を得るために,
課金データ累計ファイルが読み込まれ,
通常の課金データファイルからの情報に加算されます.
印字されたページ数をどのように数えるか?
課金を, リモートホストからの印字でさえも,
正確におこなうためには,
ジョブで使用された紙が何ページであるかを特定できる必要があります.
このことは, プリンタ利用に対する課金をおこなう上の根本的な問題です.
プレインテキストのジョブの場合,
問題を解決するのはさほど難しくはありません.
ジョブが何行であったかを数え, プリンタがサポートしている紙
1 ページに印字できる最大の行数と比較すればよいのです.
重ね打ちするために利用されるファイル中のバックスペース文字や,
物理的に複数の行に渡る長い論理行に対する取り扱いを忘れずにおこなってください.
(「テキストフィルタ
lpf」で紹介した) テキストフィルタ
lpf では, 課金をおこなうときに,
これらの取り扱いをおこなってくれます.
課金をおこなうために必要なテキストフィルタを作成している方は,
lpf
のソースコードが参考になるでしょう.
これに対して, 他のファイル形式の処理はどのようにすれば
よいのでしょうか.
まず, DVI から LaserJet, または, DVI から PostScript
への変換の場合, フィルタが dvilj や
dvips の 出力メッセージを解析することで,
何ページ分の変換がおこなわれたかを知ることができます.
他のファイル形式とその変換プログラムに関しても,
同様のことができるかもしれません.
しかし, この方式には問題点があります. それは,
変換されたページがすべて印字されるとは限らないということです.
例えば, プリンタが紙詰まりを起こしたり, トナー切れになったり,
はたまた, 爆発したりするかもしれません.
そのような状況により印字が途中で中止されたとしても, この方式では,
ユーザは全ページ分の料金を課されてしまうのです.
それでは, どのような対策をたてることができるのでしょうか.
正確な
課金をおこなうための唯一の確実な方法は,
何ページ印字したのかを知らせることができるプリンタを入手し,
これをシリアルポートかネットワークに接続することです.
ほとんどすべての PostScript
プリンタではこの概念がサポートされています.
他のプリンタも同様です (Imagen
レーザプリンタをネットワーク接続するなど).
それぞれのプリンタのフィルタを,
ジョブを印字した後で印字ページ数を得るように変更してください.
そして, 課金情報はここで得られた値のみに
基づいて記録してください. 行数を数えたり,
エラーが生じやすいファイルの調査は必要とされません.
もちろん,
気前よく印字料金をすべて無料にすることもできます.
プリンタを使う
プリンタ
使い方
この節では, FreeBSD で設定したプリンタを使う方法について説明します.
ここでは, ユーザレベルでのコマンドを概説します.
&man.lpr.1;
印字をおこないます.
&man.lpq.1;
プリンタキューを調べます.
&man.lprm.1;
プリンタキューにあるジョブを削除します.
管理者用コマンド &man.lpc.8; もありますが,
これは「プリンタを管理する」
に記します. このコマンドは,
プリンタやそのキューの制御のために用いられます.
&man.lpr.1;, &man.lprm.1;, そして &man.lpq.1; の 3
コマンドは,
オプションをとり, これによって,
/etc/printcap のように操作の対象となる
プリンタやキューを指定します.
これによって, 様々なプリンタに対してジョブを送る,
取り消す, 調査することができます.
が使われなかった場合は, これらのコマンドは
PRINTER 環境変数で指定されたプリンタを使用します.
そして, PRINTER 環境変数がなかった場合は,
これらのコマンドはデフォルトのプリンタ
lp を使います.
以下では, デフォルトプリンタ
という用語が意味するプリンタは, PRINTER
環境変数で指定されたプリンタ, もしくは, PRINTER
環境変数がない場合は, lp
という名前のプリンタです.
印字する
ファイルを印字するためには,
次のように入力してください.
&prompt.user; lpr filename ...
印刷
これにより,
入力されたファイルのそれぞれをデフォルトのプリンタ
から印字します. ファイル名が与えられなかった場合,
&man.lpr.1;
は標準入力から印字するデータを読み込みます. 例えば,
次のコマンドにより, ある重要なシステムファイルが印字されます.
&prompt.user; lpr /etc/host.conf /etc/hosts.equiv
印字させるプリンタを選択するためには,
次のように入力します.
&prompt.user; lpr -P printer-name filename ...
次の例では, プリンタ rattan に,
カレントディレクトリにあるファイルの詳細なリストを印字しています.
&prompt.user; ls -l | lpr -P rattan
上記の &man.lpr.1; コマンドではファイル名の指定がないので,
lpr は標準入力から印字するデータ,
この場合, ls -l
コマンドの出力, を読み込みます.
&man.lpr.1; コマンドでは,
出力の整形を制御したり, ファイル変換を適用したり,
複数部数のコピーを作成したり,
などといた様々な幅広いオプションを受け付けることもできます.
詳細については,
「
その他の印字オプション」をご覧ください.
ジョブの処理状況を調べる
プリントジョブ
&man.lpr.1; コマンドを使って印字をする場合, プリントしようと
するデータはプリントジョブ
と呼ばれる箱に一緒に置かれ,
これが LPD スプーリングシステムに送られます.
プリンタにはそれぞれジョブ用のキューがあり,
送られてきたジョブはあなたや他のユーザからの別のジョブと一緒にそのキューで並んで,
処理される順番を待ちます.
プリンタは到着順にこれらのジョブの印字をおこないます.
デフォルトプリンタのキューの状態を表示するには,
&man.lpq.1; と入力します. プリンタを指定するときは,
オプションを使います. 例えば, 次のコマンド
&prompt.user; lpq -P bamboo
は, プリンタ bamboo
のキューの状態を表示します. この lpq
コマンドの出力結果の例を次に示します.
bamboo is ready and printing
Rank Owner Job Files Total Size
active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes
2nd kelly 10 (standard input) 1635 bytes
3rd mary 11 ... 78519 bytes
この例では, bamboo
のキューに3つのジョブがあることが分かります.
最初のジョブはユーザ kelly からのものであり,
ジョブ番号
9 が割り当てられています.
プリンタのすべてのジョブには一意なジョブ番号が付けられています.
ほとんどの場合, このジョブ番号は無視することができますが,
ジョブをキャンセルするときにはこの番号が必要になります.
このことの詳細については, 「ジョブの削除
」をご覧ください.
ジョブ番号9のジョブは2つのファイルを処理します. すなわち,
&man.lpr.1;
のコマンドラインに複数のファイル名が与えられたときは,
1つのジョブとして扱われるのです. このジョブは, 現在,
アクティブジョブ (Rank
の欄の active という後に注目) になっています.
これは, プリンタからそのジョブが現在印字されているはずであることを意味しています.
2 番目のジョブでは,
&man.lpr.1; コマンドに標準入力からデータが与えられています.
3番目のジョブはユーザ mary から与えられました.
このジョブのサイズはとても大きくなっています.
彼女がプリントしようとしたファイルのパス名はここで表示させるには長すぎるため,
&man.lpq.1; コマンドはドットを3つだけ表示しています.
&man.lpq.1; からの出力で一番最初の行もまた有益な情報を与えています.
この行から, プリンタが現在何をしているか (あるいは, 少なくとも
LPD がプリンタがしていると思っていること) が分かります.
&man.lpq.1; コマンドは
オプションもサポートしています.
これにより,
詳しい情報が表示されます.
lpq -l の実行例を次に示します.
waiting for bamboo to become ready (offline ?)
kelly: 1st [job 009rose]
/etc/host.conf 73 bytes
/etc/hosts.equiv 15 bytes
kelly: 2nd [job 010rose]
(standard input) 1635 bytes
mary: 3rd [job 011rose]
/home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
ジョブの削除
印字するようジョブを
送った後で印字を中断したくなったときは,
&man.lprm.1; コマンドで,
キューの中からそのジョブを削除することができます.
大抵の場合, アクティブジョブでさえも
&man.lprm.1; を使って削除することができますが,
そのジョブの一部またはすべてが印字されてしまうかもしれません.
デフォルトプリンタへのジョブを削除するためには, 最初に,
&man.lpq.1; を使ってそのジョブ番号を調べます.
すなわち, それから,
次のように入力して, ジョブを削除します.
&prompt.user; lprm job-number
特定のプリンタへのジョブを削除するときは,
オプションを使ってそのプリンタを指定します.
例えば, プリンタ bamboo
のキューからジョブ番号 10 のジョブを削除するには次のようにします.
&prompt.user; lprm -P bamboo 10
&man.lprm.1; コマンドには略記法がいくつかあります.
lprm -
あなたが (デフォルトプリンタへ)
送ったジョブをすべて削除します.
lprm user
ユーザ user が
(デフォルトプリンタへ) 送ったジョブをすべて削除します.
他のユーザのジョブを削除できるのはスーパユーザだけです.
あなたは, あなた自身のジョブしか削除することはできません.
lprm
ジョブ番号もユーザ名もシンボル
も指定されないときは,
&man.lprm.1; は現在のアクティブジョブを,
そのジョブを送ったのがあなた自身であるときに限り,
デフォルトプリンタから削除します. ただし,
スーパユーザは任意のアクティブジョブを削除することができます.
上記の略記法をデフォルトプリンタではなく
特定のプリンタに対しておこなうときは,
オプションでそのプリンタを指定するだけよ いのです. 例えば,
プリンタ rattan のキューへあなたが送ったジョブを
すべて削除するためには次のようにします.
&prompt.user; lprm -P rattan -
ネットワーク環境で作業をしている場合,
あるホストから送られたプリンタジョブは, これを送ったホストで
&man.lprm.1; を使った場合に限って,
これを削除することができます.
他のホストで同じプリンタを使えたとしても,
このジョブを削除することはできません.
次の例では, 他ホストからジョブを削除することを試みています.
&prompt.user; lpr -P rattan myfile
&prompt.user; rlogin orchid
&prompt.user; lpq -P rattan
Rank Owner Job Files Total Size
active seeyan 12 ... 49123 bytes
2nd kelly 13 myfile 12 bytes
&prompt.user; lprm -P rattan 13
rose: Permission denied
&prompt.user; logout
&prompt.user; lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
その他の印字オプション
&man.lpr.1; コマンドには, テキストの整形や,
図や他のファイル形式の変換, 複数部コピーの生成,
ジョブの扱いなどをを制御することができます.
この節では, これに関するオプションについて記しています.
整形と変換に関するオプション
以下の &man.lpr.1; 用のオプションはジョブにおける
ファイルの整形の制御に関するものです.
このオプションは, ジョブにプレインテキストが含まれない場合や
&man.pr.1;
ユーティリティを使ってプレインテキストを整形する場合に用いてください.
TeX
次の例では, プリンタ
bamboo に (TeX 組版システムによる)
DVI ファイル
fish-report.dvi を印字しています.
&prompt.user; lpr -P bamboo -d fish-report.dvi
このオプションは,
ジョブに含まれるすべてのファイルに対して適用されます.
したがって, 1つのジョブに (例えば) DVI ファイルと ditroff
ファイルを混在させることはできません. その代わりに,
ファイルを形式毎に別々のジョブに分け,
それぞれのジョブでその形式用の変換オプションを使って印字してください.
と
を除くすべてのオプションを使用 するためには,
出力先プリンタ用の変換フィルタが必要です. 例えば,
オプションを使用するには, DVI
用の変換フィルタが必要 です. 詳細については, 「
変換フィルタ」で説明しています.
cifplot ファイルを印字します.
DVI ファイルを印字します.
FORTRAN プログラムを印字します.
plot のデータを印字します.
出力に対して, number
カラム分の字下げをおこないます.
number が省略されると,
8カラム分字下げされます.
このオプションはある変換フィルタと一緒の指定されたときのみに機能します.
と数字の間に空白を入れてはいけません.
制御文字を含む文字通りのテキストデータを印字します.
ditroff (device independent troff) データを印字します.
-p
印字する前に &man.pr.1;
によってプレインテキストを整形します.
詳細については &man.pr.1; をご覧ください.
&man.pr.1; コマンドにより生成されるヘッダを,
ファイル名の代わりに title とする.
このオプションは,
と一緒に使ったときのみ機能する.
troff データを印字します.
ラスタのデータを印字します.
次の例では, &man.ls.1;
のマニュアルを美しく整形したものをデフォルトプリンタで印字しています.
&prompt.user; zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t
&man.zcat.1; コマンドで
&man.ls.1; のマニュアルのソースファイルの圧縮を復元し, これを
&man.troff.1; コマンドに渡しています.
これによりソースファイルが整形され
GNU troff の形式となります.
その結果は &man.lpr.1; に渡され,
LPD スプーラへジョブの要求が発せられます.
&man.lpr.1; には
オプションが使われているため,
スプーラでジョブを印字したときに GNU troff
の形式から, デフォルトプリンタ解釈できる形式へと変換されます.
ジョブに関するオプション
以下のオプションは, &man.lpr.1; によって,
そのジョブを特殊な扱いにするよう LPD に指示するためのものである.
-# copies
ジョブに含まれるファイルのそれぞれを
1部だけ印字するのではなく,
copies
部のコピーを生成させるものです. 管理者によっては,
プリンタの消耗を避け, コピー機による複製を奨励するために
このオプションの使用が禁止されているかもしれません.
これに関しては, 「
複数部のコピーの印字を制限する
」をご覧ください.
次の例では, デフォルトプリンタで
parser.c を3 部コピーし, 次に,
parser.h を3部コピーしています.
&prompt.user; lpr -#3 parser.c parser.h
-m
印字ジョブが完了した後で, メールを送ります.
このオプショ ンを付けると, LPD
システムはジョブの扱いが終了したときに,
あなたのアカウントにメールを送ります.
メールのメッセージには, ジョブが正常終了したのか, あるいは,
何か異常があり, (しばしば)
その異常が何であったのかが書かれています.
-s
印字ファイルをスプールディレクトリにコピーせず,
代わりに,
シンボリックリンクを作成するよう指示します.
印字させるジョブのサイズが大きいとき,
このオプションを使うと便利かもしれません. このオプションにより,
スプー ルディレクトリの容量が節約されます (それに,
巨大なジョブのお陰でスプールディレクトリのあるファイルシステムの空き容量がなくなってしまうかもしれません).
さらに, LPD
がいちいちすべてのデータをコピーする必要がなくなりますので,
時間の節約にもなります.
ただし, 欠点もあります. LPD
はオリジナルのファイルを直接参照するので,
印字が終了するまでそのファイルを変更したり削除することができません.
リモートのプリンタで印字している場合, LPD は,
結局のところ,
ローカルホストからリモートホストにファイルをコピーする必要があります. したがって,
オプションはローカルのスプーリングディレクトリの空き容量を節約するだけで,
リモート側では節約されません. それにも関わらず,
このオプションはそれでも有用です.
-r
ジョブに含まれるファイルを,
スプーリングディレクトリに
ファイルをコピーした後に削除します. もしくは,
オプションと一緒に使われた場合は,
印字終了後に削除されます.
このオプションの使用には十分注意して下さい.
ヘッダページ用オプション
以下のオプションにより,
ジョブのヘッダページに通常印字さ
れるテキストを
&man.lpr.1; に調整させることができます.
対象のプリンタからヘッダページが出力されない場合は,
これらのオプションは何の効力も持ちません.
ヘッダページの設定に関する情報については,
「
ヘッダページ」を参照してください.
-C text
ヘッダページに印字されるホスト名を
text に置き換えます. なお,
ホスト名の場所には, 通常,
ジョブの要求があったホストの名前が印字されます.
-J text
ヘッダページに印字されるジョブ名を
text に置き換えます.
ジョブ名の場所には, 通常, ジョブの最初のファイル名,
または, 標準入力からデータが印字されたときは
stdin が印字されます.
-h
ヘッダページを出力を禁止します.
サイトによっては,
そのヘッダページの生成方法により,
このオプションの効果が現れないかもしれません.
詳細は, 「
ヘッダページ」をご覧ください.
プリンタを管理する
プリンタの管理者として, プリンタの設置, 設定,
そして, それらのテストをおこなう必要がありました.
&man.lpc.8; コマンドにより,
これまでとは別な管理方法がプリンタと対話的におこなわれます.
&man.lpc.8; により, 次のことが可能となります.
プリンタの起動, 停止をおこなう.
キューへの入力の許可, 禁止をおこなう.
それぞれのキューにあるジョブの順番を変更する.
最初に用語に関する注意をしておきます.
プリンタが停止しているとは,
キューの中にあるどのジョブも印字されることがない状態
を言います. この状態においても,
ユーザはまだジョブの要求をおこなうことができますが,
これらのジョブはキューの中で,
プリンタがスタートする状態になるまで,
あるいは, キューの内容が削除されるまで待たされることになります.
キューが禁止状態にあるとは, (root
以外の) すべてのユーザが
プリンタにジョブを要求することができない状態のことを言います.
キューが許可状態にある場合は,
ジョブの入力が許可されます.
キューが禁止状態にある場合でも,
プリンタをスタートす
る状態にすることは可能です. この場合は,
キューが空になるまで,
キュー内のジョブの印字が続けられます.
一般的に,
&man.lpc.8; コマンドを使用するには
root の権限を持っている必要があります. 一般のユーザも
&man.lpc.8; コマンドを使うことはできますが,
プリンタの状態を取得することとハングしたプリンタ
を再スタートすることだけに使用が制限されています.
以下に,
&man.lpc.8; コマンドに関する説明の要約を述べます.
ほとんどのコマンドでは, 操作対象となるプリンタを指定するため
printer-name 引数を与えます.
printer-name の代わりに
all が与えられると, 操作は
/etc/printcap
内にある全プリンタに対しておこなわれることになります.
abort printer-name
現在のジョブをキャンセルし, プリンタを停止させます.
キューが許可状態にある場合は,
ユーザはまだジョブを入力することができます.
clean printer-name
プリンタのスプーリングディレクトリから,
ジョブの古いファイルを削除します. 状況によって,
とりわけ, 印字途中でエラーが発生していたり,
管理操作が頻発していた場合には,
ジョブで作られたファイルを LPD が完全に削除しないことが
あります. このコマンドでは,
スプーリングディレクトリに入っていないファイルを見つけ出し,
それを削除しています.
disable printer-name
キューに新しいジョブを入れることを禁止します.
プリンタ がスタート状態にあるときは,
キューに残っているジョブの印字は続けられます. ただし,
キューが禁止状態にあったとしても, スーパーユーザ (root)
は常にジョブを入力することができます.
このコマンドは,
新しいプリンタやフィルタを設置している間に使用すると有用です.
すなわち, キューを禁止状態にしておくと,
root によるジョブのみが入力されます. そして,
その他のユーザは, テストが完了し,
enable
コマンドでキューが再度許可状態になるまで,
ジョブの入力はできなくなります.
down printer-name
message
プリンタをダウンさせます. これは,
disable をおこなった後で,
stop をおこなった場合と等価になります.
message は, ユーザが
&man.lpq.1; コマンドでプリンタのキューの状態を調べたり,
lpc status
でプリンタの状態を調べたときに,
プリンタの状況として表示されるメッセージです.
enable printer-name
プリンタのキューを許可状態にします.
ユーザはジョブの入 力ができるようになりますが,
プリンタがスタートの状態に なるまでは,
プリンタからは何も印字されません.
help command-name
command-name
コマンドのヘルプメッセージを表示します.
command-name
が指定されなかった場合は,
利用できるコマンドの要約が表示されます.
restart printer-name
プリンタをスタートさせます. 通常のユーザは,
LPD がある異常な状況でハングしたときに限り,
このコマンドを使用することができます. しかし,
stop
または down コマンドにより,
停止状態にあるプリンタをスター トさせることはできません.
restart コマンドは,
abort の後に start
をおこなったことと同じになります.
start printer-name
プリンタをスタートさせます.
プリンタのキューにあるジョブを印字することでしょう.
stop printer-name
プリンタを停止します. プリンタは,
現在のジョブを終了させ, そして,
キューにあるその他のジョブは印字しません.
プリンタが停止状態にあったとしても, まだ,
許可状態にあるキューに対して, ジョブを送ることができます.
topq printer-name
job-or-username
printer-name
のキューに対して, ジョブ番号
job のジョブ, または, ユーザ
username
から送られたジョブを置き換えて, キューの先頭に持ってきます.
このコマンドに関しては,
printer-name の代わりに
all
を使用することはできません.
up printer-name
プリンタをアップ状態にします. これの反対のコマンドが
down です. start
の次に enable
をおこなったことと等しくなります.
コマンドラインから上記のコマンドを入力すると,
&man.lpc.8;
はこれを受け付けます. コマンドが入力されなかった場合は,
&man.lpc.8; は対話モードに入り,
exit, quit,
または,
ファイル終端文字が入力されるまでコマンドの入力ができます.
標準スプーラの代替品
このマニュアルを最初から通読されている方ならば, ここまでで,
FreeBSD 付属の LPD スプーリングシステムに関して知っておくべき
ことすべてを学ばれたことと思います.
多分, このシステムにあるたくさんの欠点について認識できたことでしょう.
すると,
(FreeBSD 上で動作する)
スプーリングシステムには他にどのようなものがあるのか
という疑問が自然と湧いてきます.
LPRng
LPRng
LPRng は, その称するところの意味は次世代の LPR
です. これは PLP を完全に書き換えたものになっています.
Patrick Powell と Justin Mason (PLP の主要な管理者)
の共同で LPRng が作成されました.
LPRng の主要サイトは
ftp://dickory.sdsu.edu/pub/LPRng/
です.
トラブルシューティング
&man.lptest.1; を使った簡単なテストをおこなった結果,
正しい出
力を得られずに, 以下に示すような出力が得られるかもしれません.
しばらくしたら出力される, または,
紙の全体が出てこない
プリンタは上で示されたような印字を
おこなったのですが, しばらくして止まってしまい,
動かなくなってしまいました.
印字された結果をプリンタから取り出すためには,
プリンタにある PRINT REMAINING ボタン, または, FORM
FEED ボタンを押す必要があるようです.
この場合は,
おそらくジョブはプリントをする前に
更にデータが送られてこないか待ち続けているのでしょう.
この問題を解決するためには, プリンタに FORM FEED
文字 (あるいは特定の必要な文字コード) を
送るテキストフィルタを使ってください.
プリンタ内部に残ったデータをプリンタにすぐに印字させるには,
普通はこれで十分です.
次のジョブが前のジョブの最終ページの中央の
どこかから印字を開始させないためにも,
紙の途中で印字のジョブが終了したかどうかを確認するのは有益です.
シェルスクリプト
/usr/local/libexec/if-simple
を次のように変更して, プリンタへジョブを送信した後に
FORM FEED 文字を印字させるようにします.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.
/bin/cat && printf "\f" && exit 0
exit 2
階段効果
が現れた
次のような印字結果が得られた.
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
MS-DOS
OS/2
ASCII
あなたは「階段効果」
の新たなる犠牲者になってしまいました. この原因は,
改行を表わすべき文字がなんであるか
の解釈が混乱していることにあります. Unix
スタイルのオペレーティングシステムでは, 改行文字は
ASCII コード10 の line feed (LF)
の1文字が使われています. MS-DOS や OS/2などは ASCII
コード10の LF と, ASCII コード
13の文字 (carriage return または CR)
をペアで使います. (訳注:Machintosh では CR
のみで表現されています). 大抵のプリンタでは,
改行を表わすために MS-DOS の慣習にしたがいます.
FreeBSD で印字する場合, 印字したテキストは LF
文字だけ が使われていました. プリンタでは LF
文字を見つけると, 紙を1行分送り出しました. しかし,
次の文字を印字するた
めの紙の水平方向の位置は維持されました. すなわち, CR
文字が意味することは,
次の文字を印字する位置を紙の左端に動かすことです.
FreeBSD
がプリンタに動作をして欲しいと思っている動作を以下に示します.
プリンタが CR を受け取ったとき
CR 動作 (復帰) をおこなう
プリンタが LF を受け取ったとき
CR + LF 動作 (復帰, 改行) をおこなう
このように動作させるための方法がいくつかあります.
これらの文字の解釈を変えるために,
プリンタの設定スイッチかコントロールパネルを操作する方法.
どのようにして設定をするかはプリンタのマニュアルを参照してください.
FreeBSD
以外のオペレーティングシステムを切り替えて使う場合,
CR と LF 文字の解釈をそのオペレーティングシステムで使われているようにプリンタを
再設定する必要があるかもしれません.
以下に示す解決方法のいずれかを
選ぶのがよいかもしれませんね.
自動的に LF を CR+LF に変換してくれる
FreeBSD 用のシリアルドライバを入手する方法.
もちろん, このドライバはプリンタ専用に接続される
シリアルポート
のみで動作します.
この機能を許可するためには,
/etc/printcap
ファイルで対象プリンタの fs
項目で CRMOD ビットをセットします.
LF
文字の扱いを一時的に変更するための
エスケープコード
をプリンタに送る方法.
プリンタがサポートしているかもしれないエスケープコード
については,
プリンタのマニュアルを参照してください.
適切なエスケープコードが見つかったら,
最初にそのコードを送り, 次にプリントジョブを送信
するようにテキストフィルタを変更してください.
PCL
次に, Hewlett Packard 社の PCL
エスケープコードに対応しているプリンタのための
テキストフィルタの例を示します.
このフィルタでは, プリンタ に
LF 文字を LF と CR の2文字として扱わせます.
その後に, プリンタにジョブを送ります. 最後に,
ジョブの最終ページの紙を排出するため, FROM FEED
文字を送ります. このフィルタは Hewlett Packard
社のほとんどすべてのプリンタで機能するはずです.
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Ejects the page when done.
printf "\033&k2G" && cat && printf "\f" && exit 0
exit 2
ホスト orchid にある
/etc/printcap
の例を以下に示します. ここには,
一番目のパラレルポートにプリンタ
(Hewlett Packard LaserJet 3Si)
が一台接続されており, そのプリンタ名は
teak です.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
訳注
LF を CR+LF
に置き換える cat コマンドを作る方法も当然考えられます.
そして, このコマンドと, if-simple の cat
の部分を置き換えればよいわけです.
具体的にどのようにするかは,
読者への練習問題としましょう.
各行が重ね書きされてしまった
プリンタは紙送りをまったくしませんでした.
テキストすべての行がある行の上で重ねて印字されてしまいました.
この問題は,
階段現象とは正反対
な問題で,
ほとんどまれにしか起こりません. FreeBSDでは行末として扱われる
LF 文字が, 紙の左端に印字位置を復帰しますが,
紙送りはしない CR 文字として扱われています.
プリンタの設定スイッチかコントロールパネルを使って,
LF と CR
の文字を次のような解釈をするようにしてください.
プリンタが受け取ったとき
プリンタがおこなう
CR
CR 動作 (復帰)
LF
CR + LF (復帰, 改行)
訳注
LF を CR+LF
に置き換える cat コマンドを作る方法も当然考えられます.
そして, このコマンドと,
if-simple の cat
の部分を置き換えればよいわけです.
具体的にどのようにするかは,
読者への練習問題としましょう.
プリンタが文字を紛失してしまう
印字しているのですが,
各行の2〜3文字が印字されません.
プリンタを動かせば動かすほど,
もっとたくさんの文字が紛失されていき,
この問題は更に悪くなっていくかもしれませんでした.
この問題は,
シリアルポートを通してコンピュータから送られてくるデータの速度に,
プリンタがついていけないことに起因します
(この問題は, パラレルポートに接続された
プリンタでは発生することはありません).
この問題を克服する方法が2つあります.
プリンタが XON/XOFF のフロー制御をサポート
している場合は, 項目 fs で
TANDEM ビット をセットして, FreeBSD
にこの機能を使用させてください.
プリンタがキャリアフロー制御をサポートして
いる場合は, 項目 fs で MDMBUF
ビットをセットして下さい. それから,
プリンタとコンピュータを接続しているシリアルケーブルが
キャリアフロー制御用に正しく配線されたものかどうかを確認してください.
プリンタがフロー制御をまったく
サポートしていない場合は, 項目
fs の NLDELAY と TBDELAY,
CRDELAY, VTDELAY, BSDELA
のいくつかのビットを組み合わせて使い,
プリンタへ送るデータの流れに適当な遅延を加えてください.
プリンタは意味不明な文字列を印字した
プリンタはランダムなゴミのように
見えるものを印字しましたが,
意図したテキストは印字してくれませんでした.
この問題は, 通常,
シリアルポートに接続したプリンタでの
通信パラメータの誤りからくる前項とは別の症状です.
br 項目の通信速度と
fs と fc
項目のパリティビットの設定を共に調べてみてください.
また, プリンタでの設定が
/etc/printcap
ファイルで設定した
内容と一致しているかどうかも確認してください.
訳注
simple-if
のような単純なフィルタだけの状態で,
日本語を含むテキストを印字しようとした場合にも,
シリアルポート, パラレルポートの使用に関係なく,
このような症状は見られます. 日本語プリンタの場合,
漢字コードそのもの
を送信しただけでその漢字を印字してくれるものは,
少なくとも訳者は見たことがありません.
漢字を印字するための制御
コードを別途送信するフィルタが必要となります.
また, そのようなフィルタを使用していても,
そのフィルタが想定してる漢字コードと異なった文書を
プリントしようとしたとき もこのような症状は出ます.
もちろん, これはプリンタ用の
言語を持たないプリンタの話で, PostScript プリンタ
などにプレインテキストを送信しても, 日本語対応,
非対応に関らず, 意味不明な文字列が印字される
(もしくは, 何も印字されない) ことでしょう.
何も起きない
もしプリンタが何の動作もしないのであれば,
ハード的な問題ではなく, 多分 FreeBSD
の中に問題があります.
/etc/printcap ファイルで,
デバッグしているプリンタのエントリに
(lf 項目で) ログファイルを取るように
設定を追加してください. 例えば, プリンタ
rattan 用のエントリの項目
lf は次のようになります.
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
次に, もう一度印字をおこなってみます. そして,
発生したと思われるエラーメッセージを見るためにログファイル
(上記の例では,
/var/log/rattan.log)
を調べます. そこで見られたメッセージを元に,
問題を解決してみてください.
項目 lf
が指定されていない場合, LPD はデフォルト
のログファイルとして
/dev/console を使います.
diff --git a/ja_JP.eucJP/books/handbook/security/chapter.sgml b/ja_JP.eucJP/books/handbook/security/chapter.sgml
index 1ff22b80b7..522cd7209d 100644
--- a/ja_JP.eucJP/books/handbook/security/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/security/chapter.sgml
@@ -1,3204 +1,3204 @@
セキュリティ
この章の多くの部分は&a.dillon;によって書かれた
&man.security.7; マニュアルページからの引用です.
訳: &a.jp.hino;, (jpman プロジェクトの成果を利用させ
ていただきました).
この章では
この章では, 基本的なシステムセキュリティの考え方,
覚えておくべき一般的なルールを紹介し,
そして S/Key, OpenSSL, Kerberos
などの高度な話題について簡単に説明します.
はじめに
セキュリティとは, システム管理者をいつも悩ませる仕事の一つです.
すべての BSD UNIX マルチユーザシステムは,
従来からいくつかのセキュリティ機構を備えていますが,
ユーザを疑心暗鬼に陥らせないように追加のセキュリティ機構を構築し
保守する仕事はおそらく, システム管理者としてもっとも大きな責務の一つでしょう.
マシンの安全性に反映されるのは, 管理者が作業したことだけです.
またセキュリティ問題は, 快適な環境に必要なものと競合します.
一般に UNIX システムは膨大な数のプロセスを同時に動作させることができ,
そのプロセスの大部分は, サーバ –
外部から接続し, 通信するものとして動作します.
かつてのミニコンとメインフレームがデスクトップにとってかわり,
さらにコンピュータが相互に接続されたネットワークを形成するようになった今日,
セキュリティは非常に大きな関心事になってきています.
セキュリティを実装するには,
タマネギのように階層化する手法
(a layered onion
approach)
が最適です.
どうすれば良いのか簡単に説明すると,
便利な機能と同じ数だけセキュリティの階層を作り,
システムへの侵入を注意深く監視するのです.
あなたはセキュリティを過度に厳重にしたり,
侵入の監視に時間をとられたいとは思わないでしょう.
この侵入の発見という部分は,
あらゆるセキュリティ機構において最も重要な部分の一つなのです.
たとえば, システムの各バイナリに schg フラグ
を設定するのは, 大して意味がありません.
フラグを設定すると一時的にバイナリが保護され,
侵入してきたクラッカーによってシステムに加えられる変更のうち,
容易に検出可能な変更は行なえなくなります.
しかしその結果として, セキュリティ機構がその侵入者を検出することも
まったくできなくなってしまうでしょう.
また, システムセキュリティには,
さまざまな形での攻撃に対処することとも関係しています.
この攻撃には root 権限を奪おうとするものだけでなく,
クラッシュやシステムの不安定状態を引き起こそうとするものを含まれます.
このセキュリティ問題は, いくつかに分類することが可能です.
サービス妨害攻撃 (denial of service attack)
ユーザアカウントの不正利用 (user account compromise)
アクセス可能なサーバを使った root 権限の不正利用
ユーザアカウントを経由した root 権限の不正使用
バックドアの設置
サービス妨害攻撃 (DoS 攻撃) とは,
マシンから必要な資源を奪う行為です.
通常, サービス妨害攻撃はそのマシンで実行されるサーバや
ネットワークスタックを過負荷状態にしてマシンをクラッシュさせたり,
マシンを使えなくしたりするような力任せの方法です.
サービス妨害攻撃の中には,
ネットワークスタックのバグを利用して,
パケット一つでマシンをクラッシュさせようとするものもあります.
後者には, カーネルにバグ修正を施すことによってのみ対応することができます.
サーバプロセスに対する攻撃は, オプションを適切に指定することによって,
攻撃されている状況でサーバプロセスの負荷上昇に限界を設定することで
対応できる場合が多いです. これらに比べると,
ネットワークへの力任せの攻撃への対応はずっと難しくなります.
たとえば, 偽造パケットによる攻撃 (spoof-packet attack) は,
インターネットからシステムを切り離す以外の方法で
防ぐことはほとんど不可能です.
この攻撃によって, マシンを落としてしまうことはできないかもしれませんが,
接続しているインターネット回線を混雑させていっぱいにしてしまうことはできます.
ユーザアカウントの不正利用は, サービス妨害攻撃
よりもずっとよくある問題です. このご時勢でも, 自分たちのマシンで
標準の telnetd, rlogind, rshd, ftpd サーバを実行させているシステ
ム管理者は多いのです. これらのサーバは, デフォルトでは, 暗号化さ
れたコネクション上で動作していません. その結果, 抱えているユーザ
数が標準くらいであれば, リモートログイン (そのシステムにログイン
するには最も普通で便利な方法です) しているユーザのうち一人以上は,
パスワードを覗き見られてしまうでしょう. システム管理者が注意深い
人ならば, たとえログインが成功していたとしても, リモートアクセス
ログを解析して, 疑わしい送信元アドレスを探すものです.
ひとたび攻撃者がユーザアカウントへのアクセス権を入手すると,
攻撃者が root の権限を破る可能性があることを仮定するべきです. し
かし, セキュリティを十分維持し, 手入れの行き届いたシステムにおい
ては, あるユーザアカウントへのアクセスが可能となっても, 攻撃者に
必ずしも root へのアクセス権を与えるとは限りません. こ
の違いは重要です. というのは, 一般的に root へのアクセス権がなければ,
攻撃者は自分の侵入の痕跡を隠蔽することができませんし, そ
のユーザのファイルを引っかき回したり, マシンをクラッシュさせたり
できるのがせいぜいです. ユーザアカウントの不正利用は
めずらしいことではありません. それは一般ユーザに, システム管
理者ほど注意を払わない傾向があるからです.
システム管理者は「あるマシン上で root の権限を破る方法は, 潜
在的に何通りもあるのだ」ということを心しておかねばなりません. 攻撃
者が root のパスワードを知ってしまうかもしれませんし, 攻撃者が
root の権限で実行されるサーバのバグを見つけ, ネットワークからそ
のサーバへ接続して root の権限を破ることができるかもしれません.
ひとたびユーザアカウントを破ると, ユーザアカウントから root の権
限を破ることを可能にするような suid-root プログラムに存在するバグを
攻撃者は知っているかもしれません. あるマシン上で攻撃者
が root の権限を破る方法を知ったとすると, 攻撃者は, 裏口を作る必
要はありません. これまでに発見され, ふさがれた root の
穴の多くには, クラッカーが侵入した跡を消そうとしてたくさん仕事し
た結果が含まれています. そのためにこそ, 多くのクラッカーは裏口を
作るのです. 攻撃者は裏口を使ってシステムへの root アクセスを再び
簡単に得ることができます. しかしこの裏口は, クラッカーの検出をす
るのに便利なものでもあります. クラッカーに裏口を作らせないように
するということは, セキュリティにとっては実際には良くないことかも
しれません. なぜなら, そうすることで, クラッカーが最初に侵入して
くるために発見したセキュリティホールがふさがるわけではないからで
す.
セキュリティを改善する方法は, 常に, タマネギの皮
のように階層化する手法 (a multi-layered onion peel
approach) で実装されるべきです. これら
は次のように分類できます.
root とスタッフのアカウントの安全性を高める.
root の安全性を高める – root 権限で動作するサーバ
と suid/sgid バイナリ.
ユーザアカウントの安全性を高める.
パスワードファイルの安全性を高める.
カーネルのコア, raw デバイス, ファイルシステムの安全性を
高める.
システムに対して行なわれた, 不適切な変更をすばやく検出す
る.
必要と思われる以上の対応をとる (paranoia).
本章の次の節では, 上記の各項目についてより深く掘り下げていき
ます.
FreeBSDの安全性を高める
以下の節では, 本章の前節
でとりあげた FreeBSD システムの安全性を高める方法について
述べます.
root アカウントとスタッフアカウントの安全性を高める
root のアカウントの安全性を確保しないうちからスタッフのア
カウントの安全性をうんぬんしてもしかたがありません. ほとんどの
システムでは, root アカウントに割り当てたパスワードが 1 つあり
ます. まず最初にすべきことは, このパスワードはいつで
も不正利用の危険に晒されていると仮定することです. これは
root のパスワードを消すべきだと言っているのではありません.
root のパスワードは, マシンにコンソールからアクセスするのには,
ほとんどいつでも必要なものです. ここで言いたいのは, コンソール
以外からは, そして可能なら &man.su.1; コマンドを実行する場合も
root のパスワードを使えないようにするべきである, ということで
す. たとえば, あなたが使っている pty が,
/etc/ttys ファイルで unsecure と指定
されているか確認してください. そうすると,
telnet や rlogin 経由では
root で直接ログインできないようになります.
sshd のような, 別のログインサービス
を使っている場合でも同様に, 直接 root へログインすることを許し
ていないかどうか確認してください. すべてのアクセス手段 –
たとえば ftp のようなサービスが, 良くクラックの対象となることを
考えましょう. root への直接ログインは, シス
テムコンソール経由でのみ可能であるべきなのです.
また当然, システム管理者として自分が root になれるようにしておく必要が
ありますから, そのための穴をいくつか開けておきます. し
かし, それらの穴を動作させるには, さらに追加のパスワード認証が
必要であるようにしておくことが重要です. root でアクセス可能と
する方法の一つとして, 適切なスタッフアカウントを
(/etc/group 中の)
wheel グループに加えることがありま
す. wheel グループに入っているスタッフメン
バは su を使って root になることが許されま
す. パスワードエントリにおいて, スタッフメンバを
wheel グループに置くことによって直接 wheel
権限を与えてはいけません. スタッフメンバのアカウントは
staff グループに所属させるべきで, そして
/etc/group ファイルを通して
wheel グループに加えるべきです. 実際に root
アクセスの必要なスタッフメンバのみ wheel グ
ループに置くようにすべきです. 他の認証方法の場合, たとえば
kerberos を使用する場合には, root アカウントの
.k5login ファイルを使って, 誰も
wheel グループに置く必要なく &man.ksu.1; を
使って root になることを許すようにすることもできます. このやり
方はよりよい解決策なのかもしれません. なぜなら,
wheel のメカニズムでは, 侵入者がパスワード
ファイルを手に入れ, スタッフアカウントのいずれか 1 つを破るこ
とができると, root を破ることがまだできてしまうからです.
wheel のメカニズムを用いる方が, 何もしない
よりは良いのですが, 必ずしも最も安全な選択肢とは限りません.
root アカウントの安全性を高める間接的な方法として, 別のロ
グインアクセスの方法を用いてスタッフのアカウントの安全性を高め,
その上でそのスタッフのアカウントの暗号化パスワードを
* にしておく方法があります. この方法だと,
侵入者がパスワードファイルを盗むことができた場合でも, スタッフ
アカウントを破ることはできなくなります (また, たとえ root が暗
号化パスワードをパスワードファイルに付けていたとしても, 間接的
に root アカウントを破ることはできません). スタッフメン
バがスタッフアカウントでログインする際には, &man.kerberos.1;
や &man.ssh.1; のような, 公開鍵 / 秘密鍵の鍵の組を使う安全性の
高いログイン機構を使います. kerberos のようなログイン機構を使う
場合は一般に, kerberos サーバを実行するマシンと自分のデスクトッ
プワークステーションとの安全性を確保しなければなりません.
また ssh で公開鍵 / 秘密鍵の組を使う場合,
一般に, ログイン元マシン (通常は自分のワー
クステーション) の安全性を確保しなければなりません. ここで,
<&man.ssh-keygen.1; で公開鍵 / 秘密鍵の組を生成する際, 鍵の組
をパスワードで防御することにより, 鍵の組への防御層を追加するこ
ともできます. スタッフアカウントのパスワードを
* でつぶすことができると, 管理者自身が設定
した安全性の高い方法でしかスタッフメンバがログインできないこと
も保証できます. こうして, 多くの侵入者が使う重大なセキュリティ
の穴, すなわち, 安全性の低い無関係なマシンからネットワークを覗
き見る方法, を塞ぐようなセッションを提供する, 安全性の高い暗号
化されたコネクションを使うことを, スタッフメンバ全員に強制する
ことができるのです.
より間接的なセキュリティの仕組みでは, 制限の強いサーバから
制限の弱いサーバへログインすることを前提としています. たとえば,
メインマシンで, 様々な種類のサーバを実行させている場合, ワーク
ステーションではそれらのサーバを実行させてはなりません. ワーク
ステーションを十分に安全にしておくためには, 実行するサーバの数
を, 一つもサーバが実行されていないというくらいにまでできる限り
減らすべきです. また, パスワードで保護されたスクリーンセーバを
走らせておくべきです. ワークステーションへの物理的アクセスが与
えられたとすると, もちろん言うまでもなく, 攻撃者は管理者が設定
したいかなる種類のセキュリティをもうち破ることができるのです.
このことは, 管理者として必ず考えておかねばならない問題ですが,
システム破りの大多数は, ネットワーク経由でリモートから, ワーク
ステーションやサーバへの物理的アクセス手段を持たない人々によっ
て行われるという事実もまた, 念頭に置いておく必要があります.
kerberos のような方法を使うことで, スタッフアカウントのパ
スワードの変更もしくは停止を一箇所で行なうことと, スタッフメン
バがアカウントを持つすべてのマシンに即時にその効果を及ぼすこと
が可能となります. スタッフメンバのアカウントが危険に晒されたと
きに, すべてのマシンでスタッフメンバのパスワードを即座に変更す
る能力を過小評価してはいけません. パスワードが分散されている状
況では, N 台のマシンでパスワードを変更すると, てんやわんやの事
態を招く可能性があります. kerberos を使用すると, パスワードの
再発行に制限 (re-passwording restriction) を課することもできま
す. この機能を使うことにより, ある kerberos チケットをしばらく
経つとタイムアウトにすることができるだけでなく, 一定期間 ( 例
えば, 1 ヶ月に 1 回) 経つと, ユーザに新しいパスワードを選ぶよ
うに要求することもできます.
root 権限で実行されているサーバと SUID/SGID バイナリの安全性を高める
用心深いシステム管理者は, 自分に必要なサーバプロセスだけを
過不足なく実行させるものです. サードパーティ製のサーバは, よくバグを持っ
ていがちだということに注意して下さい. たとえば, 古いバージョンの
imapd や popper を実行させておくのは, 全世界に万能の root の切
符を与えているようなものです. 自分で注意深くチェックしていない
サーバは, 決して実行してはいけません. root で実行させる必要の
あるサーバはほとんどありません. たとえば,
ntalk,
comsat,
finger デーモンを, 専用ユーザの
砂場 (sandbox) で実行させることができます.
管理者が膨大な数の問題に直面していないのなら, この「砂場」は完
璧ではありませんが, セキュリティに関するタマネギ的アプローチは
ここでも成り立ちます. 砂場で実行されているサーバプロセスを経由
して侵入を果たすことができたとしても, 攻撃者はさらに砂場から外
に脱出しなければなりません. 攻撃者が通過せねばならない層の数が
増えれば増えるほど, それだけ攻撃者が侵入に成功する確率が減りま
す. root の抜け穴は歴史的に, 基本システムサーバも含め, root 権
限で実行されるほとんどすべてのサーバプロセスで発見されています.
ユーザが sshd 経由でのみログインし,
telnetd,
rshd,
rlogind 経由でログインすることが決
してないマシンを稼働させているのであれば, それらのサービスを停
止させて下さい!
FreeBSD では, 今では ntalkd,
comsat,
finger は砂場で実行させることがデフォ
ルトになっています. 次に砂場で実行させるべきプログラムの候補と
して, &man.named.8; があります.
/etc/defaults/rc.conf ファイルには,
named を砂場で実行するために必要な
引数がコメントアウトされた形式で含まれています. 新しいシステム
をインストールしているか, それとも既存のシステムをアップグレー
ドして使っているかに依存しますが, 砂場として使用する特別のユー
ザアカウントがインストールされていないかもしれません. 用心深い
システム管理者であれば, できるだけいつでも研究を怠らず, サーバ
に砂場を仕込むものでしょう.
通常, 砂場で実行しないサーバが他にいくつかあります.
sendmail,
popper,
imapd,
ftpd などです. これらのうちいくつか
のサーバには代わりとなるものがありますが, 代わりのものをインス
トールするには, あなたが思うより多くの仕事が必要になるかもしれ
ません (便利さという要素がまたも勝利を収めるわけです). これら
のサーバは, root 権限で実行せねばならいかもしれません. また,
これらのサーバ経由で生じる侵入を検出するためには, 他の仕組みに
頼らなくてはならないかもしれません.
システムの root 権限の潜在的な穴で他に大きなものとして, シ
ステムにインストールされた suid-root/sgid バイナリがあります.
これらのバイナリは, rlogin のように,
/bin, /sbin,
/usr/bin, /usr/sbin
に存在するものがほとんどです. 100% 安全なものは存在しないとは
いえ, システムデフォルトの siud/sgid バイナリは比較的安全とい
えます. それでもなお, root の穴がこれらのバイナリにときおり発
見されています. 1998 年に Xlib で見つかった
root の穴は, xterm (普通, suid 設定
されています)を脆弱にしてしまいました. 安全である方がよいので,
用心深いシステム管理者は残念に思いながらも, スタッフのみが実行
する必要がある suid バイナリは, スタッフのみがアクセス可能な特
別なグループに含めるように制限を加え, 誰も使わない suid バイナ
リは (chmod 000 を実行して) 片付けてしまう
でしょう. ディスプレイを持たないサーバは, 一般的に
xterm のバイナリを必要としません.
sgid バイナリもほとんど同様の危険な存在になり得ます. 侵入者が
kmem に sgid されたバイナリを破ることができた場合, その侵入者
は /dev/kmem を読み出すことができるように
なるでしょう. つまり, 暗号化されたパスワードファイルを読み出す
ことができるようになるので, パスワードを持つどのアカウントをも,
潜在的な危険に晒すことになります. 他にも,
kmem グループを破った侵入者が pty を通して
送られたキーストロークを監視できるという危険があります. キース
トロークには, 安全な方法でログインするユーザが使っている pty
も含まれます. tty グループを破った侵入者は, ほぼ任意のユーザの
tty へ書き込みができます. ユーザが端末プログラムやキーボードを
シミュレーションする機能を持ったエミュレータを使っている場合,
侵入者は潜在的に, 結局そのユーザとして実行されるコマンドをユー
ザの端末にエコーさせるデータストリームを生成できる可能性があり
ます.
ユーザアカウントの安全性を高める
ユーザアカウントは, 普通, 安全性を高めることが最も困難です.
スタッフに対しては, とても厳格なアクセス制限を強制しパスワード
を * で外すことができるでしょうが, 管理者が
持ちうる一般ユーザすべてのアカウントに対して同じことはできない
かもしれません. 管理者が十分に統率をとることができるなら, 管理
者は勝利し, ユーザのアカウントの安全を適切に確保できるかもしれ
ません. それができないならば, よりいっそう気を配って一般ユーザ
のアカウントを監視するよりほかありません. 一般ユーザアカウント
に対し ssh や kerberos を利用するこ
とには, システム管理がさらに増えたりテクニカルサポートが必要に
なるなどの問題があります. それでも, 暗号化パスワードファイルと
比較するとはるかに良い解です.
パスワードファイルの安全性を高める
できるだけ多くのパスワードを * で外し,
それらのアカウントのアクセスには
ssh や kerberos を使うようにするこ
とが, 唯一の確実な方法です. 暗号化パスワードファイル
(/etc/spwd.db) は root でのみ読み出し可能
だといっても, 侵入者が root の書き込み権限は得られなくとも, 読
み出しアクセス権限を得ることは可能かもしれません.
セキュリティスクリプトで常にパスワードファイルの変更をチェッ
クし, 報告するようにすべきです (ファイルの完全性のチェック
参照).
カーネルのコア, raw デバイス, ファイルシステムの安全性を
高める
root の権限を破ると, 攻撃者は何でもできますが, 特に重宝さ
れる特定の事柄もいくつかあります. たとえば, 最近のカーネルは, 組
み込みのパケット覗き見デバイス (packet sniffing device) ドライ
バを備えているものがほとんどです. FreeBSD では
bpf デバイスと呼ばれています. 侵入者
は普通, 侵入済みのマシンでパケット覗き見プログラムを実行させよ
うと試みます. 侵入者にわざわざそういう機能を提供する必要はない
ので, ほとんどのシステムで bpf デバイスを組み込むべきではあり
ません.
bpf デバイスを外しても, /dev/mem と
/dev/kmem という悩みの種がまだ残っていま
す. この問題に関しては, 侵入者は raw ディスクデバイスに書き込
むこともできます. また, モジュールローダ, &man.kldload.8; とい
う, 別のカーネル機能があります. やる気まんまんの侵入者は, KLD
モジュールを使って自分独自の bpf もしくはその他覗き見デバイス
を動作中のカーネルにインストールすることができます. この問題を
避けるため, システム管理者はカーネルをより高い安全レベル (
securelevel) , 少なくとも安全レベル 1 で実行させる必要がありま
す. sysctl を使って
kern.securelevel 変数に安全レベルを設定する
ことができます. ひとたび安全レベルに 1 を設定すると, raw デバ
イスに対する書き込みアクセスは拒否され, たとえば
schg のような特別な chflags フラグの機能が
強制されます. システム起動に関わる重要なバイナリやディレクトリ,
スクリプトファイルなど, 安全レベルが設定されるまでの間に実行さ
れるすべてのものに対しても schg フラグを on
にしておくことも確実に実行してください. この設定をやり過ぎても
構いませんが, より高い安全レベルで動作している場合, システムの
アップグレードがはるかに困難になります. システムをより高い安全
レベルで実行させるようにするが, すべてのシステムファイルとディ
レクトリに schg フラグを設定しないという妥
協をする方法もあります. もう一つの可能性としては, 単純に
/ および /usr を読み
込み専用でマウントすることです. ここで特筆すべきことは, システ
ムを守ろうとして厳しくしすぎると, 侵入を検出するという非常に重
要なことができなくなってしまうということです.
ファイルの完全性のチェック: バイナリ, 設定ファイルなど
ことこの問題に至ると, システム管理者にできることは, 便利さ
という要素がその醜い頭を上げない程度に, コアシステムの設定と制
御ファイルを防御することだけです. たとえば,
/ および /usr にある
大部分のファイルに schg ビットを設定するた
めに chflags を使用するのは, おそらく逆効果
でしょう. なぜなら, そうすることでファイルは保護できますが, 侵
入を検出する窓を閉ざしてしまうことにもなるからです. セキュリティ
のタマネギの最後の層はおそらく最も重要なもの – 検出で
す. セキュリティの残りのものは, 突然の侵入を検出できなければ,
まったく有用ではありません (あるいは, もっと悪ければ, 安全性に
対する間違った感覚を植え付けてしまいます). タマネギの仕事の半
分は, もう半分の検出側が攻撃者を攻撃の最中に捕えるようにするた
めに, 攻撃者を食い止めるのではなく侵入を遅らせることなのです.
侵入を検出する最も良い方法は, 変更されていたり, 消えていた
り, 入れた覚えがないのに入っているファイルを探すことです. 変更
されたファイルを探すのに最も良い方法は, もう一つの (しばしば中
央に集められた), アクセスが制限されたシステムから行なうもので
す. さらに安全でアクセス制限されたシステム上でセキュリティ用ス
クリプトを書けば, スクリプトは潜在的なクラッカー達からはほぼ見
えなくなります. これは重要なことです. この有効性を最大限に活用
するためには, 一般的に, アクセスの制限されたマシンから実際に使っ
ている他のマシンへのかなりのアクセスを許す必要があります. 普
通は, 他のマシンからアクセス制限されたマシンへ読み込み専用の
NFS エクスポートをしたり, アクセス制限されたマシンから他のマシ
ンへ ssh を行なうために,
ssh 鍵のペアを作ったりすることで行
います. ネットワークのトラフィックを別にして, NFS は最も可視性
のない方法です – 各クライアント上のファイルシステムを,
事実上検出されずに監視できるようになります. アクセス制限された
サーバがスイッチを通してクライアントに接続されている場合, たい
てい NFS がより良い選択肢です. アクセス制限されたサーバがハブ
を通したり, いくつかのルーティング層を通したりしてクライアント
に接続する場合, NFS はあまりにも危険な方法かもしれず (ネットワー
クの面で) , ssh の方が認証の道筋は
跡となって残りますが, それでもより良い方法かもしれません.
アクセス制限されたマシンに, 監視しようとするクライアントシ
ステムへの少なくとも読み込みのアクセス権を与えたら, 次に実際に
監視するためのスクリプトを書かなくてはいけません. NFS マウント
をすれば, &man.find.1; や &man.md5.1; などの単純なシステムユー
ティリティでスクリプトを書くことができます. 少なくとも 1 日 1
回, クライアントのファイルを直接 md5 にかけ, さらにもっと頻繁
に /etc および
/usr/local/etc にあるようなコントロール用
ファイルを試験するのが一番です. アクセス制限されたマシンが正し
いと知っている, 基となる md5 情報と比べて違いが見つかった場合,
システム管理者に調べて欲しいと悲鳴を上げるようにすべきです. 優
れたセキュリティ用スクリプトは, / および
/usr などのシステムパーティション上で不適
当に suid されたバイナリや, 新たに作成されたファイルや削除され
たファイルもチェックするでしょう.
NFS ではなく, ssh を使用する場
合は, セキュリティ用スクリプトを書くのはずっと難しいことで
す. スクリプトを動かすためには, クライアントに対してスクリプト
を scp しなくてはいけませんし, それは目に見
えてしまいます. そして, 安全のためには, スクリプトが使うバイナ
リ (find など) を scp する必要もあります.
クライアントの ssh デーモンはすでに
攻撃されてしまっているかもしれません. 結局のところ, 安全でない
リンク上の場合は ssh は必要かもしれ
ませんが, ssh を扱うのはとても大変
なことです.
優れたセキュリティ用スクリプトは, ユーザやスタッフメンバの
アクセス設定ファイルの変更もチェックするものです.
.rhosts, .shosts,
.ssh/authorized_keys など …
MD5 チェックの範囲外になってしまうであろう
ファイル群です.
ユーザ用のディスク容量が非常に大きい場合は, パーティション
上の各ファイルを見て回るのに大変な時間がかかるかもしれません.
この場合は, マウントフラグを設定して, このパーティションに
suid されたバイナリやデバイスを置けないようにするのが良い考え
です.nodev および nosuid
オプション (&man.mount.8; 参照) が知るべきものでしょう.
とにかく少なくとも週に 1 度はファイルシステムをスキャンするべきです.
なぜなら, この層の目的は, 侵入が成功したかどうかに関わらず, 侵
入があったことの検出をすることだからです.
プロセスアカウンティング (&man.accton.8; 参照) は,
マシンへの侵入を検出するためのメカニズムとして推奨できる,
比較的オーバヘッドの少ないオペレーティングシステムの機能です.
侵入を受けた後でも当該ファイルが無傷である場合に, 侵入者が
実際にどのようにしてシステムに侵入したかを追跡するのに特に役立ちます.
最後に, セキュリティスクリプトはログファイルを処理するよう
にし, ログファイル自体もできるだけ安全性の高い方法で生成するよ
うにすべきです – リモート syslog は極めて有益になり得ま
す. 侵入者は自分の侵入の痕跡を覆い隠そうとしますし, また, ログ
ファイルはシステム管理者が最初の侵入の時刻と方法を追跡してゆく
ために極めて重要です. ログファイルを永久に残しておくための 1
つの方法は, システムコンソールをシリアルポートにつないで走らせ,
コンソールを監視している安全なマシンを通して絶えず情報を集める
ことです.
偏執狂的方法
多少偏執狂的になっても決して悪いことにはなりません. 原則的
に, システム管理者は, 便利さに影響を与えない範囲でいくつでもセ
キュリティ機能を追加することができます. また, いくらか考慮した
結果, 便利さに影響を与えるセキュリティ機能を追加することもでき
ます. もっと重要なことには, セキュリティ管理者とは少し喧嘩にな
るはずなのですが – もしあなたが, 本文書に書かれている勧
告をそのまま使用した場合は, 予想されるクラッカーはやはり本文書
を読んでいるわけですから, あなたの防御策を教えてしまうことにな
ります.
サービス妨害攻撃
このセクションではサービス妨害攻撃 (DOS 攻撃) を扱います.
サービス妨害攻撃は, 普通は, パケット攻撃です. ネットワークを飽
和させる最先端の偽造パケット (spoofed packet) 攻撃に対してシス
テム管理者が打てる手はそれほど多くありませんが, 一般的に, その
種の攻撃によってサーバがダウンしないことを確実にすることで, 被
害をある限度に食い止めることはできます.
サーバの fork の制限.
踏み台攻撃の制限 (ICMP 応答攻撃, ping broadcast など).
カーネルの経路情報のキャッシュ.
よくあるサービス妨害攻撃は, fork するサーバプロセスに対す
るものです. これは, サーバにプロセス, ファイル記述子, メモリを
マシンが死ぬまで食い尽くさせようとするものです. inetd
(&man.inetd.8; 参照) には, この種の攻撃を制限するオプションが
いくつかあります. マシンがダウンすることを防止することは可能で
すが, この種の攻撃によりサービスが中断することを防止することは
一般的に言ってできないことに注意する必要があります. inetd のマ
ニュアルページを注意深く読んで下さい. 特に,
, ,
オプションに注意して下さい. IP 偽造攻撃 (spoofed-IP attack) は
inetd の オプションの裏をかけるので, 一般
にオプションを組み合わせて使用するべきであることに注意して下さ
い. スタンドアロンサーバの中には, 自分自身で fork を制限するパ
ラメータを持っているものがあります.
Sendmail には,
オプションがあります. シ
ステム負荷の値変化には遅れがあるので, sendmail の負荷限界指定
オプションを使うよりも, このオプションを使う方がまともに動作す
る可能性ははるかに高いです.
sendmail の実行を開始する際に,
MaxDaemonChildren パラメータを設定するべき
です. その値は, 通常見込まれる負荷を扱える程度に十分高いが, そ
れだけの数の sendmail を操作しよう
とするとマシンが卒倒してしまうほどには高くないような値に設定す
るべきです. sendmail をキュー処理モード
() で実行することや,
sendmail デーモン (sendmail -bd) をキュー処
理用プロセス (sendmail -q15m) と別に実行す
ることも, 用心深いことと言えます. それでもなおリアルタイムでの
配送を望むのであれば, のようにすることで,
キュー処理をはるかに短い時間間隔で行うことができます. いずれに
しても, MaxDaemonChildren オプションに合理
的な値を確実に指定して, sendmail がなだれをうって失敗すること
がないようにして下さい.
syslogd は直接攻撃される可能性
があるので, 可能ならばいつでも オプション
を用いることを強く推奨します. これができないなら,
オプションを使って下さい.
tcpwrapper の逆 identd などの接
続返し (connect-back) を行うサービスについては十分注意を払うよ
うにするべきです. これらは直接攻撃を受ける可能性があります. こ
ういう事情があるので, tcpwrapper の
逆 ident 機能を使おうとは思わないのが一般的です.
境界ルータのところでファイアウォールを設けて, 外部からのア
クセスに対して内部サービスを防御するという考えは実によいもので
す. この考えは, LAN の外部からの飽和攻撃を防ぐことにあり, 内部
サービスをネットワークベースの root 権限への攻撃から防御するこ
とにはあまり考慮を払っていません. ファイアウォールは常に排他的
に設定して下さい. つまり, ポート A, B, C, D と M から Z
まで以外 のすべてに防火壁を設ける
というふうにです. このようにすることで,
named (ゾーンのプライマリである場合),
ntalkd,
sendmail などのインターネットからア
クセスできるサービスとして特に指定するもの以外の, 小さい番号の
ポートすべてをファイアウォールで防御することができます. ファイ
アウォールをこの他のやり方 – つまり包含的もしくは受容的
なファイアウォールとして設定しようとする場合,
close
することを忘れてしまうサービスがいくつか
出てきたり, 新しい内部サービスを追加したのにファイアウォールの
更新を忘れたりする可能性がよく出てきます. ファイアウォール上の
大きい番号のポートを開けておくことにより, 小さい番号のポートを
危険に晒すことなく受容的な動作を許すことができます. FreeBSD で
は, net.inet.ip.portrange への
sysctl (sysctl -a | fgrep
portrange) をいろいろ使用することで, 動的バインドに使用される
ポート番号の範囲を制御できることを記憶にとどめておいてください.
これによりファイアウォールの設定を簡略化することもできます.
たとえば, 通常の first/last 範囲として 4000 から 5000 を,
高位ポートの範囲として, 49152 から 65535 を指定し,
(いくつかのインターネットアクセス可能
なポートをブロックから除外するのはもちろんですが) 4000 より下
のすべてをブロックするという設定が考えられるでしょう.
また別のよくあるサービス妨害攻撃として, 踏み台攻撃
(springboard attack) と呼ばれるものがあります – これは,
あるサーバを攻撃し, そこ結果として生成される応答が自分自身, ロー
カルネットワーク, そして他のマシンを過負荷に追い込むようにする
攻撃です. この種の攻撃の中で最もありふれたものに,
ICMP ping broadcast 攻撃があります. 攻撃
者は, 実際に攻撃したいマシンのアドレスを送信元アドレスに設定し
た ping パケットを偽造して, 対象の LAN のブロードキャストアド
レスに向けてパケットを送信します. 境界にあるルータがブロードキャ
ストアドレスに対する ping パケットを握り潰すように設定されてい
ない場合, LAN は, 詐称された送信元アドレスに向けて応答パケット
を生成するはめになり, 犠牲となるマシンが飽和するところまで行っ
てしまいます. 攻撃者が同じトリックを異なるネットワーク上のいく
つものブロードキャストアドレスに対して同時に使用した場合, とく
にひどいことになります. これまでに, 120 メガビット以上のブロー
ドキャスト攻撃が観測されています. 2 番目の踏み台攻撃は, ICMP
エラー報告の仕掛けを狙うものです. 攻撃者は ICMP エラー応答を生
成するパケットを生成し, サーバの受信ネットワークを飽和させ, そ
の結果としてサーバが送信ネットワークを ICMP 応答で飽和させてし
まうようにすることができます. mbuf を消費し尽くさせることによ
り, この種の攻撃でサーバをクラッシュさせることも可能です. サー
バが生成した ICMP 応答を十分速く送信できない場合, とくにひどい
ことになります. FreeBSD カーネルには, この種の攻撃の効果を抑制
する ICMP_BANDLIM と呼ばれる新しいカーネルコンパイルオプション
があります. 踏み台攻撃の 3 つめの主要なクラスに属する攻撃は,
udp echo サービスのような, 特定の inetd 内部サービスに関連する
ものです. 攻撃者は, 単に送信元アドレスがサーバ A の echo ポー
トであり, 送信先アドレスがサーバ B の echo ポートであるように
UDP パケットを偽造します. ここでサーバ A, B はともにあなたの
LAN に接続されています. この 2 つのサーバは, この一つのパケッ
トを両者の間で互いに相手に対して打ち返しあいます. このようにし
てパケットをほんのいくつか注入するだけで, 攻撃者は両方のサーバ
と LAN を過負荷状態にすることができます. 同様の問題が内部
chargen ポートにも存在します. 有能なシステム管理者はこの手の
inetd 内部テストサービスのすべてを無効にしておくものです.
偽造パケット攻撃は, カーネルの経路情報キャッシュに過負荷を
生じさせるために用いられることもあります.
net.inet.ip.rtexpire,
rtminexpire, rtmaxcache
の sysctl パラメータを参照して下さい. でた
らめな送信元 IP アドレスを用いた偽造パケット攻撃により, カーネ
ルは, 一時的なキャッシュ経路を経路情報テーブルに生成します. こ
れは netstat -rna | fgrep W3 で見ることがで
きます. これらの経路は, 普通は 1600 秒程度でタイムアウトになり
ます. カーネルがキャッシュ経路テーブルが大きくなり過ぎたことを
検知すると, カーネルは動的に rtexpire を減らしますが,
rtminexpire より小さくなるようには決して減らしません. ここに問
題が 2 つあります:
負荷の軽いサーバが突然攻撃された場合, カーネルが十分素
早く反応できないこと.
カーネルが持続的攻撃に耐えられるほど十分
rtminexpire が低く設定されていないこと.
自分のサーバが T3 もしくはそれより高速の回線でインターネッ
トに接続されている場合, &man.sysctl.8; を用いて
rtexpire と rtminexpire
とを手動で上書きしておくことが思慮深いことといえます. どちらか
一方でも 0 には決してしないで下さい (自分のマシンをクラッシュ
させたくないのであれば :-). 両パラメータを 2 秒
に設定すれば, 攻撃から経路情報テーブルを守るには十分でしょう.
Kerberos および SSH を用いたアクセスの問題
もしあなたが, kerberos および
ssh を使用したいのだとしたら, 両者
に関して言っておく必要のある問題がいくつかあります. kerberos V
は大変優れた認証プロトコルですが, kerberos 化された
telnet や
rlogin は, バイナリストリームを扱う
のに不向きになってしまうようなバグがあります. さらに, デフォル
トでは, kerberos は オプションを使わない限
りセッションを暗号化してくれません.
ssh では, デフォルトですべてを暗号
化してくれます.
ssh はあらゆる場面でとても良く
働いてくれます. ただし, デフォルトで暗号鍵を転送してしまうこと
を除けばです. これはつまり, 暗号鍵を持った安全なワークステーショ
ンがあって, この暗号鍵で残りのシステムとアクセスできるようになっ
ている場合に, 安全でないマシンへ
ssh を行なう時に暗号鍵が見えてしま
うということです. 実際の鍵そのものが見えてしまうわけではありま
せんが, ssh は, あなたが login して
いる間, 転送用ポートを作ります. クラッカーが安全でないマシンの
root を破ると, クラッカーは, このポートを使って暗号鍵を取得し,
この暗号鍵でロックの外れる他のマシンへのアクセスを得ます.
スタッフのログインには, kerberos を組み合せた
ssh を使用することを勧めます.
ssh は, kerberos サポート機能と一緒
にコンパイルできます. こうすると, 見えてしまうかもしれない
ssh 鍵をあまりあてにしないで良いよ
うになります. また, それと同時に, kerberos 経由でパスワードを
保護することもできます. ssh 鍵は,
安全なマシンからの自動化されたタスク (kerberos はこの用途には
不向きです) のみに使用するべきです. また,
ssh の設定で鍵転送をしないようにす
るか, あるいは, ssh が
authorized_keys ファイル中に書くことを許
している from=IP/DOMAIN オプションを使用し
て, 特定のマシンからログインしてきたときのみ鍵が有効であるよう
にすることも勧めます.
DES, MD5, と Crypt
改訂: &a.unfurl;, 21 March
2000.
訳: &a.hanai;,
12 September 1996.
訳改訂: &a.jp.hino;,
12 March 2001.
UNIX システムにおけるすべてのユーザは, そのアカウントに対応し
た一つのパスワードを持っています. それらのパスワードはユーザ本人
と本当のオペレーティングシステムのみが知っているべきであるという
ことは明らかでしょう. それらのパスワードを秘密に保っておくために,
パスワードは一方向ハッシュ
として知られる方式で暗
号化されます. 一方向ハッシュとは, 簡単に暗号化はできるが解読は難
しいという方法です. 言葉を換えると, 先ほど明らかであると書いたの
は実は正しくないのです: オペレーティングシステム自身は
本当はパスワードを知らないのです. その代わりに
暗号化された形でのみパスワードを知っていま
す.素のテキスト
としてパスワードを得る唯一の方法は,
可能な限りのパスワード空間を検索するという力任せの方法です.
不幸なことに, UNIX が生まれようとしているときにパスワードを
安全な形で暗号化できる方式は DES(Data Encryption Standard) に基
づいたものだけでした. このことは米国に住んでいるユーザにとって
は大して問題ではありませんでしたが, DES のソースコードを米国外に
輸出することはできないという問題がありました. そのために,
FreeBSD は, 米国の法律を守ることと, 未だに DES を使っている他の
UNIX 一族との互換性を保つこととを両立する方法を探し出す必要があ
りました.
その解決方法は, 米国のユーザは DES のライブラリをインストー
ルして DES を使用できるが, 米国外のユーザは国外に輸出可能な他の
ひとつの暗号化方式を使用することができる, というように暗号化ライ
ブラリを分割することでした. これが FreeBSD がデフォルトの暗号化
方式として MD5 を使うようになったいきさつです. MD5 は DES よりも
より安全であると考えられているため, DES をインストールする一番の
理由は互換性を保つためといえます.
暗号化機構を理解する
FreeBSD がどの暗号化方式を使うようにセットアップされている
かを判断するのは簡単です.
/etc/master.passwd ファイルの中の暗号化さ
れたパスワードを調べてみるのが一つの方法です. MD5 ハッシュで暗
号化されたパスワードは, DES ハッシュで暗号化されたパスワードよ
りも長いですし, その上 $1$ と
いう文字で始まるという特徴も持っています. DES のパスワードはこ
れといって識別可能な特徴は持っていませんが, MD5 のパスワードよ
りは短く, そして $ という文字を含ま
ない 64 文字のアルファベットを使って表現されているので, 比較的
短い文字列でドル記号で始まっていないものはおそらく DES のパス
ワードでしょう.
同様の方法で, ライブラリはパスワードを識別します. 結果とし
て, DES のライブラリは MD5 パスワードを識別でき, そして MD5 を
使って MD5 で暗号化されたパスワードをチェックし, その他のパス
ワードには DES を使ってチェックします. DES のライブラリは MD5
も含んでいるのでこのようなことが可能なのです. 残念なことに, 反
対は真ではありません. MD5 のライブラリは DES で暗号化されたパ
スワードを認証することができません.
あなたのシステムでプログラムがどちらのライブラリを使ってい
るかを調べるのは非常に簡単です. crypt を使うプログラムは
libcrypt をリンクしています. そしてそれぞれのライブラリに対す
る適切な実装へのシンボリックリンクとなってい ます. たとえば, DES
版を使っているようなシステムにおいては次のようになっています:
&prompt.user; ls -l /usr/lib/libcrypt*
lrwxr-xr-x 1 root wheel 13 Mar 19 06:56 libcrypt.a -> libdescrypt.a
lrwxr-xr-x 1 root wheel 18 Mar 19 06:56 libcrypt.so.2.0 -> libdescrypt.so.2.0
lrwxr-xr-x 1 root wheel 15 Mar 19 06:56 libcrypt_p.a -> libdescrypt_p.a
MD5 に基づいたライブラリを使っているシステムにおいては, 同
じようなリンクが 見られるでしょうが, そのターゲットは
libdescrypt ではなく
libscrypt になっているでしょう.
もし DES 機能を持った crypt ライブラリ
libdescrypt をインストールしたのなら (つ
まり "crypt" ディストリビューションをインストールした場合), 新
規パスワードがどちらのパスワード形式になるかは,
/etc/login.conf の中の
passwd_format
ログインケーパビリティによって制
御されます. その値としては, des
または
md5
を設定することができます. ログインケーパビ
- リティに関するより詳細な情報は, login.conf(5) マニュアルページ
+ リティに関するより詳細な情報は, &man.login.conf.5; マニュアルページ
をご覧ください.
S/Key
S/Key は一方向ハッシュ関数を基にしたワンタイムパスワード方式
です. FreeBSD では, 互換性のために MD4 ハッシュを用いていますが
他のシステムでは MD5 や DES-MAC を用いてます. S/Key は, バージョ
ン1.1.5 以降のすべての FreeBSD に含まれていますし, FreeBSD 以外
の数多くのシステムの上でも利用されています. S/Key ば Bell
Communications Research, Inc. の登録商標です.
以下の説明では, 三種類の異なる「パスワード」が使われます.
まず一つ目は, あなたが普段使っている普通の UNIX スタイルの, もし
くは Kerberos でのパスワードです. ここではこれを UNIX パ
スワード
と呼ぶことにし ます. 二つ目は, S/Key の
key プログラムによって生成され,
keyinit プログラムとログインプロンプトが受け
付けるパスワードです. ここではこれをワンタイムパスワード
と呼ぶことにします. 三つ目のパスワードは,
key (と場合により keyinit)
プログラムに対してユーザが入力する秘密のパスワードで, ワンタイム
パスワードを生成するのに使われます. ここではこれを秘密の
パスフレーズ
もしくは単に “パスフレーズ” と呼
ぶことにします. (訳注: ユーザが頭の中だけにしまっておくべきもの
が, この秘密のパスフレーズです. なお, 原文ではこれをパスワードと
表記していますが, 混乱を避けるために訳文ではすべて 秘密の
パスフレーズ
に統一しています.)
秘密のパスフレーズは, UNIX パスワードと何の関連性もありませ
ん: 両者を同一に設定することは可能ですが, お奨めしません. UNIX
パスワードは長さが 8 文字に制限されています (訳注: FreeBSD で
DES を導入していない場合はもっと長いパスワードも認識されます).
これに対し, S/Key では秘密のパスフレーズを好きなだけ長くすること
ができます (訳注: 実装上, key コマンドなどの
バッファ長で制限されてしまう可能性があります. 200 文字程度に押
えておいた方がよいでしょう :-). 6 語から 7 語からなるパスフレー
ズがふつうです. ほとんどの部分で, S/Key システムは UNIX のパスワー
ドシステムと完全に独立して動作するようになっています.
パスフレーズに加え, S/Key システムにとって重要な二種類のデー
タがあります. 一つはシード (seed: 種)
または
キー (key: 鍵)
と呼ばれるもので, 二つの文字と五つ
の数字で構成されます. もう一つはシーケンス番号 (iteration
count)
で, 1 から 100 までの整数です. S/Key はここまで
に述べたデータを利用してワンタイムパスワードを生成します. その方
法は, まずシードと秘密のパスフレーズを連結し, それに対してシーケ
ンス番号の回数だけ MD4 ハッシュを繰り返し計算します. そしてその
結果を 六つの短い英単語に変換します. login プ
ログラムと su プログラムは, 前回最後に受け付
けられたワンタイムパスワードを記録しています. そして, その前回
のワンタイムパスワードと, ユーザが入力したワンタイムパスワードを
一回ハッシュ関数にかけた結果とが一致した場合に, このユーザは認証
されます. 一方向ハッシュ関数を使っているので, もし正しく認証され
たワンタイムパスワードが一回盗聴されたとしても, 次回以降に使われ
る複数のワンタイムパスワードを生成することは不可能です. シーケ
ンス番号はログインが成功するたびに一つずつ減らされて, ユーザとロ
グインプログラムの間で同期が取られます. シーケンス番号が 1 まで
減ったら, S/Key を再度初期化する必要があります.
次に, S/Key 関連の四つのプログラムについて説明します.
key プログラムは, シーケンス番号一つと, シー
ド一つと, 秘密のパスフレーズ一つとを受け付けて, ワンタイムパスワー
ドを一つ生成します. keyinit プログラムは,
S/Key を初期化するのに使用され, また秘密のパスフレーズやシーケン
ス番号やシードを変更するためにも使用されます. このプログラムを実
行するには, 秘密のパスフレーズか, または, シーケンス番号とシード
とワンタイムパスワードの一組かの, どちらかが必要になります.
keyinfo プログラムは,
/etc/skeykeys というファイルを調べて, この
プログラムを起動したユーザの現在のシーケンス番号とシードを表示し
ます. 最後に, login と su
プログラムについてですが, これらは S/Key のワンタイムパスワード
を, (訳注:システムが) ユーザを認証するものとして受理するのに必要
な処理をおこないます. login プログラムは, 指
定された特定のアドレスからの接続に対して, UNIX パスワードの使用
を認めなくする機能, 逆に言えば S/Key の利用を強制する機能も持っ
ています.
この文書では, 四種類の異なる操作について説明します.
一つ目は, keyinit プログラムを信頼できる通信
路上で利用する場合で, 一番始めに S/Key を設定する操作や, 使い始
めたあとで秘密のパスフレーズやシードを変更する操作です. 二つ目は,
keyinit プログラムを信頼できない通信路上で利
用する場合で, 操作の目的は一つ目と同じです. この場合には
key プログラムを併用する必要があります. 三つ
目は, key プログラムを使い, 信頼できない通信
路を通じてログインする操作です. 四番目は, key
プログラムを使って, 複数のワンタイムパスワードを一気に生成する操
作です. ここで生成した複数のワンタイムパスワードは, メモしたり
印刷したりして携帯し, 信頼できる通信路が一切ないところで利用する
ことができます. (訳注: ワンタイムパスワードを記録した紙をなくさ
ないこと! 電話番号やIPアドレス, ユーザ名を一緒にメモしていたら
最悪です!!)
信頼できる通信路での初期化
信頼できる通信路 (たとえばあるマシンのコンソール画面や, ssh
を使っている時など) を利用しているときに, S/Key を初めて初期化
すること, S/Key の秘密のパスフレーズを変更すること, またはシー
ドを変更すること, をおこなうことができます. そのためには, まず
あなた自身がログインし, keyinit コマンドを
以下のようにパラメタなしで実行します:
&prompt.user; keyinit
Adding unfurl:
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
) `keyinit' コマンドが出力する注意です. 訳すと,
) 注意 - この動作モードはマシンに直接入力しているときのみ利用
) すること. もし今 telnet や rlogin を使っているなら, 秘密のパ
) スフレーズを入力せずにこのままコマンドを終了し, かわりに
) keyinit -s を実行すること.
Enter secret password:
Again secret password:
ID unfurl s/key is 99 to17757
DEFY CLUB PRO NASH LACE SOFT
Enter secret password: というプロンプトに
対してあなたが考えた秘密のパスフレーズを入力します. このパスフ
レーズはログインするときに使うものではなく, ログインするときに
使うワンタイムパスワードを生成するために使うものであることを覚
えておいてください. ID
から始まる行は, S/Key に
おける一回分のパラメタであり, あなたのログイン名とシーケンス番
号とシードです. (訳注: `keyinit' コマンドは
次回にログインするときに使えるパラメタを参考のためにここで表示
します.) S/Key を使ってログインするときには, システム側が自動
的にこれらのパラメタを表示してくれますから, これらのパラメタを
覚えておく必要はありません. 最後の行が, 今述べたパラメタと入力
された秘密のパスフレーズから計算されたワンタイムパスワードです.
この例を実行した後, 次にログインするときに打ち込むべきワンタイ
ムパスワードがこれです.
信頼できない通信路での初期化
信頼できない通信路を使って S/Key を初期化, または秘密のパ
スフレーズを変更するためには, 信頼できる通信路として, その信頼
できない通信路とは別のものを用意する必要があります. その信頼で
きる通信路は key プログラムを実行するために
必要となるもので, たとえばそれは, あなたが信頼できる Macintosh
のデスクアクセサリや信頼できるマシンのシェルプロンプトだったり
するでしょう. (訳注: ここでの通信路とはマシンそのものになりま
す. 信頼できるマシンとは, 信頼できる人がしっかり管理しているマ
シンということです.) 他に準備しておくものとして, シーケンス番
号 (100 は適切な値といえるでしょう) と, 場合によっては自分で考
えた, またはランダムに生成されたシードがあります. (あなたが
S/Key を初期化しようとしているマシンへの) 信頼できない通信路を
使うときには, keyinit -s コマンドを以下のよ
うに使用します:
&prompt.user; keyinit -s
Updating unfurl:
Old key: to17758
Reminder you need the 6 English words from the key command.
) `keyinit' コマンドが出力する注意です. 訳すと,
) 注意 - skey コマンドの出力する 6 英単語が必要になります.
Enter sequence count from 1 to 9999: 100
Enter new key [default to17759]:
s/key 100 to 17759
s/key access password:
デフォルトのシード (keyinit プログラム
は困ったことにこれを key と読んでいるのです
が, 混乱しないよう注意してください) で構わなければ, リターンキー
を押してください. 次に, アクセスパスワードを入れる前に, あらか
じめ用意しておいた信頼できる通信路(信頼できるマシンや信頼でき
る S/Key デスクアクセサリなど) へ移って, 先ほどと同じパラメタ
を入力します:
&prompt.user; key 100 to17759
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <秘密のパスフレーズ>
CURE MIKE BANE HIM RACY GORE
ここで信頼できない通信路の方に戻って,
key コマンドが出力したワンタイムパスワード
をコピーして keyinit プログラムに入力します.
s/key access password:CURE MIKE BANE HIM RACY GORE
ID unfurl s/key is 100 to17759
CURE MIKE BANE HIM RACY GORE
後は, 前章で説明したことと同様です.
ワンタイムパスワードを一つ生成する
S/Key の初期化ができたら, ログインするときには以下のような
プロンプトが出てくるでしょう:
&prompt.user; telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.
FreeBSD/i386 (example.com) (ttypa)
login: <ユーザ名>
s/key 97 fw13894
Password:
ここでは表示していませんが, 便利な機能がログインプログラム
に備わっています: パスワードプロンプトに対して, 何も入力せずに
リターンを押すとエコーモードに切り替わります. つまりタイプし
た文字がそのまま見えるようになるのです. これはS/Key のワンタイ
ムパスワードを紙に印刷していた場合など, ワンタイムパスワードを
手で入力しなければならない場合に特に役立つ機能です. また, この
ログインしようとしてるマシンが, 接続元のマシンから
UNIX パスワードを使ってログインすることができないように設定さ
れている場合には, ログインプロンプトには S/Key のワンタイムパ
スワードのみが受け付けられることを示す (s/key
required) という注釈が表示されます.
次に, このログインプロンプトに対して入力するためのワンタイ
ムパスワードを生成しましょう. そのために,
key プログラムを使える信頼できるマシンを用
意します. (key プログラムには DOS や
Windows の上で動くもの, MacOS の上で動くものなどもあります.)
key プログラムを使うときには, シーケンス番
号とシードを指定します. ログインしようとしているマシンのログ
インプロンプトの右側をカットアンドペーストすると楽でしょう.
信頼できるシステムで:
&prompt.user; key 97 fw13894
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
WELD LIP ACTS ENDS ME HAAG
ここでワンタイムパスワードが得られました. ログインを続けま
しょう:
login: <username>
s/key 97 fw13894
Password: <return to enable echo>
s/key 97 fw13894
Password [echo on]: WELD LIP ACTS ENDS ME HAAG
Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
以上の手順は, 信頼できるマシンが利用できる場合の
みに使えるもっとも簡単な方法です. Java による
S/Key の key applet もあり, The Java OTP
Calculator からダウンロードして Java をサポートするブ
ラウザ上でローカルに実行することができます.
複数のワンタイムパスワードを生成する
都合によっては, 信頼できるマシンや信頼できる通信路が一切確
保できないようなところで S/Key を使う必要があるでしょう. この
ような場合には, key コマンドを使って複数の
ワンタイムパスワードをあらかじめ一気に生成し, 紙に印刷して携帯
していくことができます. たとえば:
&prompt.user; key -n 5 30 zz99999
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <秘密のパスフレーズ>
26: SODA RUDE LEA LIND BUDD SILT
27: JILT SPY DUTY GLOW COWL ROT
28: THEM OW COLA RUNT BONG SCOT
29: COT MASH BARR BRIM NAN FLAG
30: CAN KNEE CAST NAME FOLK BILK
という引数によって 5 個のワンタイム
パスワードを順に生成します. ここで は, 最
後のシーケンス番号となるべき数字です. 出力は普通に使う順番とは
逆に出力されていることに注意してください
(訳注: 一番最初に使うワンタイムパスワードは一番最後に出力され
たものです). この結果をカットアンドペーストして
lpr コマンドを使って印刷すると よいでしょう.
もしあなたがセキュリティに偏執するなら, この結果を紙と鉛筆を使っ
て手で書き移した方がよいかもしれません. ここで, 出力の各行はシー
ケンス番号とそれに対応する一回分のワンタイムパスワードです.
消費済みの ワンタイムパスワードの行をペンで消していくと便利で
しょう.
UNIX パスワードの利用を制限する
設定ファイル /etc/skey.access を使っ
て UNIX パスワードの利用を制限することができます. この場合の判
断基準として, ログインを受け付ける際のホスト名, ユーザ名, 端末
のポート, IP アドレスなどが利用できます. この設定ファイルの詳
細に関してはマニュアル &man.skey.access.5; をご覧ください. マ
ニュアルにはこの機能に関わるセキュリティについて, いくつかの警
告が記述してあります. この機能を使ってセキュリティを高めようと
するのならば絶対にこのマニュアルを読んでください.
もし /etc/skey.access ファイルが存在
しないならば (FreeBSD のデフォルト状態ではそうです), すべての
ユーザが UNIX パスワードを利用することができます. 逆に, もし
ファイルが存在するならば, skey.access ファ
イルに明示的に記述されていない限り, すべてのユーザは S/Key の
利用を要求されます. どちらの場合においても, そのマシンのコンソー
ルからはいつでも UNIX パスワードを使ってログインすることが可能
です.
以下によく使われるであろう三種類の設定を含む設定ファイルの
例を示します:
permit internet 192.168.0.0 255.255.0.0
permit user fnord
permit port ttyd0
はじめの行 (permit internet) で, telnet
などで接続するときの IP のソースアドレス (注意: これは偽造され
るおそれがあります) が特定の値とマスクに一致している場合に,
UNIX パスワードの利用を許可することを指定しています. この設定
自体はセキュリティを高めるための機能ではありません. そうでは
なく, ログインの権利を持つ許可されたユーザに対して, 現在そのユー
ザが使っているネットワークが信頼できないと考えられるので S/Key
を使うべきである, ということを気づかせるための機能であると考え
てください.
二行目 (permit user) によって, ある特定
のユーザ, この場合は fnord, に対して, いつ
でも UNIX パスワードの利用を許可するように指定しています. 一般
的にはこの設定をおこなうべきではありません.
key プログラムがどうしても使えない環境にい
る人や, ダム端末しかない環境にいる人, または何度教えても聞く耳
を持たないような人をサポートする必要がある場合にのみ設定をおこ
なってください.
三行目 (permit port) によって, ある特定
の端末ポートからログインしようとするすべてのユーザに対して
UNIX パスワードの利用を許可するように指定しています. この設定
はダイヤルアップ回線に対する設定として利用できるでしょう.
Kerberos
原作: &a.markm;
(Mark Dapoz md@bsc.no
からの寄稿に基づいています).
訳: &a.jp.arimura;.
Kerberosは,
サーバのサービスによってユーザが安全に認証を受けられる
ようにするための, ネットワークの付加システム及びプロトコルです.
リモートログイン, リモートコピー,
システム間での安全なファイルのコピ
ーやその他のリスクの高い仕事がかなり安全に,
そしてこれまでより制御 できるようになります.
以下の文章は,
FreeBSD用として配布されているKerberosをセットアップ
する際のガイドとして読むことができます. しかし,
完全な説明が必要な場合には, マニュアルページを読んだ方がよい
でしょう.
FreeBSDのKerberosは,
オリジナルの4.4BSD-Liteの配布に含まれているものではなく,
FreeBSD 1.1.5.1のときに移植されたeBonesです.
これはアメリカ/カナダの外で作成されており, そのため, アメリカか
らの暗号技術の輸出制限があった時代でも,
これら以外の国の人々が手に入れられるものでした.
初期データベースの作成
この作業はKerberosサーバだけでおこないます. まず,
古いKerberosの データベースが存在しないことを確認してください.
ディレクトリ/etc/kerberosIVに移って,
次のファイルだけが 存在することをチェックします:
&prompt.root; cd /etc/kerberosIV
&prompt.root; ls
README krb.conf krb.realms
もし他のファイル (principal.* や
master_key) が 存在する場合には,
kdb_destroyというコマンドで古い
Kerberosデータベースを消してください.
Kerberosが走っていなければ,
単に余計なファイルを消せばよいです.
まず, krb.conf と
krb.realmsを編集してKerberosの 管理領域
(realm) を定義してください.
ここでは管理領域がGRONDAR.ZA で,
サーバ名がgrunt.grondar.zaであるとします.
krb.conf
というファイルを次のように編集してください:
&prompt.root; cat krb.conf
GRONDAR.ZA
GRONDAR.ZA grunt.grondar.za admin server
CS.BERKELEY.EDU okeeffe.berkeley.edu
ATHENA.MIT.EDU kerberos.mit.edu
ATHENA.MIT.EDU kerberos-1.mit.edu
ATHENA.MIT.EDU kerberos-2.mit.edu
ATHENA.MIT.EDU kerberos-3.mit.edu
LCS.MIT.EDU kerberos.lcs.mit.edu
TELECOM.MIT.EDU bitsy.mit.edu
ARC.NASA.GOV trident.arc.nasa.gov
この例にあるような他の管理領域は, 実際には必要ありません.
この例は複数の管理領域を認識する方法を示したものですので,
これらの行は含めなくても結構です.
1行目はこのシステムが動いている管理領域の名前です.
他の行は管理領域とホスト名のエントリです.
行の1つめの単語が管理領域で, 2つめがその管理領域の中で
鍵配布センター
(Key Distribution Center)
として働くホスト名です. ホスト名の次に admin
server と書いてある場合には, そのホストが
``管理データベースサーバ''(Administrative Database Server)
も提供 することを意味します.
これらの単語について詳しく知りたい場合にはKerberosのマニュアル
ページをご覧ください.
ここで,
GRONDAR.ZAという管理領域にgrunt.grondar.za およびその他の.grondar.za
ドメインのすべてのホストを追加し なければなりません.
krb.realmsは次のようになります:
&prompt.root; cat krb.realms
grunt.grondar.za GRONDAR.ZA
.grondar.za GRONDAR.ZA
.berkeley.edu CS.BERKELEY.EDU
.MIT.EDU ATHENA.MIT.EDU
.mit.edu ATHENA.MIT.EDU
もう一度注意しますが, 他の管理領域を書く必要はありません.
これらは複数の管理領域を認識できるようにマシンを設定する方法を
示した例ですので, これらの行は消して構いません.
1行目は名前をつけた管理領域に 特定の
システムを含めるための ものです.
残りの行は名前をつけた管理領域にサブドメインのデフォルトの
システムを含めるためのものです.
これでデータベースを作成する準備ができました.
この操作はKerberos サーバ (鍵配布センター) を起動するだけです.
kdb_initコ
マンドを次のように実行してください:
&prompt.root; kdb_init
Realm name [default ATHENA.MIT.EDU ]: GRONDAR.ZA
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter Kerberos master key:
ここで鍵を保存して,
ローカルのマシンにあるサーバが取り出せるように します.
それにはkstashコマンドを使用します.
&prompt.root; kstash
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
これで暗号化されたマスタパスワードが
/etc/kerberosIV/master_key
に保存されました.
すべてが動くようにするための設定
Kerberosを導入する それぞれの
システムのデータベースに, 2つ のprincipal (主体名)
を追加する必要があります. その名前は
kpasswdとrcmdです.
これら2つのprincipalは, 個々 のシステムにおいて,
システム名と同じ名前のインスタンスと組にして作成
されます.
これらの kpasswd と
rcmd というデーモンによって, 他の
システムからKerberosのパスワードを変更したり,
rcpや rlogin,
rshといったコマンドを実行したりできるよ
うになります.
それでは実際にこれらのエントリを追加しましょう:
&prompt.root; kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: passwd
Instance: grunt
<Not found>, Create [y] ? y
Principal: passwd, Instance: grunt, kdc_key_ver: 1
New Password: <---- ここは「RANDOM」と入力してください
Verifying password
New Password: <---- ここは「RANDOM」と入力してください
Random password [y] ? y
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: rcmd
Instance: grunt
<Not found>, Create [y] ?
Principal: rcmd, Instance: grunt, kdc_key_ver: 1
New Password: <---- ここは「RANDOM」と入力してください
Verifying password
New Password: <---- ここは「RANDOM」と入力してください
Random password [y] ?
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- 何も入力しないと終了します
サーバファイルの作成
次に, 各マシンにおけるサービスを定義している,
すべてのインスタンス を展開します.
これにはext_srvtabというコマンドを使用しま
す. このコマンドで作成されるファイルは, Kerberosの各クライアン
トの/etc/kerberosIVディレクトリに
安全な方法でコピーまたは
移動する必要があります. このファイルはそれぞれのサーバとクラ
イアントに存在しなければならず,
またKerberosの運用において重要なも のです.
&prompt.root; ext_srvtab grunt
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Generating 'grunt-new-srvtab'....
このコマンドは一時的なファイルを作成するだけです.
ファイル名をすべ てのサーバが読めるような
srvtab という名前に変更しな
ければなりません.
mvコマンドを用いてシステムの場所に移動
してください.
&prompt.root; mv grunt-new-srvtab srvtab
そのファイルがクライアントに配るためのもので,
ネットワークが安全で はないと思われる場合には,
client-new-srvtab
を移動
可能なメディアにコピーして物理的に安全な方法で運んでください.
クラ
イアントの/etc/kerberosIVディレクトリで,
名前を srvtabに変更し,
modeを600にするのを忘れないでください:
&prompt.root; mv grumble-new-srvtab srvtab
&prompt.root; chmod 600 srvtab
データベースへのユーザの追加
ここで,
ユーザのエントリをデータベースに追加する必要があります.
始めに,
ユーザjaneのエントリを作成してみましょう.
kdb_edit
を用いて次のように作成してください:
&prompt.root; kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: jane
Instance:
<Not found>, Create [y] ? y
Principal: jane, Instance: , kdc_key_ver: 1
New Password: <---- 安全なパスワードを入れてください
Verifying password
New Password: <---- もう一度パスワードを入れてください
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- 何も入力しないと終了します
すべてのテスト
まず始めにKerberosデーモンを起動する必要があります.
/etc/rc.conf
ファイルを正しく編集してあれば, マシンを再
起動することでに自動的にデーモンが起動します.
これはKerberosサー バでのみ必要です.
Kerberosクライアントは/etc/kerberosIVか
ら必要なものを自動的に入手します.
&prompt.root; kerberos &
Kerberos server starting
Sleep forever on error
Log file is /var/log/kerberos.log
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Current Kerberos master key version is 1
Local realm: GRONDAR.ZA
&prompt.root; kadmind -n &
KADM Server KADM0.0A initializing
Please do not use 'kill -9' to kill this job, use a
regular kill instead
Current Kerberos master key version is 1.
Master key entered. BEWARE!
さあ, これで上で作成した jane
というIDのチケットを
kinitコマンドで得ることができます:
&prompt.user; kinit jane
MIT Project Athena (grunt.grondar.za)
Kerberos Initialization for "jane"
Password:
klist コマンドを用いてトークンを見て,
きちんとチケットを持って いるかどうか確認してください:
&prompt.user; klist
Ticket file: /tmp/tkt245
Principal: jane@GRONDAR.ZA
Issued Expires Principal
Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.GRONDAR.ZA@GRONDAR.ZA
passwd
コマンドを用いてパスワードを変更して, kpasswdデーモ
ンがKerberos
データベースに対して認証されるかどうかチェックして
ください:
&prompt.user; passwd
realm GRONDAR.ZA
Old password for jane:
New Password for jane:
Verifying password
New Password for jane:
Password changed.
su特権の追加
root権限が必要なユーザは誰でも,
suコマンドのパス
ワードをユーザ毎に別のもの
として持つことができます.
rootにsu
できる権利を与えられたidを追加します. これは,
principalに付いているroot
というインスタンスに よって制御されています.
kdb_editを用いて
jane.rootというエントリを
Kerberosデータベースに作成します:
&prompt.root; kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: jane
Instance: root
<Not found>, Create [y] ? y
Principal: jane, Instance: root, kdc_key_ver: 1
New Password: <---- 安全なパスワードを入れます
Verifying password
New Password: <---- もう一回パスワードを入れます
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- ここは短くしてください
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- 何も入力しないと終了します
実際にトークンをもらって,
ちゃんと働いているかどうか確認しましょう:
&prompt.root; kinit jane.root
MIT Project Athena (grunt.grondar.za)
Kerberos Initialization for "jane.root"
Password:
ここでrootユーザの .klogin
ファイルにユーザを追加する必要が あります.
&prompt.root; cat /root/.klogin
jane.root@GRONDAR.ZA
suしてみましょう:
&prompt.user; su
Password:
どのトークンを持っているか見てみましょう:
&prompt.root; klist
Ticket file: /tmp/tkt_root_245
Principal: jane.root@GRONDAR.ZA
Issued Expires Principal
May 2 20:43:12 May 3 04:43:12 krbtgt.GRONDAR.ZA@GRONDAR.ZA
他のコマンドの使用
ここまでの例では, jane という principal
を root とい
うインスタンス付きで作成しました.
これはユーザと同じ名前をprincipalと しており,
Kerberosのデフォルトの値です;
<username>.root
という形式の
<principal>.<instance>で,
必要なエント
リがrootのホームディレクトリの
.kloginファイルに あれば,
<username>がrootに
suすることができま す.
&prompt.root; cat /root/.klogin
jane.root@GRONDAR.ZA
同様に, ユーザのホームディレクトリの
.kloginファイルに次の
ような行がある場合には:
&prompt.user; cat ~/.klogin
jane@GRONDAR.ZA
jack@GRONDAR.ZA
jane または jack
という名前で (前述のkinit によって)
認証されている GRONDAR.ZA
という管理領域のユーザ なら誰でもrlogin や
rsh, rcp等によってこ
のシステム (grunt)
のjaneのアカウントまたはファ
イルにアクセスできます.
たとえば, Janeが他のシステムにKerberos
を用いてloginします:
&prompt.user; kinit
MIT Project Athena (grunt.grondar.za)
Password:
&prompt.user; rlogin grunt
Last login: Mon May 1 21:14:47 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
次の例では, Jackが同じマシンの Jane
のアカウントにloginします. Janeは .klogin
ファイルを前述のように設定しており,
Kerberosではjackというprincipal
をインスタンスなしで設定してあ ります.
&prompt.user; kinit
&prompt.user; rlogin grunt -l jane
MIT Project Athena (grunt.grondar.za)
Password:
Last login: Mon May 1 21:16:55 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
ファイアウォール
原作: &a.gpalmer;, Alex Nash;.
訳: &a.jp.saeki;.
11 November 1996.
ファイアウォールは,
インターネットに参加している人はもちろんのこと,
プライベートネットワークのセキュリティ向上のための
アプリケーションを 探している人にとっても,
ますます興味深くなりつつある分野です.
このセクションではファイアウォールとは何か,
ファイアウォールの使用法,
そしてファイアウォールを構築するために FreeBSD のカーネルで
提供されているファシリティ (機能)
の使用法について説明したいと思います.
社内のネットワークと 巨大かつ信頼のおけない
インターネット
との間にファイアウォールを構築することで
セキュリティ上のすべての問題が解決できると考える人がいます.
ファイアウォールはセキュリティ上の問題を
解決する助けになる場合もありますが,
充分な設定がなされていないファイアウォールは,
まったくファイアウォールを
持たない場合よりもセキュリティ上の危険を増大させてしまいます.
ファイアウォールにできることは,
あなたのシステムにもう一つのセキュリティ層を
追加することだけで,
本気でアタックをしかけてくるクラッカーが内部ネットワークに
侵入するのを妨げることはできません.
ファイアウォールを侵入不可能と過信して
内部のセキュリティをおろそかにすることは,
単にクラッカーの仕事を少し簡単にするだけでしか
ありません.
ファイアウォールとは何か ?
現在インターネットで普通に使用されている
ファイアウォールには 二つの異なるタイプがあります. 一つは,
厳密には パケットフィルタリングルータ
と 呼ばれるタイプのものです. これはマルチホームのホストマシン
(複数の ネットワークに接続されているマシン) のカーネルが,
ある規則にしたがって
パケットを転送したりブロックしたりするものです. もう一つは,
proxy (代理) サーバ
として知られているタイプのものです. これは,
おそらくはマルチホームのホストマシン上で,
カーネルによるパケット転送を 禁止して,
デーモンにより認証の提供とパケットの転送とを
おこなうものです.
二つのタイプのファイアウォールを組み合わせて使用して,
特定のマシン ( 要塞ホスト と呼ばれる)
だけが パケットフィルタリングルータを通して内部ネットワークへ
パケットを送ることができるよう設定している
サイトがしばしば存在します. proxy (代理)
サービスは通常の認証機構よりもセキュリティを
強化してある 要塞ホストで動作させます.
FreeBSD は (IPFW
として知られる) カーネルパケットフィルタ込みで
提供されています. このセクションの後の方では,
このフィルタについての 説明を集中しておこないます.
サードパーティから提供されるソフトウェアを使用することにより,
Proxy サーバを FreeBSD 上に構築することができます. しかし,
現在入手可能な proxy サーバは
たいへんバラエティに富んでいるので,
このドキュメントでそれらすべてを
カバーすることは不可能です.
パケットフィルタリングルータ
ルータとは, 二つまたはそれ以上のネットワークの間で
パケットの転送をおこなう マシンのことです.
パケットフィルタリングルータは, そのカーネルの内部に,
一つ一つのパケットをルールリストと比較して
転送するかしないかを決める 特別なコードを持っています.
最近の IP ルーティングソフトウェアのほとんどは, 内部に
パケットのフィルタリングをおこなうためのコードを持っていて,
デフォルトでは すべてのパケットを転送するようになっています.
このフィルタを有効にするためには,
パケットの通過を許すべきかどうかを決める
ルールを自分で定義する必要があります.
パケットを通すべきか通すべきでないかを決めるために,
パケットヘッダの内容にマッチするものが
ルールリストから探されます. マッチするルールが見つかると,
ルールアクションが実行されます. ルールアクションには,
パケットを捨てる, パケットを転送する,
またはパケットの発信元に ICMP
メッセージを送り返すというものがあります.
ルールの検索は先頭から順番におこなわれ,
通常は最初にマッチしたものだけが 適用されます. そのため,
このルールリストはルールチェーン
と呼ばれることもあります.
パケットマッチングの基準は使用するソフトウェアに
よって異なりますが, 通常はパケットの発信元 IP アドレス,
宛先 IP アドレス, 発信元ポート番号, 宛先ポート番号
(ポート番号はポートをサポートするプロトコルの場合のみ),
パケットタイプ (UDP, TCP, ICMP など)
に基づくルールを指定することができます.
Proxy サーバ
Proxy サーバとは通常のシステムデーモン (telnetd, ftpd
など) を 特別なサーバで置き換えたマシンのことです.
これらのサーバは,
通常は中継をおこなって特定方向への接続だけを許すため,
proxy サーバ と呼ばれます. (たとえば)
proxy telnet
サーバをファイアウォールホストで走らせておきます.
外部からユーザがファイアウォールに対して telnet
を実行すると, proxy telnet サーバが応答して,
何らかの認証機構を実行します. これを通過した後で,
内部ネットワークへのアクセスがおこなえるように なるのです.
(内部ネットワークからの信号は proxy
サーバがかわりに受け取り, 外へ向けて送り出します.)
Proxy サーバは通常,
普通のサーバより堅固に構築されていて, しばしば
使い捨て
パスワードシステムなどを含む,
多様な認証機構を持っています.
使い捨て
パスワードシステムとは,
どういうものなのでしょうか. 仮に誰かが何らかの方法で,
あなたが使用したパスワードを手に入れたとします. しかし,
一度使用したことで,
そのパスワードは既に無効になっているのです. ですから,
そのパスワードをもう一度使用したとしても, あなたのシステムへ
アクセスすることはできないというわけです.
これらのサーバは中継をおこなうだけで,
実際のところサーバホスト自身への
アクセスをユーザに許してはいません. そのため,
何者かがセキュリティシステムに
侵入用の裏口を取り付けることは,
より困難になっています.
proxy サーバはアクセス制限の方法をいくつも持っていて,
特定のホスト
だけがサーバへのアクセス権を得ることができるように
なっていることがあり ます.
そして目的のマシンと通信できるユーザを制限するように
設定することもできます. もう一度言いますが,
どんなファシリティ (機能) が使えるかは, どんな proxy
サービスをおこなうソフトウェアを選ぶかに大きく
依存します.
IPFW で何ができるか
FreeBSD とともに配布されている
IPFW は, カーネル内部にあって
パケットのフィルタリングとアカウンティングを
おこなうシステムであり,
ユーザ側のコントロールユーティリティである &man.ipfw.8; を
含んでいます. ルーティングの決定をおこなう際に,
これらは互いに協力して,
カーネルで使用されるルールを定義したり,
現在使用されているルールを
問い合わせたりすることができます.
IPFW
は互いに関連する二つの部分からなっています.
ファイアウォールセクションは
パケットフィルタリングをおこないます. また, IP
アカウンティングセクションはファイアウォールセクションのものと
似たルールに基づいてルータの使用を追跡します. これにより,
(たとえば) 特定のマシンからルータへのトラフィックがどのくらい
発生しているか調べたり, どれだけの WWW (World Wide Web)
トラフィックが
フォワードされているかを知ることができます.
IPFW は,
ルータではないマシンにおいても入出力コネクションの
パケットフィルタリングのために
使用することができるように設計されています. これは一般的な
IPFW
の使用法とは異なる特別な使い方ですが,
こういった状況でも同じコマンドと
テクニックが使用されます.
FreeBSD で IPFW を有効にする
IPFW
システムの中心となる部分はカーネル内部にあります. そのため,
どのファシリティ (機能) を必要とするかによって, 一つまたは
それ以上のオプションをカーネルコンフィグレーション
ファイルに追加し,
カーネルを再コンパイルする必要があるでしょう.
カーネルの再コンパイル方法の詳細については, カーネルコンフィグレーション
を参照してください.
現在, IPFW
に関係するカーネルコンフィグレーションオプションは
三つあります:
options IPFIREWALL
パケットフィルタリングのためのコードを
カーネルに組み込みます.
options IPFIREWALL_VERBOSE
&man.syslogd.8; を通じて
パケットのログを取るためのコードを有効にします.
フィルタルールでパケットのログを取るように指定しても,
このオプションが指定されていなければ,
ログを取ることはできません.
options IPFIREWALL_VERBOSE_LIMIT=10
&man.syslogd.8; を通じて
ログを取るパケットの数をエントリ毎に制限します.
敵対的な環境においてファイアウォールの
動作のログを取りたいけれど,
syslog の洪水によるサービス拒絶攻撃に対し
無防備でありたくないという場合に,
このオプションを使用したいと思うことが
あるかもしれません.
チェーンエントリのログが指定された制限数に達すると,
そのエントリに関するログ取りは停止されます.
ログ取りを再開するには, &man.ipfw.8;
ユーティリティを使用して
関連するカウンタをリセットする必要があります:
&prompt.root; ipfw zero 4500
4500 とは,
ログ取りを続行したいチェーンエントリの番号です.
以前のバージョンの FreeBSD は
IPFIREWALL_ACCT というオプションを
持っていました. しかし,
ファイアウォールコードがアカウンティングファシリティ (機能) を
自動的に含むようになったため,
現在では使用されることはなくなっています.
IPFW の設定
IPFW ソフトウェアの設定は
&man.ipfw.8; ユーティリティを
通じておこないます. このコマンドの構文は非常に
複雑に見えますが,
一旦その構造を理解すれば比較的単純です.
このユーティリティでは今のところ四つの異なる
コマンドカテゴリが 使用されています: それは追加 / 削除, 表示,
フラッシュ, およびクリアです. 追加 /
削除はパケットの受け入れ, 拒絶, ログ取りをどのようにおこなうか
というルールを構築するのに使用します. 表示はルールリスト
(またはチェーン) と (アカウンティング用) パケットカウンタの
内容を調べるのに使用します.
フラッシュはチェーンからすべてのエントリを
取り除くのに使用します.
クリアは一つまたはそれ以上のアカウンティングエントリを
ゼロにするのに 使用します.
IPFW ルールの変更
この形式での使用法は:
ipfw
-N
コマンド
index
アクション
log
プロトコル
アドレス
オプション
この形式で使用する際に有効なフラグは一つだけです:
-N
アドレスやサービス名を
文字列に変換して表示します.
コマンド
は一意である限り短縮可能です. 有効な コマンド
は:
add
ファイアウォール / アカウンティングルールリストに
エントリを追加します.
delete
ファイアウォール /
アカウンティングルールリストから
エントリを削除します.
以前のバージョンの IPFW では,
ファイアウォールエントリと
パケットアカウンティングエントリが別々に利用されていました.
現在のバージョンでは, それぞれのファイアウォールエントリ毎に
パケットアカウンティングエントリが備えられています.
index が指定されていると,
エントリはチェーン中の index
で示される位置に置かれます. index が指定されて いなければ,
エントリは (65535 番のデフォルトルールである
パケット拒絶を別にして) 最後のチェーンエントリの index に
100 を足した 位置 (チェーンの最後) に置かれます.
カーネルが IPFIREWALL_VERBOSE
つきでコンパイルされている場合, log
オプションはマッチしたルールを
システムコンソールに出力させます.
有効な アクション は:
reject
パケットを捨てます, ICMP ホスト /
ポート到達不能パケットを (適切な方を)
発信元へ送ります.
allow
通常通りパケットを通過させます. (別名:
pass および
accept)
deny
パケットを捨てます. 発信元は ICMP メッセージによる
通知を受けません (そのためパケットが
宛先に到達しなかったように見えます).
count
このルールはパケットカウンタを更新するだけで,
パケットを 通過させたり拒絶したりしません.
検索は次のチェーンエントリから続けられます.
それぞれの アクション
は一意な先頭部分だけでも認識されます.
指定可能な プロトコル
は以下の通り:
all
任意の IP パケットにマッチします.
icmp
ICMP パケットにマッチします.
tcp
TCP パケットにマッチします.
udp
UDP パケットにマッチします.
アドレス の指定は:
from
address/mask
port
to
address/mask
port
via interface
port はポートをサポートする
プロトコル (UDP と TCP) の
場合にだけ指定可能です.
は必須ではなく,
特定のインターフェースを通ってきたパケット
だけにマッチするように, IP アドレスまたはローカル IP
インターフェースの ドメイン名, またはインターフェース名
(たとえば ed0) を
指定することができます.
インターフェースユニット番号はオプションで,
ワイルドカードで指定することが できます. たとえば,
ppp* はすべてのカーネル PPP
インターフェースに マッチします.
address/mask の指定は:
address
または
address/mask-bits
または
address:mask-pattern
IP
アドレスのかわりに有効なホスト名を指定することも可能です.
はアドレスマスクで上位何ビットを1にするべきかを
示す十進数値です. たとえば次の指定,
192.216.222.1/24 はクラス C のサブネット
(この場合 192.216.222) の任意のアドレスにマッチする
マスクを作成します.
は与えられたアドレスと 論理 AND される IP アドレスです.
キーワード any は任意の IP
アドレス
を指定するために
使用することができます.
ブロックするポート番号は以下のように指定します:
port,
port,
port…
のように単独のポートまたはポートのリストを指定します.
または
port-
port
のようにポートの範囲を指定します.
単独のポートとポートのリストを
組み合わせて指定することも可能ですが,
その場合は常に範囲の方を
最初に指定しなければなりません.
使用可能な オプション は:
frag
データグラムの最初の
フラグメントでなければマッチします.
in
入力途中のパケットであればマッチします.
out
出力途中のパケットであればマッチします.
ipoptions spec
IP ヘッダが spec
に指定された カンマで区切られた
オプションのリストを含んでいればマッチします.
サポートされている IP オプションのリストは:
ssrr (ストリクトソースルート),
lsrr (ルーズソースルート),
rr (レコードパケットルート),
そして ts (タイムスタンプ) です.
特定のオプションを含まないことを指定するには
! を先頭につけます.
established
パケットが既に確立されている TCP
コネクションの一部であれば (つまり RST または ACK
ビットがセットされていれば) マッチします.
established
ルールをチェーンの最初の方に置くことで,
ファイアウォールのパフォーマンスを向上させることが
できます.
setup
パケットが TCP
コネクションを確立しようとするものであれば (SYN
ビットがセットされ ACK ビットはセットされていなければ)
マッチします.
tcpflags flags
TCP ヘッダが flags
に指定された カンマで区切られたフラグの
リストを含んでいればマッチします.
サポートされているフラグは, fin,
syn, rst,
psh, ack と
urg です.
特定のフラグを含まないことを指定するには
! を先頭につけます.
icmptypes types
ICMP タイプが types
リストに 存在していればマッチします.
リストはタイプの範囲または個々のタイプを
カンマで区切った任意の組合せで指定できます.
一般的に使用されている ICMP タイプは:
0 エコーリプライ (ping リプライ),
3 相手先到達不可能,
5 リダイレクト,
8 エコーリクエスト (ping
リクエスト), そして 11 時間超過
(&man.traceroute.8; で使用されているように, TTL
満了を示すのに使用されます) です.
IPFW ルールリストの表示
この形式での使用法は:
ipfw
-a
-t
-N
l
この形式で使用する際に有効なフラグは三つあります:
-a
リスト表示の際にカウンタの値も表示します.
このオプションは アカウンティングカウンタの
内容を見る唯一の手段です.
-t
各チェーンエントリが最後に
マッチした時刻を表示します. この時刻表示は
&man.ipfw.8; ユーティリティで使用される入力形式と
互換性がありません.
-N
(可能であれば)
アドレスやサービス名を文字列に変換して表示します.
IPFW ルールのフラッシュ
チェーンをフラッシュするには:
ipfw
flush
カーネルに固定されているデフォルトルール (インデックス
65535 番) 以外の,
ファイアウォールチェーンの中のすべてのエントリを削除します.
デフォルトではすべてのパケットが拒絶されるので,
一旦これを実行すると,
パケットを許可するエントリがチェーンに追加されるまで,
あなたのシステムがネットワークから切り放されてしまいます.
そのため,
ルールのフラッシュをおこなうときは注意が必要です.
IPFW パケットカウンタのクリア
一つまたはそれ以上のパケットカウンタをクリアするためには:
ipfw
zero
index
index が指定されていなければ,
すべてのパケットカウンタが クリアされます.
index が指定されていれば,
特定のチェーンエントリだけが クリアされます.
ipfw に対するコマンドの例
このコマンドは, ホスト evil.crackers.org から ホスト nice.people.org の telnet ポートへの
すべてのパケットを拒絶します:
&prompt.root; ipfw add deny tcp from evil.crackers.org to nice.people.org 23
次の例は, ネットワーク crackers.org (クラス C) 全体から
マシン nice.people.org
(の任意のポート) への 任意の TCP トラフィックを拒絶し,
ログを取ります.
&prompt.root; ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
あなたの内部ネットワーク (クラス C のサブネット) に対する
X セッションを 張れないようにする場合,
以下のコマンドで必要なフィルタリングがおこなえます:
&prompt.root; ipfw add deny tcp from any to my.org/28 6000 setup
アカウンティングレコードを見るには:
&prompt.root; ipfw -a list
または短縮形式で
&prompt.root; ipfw -a l
最後にチェーンエントリがマッチした
時刻を見ることもできます.
&prompt.root; ipfw -at l
パケットフィルタリングファイアウォールの構築
以下の提案は, ただの提案にすぎません:
必要な処理はそれぞれのファイアウォールで異なるため,
あなた独自の要求にあったファイアウォールを構築する方法を
ここで述べることはできないのです.
最初にファイアウォールをセットアップするとき,
コントロールされた環境でファイアウォールホストの
設定がおこなえるような
テストベンチセットアップが用意できない場合には,
カーネルのログ取りを
有効にしてログ取り版のコマンドを使用することを
強くおすすめします. そうすることで,
大した混乱や中断なしに問題となる範囲の特定と処置を
素早くおこなうことができます.
初期セットアップフェーズが完了してからであっても,
アタックの可能性のあるアクセスをトレースしたり,
要求の変化に応じてファイアウォールルールを
変更したりできるので, `deny'
に対するログ取りをおこなうことをおすすめします.
accept
コマンドのログ取りをおこなっていると,
ファイアウォールをパケットが一つ通過する毎に 1
行のログが生成されるため 大量の
ログデータが発生します. そのため, 大規模な ftp/http
転送などをおこなうと, システムが非常に 遅くなってしまいます.
また, パケットが通過するまでにカーネルにより
多くの仕事を要求するため, パケットのレイテンシ (latency)
を増加させてしまいます. syslogd
もログをディスクに記録するなど, より多くの CPU タイムを
使用し始め, 実に容易に /var/log
が置かれているパーティションを
パンクさせてしまう可能性があります.
ファイアウォールは,
/etc/rc.conf.local か, もしくは
/etc/rc.conf によって有効化されるべきです.
関連マニュアルページには, どのドアノブ(訳注:
ポートや IP アドレスなど,
ネットワークからの入口を示すもののこと)に手をつければ良いのかに
ついての説明と, ファイアウォール設定の既定値のリストがあります.
もし, 設定の既定値を使わない場合には,
ipfw list とすることで,
現在のルールセットを rc.conf から読み込める形で
ファイルに出力することができます.
また, /etc/rc.conf.local や
/etc/rc.conf によってファイアウォールを
有効化しない場合には, ファイアウォールの有効化がすべての
IP インターフェイス設定より先に行なわれるように確認することが重要です.
次の問題は, ファイアウォールが実際には何を する
べきかです !
これは外部からそのネットワークへのどんなアクセスを許したいか,
また内部から外界へのアクセスを
どのくらい許したいかに大きく依存します.
いくつか一般的なルールを挙げると:
1024 番以下のポートへのすべての TCP
入力アクセスをブロックします. ここは finger, SMTP (mail)
そして telnet など, 最もセキュリティに敏感な
サービスが存在する場所だからです.
すべての 入力 UDP
トラフィックをブロックします. これは UDP
を使用しているサービスで有用なものは極めて少ないうえ,
有用なトラフィック (たとえば Sun の RPC と NFS プロトコル)
は, 通常セキュリティに対する脅威となるためです. UDP
はコネクションレスプロトコルであるため, 入力 UDP
トラフィックを拒絶することは すなわち出力 UDP
トラフィックに対する返答をも ブロックすることになるので,
このことはそれなりの不利益をもたらします. たとえば外部の
archie (prospero) サーバを使用している (内部の) ユーザに
とって問題となる可能性があります. もし archie
へのアクセスを許したければ, 191 番と 1525 番のポートから
任意の UDP
ポートへ来るパケットがファイアウォールを通過することを
許可しなければなりません. 123
番のポートから来るパケットは ntp パケットで,
これも通過の許可を考慮する必要がある
もう一つのサービスです.
外部から 6000
番のポートへのトラフィックをブロックします. 6000
番のポートは X11 サーバへのアクセスに使用されるポートで,
セキュリティに対する脅威となりえます.
(特に自分のワークステーションで xhost
+
をおこなう癖を持っている人がいればなおさらです). X11
は実際に 6000 番以降のポートを使用する可能性があるため,
通過許可に 上限を定めると,
そのマシンで走らせることのできる X ディスプレイの
個数が制限されます. RFC 1700 (Assigned Numbers)
で定義されているように, 上限は 6063 です.
内部のサーバ (たとえば SQL サーバなど)
がどのポートを使用するかを チェックします.
それらのポートは通常, 上で指定した 1-1024
番の範囲から外れていますので,
これらも同様にブロックしておくことは
おそらく良い考えです.
これとは別のファイアウォール設定に 関するチェックリストが
CERT から 入手可能です. http://www.cert.org/tech_tips/packet_filtering.html
前にも述べたように, これはただの ガイドライン
にすぎません.
ファイアウォールでどのようなフィルタルールを使用するかは,
あなた自身が 決めなければなりません.
これまでのアドバイスにしたがったにも関わらず,
誰かがあなたのネットワークに 侵入してきたとしても,
わたしたちは「いかなる」責任もとることはできません.
OpenSSL
FreeBSD 4.0 では, OpenSSL ツールキットが基本構成の一部に
含まれています. OpenSSL は,
Secure Sockets Layer v2/v3 (SSLv2/SSLv3) や Transport Layer
Security v1 (TLSv1) ネットワークセキュリティプロトコルと同様の
多目的な暗号化ライブラリを提供します.
しかしながら, OpenSSL に含まれるアルゴリズムのひとつ
(特に IDEA) は, 合衆国内, その他の地域において,
特許により保護されています. そのため,
無制約な利用は許されません. IDEA は
FreeBSD の OpenSSL 配布に含まれていますが, デフォルトではコンパ
イルされません. もし IDEA を使いたいなら, そしてあなたがそのライ
センス条項に合致するなら, /etc/make.conf の中の MAKE_IDEA スイッ
チを有効にして, 'make world' でソースをリビルドしてください.
現在は RSA アルゴリズムはアメリカとその他の国で自由に利用で
きます. 以前は特許により保護されていました.
ソースコードのインストール
OpenSSL は src-crypto と
src-secure cvsup コレクションの一部です.
FreeBSD のソースコードの取得と更新の詳細は,
FreeBSD
の入手の項を参照して下さい.
IPsec
原作: &a.shin;, 5 March
2000.
訳: &a.jp.hino;, 14 March
2001.
IPsec 機構は, IP 層とソケット層の両方に対して安全な通
信を提供します. 実装の詳細に関しては The
+ url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/ipv6.html">The
Developers' Handbook を参照してください.
現在の IPsec の実装は, トランスポートモードとトンネルモード
の両方をサポートしています. しかし, トンネルモードにはいくつかの
制限事項があります. http://www.kame.net/newsletter/
にはより総合的な例が載っています.
ここで述べる機能を利用するには, 以下のオプションをカーネルコ
ンパイル時に指定する必要があることにご注意ください.
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/IPSEC)
IPv4 におけるトランスポートモードの例
ホスト A (10.2.3.4) とホスト B (10.6.7.8) との間に安全なチャ
ネルを配置するために, セキュリティアソシエーションを設定しましょ
う. ここでは, 少し込み入った例を示します. ホスト A からホストB
へは old AH のみを使います. ホスト B からホスト A へは new AH
と new ESP を組み合わせます.
ここで "AH"/"new AH"/"ESP"/"new ESP" に対応するアルゴリズ
ムを決めないといけません. アルゴリズムの名前を知るには,
&man.setkey.8; マニュアルページをご覧ください. ここでは, AH に
MD5 を, new AH には new-HMAC-SHA1 を, new ESP には 8 バイト IV
の new-DES-expIV を選びました.
鍵長はそれぞれのアルゴリズムに大きく依存します. たとえば,
MD5 では鍵長は 16 バイトでなければなりませんし, new-HMAC-SHA1
では 20 バイトでなければなりませんし, new-DES-expIV では 8 バ
イトでなければなりません. ここではそれぞれ "MYSECRETMYSECRET",
"KAMEKAMEKAMEKAMEKAME", "PASSWORD", とします.
次に, それぞれのプロトコルに対して SPI (セキュリティパラメー
タインデックス: Security Parameter Index) を割り当てます. 三種
類のセキュリティヘッダ (ホスト A からホスト B に一つ, ホスト B
から ホスト A に二つ) を生成するので, この安全なチャネルには三
つの SPI が必要になることに注意してください. さらに, SPI は
256 以上である必要があることにも注意してください. ここではそれ
ぞれ 1000, 2000, 3000 を割り当てます.
(1)
ホスト A ------> ホスト B
(1)PROTO=AH
ALG=MD5(RFC1826)
KEY=MYSECRETMYSECRET
SPI=1000
(2.1)
ホスト A <------ ホスト B
<------
(2.2)
(2.1)
PROTO=AH
ALG=new-HMAC-SHA1(new AH)
KEY=KAMEKAMEKAMEKAMEKAME
SPI=2000
(2.2)
PROTO=ESP
ALG=new-DES-expIV(new ESP)
IV length = 8
KEY=PASSWORD
SPI=3000
次に, セキュリティアソシエーションを設定しましょう. ホスト
A とホスト B の両方で, &man.setkey.8; を実行します:
&prompt.root; setkey -c
add 10.2.3.4 10.6.7.8 ah-old 1000 -m transport -A keyed-md5 "MYSECRETMYSECRET" ;
add 10.6.7.8 10.2.3.4 ah 2000 -m transport -A hmac-sha1 "KAMEKAMEKAMEKAMEKAME" ;
add 10.6.7.8 10.2.3.4 esp 3000 -m transport -E des-cbc "PASSWORD" ;
^D
実際には, セキュリティポリシのエントリが定義されるまでは
IPsec による通信は行われません. この例の場合, 両方のホストを設
定する必要があります.
A で:
&prompt.root; setkey -c
spdadd 10.2.3.4 10.6.7.8 any -P out ipsec
ah/transport/10.2.3.4-10.6.7.8/require ;
^D
B で:
&prompt.root; setkey -c
spdadd 10.6.7.8 10.2.3.4 any -P out ipsec
esp/transport/10.6.7.8-10.2.3.4/require ;
spdadd 10.6.7.8 10.2.3.4 any -P out ipsec
ah/transport/10.6.7.8-10.2.3.4/require ;
^D
ホスト A -------------------------------------> ホスト B
10.2.3.4 10.6.7.8
| |
========== old AH keyed-md5 ==========>
<========= new AH hmac-sha1 ===========
<========= new ESP des-cbc ============
IPv6 におけるトランスポートモードの例
IPv6 を使ったもう一つの例.
ホスト-A とホスト-B 間の TCP ポート番号 110 番の通信には,
ESP トランスポートモードが推奨されます.
============ ESP ============
| |
ホスト-A ホスト-B
fec0::10 -------------------- fec0::11
暗号化アルゴリズムは blowfish-cbc で, その鍵は "kamekame",
認証アルゴリズムは hmac-sha1 で, その鍵は "this is the test
key" とします. ホスト-A の設定:
&prompt.root; setkey -c <<EOF
spdadd fec0::10[any] fec0::11[110] tcp -P out ipsec
esp/transport/fec0::10-fec0::11/use ;
spdadd fec0::11[110] fec0::10[any] tcp -P in ipsec
esp/transport/fec0::11-fec0::10/use ;
add fec0::10 fec0::11 esp 0x10001
-m transport
-E blowfish-cbc "kamekame"
-A hmac-sha1 "this is the test key" ;
add fec0::11 fec0::10 esp 0x10002
-m transport
-E blowfish-cbc "kamekame"
-A hmac-sha1 "this is the test key" ;
EOF
そしてホスト-B の設定:
&prompt.root; setkey -c <<EOF
spdadd fec0::11[110] fec0::10[any] tcp -P out ipsec
esp/transport/fec0::11-fec0::10/use ;
spdadd fec0::10[any] fec0::11[110] tcp -P in ipsec
esp/transport/fec0::10-fec0::11/use ;
add fec0::10 fec0::11 esp 0x10001 -m transport
-E blowfish-cbc "kamekame"
-A hmac-sha1 "this is the test key" ;
add fec0::11 fec0::10 esp 0x10002 -m transport
-E blowfish-cbc "kamekame"
-A hmac-sha1 "this is the test key" ;
EOF
SP の方向に注意してください.
IPv4 におけるトンネルモードの例
二台のセキュリティゲートウェイ間のトンネルモード
セキュリティプロトコルは old AH トンネルモード, すなわち
RFC1826 で指定されるものです. 認証アルゴリズムは "this is the
test" を鍵とする keyed-md5 です.
======= AH =======
| |
ネットワーク-A ゲートウェイ-A ゲートウェイ-B ネットワーク-B
10.0.1.0/24 ---- 172.16.0.1 ----- 172.16.0.2 ---- 10.0.2.0/24
ゲートウェイ-A における設定:
&prompt.root; setkey -c <<EOF
spdadd 10.0.1.0/24 10.0.2.0/24 any -P out ipsec
ah/tunnel/172.16.0.1-172.16.0.2/require ;
spdadd 10.0.2.0/24 10.0.1.0/24 any -P in ipsec
ah/tunnel/172.16.0.2-172.16.0.1/require ;
add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any
-A keyed-md5 "this is the test" ;
add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any
-A keyed-md5 "this is the test" ;
EOF
上記の例のように, もしポート番号フィールドを書かないと,
"[any]" と同じ意味になります. `-m' は使用される SA のモードを
指定します. "-m any" はセキュリティプロトコルのモードのワイル
ドカードを意味します. この SA をトンネルモードとトランスポート
モードの両方で使用できます.
そしてゲートウェイ-B では:
&prompt.root; setkey -c <<EOF
spdadd 10.0.2.0/24 10.0.1.0/24 any -P out ipsec
ah/tunnel/172.16.0.2-172.16.0.1/require ;
spdadd 10.0.1.0/24 10.0.2.0/24 any -P in ipsec
ah/tunnel/172.16.0.1-172.16.0.2/require ;
add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any
-A keyed-md5 "this is the test" ;
add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any
-A keyed-md5 "this is the test" ;
EOF
二台のセキュリティゲートウェイ間の SA の束を作ります
ゲートウェイ-A とゲートウェイ-B の間では, AH トランスポー
トモードと ESP トンネルモードが要求されます. この例では, ESP ト
ンネルモードが先に適用され, 次に AH トランスポートモードが適用さ
れます.
========== AH =========
| ======= ESP ===== |
| | | |
ネットワーク-A ゲートウェイ-A ゲートウェイ-B ネットワーク-B
fec0:0:0:1::/64 --- fec0:0:0:1::1 ---- fec0:0:0:2::1 --- fec0:0:0:2::/64
IPv6 におけるトンネルモードの例
暗号化アルゴリズムは 3des-cbc, ESP の認証アルゴリズムは
hmac-sha1 とします. AH の認証アルゴリズムは hmac-md5 とします.
ゲートウェイ-A での設定は:
&prompt.root; setkey -c <<EOF
spdadd fec0:0:0:1::/64 fec0:0:0:2::/64 any -P out ipsec
esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require
ah/transport/fec0:0:0:1::1-fec0:0:0:2::1/require ;
spdadd fec0:0:0:2::/64 fec0:0:0:1::/64 any -P in ipsec
esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require
ah/transport/fec0:0:0:2::1-fec0:0:0:1::1/require ;
add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10001 -m tunnel
-E 3des-cbc "kamekame12341234kame1234"
-A hmac-sha1 "this is the test key" ;
add fec0:0:0:1::1 fec0:0:0:2::1 ah 0x10001 -m transport
-A hmac-md5 "this is the test" ;
add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10001 -m tunnel
-E 3des-cbc "kamekame12341234kame1234"
-A hmac-sha1 "this is the test key" ;
add fec0:0:0:2::1 fec0:0:0:1::1 ah 0x10001 -m transport
-A hmac-md5 "this is the test" ;
EOF
異なる通信端での SA を作る
ホスト-A とゲートウェイ-A の間では ESP トンネルモードが要
求されています. 暗号化アルゴリズムは cast128-cbc で, ESP の認
証アルゴリズムは hmac-sha1 です. ホスト-A とホスト-B との間で
は ESP トランスポートモードが推奨されています. 暗号化アルゴリ
ズムは rc5-cbc で, ESP の認証アルゴリズムは hmac-md5 です.
================== ESP =================
| ======= ESP ======= |
| | | |
ホスト-A ゲートウェイ-A ホスト-B
fec0:0:0:1::1 ---- fec0:0:0:2::1 ---- fec0:0:0:2::2
ホスト-A での設定:
&prompt.root; setkey -c <<EOF
spdadd fec0:0:0:1::1[any] fec0:0:0:2::2[80] tcp -P out ipsec
esp/transport/fec0:0:0:1::1-fec0:0:0:2::2/use
esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require ;
spdadd fec0:0:0:2::1[80] fec0:0:0:1::1[any] tcp -P in ipsec
esp/transport/fec0:0:0:2::2-fec0:0:0:l::1/use
esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require ;
add fec0:0:0:1::1 fec0:0:0:2::2 esp 0x10001
-m transport
-E cast128-cbc "12341234"
-A hmac-sha1 "this is the test key" ;
add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10002
-E rc5-cbc "kamekame"
-A hmac-md5 "this is the test" ;
add fec0:0:0:2::2 fec0:0:0:1::1 esp 0x10003
-m transport
-E cast128-cbc "12341234"
-A hmac-sha1 "this is the test key" ;
add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10004
-E rc5-cbc "kamekame"
-A hmac-md5 "this is the test" ;
EOF
OpenSSH
原作: &a.chern;,
2001 年 4 月 21 日.
セキュアシェル (secure shell) はリモートマシンへのセキュアなアクセスに使われる
ネットワーク接続ツールのセットです. それは rlogin,
rsh, rcp,
telnet を直接置き換えて使うことができます.
また, 他のあらゆる TCP/IP 接続を
ssh 経由でセキュアにトンネル/フォワードすることもできます.
ssh はすべてのトラフィックを暗号化し,
盗聴や接続の乗っ取り等のネットワークレベルの攻撃を事実上無効化します.
OpenSSH は OpenBSD プロジェクトによって維持管理されており, SSH v1.2.12
に最新のすべてのバグ修正と更新を適用したものをベースにしています.
OpenSSH クライアントは SSH プロトコル 1 と 2 の両方に互換性があります.
OpenSSH は FreeBSD 4.0 以降ベースシステムに取り込まれています.
OpenSSH を使うことの利点
&man.telnet.1; や &man.rlogin.1;
を使う場合, 一般にデータはネットワークを平文で流れます.
ネットワークをクライアントとサーバの間のどこかで盗聴することで
あなたのユーザ/パスワード情報やセション中を流れるデータを盗むことが可能です.
OpenSSH はこれらを予防する為にさまざまな認証と暗号化の方法を提供します.
sshd を有効にする
rc.conf ファイルに
以下の行を追加してください.
sshd_enable="YES"
次に起動したときから ssh デーモンが起動します.
もしくは単に sshd
デーモンを実行しても構いません.
SSH クライアント
&man.ssh.1; ユーティリティは
&man.rlogin.1; と同様に働きます.
&prompt.root ssh user@foobardomain.com
Host key not found from the list of known hosts.
Are you sure you want to continue connecting (yes/no)? yes
Host 'foobardomain.com' added to the list of known hosts.
user@foobardomain.com's password: *******
ログインは rlogin や telnet でセションを張った時と同様に続きます.
SSH はクライアントが接続した時,
サーバの信頼性の検証のために鍵指紋システム
(key fingerprint system) を利用します.
初めての接続の際にのみ, ユーザは 'yes' と入力することを要求されます.
これ以降の login では保存されていた鍵指紋を照合することで検証されます.
SSH クライアントは保存されていた鍵指紋が
login しようとした際に送られてきたものと異なっていた場合には警告を表示します.
指紋は ~/.ssh/known_hosts に保存されます.
Secure copy
scp コマンドが rcp と異なるのは,
セキュアになっているという点だけです.
つまりローカルのファイルをリモートマシンへ,
あるいはリモートマシンのファイルをローカルにコピーします.
&prompt.root scp user@foobardomain.com:/COPYRIGHT COPYRIGHT
user@foobardomain.com's password:
COPYRIGHT 100% |*****************************| 4735
00:00
&prompt.root
前回の例でこのホストの指紋がすでに保存されていれば
この scp を使う時に検証が行なわれます.
設定
システム全体の設定ファイルは, OpenSSH デーモン,
クライアントの両方とも /etc/ssh ディレクトリにあります.
ssh_config はクライアントの動作設定,
sshd_config はデーモンの動作設定を行ないます.
ssh-keygen
パスワードの代わりに &man.ssh-keygen.1; を使って
ユーザの認証用の RSA 暗号鍵を作ることができます.
&prompt.user ssh-keygen
Initializing random number generator...
Generating p: .++ (distance 66)
Generating q: ..............................++ (distance 498)
Computing the keys...
Key generation complete.
Enter file in which to save the key (/home/user/.ssh/identity):
Enter passphrase:
Enter the same passphrase again:
Your identification has been saved in /home/user/.ssh/identity.
...
&man.ssh-keygen.1; は認証に使う為の公開鍵と秘密鍵のペアを作ります.
秘密鍵は ~/.ssh/identity に保存され,
公開鍵は ~/.ssh/identity.pub に保存されます.
公開鍵はリモートマシンの ~/.ssh/authorized_keys
にも置かなければなりません.
これでパスワードの代わり RSA 認証を使って
リモートマシンに接続できるようになったはずです.
&man.ssh-keygen.1; でパスフレーズを使っている場合は,
ユーザは秘密鍵を使うために毎回パスフレーズの入力を行なう必要があります.
&man.ssh-agent.1; と &man.ssh-add.1; は
多重にパスワード化された秘密鍵の管理に使われます.
SSH トンネリング
OpenSSH は暗号化されたセションの中に他のプロトコルを
カプセル化することでトンネルを作ることができます.
以下のコマンドは &man.ssh.1; で telnet
用のトンネルを作成します.
&prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.bar.com
&prompt.user;
-2 は &man.ssh.1; にプロトコル
2 を使うことを指示します.
(古い ssh サーバを使っているときには指定しないでください)
-N
はトンネルだけでコマンドはないことを示します.
省略されると &man.ssh.1; は通常のセッションを開始します.
-f は &man.ssh.1;
にバックグラウンド実行を強制します.
-L はローカルトンネルとして
localport:localhost:remoteport
形式を指示します.
foo.bar.com はリモート/ターゲットの
SSH サーバです.
SSH のトンネルは指定されたローカルホストとポートを listen する
ソケットを作ることで実現されています.
SSH はローカルのホスト/ポートへのすべての接続を SSH
接続経由でリモートマシンの指定されたリモートポートへ
転送 (フォワード) します.
たとえば, ローカルホストのポート 5023
がリモートマシンの 23
に転送されるようになっているとします.
23 は telnet なのでこれは SSH
トンネルを通るセキュアな telnet セッションを作ります.
このようにして smtp や pop3, ftp 等のセキュアではない TCP
プロトコルをカプセル化することができます.
典型的な SSH トンネル
&prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.foobar.com
user@mailserver.foobar.com's password: *****
&prompt.user; telnet localhost 5025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailserver.foobar.com ESMTP
&man.ssh-keygen.1; と別のユーザアカウントを組み合わせて使うことで
より透過的で悩まずに済むような SSH のトンネル環境を作ることができます.
パスワードを入力するところで暗号鍵を使い,
トンネルは別のユーザ権限で実行することが可能です.
さらに知りたい人へ
OpenSSH
&man.ssh.1; &man.scp.1; &man.ssh-keygen.1;
&man.ssh-agent.1; &man.ssh-add.1;
&man.sshd.8; &man.sftp-server.8;