HACK # 79 /etc の変更を安全に統合 設定ファイルをアップグレードするときの注意 ー 393 設定ファイルをアップグレードするときの問題に注意してほしい。普通は設定ファイルの フォーマットや内容が変化したかどうかを知らないことが多いし、変化したとしてもいつ変化 したのかがわからないことが多い。 / et ( / group に新しいグループが加わるかもしれないし、 /etc/ passwd に別のフィールドが加わるかもしれない。ほとんどの場合、設定ファイルを古いシステ ムから新しいシステムにコピーするだけで十分だが、フォーマットや内容が変化した場合はコ ピーするだけでは不十分だ。残念ながら、 mergemaster で扱えるのは基本的なシステムファイル だけであり、 po 「 ts でインストールしたファイルを扱うことはできない。あなたにできること は、主要なバージョン番号が大きく変わるときに警戒することくらいだ。頻緊に更新している ソフトウェアプログラムについては、設定ファイルについて詳しく調査すべきだ。筆者は、隠 れた変化を突き止めるために、変更した設定ファイルのコピーを stage 3. mk と同じ場所に置き、 make rule で比較している。例えば以下のようにして、ターゲット config apache について fi di 幵 -u /usr/Ioca1/etc/apache2/httpd.conf httpd.conf; \ ech0 "the modifications are still correct. Here is the di 幵 echo "ATTENTION : the httpd.conf has changed. Please examine if" @if ! cmp -s /usr/Ioca1/etc/apache2/httpd.conf httpd.conf; then \ . 自動化した httpd.conf の変更 . Apache の httpd.conf を調べている。 H A C K OS の新しいバージョンが出たときだけだという人が多いだろう。システムのアップグレード たとえ毎日のように cvsup を実行している人でも、 make wo て ld を実行するのは年に数回で、 ー 3 段階の統合によって設定ファイルをアップグレードする /etc の変更を安全に統合 ticles/fbsd-from-scratch/article. html 、スクリプトへのリンクも載っている ) from-scratch/article. html 、日本語版は http://www.freebsd.org/doc/ja JP. eucJP/ar- ・ fFreeBSD From Scratch 』 (http://www.freebsd.org/doc/en US. IS08859-1/articIes/fbsd- 参照 チの適用と理解と作成」を参照してほしい。 なメッセージが出ないようにすることができる。この方法の詳細については、「旧 ack # 9 幻バッ 相違が無害であれば cp /usr/local/etc/apache2/httpd.conf httpd.conf を実行して、このよう
HACK # 21 2 章 ファイルとファイルシステム 他の BSD の場合 これまでの解説は、 FreeBSD に基づいていた。他の BSD システムも、同じ作業を実行す るために、同様のスクリプトを用意している。しかし、それらのスクリプトは別々のディレ クトリに入っているのでなく、 1 つのファイルに入っている。 NetBSD NetBSD では、毎日、毎週、毎月の作業を実行するために、 /etc/daily 、 /etc/weekly 、 /etc/ monthly の各スクリプトを使用する。これらのスクリプトの動作を、設定ファイル / et ( / daily. conf 、 /etc/weekly. conf 、 /etc/monthly. conf で調節する。詳しくは、 man daily. conf 、 man weekly. conf 、 man monthly. conf と実行して、それぞれのマニュアルページを読んでほしい。 OpenBSD OpenBSD の場合も、 3 つのスクリプト /etc/daily 、 /etc/weekly 、 /etc/monthly を使用する。 man daily と実行してマニュアルページを読めば、詳しいことがわかるはすだ。 参照 ja JP. eucJP/books/handb00k/quotas. html) IS08859-1/b00ks/handb00k/quotas. html 、日本語版は http://www.freebsd.org/doc/ fFreeBSD Handbook 』の「 Quotas 」のセクション (http : //www.freebsd.org/doc/en US. ・ man tcsh man limits man periodic. conf H A C K トールするといった過激な手段でないほうが好ましい。 なときの解決方法は、ディスクのパーティションを再構成するとか、システムを再インス 必要性が変化することもあるし、最初の構成をさらに最適化したいと望むこともある。そん 最適なサイズに基づいてディスクのパーティションを分割することができる。しかし、後に 最適なサイズを知っていることが望ましい。そうすれば、システムをインストールするとき、 う、十分なディスク容量を割り当てることが重要だ。理想的には、自分のシステムにとって どんな OS をインストールする場合でも、一時的ファイルとスワップスペースを扱えるよ バーティションを再構成しないで、一時的スペースとスワップスペースを増やす 一時的ファイルとスワップスペースを管理
ディスクの無駄づかいをなくす一 91 あなたはこれらのスクリプトを使用しているだろうか。使用しているかどうかを調べるに は、 / etc / pe ⅱ odi (. conf ファイルを見ればよい。このファイルさえ見つからないとしたら、 れまでにデフォルトの設定を調節したことがないに違いない。そんな場合には、サンプル ファイルをコピーして、何が利用できるかを眺めてみるとよい。 # cp /etc/defaults/periodic. conf /etc/periodic. conf # more /etc/periodic. conf daily—clean_disks まず、 daily clean disks から始めてみる。このスクリプトは、特定の拡張子の付いたファ イルを見つけて削除するのに最適だ。 periodic. conf には、 2 ページほどの長さの「 Daily options 」セクションがあるが、デフォルトでは daily_clean disks を使用する設定になってい ない。幸い、この機能を設定するのは、複雑な find 命令のスケジュールを cron で設定するよ りも、はるかに簡単だ。 スクリプトを使用可能に設定する前に、テストを実施しておくべきだ。特に、バ ターンマッチング規則に基づいてファイルを削除する場合には、必ずテストしな けれはならない。さらに、その前にシステムのバックアップをとっておくべきだ。 例えば、拡張子 . bz2 の付く古いログを削除したいとする。 daily_clean disks files の行を設定するときには十分に注意しないと、その拡張子の付くファイルを 「すべて」削除してしまうおそれがある。重要なデータを圧縮していたユーザは、 いつの間にか自分のデータが消えたことを知って怒るだろう。 このスクリプトをテストしてみる。すべての . core ファイルと、 .0. bz2 よりも古いすべて HACK # 20 のログを削除したいとする。 /etc/periodic.conf で、 に編集する。 # 100. clean-disks daily clean disks enab1e="YES" daily_clean disks files="*. [ 1-9 ]. bz2 * daily_clean disks days=l daily clean disks verbose="YES" . core このスクリプトのセクションを次のよう # 毎日ファイルを削除 # 古いログとコアを削除 # 1 日に 1 度実行 # 削除したファイルを報告 こで . bz2 ファイルに対して設定したパターンマッチング表現に注目してほしい。この表 作業で実行した。このスクリプトは多量のリソースを消費するので、システムの負荷が軽い 筆者は、システムのバックアップをとっていることを確認した後で、このスクリプトを手 トと . bz2 拡張子が付くファイルにマッチする。 現は、すべてのファイル名 ( * ) のうち、ドットと 1 ~ 9 の数字が付き (. [ 1-9]) 、もう 1 つのドッ
HACK # 43 204 ー 5 章ネットワーク このように option host-name を使用している ISP もあれば、 optiondhcp-client-identifier を 使用している ISP もある。実際に MAC アドレスに割り当てられているオプションを選択す ればよい。この例では、識別子は MAC アドレスであり、その後に -36-33 が付いている。 必要な情報がそろったので、新しい NIC カードで古い MAC アドレスになりすますことが できる。新しいカードが ed0 だとすると、次のように実行すればよい。 # ifconfig ed0 ether 00 : 05 : 5d : d2 : 19 : b7 # ifconfig ed0 ー grep ether ether 00 : 05 : 5d : d2 : 19 : b7 これらの設定を変更するには、スーパーユーザで実行しなければならない。 上記のように実行したとしても、システムを再起動すると設定が元に戻ってしまう。シス テムがプートするとき、ハードウェア調査の段階で、 NIC が ROM に焼き込まれた MAC ア ドレスをカーネルに伝えるからだ。 ISP に設定を変更してもらうまでの間にシステムを再起 動することがあるなら、 /etc/rc. conf に次の行を追加すればよい。 ifconfig ed0 aliaso="ether 00 : 05 : 5d : d2 : 19 : b7 " このように ed0 の工イリアスを設定すれば、物理的なカードに焼き込まれた MAC アドレス でなく、望みの MAC アドレスを使用することができる。工イリアスとは、インタフェース がカーネルに設定できる代替の名前、つまりネットワーク上のニックネームのようなものだ と考えればよい。 次に、 /etc/dhclient. conf を編集する。 # vi /etc/dhclient. conf # $FreeBSD: src/etc/dhclient. conf,v 1.3 2001 / 10 / 27 03 : 14 : 37 rwatson Exp $ 空のファイルのままでかまわない。 ほとんどの場合、デフォルトで十分なので、 DHCP クライアントに必要。詳細は man 5 dhclient. conf を参照。 このファイルは、 ISC(Internet Systems Consortium) の ス ed0 のセクションを追加した。ファイルを編集するとき、中括弧 ( { } ) で囲むことを忘れな デフォルトでは、このファイルにはコメントしか入っていない。ここでは、インタフェー send dhcp-client-identifier " 00-05-5d - d2-19- b7-36-33 " ・ send host-name ” 00-05-5d - d2-19- b7-36-33 “・ interface "ed0" {
B wfish ハッシュでパスワードを保護ー 135 ほとんどの Unix システムと同様、パスワードをパスワードデータベースに格納するとき、パ スワードのランダム性を増すための魔法のピットを追加することができる。その魔法のビッ トを「ソルト」 (salt つまり塩 ) と呼んでいる。ソルトを付けると、パスワードクラッカーは、 推測したパスワードひとつひとつについて最大 4 , 096 回ずつ、違う組み合わせを試さなけれ ばならない。 パスワードを保護するために強力なアルゴリズムを使用することも、総当たり攻撃の速度 を落とすのに役立つ。 FreeBSD は、解読が困難なアルゴリズム BIow ⅱ sh ( フグという意味 ) を 採用している。筆者の場合、 FreeBSD をインストールした後で最初に実行したことの 1 つが、 BIow. 廰 h を使用するようにパスワードデータベースを設定することだった。ユーザアカウン トを作成する前に設定するほうが簡単だが、ユーザアカウントを作成した後でも実装する価 HACK # 29 値がある。 BIowfish でシステムのバスワードを保護 BIow ⅱ sh を使用するためには、ますは任意のエデイタで / et ( / login. conf を開く。 :passwd format=blf:\ この行を、十分に注意しながら、次のように変更する。 :passwd format=md5 : \ イルには次のような行がある。 # このファイルを変更するたびに、必ずデータベースを再ビルドすること /etc/login. conf を変更するとき、次のコメントに気づいたかもしれない。 入力ミスがないことを確認したら、ファイルを保存する。 cap mkdb /etc/login. conf このファ 何を実行することを要求しているのか、詳しく見てみよう。このコメントによると、 login. conf は単なる設定ファイルでなく、データベースである。それだけでなく、これは「機 能データベース (capabilitydatabase) 」、つまり、さまざまな機能を扱うデータベースである。 login. ( onf の構文が奇妙なのは、このような理由があるからだ。機能データベースを編集す るとき、自分の変更をデータベース内に統合するために、必ず ( apmkdb コマンドを使用しな ければならない。 そこで、コメントの指示どおり、次のように実行する。
HACK # 78 390 ー 8 章最新バージョンに維持 * * * You installed a login. conf file, so make sure that you run '/usr/bin/cap mkdb /newroot/etc/login. conf' to rebuild your login. conf database Wou1d you like to run it now? y or n [n] いずれは〔 ap ー mkdb を実行することになるので、こはどう答えてもよい。 stage_l. conf. default をダウンロードしてもよいが、根本的に変更する必要がある。コメン トを読めば何を変更すべきかがわかるはすだ。 newfs コマンドに注意してほしい。パーティションをマウントしたままで新しいファイルシ ステムを作成することはできないが、スクリプトはマウントしていないパーティションをす べて消去する。そうすると、 1 日の作業が無駄になってしまうおそれがあるので、実在のデ バイス名にあわせてスクリプトを変更する必要がある。 このスクリプトを実行してシステムをインストールすると、そのシステムは、ユーザとグ ループ、ファイアウォールで保護したイーサネットと PPP 上のインターネット接続、正しい 時間帯 ( タイムゾーン ) と NTP の設定、マイナーな設定 ( 例え t±/etc/ttys や /etc/inetd. conf) など、さまざまま情報を受け継ぐ。 ステージ 2 が完了するまで、他の領域の設定は作用しない。例えば、すでに印刷や X11 の 設定ファイルをコピーしたとしても、印刷を実行するには基本システムに入っていないアプ リケーションが必要になる。同様に、 X11 を動かすには、サーバ、ライプラリ、プログラム をコンパイルしなければならない。 ステージ 2 : ports をインスト - ル このステージで、 po ホをコンパイルする代わりに、コンパイル済みのパッケージをインス トールしてもかまわない。その場合は stage2. sh スクリプトに pkg ー add コマンドを並べるだ けでよい。 筆者の場合にはダウンロードした stage 2. sh スクリプトを使用して、お気に入りの po ホを インストールしている。このスクリプトは、すでにインストールしてある po ホについては インストールを省略するので、繰り返し実行しても安全だ。さらに、予行演習のオプション ( - n ) があり、何を実行するかを事前に調べることができる。 stage 1. sh の場合と同じように 設定ファイルを意味する引数を 1 つだけ付けて次のように実行する。 # . /stage_2. sh default このように実行すると、このスクリプトは stage 2. ( onf. default から po ホのリストを読む。 po れ s のリストとして、各行に 2 つ以上の単語を空白で区切って並べる。つまり、 po ホの カテゴリと名前を書き、その後に po ホをコンパイルしてインストールするためのインストー
ログインを制限ー 163 # ki11a11 -1 sshd ナル 1 」 (SIGHUP) を送る必要があることを思い出してほしい。 SSH デーモンの設定ファイルを変更したとき、その変更を知らせるために、 sshd に「シグ ドし、その変更を必ずテストすることを忘れないでほしい。 /etc/login. conf を変更したら、 cap mkdb /etc/login. conf を実行してデータベースを再ピル ての時間について許可することになる。 その逆も同様に作用する。つまり、 times. deny で拒否したい時間を指定すると、他のすべ する。 times. a110W オプションを使用すると、「指定していない時間」のアクセスを自動的に拒否 : times. a110W = MO - F 加 900-1700 : \ は、 default:\ セクションに次の行を追加すればよい。 曜日のうち、午前 9 時から午後 5 時までの間はすべてのユーザにログインの許可を与えるに このファイルで、オプション times. a110W と times. deny を使用できる。例えば月曜日から金 を参照 ) で、他にどんなオプションを利用できるかを見てみる。 インできるかはまだ制限していない。そのために、すでに紹介した / et ( / login. ( onf ( [ Hack # 29 ] ンできるか、そしてどこからログインできるかを制限した。しかし、ユーザが「いつ」ログ これまでに、ローカルのログインとリモートからの ssh のログインについて、誰がログイ /etc/login. conf 実を、 6 か月もたった後で知りたくはないだろう。 に制限したと思っていたのに、実際にはすべてのユーザに接続を許可していたのだという事 /etc/ssh/sshd ( onfig の引数では「大文字と小文字を区別する」からだ。接続を特定のユーザ と、いまだにユーザ nastygirl が接続できることがわかるだろう。なぜこうなるのだろうか。 てほしい。例えば、 AIIowusers genisis biko dru という行を追加した場合、テストしてみる sshd に変更を知らせた後で、「直ちに」 ssh クライアントを使用して、その変更をテストし 参照 man login. conf ・ man sshd config man login. access man ttys HACK # 34
HACK # 9 36 ー ] 章ユーザ環境のカスタマイズ ルをユーザが使用する場合、ユーザがログインしたときに実行したいコマンドがあるかどう かを検討するとよい。システムは . cshrc を読んだ「後で」 dot. login を読むことに注意してほ しい。 デフォルトでは、このファイルでコメントが外れているのは以下の 1 行だけである。 % grep -v ' # ・ /usr/share/skel/dot. login [ -x /usr/games/fortune ] & & /usr/games/fortune freebsd-tips こでは、コメント記号 # で「始まらない」行をすべて探すために、検索ユーティリティ grep に逆のフィルタスイッチ -v を使用した。 このコメントアウトされていない行は、 fortune プログラムを実行することをシェルに命じ ている。 FreeBSD をインストールしたとき、ゲームのディストリビューションもインストー ルすることを選択していた場合、ログインすると MOTD(MessageoftheDay 、その日のメッ セージ ) の直前に fortune の出力が現れる。 su を実行したとき、 f0 て tune の出力が現れなかっ たことに気づいただろうか。その理由は、 . login が読み出されるのはログインしたときだけ であり、普通に su を実行しても実際にはログインしていないからだ。 その代わり、 su は「非ログインシェル」を開始する。 xterm を開くときにも、非ログイン シェルが作動する。基本的に、実際にログインシェルが動くのは、ログインプロンプトでユー ザ名とパスワードを入力したときだけである。 ここで . ( shrc と . login の違いが出てくる。ログインしたときだけ実行したいことを . login に設定すればよい。そして、たとえログインシェルでなくても、 csh シェルを起動したときに 必ず実行したいことを . cshrc に設定すればよい。両者の違いを区別しなくてよいのであれ ば、 /usr/share/skel/dot. login は不要だ。 dOt. login—conf デフォルトの dot. login ( onf の内容を読めば、 すべきかがわかるだろう。 % more /usr/share/skel/dot. login conf このファイルの目的や、どこに情報を追加 # $FreeBSD: src/share/skel/dot. login conf,v 1.3 2001 / 06 / 10 17 : 08 : 53 ache Exp $ # login. conf ( 5 ) を参照 :lang=de DE. IS08859-1 : :charset=is0-8859-I:\ デフォルトでは、このファイルはすべてコメントになっているが、独自の . login. ( onf を作
HACK ー 24 / # 52 コマンドを分散して実行 ど ) をはじめ、接続のさまざまな属性を指定することもできる。 tentakel をインストールして設定 po ホコレクションから tentakel をインストールする。 # cd /usr/ports/sysutils/tentakel # make install clean もちろん手作業で tentakel をインストールしてもよい。ディストリビューションに入って いる INSTALL ファイルを参照してほしい。 Python をインストールしてあれば、ほとんどの場 合は make install だけでうまくいくはずだ。 インストールした後で、ディレクトリ $HOME/. tentakel/ に設定ファイル tentakel. conf を作 成する。この設定ファイルのフォーマットについては、例のファイル /usr/local/share/doc/ tentakel/tentakel. conf. example を見てほしい。 ユーザ固有の設定がない場合には、この tentakel. conf ファイルを /usr/local/etc/ または / etc/ ( どちらのディレクトリかはシステムによる ) にコピーして、サイト全体に反映させても よい。管理者としては、あらかじめユーザ用のグループを定義しておくとよいだろう。 自分のサイトに 3 つのサーバ mosel 、 aare 、 spree があり、最初の 2 つが Web サーバだとす ると、以下のように設定するとよい。 set format="%d\n%o\n" group webservers(user="webmaster") 十 mosel 十 aare group servers(user="root" ) @webservers 十 spree このように定義すると、すべてのサーバ上でて 00t としてコマンドを実行するときに、グ ループ名 servers を使用できる。また、 Web サーバだけでユーザ webmaster としてコマンドを 実行するときに、グループ名 webservers を使用できる。 最初の行で出力フォーマットを定義している。その意味を表 5-5 に示す。 表 5-5 tentakel の出力フォーマット文字 ホスト名 リモートで実行したコマンドの出力 改行文字
HACK # 41 196 ー 4 章バックアップ 「 00t 以外で実行 なるべく最小の権限でデーモンを実行することは、好ましい考え方である。 StorageDae- mon と DirectorDaemon には、 root のパーミッションは必要ない。しかし、 FileDaemon は システムのすべてのファイルにアクセスしなければならないので、 root のパー ッションカゞ 必要になる。 root 以外のアカウントでデーモンを実行するために、ユーザとグループを作成する必要が こでは vipw を使用してユーザを作成する。ユーザ ID とグループ ID を 1002 とした。 ある。 この ID がシステムで未使用だったからだ。 bacula : * : 1002 : 1002 : :0:0:BacuIa Daemon:/var/db/bacu1a:/sbin/n010gin さらに、以下の行を /etc/group に追加する。 bacula:*:1002: BacuIa デーモン用の bacula ユーザに、ホームディレクトリとして /var/db/bacula を与える。 これは、 BacuIa データベースのデフォルトの場所である。 ba ( ula ユーザと bacula グループを作成したら、次のコマンドを実行して、 bacula のホーム root 63416 0.0 0.3 2040 1172 ? ? Ss 4 : 09PM 0 : 00.01 # ps auwx ー grep bacula 実際に動いていることを、次のようにして確認できる。 # /usr/local/etc/rc. d/bacula. sh start FreeBSD システムで BacuIa デーモンを起動するには、以下のコマンドを実行する。 BacuIa デーモンを起動 # chown -R bacula: bacula /var/db/bacula/ ディレクトリを保護する。 /usr/local/sbin/bacula-dir -v - ( /usr/local/etc/bacula-dir. conf て 00t 63422 0.0 0.4 2360 1440 ? ? Ss 4 : 09PM 0 : 00.00 /usr/local/sbin/bacula-fd -v - ( /usr/local/etc/bacula-fd. conf root 63418 0.0 0.3 1856 1036 ? ? Ss 4 : 09PM 0 : 00.00 /usr/local/sbin/bacula-sd -v - ( /usr/local/etc/bacula-sd. conf