<!doctype linuxdoctr system>

<!-- This is the Linux Shadow Password HOWTO, please forward any comments
 	or suggestions to the author: mhjack@tscnet.com -->
<!-- この文書は Linux Shadow Password HOWTO 日本語訳です。 訳についての
	ご意見ご感想は訳者(fujiwara@linux.or.jp)へどうぞ -->

<article>

<!-- Title information -->

<title>Linux Shadow Password HOWTO
<author>Michael H. Jackson, <tt>mhjack@tscnet.com</tt>
<date>v1.3, 1996年4月3日
<trans>藤原輝嘉, <tt>fujiwara@linux.or.jp</tt>

<abstract>
この文書は Linux のパスワードを shadow 化する <em>Shadow Suit</em> の
入手、インストール及び設定の方法について説明するものです。また、ユーザ
のパスワード認証を行うソフトウェアやデーモンの(再)インストールについて
も解説します。これらのプログラムは <em>Shadow Suit</em> の一部ではあり
ませんが、<em>Shadow Suit</em> をサポートするためには再コンパイルする
必要があります。また、この文書には shadow パスワードをサポートするプロ
グラムの例も書いてあります。将来の改定ではよく聞かれる質問への回答もさ
らに加えるつもりです。

</abstract>

<!-- Table of contents -->
<toc>

<!-- Begin the document -->

<sect><heading>はじめに
<p>
この文書は Linux Shadow-Password-HOWTO です。この文書は Linux システム
になぜ shadow パスワードを導入するのか、またどのように導入するのかを説
明します。<em>Shadow Suite</em> の機能の利用法についての説明もあります。

<p>
<em>Shadow Suite</em> をインストールする時や、ユーティリティを使う時に
は <em>root</em> でなければなりません。<em>Shadow Suite</em> をインス
トールする際にはシステムの基幹ソフトウェアの変更が行われるので、後で説
明するようにバックアップを取るべきです。また作業を始める前には、これか
ら行う説明をすべて読み、理解しておくべきでしょう。

<sect1><heading>以前の版からの変更点

<p>
<verb>追加:
	shadow パスワードをインストールしないほうがよい場合についての節を追加
	xdm の更新についての節を追加
	Shadwo Sutie の動作のさせかたについての章を追加
	よく聞かれる質問についての章を追加

訂正/更新:
	Sunsite の html への参照を訂正
	wu-ftp の章で Makefile に -lshadow を Makefile に加えるよう訂正
	誤字脱字の訂正
	wu-ftp の章で ELF をサポートするよう変更
	プログラム'login'でおこるセキュリティ上の問題を更新
	Marek Michalkiewicz 氏による Linux Shadow Suite を推奨するよう更新
</verb>

<sect1><heading>この文書の最新版について
<p>
この文書の最新版は以下のサイトから anonymous FTP で入手できます:
<bf>sunsite.unc.edu</bf>
<verb>/pub/Linux/docs/HOWTO/Shadow-Password-HOWTO</verb>
あるいは:
<verb>/pub/Linux/docs/HOWTO/other-formats/Shadow-Password-HOWTO{-html.tar,ps,dvi}.gz</verb>

あるいは、WWW を利用して、
<url url="http://sunsite.unc.edu/mdw/linux.html"
name="Linux Documentation Project Web Server"> の
<url url="http://sunsite.unc.edu/linux/HOWTO/Shadow-Password-HOWTO.html" 
name="Shadow-Password-HOWTO">
のページから入手することもできます。

また、筆者(<tt>&lt;mhjack@tscnet.com&gt;</tt>) から直接入手することもできま
すし、 <tt>comp.os.linux.answers</tt> ニュースグループにも投稿されます。
<p>
この文書は現在は Shadow-YYDDMM パッケージにも含まれるようになりました。

<p>
<bf>訳注:</bf>
日本語訳の最新版については
WWWが利用できるならば
<url url="http://jf.linux.or.jp/JF/JF-ftp/other-formats/INDEX-JF.html"
name="JF-INDEX">
から、
ftp が利用できるならば
<bf>jf.linux.or.jp</bf> の<tt>/Linux/JF/</tt>ディレクトリ
などから入手できます。

<sect1><heading>フィードバック
<p>
コメントや訂正、提案などは筆者(<htmlurl url="mailto:mhjack@tscnet.com" 
name="Michael H. Jackson &lt;mhjack@tscnet.com&gt;">)に送って下さい。早く
フィードバックを得られれば、それだけ早くこの文書を直すことができます。
あまりネットニュースは見ていないので、不具合を見つけた場合には直接メー
ルを送って下さい。

<sect><heading>shadow パスワードを使うべき理由
<p>
現在はほとんどの Linux のパッケージでは <em>Shadow Suite</em> は標準で
はインストールされません。Slackware 2.3, Slackware 3.0 や他のポピュラー
なパッケージでそうなっています。この理由の一つはオリジナルの 
<em>Shadow Suite</em> の著作権表示は、無料配布でない場合について不明確
だからです。Linux は CD-ROM のような配布に便利なメディアへパッケージ化
し、これに対する報酬を受け取ることが行いやすい GNU Copyright (Copyleft 
とも言われますが)を採用しています。

<p>
現在<em>Shadow Suite</em>をメンテナンスしている, <htmlurl 
url="mailto:marekm@i17linuxb.ists.pwr.wroc.pl" 
name="Marek Michalkiewicz &lt;marekm@i17linuxb.ists.pwr.wroc.pl&gt;"> 
氏は元の作者から、再配布のできる BSD スタイルの著作権のもとにソースコー
ドを受け取っています。現在は著作権の問題は解決しているので、将来は標準
で Linux のパッケージに <em>Shadow Suite</em> が含まれることになるでしょ
う。それまでは、ユーザが自分自身でインストールしなければなりません。

<p>
パッケージを CD-ROM からインストールする場合には、パッケージ自体は <em>Shadow
Suite</em> をインストールしなくても、<em>Shadow Suite</em> のインストー
ルに必要なファイルは CD-ROM に含まれていることがあります。

<p>
<em>しかし、バージョン3.3.1, 3.3.1-2の Shadow Suite と shadow-mk では
login プログラムと<em>root に suid </em>されたプログラムでセキュリティ
上の問題を起こします。ですから、これらを使ってはいけません。</em>

<p>
必要なファイルは anonymous FTP や WWW を利用して入手することができます。

<p>
<em>Shadow Suite</em> がインストールされていない Linux システムではパ
スワードを含めたユーザ情報は <tt>/etc/passwd</tt> ファイルに記録されて
います。もちろん、パスワードは暗号化された状態で記録されています。しか
し、暗号の専門家に言わせるとこれは<em>暗号化(encrypt)</em>ではなく<em>
エンコード(encode)</em>に過ぎないそうです。crypt(3) を用いる場合の文字
列が空であればパスワードはキーになってしまうからです。この理由から、こ
れ以降の文書中では'暗号化'ではなく <em>'エンコード'</em>の語を用います。

<p>
ここでパスワードをエンコードするために用いられるアルゴリズムは、技術的
には<em>単方向のハッシュ関数</em>と言われるものです。これは、ある方向
には計算しやすいけれど、その逆方向の計算は非常に難しいというアルゴリズ
ムです。実際のアルゴリズムについてのより詳しい説明は 2.4節か crypt(3) 
のマニュアルを参照して下さい。

<p>
ユーザがあるパスワードを決めた場合、このパスワードはランダムに決められ
た <em>salt</em> と呼ばれる値を用いてエンコードされます。こうすること
で一つの文字列がエンコードされた結果として取りうる結果は 4096 通りにな
ります。<em>salt</em> の値はエンコードされたパスワードと一緒に記録され
ます。

<p>
ユーザがログイン時にパスワードを入力すると、まず <em>salt</em> がエン
コードされているパスワードから取り出されます。そして、入力されたパスワー
ドを <em>salt</em> を用いて<em>エンコードして</em>その結果を<em>エンコー
ド</em>された文字列と比較します。これが一致した場合に正しいユーザとし
て認証します。


<p>
ランダムに<em>エンコード</em>されたパスワードを入手し、元のパスワード
を復元することは計算の点から困難です(不可能ではない)。しかし、複数以上
の人が使うシステムでは少なからずのパスワードはありふれた単語(あるいは
ありふれた単語を少し変えただけのもの)になっています。

<p>
クラッカーはこのような事情をよく知っているので 4096 個全ての salt を用い
て辞書の単語とよく使われそうなパスワードをあらかじめエンコードしておき
ます。そして、<tt>/etc/passwd</tt> に書かれているエンコードしたパスワー
ドをこの結果と比較します。ここで一致するものが見つかれば、クラッカーは
他人のパスワードを破ったことになるわけです。これは「辞書攻撃」と呼ばれ
るもので、正規の認証を受けずにシステムにアクセスするための常套手段です。

<p>
ある 8 文字からなるパスワードは 、13 文字から成る 4096 通りの文字列のど
れかにエンコードされます。したがって、基本語や固有名詞とそれに簡単な変
化をつけたものを集めて作った400,000 語程度の辞書は 4GB のハードディス
クに十分収まるくらいの大きさです。クラッカーはこれらをソートしておき、
<tt>/etc/passwd</tt> の文字列と一致するかどうかを調べるだけでよいので
す。4GB のハードディスクは 1,000 ドル以下で買えるくらいですから、大抵
のクラッカーは持っていると考えるべきです。

<p>
また、クラッカーが最初にあなたの <tt>/etc/passwd</tt> ファイルを手に入
れた場合にはクラッカーはこのファイルに含まれている<tt>salt</tt>を使っ
て辞書をエンコードしてゆけばよいだけになってしまいます。ディスク数百メ
ガバイトと486クラスのCPUを持つマシンがあれば、この程度のことは子供でも
できてしまいます。

<p>
大量のディスクがなくても crack(1) のようなユーティリティを用いれば、あ
る程度以上の数のユーザがいるシステムの少なくとも一つはパスワードを破る
ことができます。(ユーザは自分で各自のパスワードを決めるものとします。)

<p>
<tt>/etc/passwd</tt> ファイルには多くのシステムプログラムが使うユーザ
ID やグループID のような情報が書かれています。従って、このファイルは世
界中からアクセス<em>できなければなりません</em>。例えば、 
<tt>/etc/passwd</tt> ファイルを誰も読めないようにしてしまったら、
<tt>'ls -l'</tt> コマンドで名前の代わりにユーザID が表示されるようになっ
て驚くはめになるでしょう。

<p>
<em>Shadow Suite</em> はパスワードを別の場所に移すことでこの問題を解決
します(通常は <tt>/etc/shadow</tt>)。このファイルは誰も読めないように
設定されます。<em>root</em>だけが <tt>/etc/shadow</tt> ファイルを読み
書きできます。いくつかのプログラム(xlock など)は <tt>/etc/shadow</tt> 
を変更はできなくてもいいですが、パスワードの確認は行う必要があります。
このようなプログラムは <em>root に SUID する</em>か、shadow グループに
属する必要があります。パスワードを確認するためだけに root に SUID する
よりは、shadow に SGID する方が良い考えと言えます。

<p>
パスワードを <tt>/etc/shadow</tt> に移動させることによって、クラッカー
がエンコードされたパスワードにアクセスして<em>辞書攻撃</em>に利用する
ことを防げます。

<p>
加えて、<em>Shadow Suite</em> は以下のような特長を持っています:
<itemize>
<item>ログイン時のデフォルトを設定するコンフィグレーションファイル(<tt>/etc/login.defs</tt>)
<item>ユーザアカウントやグループを追加、修正、削除するためのユーティリティ
<item>古いパスワードのチェックや期限設定
<item>アカウントの期限設定とロッキング
<item>倍長パスワード (16文字のパスワード) &lsqb;推奨しません&rsqb;
<item>ユーザのパスワード決定を制御しやすい
<item>ダイアルアップ・パスワード
<item>2次認証プログラム &lsqb;推奨しません&rsqb;
</itemize>

<p>
<em>Shadow Suit</em> をインストールすることでシステムのセキュリティを
強化することができますが、Linux システムのセキュリティをより強化するた
めには、他にもやるべきことは数多くあります。セキュリティ強化の方法とセ
キュリティに関係する話題について解説する Linux Security HOWTO シリーズ
がそのうちできることでしょう。

<p>
既知のセキュリティホールについての警告など、 Linux のセキュリティにつ
いての最新の情報を得るためには<url
url="http://bach.cis.temple.edu/linux/linux-security/" 
name="Linux Security ホームページ">
を参照して下さい。


<sect1><heading>shadow パスワードを使わないほうが良い場合
<p>
<em>Shadow Suite</em>をインストールすることがかならずしも良いことでは
<em>ない</em>環境やシステム構成もあります。

<itemize>
<item>システムにユーザアカウントがない場合。
<item>コンピュータが LAN に繋がっていて、ユーザ名やパスワードは NIS
(Network Information Services) 経由でネットワーク上の他のマシンから得
ている場合。(これは本文書の範囲を外れている点と、あまりセキュリティ向
上は望めないので説明しません)
<item>システムが NFS (Network File System)や NIS などを用いてユーザ認
証をするためにターミナルサーバによって利用される場合
<item>ユーザ認証はするが、shadow パスワードに対応しておらず、ソースコー
ドも無いソフトウェアを使わなければならない場合
</itemize>

<sect1><heading>/etc/passwd ファイルのフォーマット
<p>
shadow 化されていない <tt>/etc/passwd</tt> ファイルは以下のようなフォーマットに
なっています:
<tscreen><verb>username:passwd:UID:GID:full_name:directory:shell</verb></tscreen>
ここで、
<descrip>
<tag/<tt>username</tt></tag> ユーザのログインネーム
<tag/<tt>passwd</tt></tag> エンコードされたパスワード
<tag/<tt>UID</tt></tag> ユーザ ID (数値)
<tag/<tt>GID</tt></tag> デフォルトのグループ ID (数値)
<tag/<tt>full_name</tt></tag> ユーザの本名。実際にはこのフィールドは 
GECOS (General Electric Comprehensive Operating System) フィールドと呼
ばれ、ユーザの本名以外の情報も保持できます。<em>Shadow Suite</em> のコ
マンドおよびオンラインマニュアルではコメントフィールドとして記述されて
います。
<tag/<tt>directory</tt></tag> ユーザのホームディレクトリ
<tag/<tt>shell</tt></tag> ユーザのログインシェル(絶対パス記述)
</descrip>

例えば次のようになります:
<tscreen><verb>username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh</verb></tscreen>
ここで、第2フィールドの <tt>Np</tt> は salt で、<tt>ge08pfz4wuk</tt> 
は<em>エンコード</em>されたパスワードです。同じパスワードでも、salt/パ
スワードの組み合わせは <tt>kbeMVnZM0oL7I</tt> のようになる場合もありま
す。ある一つのパスワードに関してエンコードされ得る可能性は 4096通りで
す。(この例で用いた 'password' というパスワードは破られやすい点におい
て<em>非常に悪い</em>パスワードです。)

<p>
Shadow suite がインストールされると、<tt>/etc/passwd</tt> ファイルは以
下のようになります:
<tscreen><verb>username:x:503:100:FullName:/home/username:/bin/sh</verb></tscreen>
この場合の2番目のフィールドの <tt>'x'</tt> は単に場所を埋めているだけ
です。<em>エンコード</em>されたパスワードは含まれなくなりますが、
<tt>/etc/passwd</tt> ファイルのフォーマット自体は変わりません。従って、
<tt>/etc/passwd</tt> ファイルを読むけれどパスワード認証は行わないプロ
グラムは以前の通りに動作します。

<p>
パスワードは shadow ファイル(通常 <tt>/etc/shadow</tt>) に移されます。

<sect1><heading>shadow ファイルのフォーマット
<p>
<tt>/etc/shadow</tt>ファイルには以下のような情報が記述されています:
<tscreen><verb>username:passwd:last:may:must:warn:expire:disable:reserved</verb></tscreen>
内容は以下のような意味を持ちます:
<descrip>
<tag/<tt>username</tt></tag> ユーザ名
<tag/<tt>passwd</tt></tag> エンコードされたパスワード
<tag/<tt>last</tt></tag> 1970年1月1日から、パスワードが最後に更新された日までの日数
<tag/<tt>may</tt></tag> 何日前にパスワードが変更されたと思われるか
<tag/<tt>must</tt></tag> パスワードを変更しなければならない期限
<tag/<tt>warn</tt></tag> パスワードの期限切れの何日前にユーザに警告するか
<tag/<tt>expire</tt></tag> パスワード期限切れの何日後にアカウントを抹消するか
<tag/<tt>disable</tt></tag> 1970年1月1日から、アカウントが抹消された日までの日数
<tag/<tt>reserved</tt></tag> 予約フィールド
</descrip>

さきほどと同じ例では <tt>/etc/shadow</tt> はこのようになります:
<tscreen><verb>username:Npge08pfz4wuk:9479:0:10000::::</verb></tscreen>

<sect1><heading>crypt(3) の概要
<p>
crypt(3) のオンラインマニュアルより:

<p>
&dquot;<em>crypt</em>はパスワードの暗号化関数である。これは <em>Data
Encryption Standard (DES)</em> のアルゴリズムに、特にキー検索のハード
ウェア実装をしにくくすることを特に意図した変化をつけたものに基づいてい
る。

<p>
キーはユーザの入力したパスワードである。 [エンコードされた文字列はすべ
てNULLである。]

<p>
<em>salt</em> は [a-zA-Z0-9./] の中から2文字を選んだ文字列である。この
文字列はアルゴリズムの中で4096通りの異なる結果から一つを適当に選び出す
ために用いられる。

<p>
キーの各文字の下位7ビットを取り出すことで 56ビットのキーが得られる。こ
の56ビットのキーは定数文字列(通常は全て0の文字列を含む)を繰り返し暗号
化するために用いられる。戻し値は暗号化されたパスワードへのポインタであ
り、このパスワードは13文字の ASCII 文字である(最初の2文字はsaltそのも
のである)。戻し値のポインタが指す領域は呼び出しごとに上書きされる静的
なデータである。

<p> 
<bf>警告:</bf>キー空間は 2の56乗(=7.2e16)個の値を取ることができる。この
キー空間は大量の並列計算機を用いれば全探索することが<bf>可能</bf>であ
る。また、<tt>crack(1)</tt> のようなソフトウェアは人間がパスワードに用
いそうな単語が作るキー空間の部分空間に絞って検索を行う。従って、パスワー
ドの選択ではありふれた単語や名前の使用は避けるべきである。パスワードを
決める際には破られやすいパスワードのチェックを行う <tt>passwd(1)</tt> 
プログラムを利用すると良いだろう。

<p>
DES アルゴリズム自体には癖があるので、<tt>crypt(3)</tt>のインタフェー
スはパスワード認証の他に使うべきではない。<tt>crypt(3)</tt>のインタフェー
スを暗号そのものに関わるプロジェクトに利用してはならない。このような場
合には、暗号化について書いてある良い本と広く利用することができる DES 
ライブラリを入手するべきである。&dquot;

<p>
ほとんどの <em>Shadow Suites</em> パッケージにはパスワードを16文字に倍
長化するコードが含まれています。しかし<tt>DES</tt>の専門家はこれを推奨
していません。パスワードの長さが倍でも、最初に左半分をエンコードして、
次に右半分をエンコードしているだけだからです。これは<tt>crypt</tt>の動
作のためであり、始めから倍長パスワードが使われていなかった場合と比べて
も、より<em>脆弱な</em>パスワードを作ってしまいます。また、ユーザに16
文字のパスワードを覚えてもらうことは困難であるという理由もあります。

<p>
<tt>crypt</tt>に代るもので、より安全で長いパスワードをサポートし(特に 
MD5 アルゴリズム)、さらに<tt>crypt</tt>との互換性を保持しているような
認証アルゴリズムを開発しようとしているプロジェクトがあります。

<p>
もし、読者が暗号化についての良い本を探しているなら、筆者は以下の本を推
薦しておきます:
<verb>
	"Applied Cryptography: Protocols, Algorithms, and Source Code in C"
	by Bruce Schneier <schneier@chinet.com>
	ISBN: 0-471-59756-2
</verb>


<sect><heading>Shadow Suite の入手

<sect1><heading>Linux 用の Shadow Suite の歴史
<p>
<em>セキュリティ上の問題があるので、この節で述べる古いパッケージを使っ
てはいけません。</em>

<p>
オリジナルの <em>Shadow Suite</em> は <tt>John F. Haugh II</tt>氏によっ
て作成されました。

<p>
Linux システム上で用いられてきたバージョンはいくつかあります:

<itemize>
<item><tt>shadow-3.3.1</tt> はオリジナルです。
<item><tt>shadow-3.3.1-2</tt> は
<htmlurl url="mailto:flla@stud.uni-sb.de" 
name="Florian La Roche &lt;flla@stud.uni-sb.de&gt;">
氏によって書かれた Linux 専用のパッチで、独自の拡張もしています。
<item><tt>shadow-mk</tt> Linux 専用のパッケージです。
</itemize>

<p>
<tt>shadow-mk</tt>パッケージは <tt>John F. Haugh II</tt> 氏が配布してい
る <tt>shadow-3.3.1</tt> パッケージに <tt>shadow-3.3.1-2</tt> へのパッチ、
<htmlurl 
url="mailto:magnus@texas.net" 
name="Mohan Kokal &lt;magnus@texas.net&gt;">
氏によってなされたインストールを簡単にするための修正、<tt>Joseph
R.M. Zbiciak</tt> 氏による 
/bin/login の -f, -h のオプション時の動作についてのセキュリティホール
を塞ぐための <tt>login1.c</tt> (login.secure) に対するパッチ及びその他
いくつかの変更を加えたものです。

<p>
<tt>shadow.mk</tt>パッケージは <em>以前は</em>推奨されていましたが、
<tt>login</tt>プログラムの<em>セキュリティ上の問題</em>があるので使う
べきではないでしょう。

<p>
バージョン 3.3.1, 3.3.1-2 の Shadow と shadow-mk では<tt>login</tt>プ
ログラムに<em>セキュリティ上の問題</em>があります。この<tt>login</tt>
のバグはログイン名の長さをチェックしないというものです。これによりバッ
ファがオーバーフローしてプログラムが異常動作してしまいます。システム上
にアカウントを持っている人間は、このバグと共有ライブラリを使って root 
の権限を手に入れることができるという噂が流れました。私はこれについて詳
しい話をするつもりはありません。影響をうける Linux システムは多いけれ
ど、これらの<em>Shadow Suites</em> をインストールした Linux システムや
初期バージョンの ELF 版パッケージのシステムで<em>Shadow Suites</em>を
インストールして<em>いない</em>ものは危険にさらされるからです。

<p>
この話題や、その他の Linux のセキュリティについての情報を得るためには、
<url
url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-FAQ/Linux-telnetd.html"
name="Linux Security ホームページ (共有ライブラリとloginプログラム
の脆弱性)">
を見るとよいでしょう。

<sect1><heading>Shadow Suite の入手
<p>
現在推奨される唯一の <em>Shadow Suite</em> はまだβバージョンですが、
最新のものは作っている環境では安全であり、危険な <tt>login</tt>プログ
ラムも含んでいません。

<p>
パッケージは以下の名前付けの規則を使っています:
<tscreen><verb>shadow-YYMMDD.tar.gz</verb></tscreen>
は、<em>Shadow Suite</em> の <tt>YY年MM月DD日</tt> 公開した版であるこ
とを意味します。

<p>
このバージョンは現在βテスト中であり、やがて<em>バージョン 3.3.3</em>
になるでしょう。今は<htmlurl 
url="mailto:marekm@i17linuxb.ists.pwr.wroc.pl" name="Marek Michalkiewicz &lt;marekm@i17linuxb.ists.pwr.wroc.pl&gt;">
氏によってメンテナンスされており、
<url
url="ftp://i17linuxb.ists.pwr.wroc.pl/pub/linux/shadow/shadow-current.tar.gz"
name="shadow-current.tar.gz">
から入手可能です。

<p>
また、以下のミラーサイトもあります:
<itemize>
<item><htmlurl url="ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz"
name="ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz">
<item><htmlurl url="ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz"
name="ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz">
<item><htmlurl url="ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz"
name="ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz">
<item><htmlurl url="ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz"
name="ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz">
</itemize>


<p>
現在利用できる最新版を利用しましょう。

<p>
<tt>shadow-960129</tt>より<em>古い</em>バージョンのものは先程述べたよ
うに <tt>login</tt>プログラムに問題があるので使ってはいけません。

<p>
この文書中で <em>Shadow Suite</em> と書く時は、このパッケージについて
記述しているものとします。また、あなたが使うパッケージもこれであるもの
と仮定します。

<p>
参考のために、<tt>shadow-960129</tt> に基づいてインストールの手順を作成しました。


<p>
もしあなたが現在<tt>shadow-mk</tt>を使っているならば、すべて再構築して
このバージョンにアップグレードするべきでしょう。


<sect1><heading>Shadow Suite には何が含まれているか
<p>
<em>Shadow Suite</em>は以下のコマンドを置き換えます:

<p>
<tt>su, login, passwd, newgrp, chfn, chsh, and id</tt>

<p>
また、パッケージには以下の新しいプログラムが含まれています:

<p>
<tt>chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod, groupadd,
 groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv, and pwunconv</tt>

<p>
加えて、パスワードにアクセスする必要があるプログラムを作るためのライブ
ラリ <tt>libshadow.a</tt> が含まれています。

<p>
そして、プログラムのオンラインマニュアルも含まれています。

<p>
<tt>/etc/login.defs</tt> としてインストールされる、login プログラム
の設定ファイルも含まれています。


<sect><heading>プログラムのコンパイル

<sect1><heading>アーカイブの展開

<p>
パッケージを入手した後の最初の作業はこれを展開することです。パッケージ
は tar (Tape ARchive) でまとめた後に gzip で圧縮してあるので、まずパッ
ケージを <tt>/usr/src</tt> に移動させてから次のように入力して下さい:
<tscreen><verb>tar -xzvf shadow-current.tar.gz</verb></tscreen>

<p>
この操作でパッケージは <tt>/usr/src/shadow-YYMMDD</tt> というディレク
トリに展開されます。

<sect1><heading>config.h による設定
<p>
まず最初に行なうことは<tt>Makefile</tt>と<tt>config.h</tt>の2つを上書
きコピーすることです:
<tscreen><verb>cd /usr/src/shadow-YYMMDD
cp Makefile.linux Makefile
cp config.h.linux config.h</verb></tscreen>

<p>
まず <tt>config.h</tt> ファイルを見てください。このファイルには設定オ
プションの定義が書かれています。もし、あなたが<em>推奨されている</em>
パッケージを用いている場合には、まずグループのshadowサポートをまず無効
にしましょう。

<p>
標準ではグループのパスワードは有効になっています。これを無効にするため
には<tt>config.h</tt>を編集し、<tt>#define SHADOWGRP</tt> を 
<tt>#undef SHADOWGRP</tt> に変更します。とりあえずはこれを無効にしてお
き、あとで本当にグループのパスワードやグループの管理者が必要となった時
に <em>Shadow Suite</em> を再コンパイルするべきでしょう。もし有効なま
まにしておくのならば、<tt>/etc/gshadow</tt> ファイルを作らなければなり
ません。

<p>
倍長パスワードを有効にすることは前に述べた理由のため、推奨しません。

<p>
<tt>#undef AUTOSHADOW</tt> の設定は<em>絶対に</em>変更してはいけません。

<p>
<tt>AUTOSHADOW</tt> オプションは shadow を理解できないプログラムも機能
するようにするために設計されたものです。これは良いことのように思えます
が、きちんと動きません。このオプションを有効にし、root でプログラムを
実行すると、 <tt>getpwnam()</tt> 関数を呼び出された場合には変更された
エントリーを <tt>/etc/passwd</tt> ファイルに書き戻してしまいます。
(<em>もはやshadow 化されたパスワードなくなってしまう</em>) chfn や 
chsh がこれに該当するプログラムです。<tt>getpwnam()</tt>を呼び出す前に
真のUIDと実効UIDをうまく切替えることで回避するという方法は使えません。
chfn や chsh は root 権限で動作するからです。

<p>
libc には同じ意味を持つ <tt>SHADOW_COMPAT</tt> オプションがありますが、	
同じ注意が libc を作る際にも当てはまります。<em>使うべきではありません！
</em>

もし<tt>/etc/passwd</tt>ファイルにエンコードされたパスワードが現われる
ようならば問題です。

<p>
もし4.6.27 以前のバージョンの<tt>libc</tt>を使っているなら、
<tt>config.h</tt>と<tt>Makefile</tt>をそれぞれ変更する必要があります。
<tt>config.h</tt> は以下の部分を:
<tscreen><verb>#define HAVE_BASENAME</verb></tscreen>
このように変更してください:
<tscreen><verb>#undef HAVE_BASENAME</verb></tscreen>
<tt>Makefile</tt> についても同様です:

<tscreen><verb>SOBJS = smain.o env.o entry.o susetup.o shell.o \
        sub.o mail.o motd.o sulog.o age.o tz.o hushed.o

SSRCS = smain.c env.c entry.c setup.c shell.c \
        pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
        tz.c hushed.c
</verb></tscreen>

<tscreen><verb>SOBJS = smain.o env.o entry.o susetup.o shell.o \
        sub.o mail.o motd.o sulog.o age.o tz.o hushed.o basename.o

SSRCS = smain.c env.c entry.c setup.c shell.c \
        pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
        tz.c hushed.c basename.c
</verb></tscreen>
<tt>libc 4.6.27</tt> 以降ではこれらの変更は<tt>basename.c</tt>に対して
行われています。

<sect1><heading>元のプログラムのバックアップの作成
<p>
<em>Shadow Suite</em> が置き換えてしまうプログラムをあらかじめ確認して
おき、バックアップを取っておくのは良い考えです。Slackware 3.0 パッケー
ジでは以下のファイルが該当します:

<itemize>
<item>/bin/su
<item>/bin/login
<item>/usr/bin/passwd
<item>/usr/bin/newgrp
<item>/usr/bin/chfn
<item>/usr/bin/chsh
<item>/usr/bin/id
</itemize>

<p>
β版パッケージには Makefile 中に<em>save</em> というターゲットがありま
すが、コメントアウトされています。
パッケージが異なればプログラムの置き場所も異なるからです。

<p>
<tt>/etc/passwd</tt>ファイルのバックアップも取っておいたほうが良いでしょ
う。<tt>passwd</tt>コマンドと同じディレクトリに置いて上書きしてしまわ
ないように、何か別の名前にしましょう。

<sect1><heading>Make の実行
<p>
<em>インストール作業のほとんどはrootとして行う必要があります</em>。

<p>
パッケージの実行ファイルをコンパイルするために make を実行して下さい:
<tscreen><verb>make all</verb></tscreen>

<p>
<tt>rcsid defined but not used</tt> というウォーニングが出るかもしれま
せんが、無視して構いません。
これは作者がバージョン管理ツールを使っているために起こるものです。


<sect><heading>インストール

<sect1><heading>システム破壊に備えてのブートディスク作成

<p>
最悪の事態に備えて、ブートディスクを作っておきましょう。システムをイン
ストールした時のブートディスクとルートディスクがあれば十分です。無い場
合には、ブートディスクの作成についての説明が書かれている
<url url="http://sunsite.unc.edu/mdw/HOWTO/Bootdisk-HOWTO.html"
name="Bootdisk-HOWTO">
を参照して下さい。

<sect1><heading>重複するオンラインマニュアルの削除
<p>
置き換えられる古いマニュアルはどこかに移しておくべきです。バックアップ
なしで <em>Shadow Suite</em> をインストールする場合でも、古いマニュア
ルを消してしまいたくなるでしょう。古いマニュアルはおそらく圧縮されてい
るので、新しいマニュアルはうまく上書きされないからです。

<p>
<tt>man -aW</tt> と <tt>locate</tt> コマンドを使って移動(削除)すべきマニュアルの位置を調べることができます。一般的には <tt>make install</tt> を実行した後よりも実行する前の方が古いマニュアルの場所を見つけるのが容易です。

<p>
Slackware 3.0 パッケージの場合には削除すべきマニュアルは以下の場所にあ
ります:
<itemize>
<item>/usr/man/man1/chfn.1.gz
<item>/usr/man/man1/chsh.1.gz
<item>/usr/man/man1/id.1.gz
<item>/usr/man/man1/login.1.gz
<item>/usr/man/man1/passwd.1.gz
<item>/usr/man/man1/su.1.gz
<item>/usr/man/man5/passwd.5.gz
</itemize>

<p>
<tt>/var/man/cat[1-9]</tt> にも同じ名前のオンラインマニュアルがあるか
も知れないので、あれば削除する必要があります。

<sect1><heading>make install の実行

<p>
以下のコマンドを実行しましょう:(rootになってから実行して下さい)
<tscreen<verb>make install</verb></tscreen>

<p>
これで、新しいプログラム及び置き換えられるプログラムがインストールされ、
ファイルのパーミッションが修正されます。また、オンラインマニュアルもイ
ンストールされます。

<p>
Shadow Suite のインクルードファイルが 正しい場所
(<tt>/usr/include/shadow</tt>) にインストールされたかどうか確認して下さい。

<p>
β版パッケージを使っている場合には、<tt>login.defs</tt>を手動で
<tt>/etc</tt>へコピーして、root だけしか読み書きできないようにしなけれ
ばなりません。
<tscreen><verb>cp login.defs /etc
chmod 700 /etc/login.defs</verb></tscreen>

<p>
このファイルは<em>login</em>プログラムの設定ファイルです。このファイル
はあなたのシステムに合わせて変更してください。このファイルでは、どの 
tty から root のログインを許すかなどセキュリティに関する設定(パスワー
ドの期限設定など)ができます。

<sect1><heading>pwconv の実行
<p>
次のステップは <tt>pwconv</tt> を実行することです。これも<em>root</em>
権限で行わなければなりません。また、<tt>/etc</tt> ディレクトリへ移動し
てから実行して下さい:
<tscreen><verb>cd /etc
/usr/sbin/pwconv</verb></tscreen>

<p>
<tt>pwconv</tt> は <tt>/etc/passwd</tt> の各フィールドを取り出して、
<tt>/etc/npasswd</tt> と <tt>/etc/nshadow</tt> の2つのファイルを作りま
す。

<p>
<tt>pwunconv</tt> というコマンドもあり、もし必要ならば 
<tt>/etc/passwd</tt> と <tt>/etc/shadow</tt> から普通の 
<tt>/etc/passwd</tt> を生成することもできます。

<sect1><heading>npasswd と nshadow のリネーム
<p>
<tt>pwconv</tt> を実行したことで <tt>/etc/npasswd</tt> と 
<tt>/etc/nshadow</tt> が得られたはずです。これらのファイルをそれぞれ 
<tt>/etc/passwd</tt> と <tt>/etc/shadow</tt> に上書きしてください。上
書きの前には元の <tt>/etc/passwd</tt> のバックアップを作り、このバック
アップは root 以外のユーザは読めないようにしておきましょう。
バックアップは root のホームディレクトリに作ると良いでしょう:
<tscreen><verb>cd /etc
cp passwd ~passwd
chmod 600 ~passwd
mv npasswd passwd
mv nshadow shadow</verb></tscreen>

<p>
さらに、ファイルのオーナとパーミッションが正しいかどうか確認しましょう。
<em>X-Window System</em> を使っているならば、<tt>xlock</tt> や 
<tt>xdm</tt> は shadow ファイルを読めるようになっていなければなりませ
ん(書き込みができる必要はありません)。

<p>
これには2つの方法があります。
一つは、<tt>xlock</tt>を root に SUID する方法です。(xdm はいずれにせ
よ root として動作するので関係ありません。) もう一つは <tt>shadow</tt>
ファイルの所有者は<tt>root</tt>に、グループは<tt>shadow</tt>にする方法
です。このような設定にする前には、<tt>/etc/group</tt> ファイルを見て、
shadow グループがあるかどうかをまず確認してください。shadow グループに
属するユーザは一人もいてはいけません。
<tscreen><verb>chown root.root passwd
chown root.shadow shadow
chmod 0644 passwd
chmod 0640 shadow</verb></tscreen>

<p>
これであなたのシステムのパスワードは shadow 化されました。ここで、新し
く仮想端末を開いてログインができるかどうか確認してみましょう。

<p>
<em>さあ、やってみましょう！</em>

<p>
もしうまくいかない場合は、どこかで間違えています。shadow 化されていない
状態に戻すためには以下のような手続きを行って下さい:
<tscreen><verb>cd /etc
cp ~passwd passwd
chmod 644 passwd</verb></tscreen>

<p>
最初にバックアップを取った他のファイルも正しい場所に戻しましょう。


<sect><heading>アップグレードするかパッチを当てる必要があるプログラム
<p>
<em>Shadow Suite</em> にはパスワードにアクセスするプログラムほとんどの
代替品を含んでいますが、ほとんどのシステムでは他にもいくつかのプログラ
ムが必要となります。

<p>
<em>Debian パッケージ</em>では(そうでない場合でも構いませんが)、
以下の場所からシステムの再構築に必要なプログラムの Debian パッケージの
のソースを入手することができます。
ftp://ftp.debian.org/debian/stable/source/

<p>
この節の残りは<tt>adduser</tt>, <tt>wu_ftpd</tt>, <tt>ftpd</tt>,
<tt>pop3d</tt>, <tt>xlock</tt>, <tt>xdm</tt> and <tt>sudo</tt> が 
<em>Shadow Suite</em> をサポートできるようにするため行うアップグレードについて説
明します。

<p>
他のプログラムも shadow サポートできるようにする方法は <ref
id="sec-adding" name="Cプログラムを Shadow Suite に対応させる方法"> の章を参
照して下さい。(実際に shadow ファイルにアクセスするためには root に 
SUID するか shadow に SGID する必要があります。)


<sect1><heading>Slackware adduser program
<p>
Slackware パッケージ(おそらく他のパッケージにも)には 
<tt>/sbin/adduser</tt> という対話的に新しいユーザを追加するプログラム
が含まれています。このプログラムの shadow 対応版は <htmlurl
url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/accounts/adduser.shadow-1.4.tgz"
name="ftp://sunsite.unc.edu/pub/Linux/
system/Admin/accounts/adduser.shadow-1.4.tar.gz">
から入手できます。

<p>
筆者は slackware の<tt>adduser</tt>の代りに<em>Shadow Suite</em>に含ま
れているプログラム(<tt>useradd</tt>, <tt>usermod</tt>,
<tt>userdel</tt>)を使うことを勧めます。使い方は新たに覚えなければなり
ませんが、それだけの価値はあります。より細かい制御ができますし、
(<tt>adduser</tt>では行わない) <tt>/etc/passwd</tt> や 
<tt>/etc/shadow</tt>のロッキングもしてくれるからです。

<p>
詳しくは
<ref id="sec-work" name="Shadow Suite を使ってみる"> 
の章を見てください。

<p>
それでも adduser を使いたいならば、以下のような手順でインストールしてください:
<tscreen><verb>tar -xzvf adduser.shadow-1.4.tar.gz
cd adduser
make clean
make adduser
chmod 700 adduser
cp adduser /sbin</verb></tscreen>


<sect1><heading>wu_ftpd サーバ
<p>
大部分の Linux システムでは <tt>wu_ftpd</tt> サーバを使っています。も
し、あなたの使っているパッケージに <em>Shadow Suite</em>がインストール
されていない場合、<tt>wu_ftpd</tt> も shadow をサポートするようにはなっ
ていないでしょう。wu_ftpd は <tt>inetd/tcpd</tt> から<em>root</em>のプ
ロセスとして起動されます。もし、あなたが古い <tt>wu_ftpd</tt> デーモン
を走らせているなら、バージョンを上げてください。古いバージョンは
<em>root</em>のアカウントを認めてしまうバグを持っていることで知られて
いるからです。(詳しくは 
<url
url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-FAQ/Linux-wu.ftpd-2.4-Update.html" name="Linux security ホームページ">)
を参照して下さい。 )

<p>
幸い、shadow を有効にするためにはソースコードを入手して再コンパイルす
るだけです。

<p>
ELF システムでない場合には、<tt>wu_ftp</tt>サーバは Sunsite に <url
url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/wu-ftpd-2.4-fixed.tar.gz"
name="wu-ftp-2.4-fixed.tar.gz">
の名前で置いているものが利用できます。

<p>
ファイルを入手したら、このファイルを <tt>/usr/src</tt> に置いてから、
以下のような操作を行ってください:
<tscreen><verb>cd /usr/src
tar -xzvf wu-ftpd-2.4-fixed.tar.gz
cd wu-ftpd-2.4-fixed
cp ./src/config/config.lnx.shadow ./src/config/config.lnx</verb></tscreen>

<p>
次に <tt>./src/makefiles/Makefile.lnx</tt> ファイルの以下の部分を:
<tscreen><verb>LIBES    = -lbsd -support</verb></tscreen>
次のように変更します:
<tscreen><verb>LIBES    = -lbsd -support -lshadow</verb></tscreen>

<p>
そして、実行ファイル生成スクリプトの実行及びインストールを行います:
<tscreen><verb>cd /usr/src/wu-ftpd-2.4-fixed
/usr/src/wu-ftp-2.4.fixed/build lnx
cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old
cp ./bin/ftpd /usr/sbin/wu.ftpd</verb></tscreen> 

<p>
これは、Linux 用 shadow の設定ファイルを使ってサーバのコンパイル及びイ
ンストールを行います。

<p>
筆者の Slackware 2.3 システムでは実行ファイル生成スクリプトを実行する
前に以下の操作を行う必要がありました:
<tscreen><verb>cd /usr/include/netinet
ln -s in_systm.h in_system.h
cd -</verb></tscreen>

<p>
ELF システム上ではコンパイルがうまくいかないことが報告されていますが、
次のリリースのβ版を使えばうまくいくようです。
これは、<url
url="ftp://tscnet.com/pub/linux/network/ftp/wu-ftpd-2.4.2-beta-10.tar.gz"
name="wu-ftp-2.4.2-beta-10.tar.gz">
として入手できます。

<p>
ファイルを入手したら、これを <tt>/usr/src</tt> に置いて、以下の操作を
行ってください:
<tscreen><verb>cd /usr/src
tar -xzvf wu-ftpd-2.4.2-beta-9.tar.gz
cd wu-ftpd-beta-9
cd ./src/config</verb></tscreen>

<p>
次に <tt>config.lnx</tt> ファイルの以下の部分を
<tscreen><verb>#undef SHADOW.PASSWORD</verb></tscreen>
次のように変更します。
<tscreen><verb>#define SHADOW.PASSWORD</verb></tscreen>
それから、
<tscreen><verb>cd ../Makefiles</verb></tscreen>
を行い、カレントディレクトリを変更してから <tt>Makefile.lnx</tt>
ファイルの
<tscreen><verb>LIBES = -lsupport -lbsd # -lshadow</verb></tscreen>
の部分を次のように変更します。
<tscreen><verb>LIBES = -lsupport -lbsd -lshadow</verb></tscreen>
そして実行ファイル生成とインストールを行います:
<tscreen><verb>cd ..
build lnx
cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old
cp ./bin/ftpd /usr/sbin/wu.ftpd</verb></tscreen> 

<p>
<tt>/etc/inetd.conf</tt> ファイルに wu_ftpd 本体の置き場所が書かれてい
るかどうかを確認するのを忘れないようにしましょう。パッケージによっては
サーバデーモンの置場所が違い、wu_ftpd が別の名前になっているものもある
という報告がありました。

<bf>訳注:</bf>
Slackware 3.1 では shadow パスワード化を行った場合、wu-ftpd のコンパイ
ルに失敗する場合があります。
下記のようなエラーが出る場合には src/makefiles/Makefile.lnx の CFLAGS 
に "-DDIRENT_ILLEGAL_ACCESS" を加えてみてください。
(この情報は高石＠広島電機大さんより頂きました。)

<code>
gcc -O2 -fomit-frame-pointer -I.. -I../support -I/usr/include/bsd -L../suppors 
 -c glob.c -o glob.o
glob.c: In function `matchdir':
glob.c:284: dereferencing pointer to incomplete type
make: *** [glob.o] Error 1
</code>


<sect1><heading>標準の ftpd
<p>
標準の ftpd サーバを使っている場合には <tt>wu_ftpd</tt> サーバにアップ
グレードすることを勧めます。先程述べたバグを除けば、より安全だとされて
いるからです。

<p>
どうしても標準のものを使いたい場合や、NIS をサポートする必要がある場合
には Sunsite から 
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/ftpd-shadow-nis.tgz"
name="ftpd-shadow-nis.tgz">
を入手して下さい。


<sect1><heading>pop3d (Post Office Protocol 3)

<p>
もし、<em>POP3(the third Post Office Protocol)</em> をサポートする必要
がある場合には <tt>pop3d</tt> を再コンパイルする必要があります。
<tt>pop3d</tt> は <tt>inet/tcpd</tt> から<tt>root</tt>権限で実行されま
す。

<p>
Sunsite から2つの異なるバージョンのものを入手できます:
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d-1.00.4.linux.shadow.tar.gz"
name="pop3d-1.00.4.linux.shadow.tar.gz">
と
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d+shadow+elf.tar.gz"
name="pop3d+shadow+elf.tar.gz">
です。

<p>
どちらの場合も問題なくインストールできるでしょう。


<sect1><heading>xlock
<p>
<em>Shadow Suite</em> をインストールし、<em>X Window システム</em>上で 
<tt>xlock</tt> をアップグレードしないままで実行した場合には、
<tt>CNTL-ALT-Fx</tt> で別のコンソールに切替えてログインし 
<tt>xlock</tt> のプロセスを殺す(あるいは <tt>CNTL-ALT-BS</tt> で X サー
バを殺す)以外にどうしようもない状態になってしまいます。幸いなことに、
<tt>xlock</tt> をアップグレードするのはとても簡単です。

<p>
もし、XFree86 のバージョン 3.x.x を利用している場合には、
<tt>xlockmore</tt> (lock 機能に加えてスクリーンセーバ機能を持つ)を使っ
ていると思います。このパッケージは再コンパイルすることで 
<em>shadow</em> をサポートできます。古い <tt>xlock</tt> を使っている場
合には <tt>xlockmore</tt> にアップグレードすることを勧めます。

<p>
<tt>xlockmore-3.5.tgz</tt> は以下の場所で入手できます:
<url
url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/screensavers/xlockmore-3.7.tgz">

<p>
インストールは基本的には以下のような操作で行います:

<p>
<tt>xlockmore-3.5.tgz</tt> を入手し、<tt>/usr/src</tt> で展開します:
<tscreen><verb>tar -xzvf xlockmore-3.7.tgz</verb></tscreen>

<p>
<tt>/usr/X11R6/lib/X11/config/linux.cf</tt> を編集し、
<tscreen><verb>#define HasShadowPasswd    NO

の行を

#define HasShadowPasswd    YES</verb></tscreen>

のように変更します。

<p>
そして、実行ファイルを作成します:
<tscreen><verb>cd /usr/src/xlockmore
xmkmf
make depend
make</verb></tscreen>

<p>
ファイルを移動し、オーナとパーミッションを設定します:
<tscreen><verb>cp xlock /usr/X11R6/bin/
cp XLock /var/X11R6/lib/app-defaults/
chown root.shadow /usr/X11R6/bin/xlock
chmod 2755 /usr/X11R6/bin/xlock
chown root.shadow /etc/shadow
chmod 640 /etc/shadow</verb></tscreen>

<p>
これで、うまく動く xlock ができたはずです。


<sect1><heading>xdm
<p>
<tt>xdm</tt>は X Window のログイン画面を表示するプログラムです。特定
の run level に移行したときに<tt>xdm</tt>が実行されるシステムもあります。
(<tt>/etc/inittab</tt>参照)

<p>
<em>Shadow Suite</em>のインストールを行なうと、<tt>xdm</tt>も更新しな
ければなりません。しかし<tt>xdm</tt>のアップグレードは簡単なので問題あ
りません。

<p>
<tt>xdm.tar.gz</tt> は以下のURLで入手できます:
<url url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz">

<p>
<tt>xdm.tar.gz</tt> ファイルを入手して、<tt>/usr/src</tt>に置いてから
以下のようにして展開します:
<tscreen><verb>tar -xzvf xdm.tar.gz</verb></tscreen>

<p>
<tt>/usr/X11R6/lib/X11/config/linux.cf</tt> 内の
<tscreen><verb>#define HasShadowPasswd    NO

の部分を

#define HasShadowPasswd    YES</verb></tscreen>

のように変更します。

<p>
実行ファイルを作ります:
<tscreen><verb>cd /usr/src/xdm
xmkmf
make depend
make</verb></tscreen>

<p>
ファイルをインストールします:
<tscreen><verb>cp xdm /usr/X11R6/bin/</verb></tscreen>

<p>
<tt>xdm</tt> は <em>root</em> 権限で動作するのでファイルのパーミッショ
ンを変える必要はありません。


<sect1><heading>sudo
<p>
<tt>sudo</tt>プログラムはシステム管理者が通常root権限を必要とするプロ
グラムをユーザに実行させるために用います。管理者がrootのアカウントへの
アクセスを制限したままで、ユーザにディスクのマウント等の操作を許可する
ときに便利なプログラムです。

<p>
<tt>sudo</tt> は実行された時にユーザのパスワード認証を行うので、パスワー
ドファイルを読めなければなりません。<tt>sudo</tt> は最初からrootに 
SUID されて動作するので、<tt>/etc/shadow</tt> へのアクセスについては問
題ありません。

<p>
<em>Shadow Suit</em> 対応の <tt>sudo</tt> は以下のURLで入手できます:
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/sudo-1.2-shadow.tgz">

<p>
<em>警告</em>: <tt>sudo</tt>をインストールする際に 
<tt>/etc/sudoers</tt>ファイルは標準のものと置き換えられてしまいます。
ですから、標準の状態から変更がある場合にはバックアップを取っておく必要
があります。(Makefile を変更して標準のファイルを<tt>/etc</tt>にコピー
する部分の処理を削除するという方法もあります。)

<p>
このパッケージは既に shadow 対応の設定がなされているので、パッケージを
再コンパイルするだけで利用できます(ソースは /usr/src に展開して下さい):
<tscreen><verb>cd /usr/src
tar -xzvf sudo-1.2-shadow.tgz
cd sudo-1.2-shadow
make all
make install</verb></tscreen>


<sect1><heading>imapd (E-Mail &lsqb;pine パッケージ&rsqb;)
<p>
<tt>imapd</tt> は <tt>pop3d</tt> のようなメールサーバです。
<tt>imapd</tt> は <em>pine E-mail</em> パッケージに付属しています。パッ
ケージに付属するドキュメントには Linux システムに対する標準設定で 
shadow をサポートしていると書かれています。しかし、これは正しくない記
述です。さらに、このパッケージでは実行ファイル生成スクリプトと 
Makefile の組合せが必要で、コンパイル時に<tt>libshadow.a</tt>を加える
ことが難しいのです。そういうわけで、私はまだ <tt>imapd</tt> が 
shadow サポートするようにはできていません。

<p>
もし成功した人がいましたら、筆者のところにメールで知らせてください。この
項目に加えたいと思います。


<sect1><heading>pppd (PPP プロトコルサーバ)
<p>
pppd サーバは認証の方式を複数利用できるように設定できます。
<em>Password Authentication Protocol (PAP)</em> と <em>Cryptographic
Handshake Authentication Protocol (CHAP)</em>です。pppd サーバは普通パ
スワード文字列を <tt>/etc/ppp/chap-secrets</tt> か 
<tt>/etc/ppp/pap-secrets</tt> (あるいは両方)から得ます。pppd に標準の
動作をさせている場合には pppd を再インストールする必要はありません。

<p>
pppd は<em>login</em>パラメータを使うようにすることもできます(コマンド
ラインか、設定ファイルで指定するか <tt>options</tt> ファイル内で指定)。
もし<em>login</em> オプションが指定されると pppd は <em>PAP</em> で 
<tt>/etc/passwd</tt> ファイルのユーザネームとパスワードを使います。パ
スワードを shadow 化するともちろん、これは動作しなくなります。
pppd-1.2.1d では shadow をサポートするためにはプログラムを変更しなけれ
ばなりません。

<p>
次の章での例題は <tt>pppd-1.2.1d</tt>(バージョンが古い pppd)に shadow 
サポートを加えるというものです。

<p>
<tt>pppd-2.2.0</tt> では既に shadow 対応が行われています。


<sect><heading>Shadow Suite を使ってみる<label id="sec-work">
<p>
この章ではシステムに<em>Shadow Suite</em>をインストールした後に知って
おくべきだと思われることを説明します。より詳しい説明は各コマンドのオン
ラインマニュアルを参照してください。


<sect1><heading>ユーザの追加、変更、削除
<p>
<em>Shadow Suite</em> にはユーザを追加、変更、削除するためのプログラム
が含まれています。既に<tt>adduser</tt>プログラムも持っているかもしれません。


<sect2><heading>useradd
<p>
<tt>useradd</tt>コマンドはシステムにユーザを追加するために用います。標
準の設定を変えるときにもこのコマンドを実行します。

<p>
最初に行なうべきことは標準設定を確認してあなたのシステムに合わせて変更
を加えることです:
<tscreen><verb>useradd -D</verb></tscreen><code>
GROUP=1
HOME=/home
INACTIVE=0
EXPIRE=0
SHELL=
SKEL=/etc/skel</code>

<p>
標準設定はおそらく気に入らないでしょうから、ユーザを加えるときに各ユー
ザに対して全ての項目をいちいち指定するよりも、標準の設定を変えてしまい
ましょう。

<p>
筆者のシステムでは以下のような設定に変えています:
<itemize>
<item>標準のグループ ID を 100 に
<item>パスワードの期限を 60 日に
<item>パスワードの期限切れによるアカウントのロックは行なわない
<item>標準のシェルを<tt>/bin/bash</tt> に
</itemize>
このような変更を行なうには次のコマンドを実行します:
<tscreen><verb>useradd -D -g100 -e60 -f0 -s/bin/bash</verb></tscreen> 

<p>
この状態で <tt>useradd -D</tt> を実行すると以下の結果を得ます:
<code>
GROUP=100
HOME=/home
INACTIVE=0
EXPIRE=60
SHELL=/bin/bash
SKEL=/etc/skel
</code>

<p>
もし知りたければ、これらの標準設定は<tt>/etc/default/useradd</tt> ファ
イルで確認できます。

<p>
これでユーザの追加に <tt>useradd</tt> を使えるようになりました。例えば、
標準の設定を使ってユーザ <tt>fred</tt> を追加するためには以下のような
操作を行ないます:
<tscreen><verb>useradd -m -c "Fred Flintstone" fred</verb></tscreen>
このコマンドは<tt>/etc/passwd</tt> ファイル内に以下のようなエントリー
を作ります:
<tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/bash</verb></tscreen>
また、<tt>/etc/shadow</tt>ファイル内に以下のエントリーを作ります:
<tscreen><verb>fred:!:0:0:60:0:0:0:0</verb></tscreen>
<tt>-m</tt>オプションがついているので、ユーザ<tt>fred</tt> のホームディ
レクトリも生成され、<tt>/etc/skel</tt>ディレクトリの内容がコピーされます。

<p>
UID は指定していなくても適当に決めてくれます。

<p>
これで<tt>fred</tt>のアカウントができましたが、アカウントのロックを解
除しない限り<tt>fred</tt>はログインすることはできません。ロックの解除
はパスワードを変えることによって行ないます。
<tscreen><verb>passwd fred</verb></tscreen>
<code>
Changing password for fred
Enter the new password (minimum of 5 characters)
Please use a combination of upper and lower case letters and numbers.
New Password: *******
Re-enter new password: *******
</code>
これで <tt>/etc/shadow</tt>は以下のような内容になります:
<tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0</verb></tscreen>
そして、<tt>fred</tt>はシステムにログインできるようになります。
他のプログラムでなく <tt>useradd</tt> を使う利点は<tt>/etc/passwd</tt>
と<tt>/etc/shadow</tt>の変更が不可分に行なわれることです。つまり、あな
たがユーザを登録するのと同時に他のユーザがパスワードを変更したとしても、
両方とも正しく実行されます。

<p>
直接 <tt>/etc/passwd</tt> や <tt>/etc/shadow</tt> を編集するのはやめて、
用意されたコマンドを利用するべきです。あなたが <tt>/etc/passwd</tt> を
編集している間に、あるユーザがパスワードを変更したとすると、そのユーザ
のパスワード変更はあなたがファイルをセーブした時に失われてしまいます。

<p>
以下に示すのは<tt>useradd</tt>と<tt>passwd</tt>を使った簡単な対話的ユー
ザ追加スクリプトです。
<code>
#!/bin/bash
#
# /sbin/newuser - A script to add users to the system using the Shadow
#                 Suite's useradd and passwd commands.
#
# Written my Mike Jackson <mhjack@tscnet.com> as an example for the Linux
# Shadow Password Howto.  Permission to use and modify is expressly granted.
#
# This could be modified to show the defaults and allow modification similar
# to the Slackware Adduser program.  It could also be modified to disallow
# stupid entries.  (i.e. better error checking).
#
##
#  Defaults for the useradd command
##
GROUP=100        # Default Group
HOME=/home       # Home directory location (/home/username)
SKEL=/etc/skel   # Skeleton Directory
INACTIVE=0       # Days after password expires to disable account (0=never)
EXPIRE=60        # Days that a passwords lasts
SHELL=/bin/bash  # Default Shell (full path)
##
#  Defaults for the passwd command
##
PASSMIN=0        # Days between password changes
PASSWARN=14      # Days before password expires that a warning is given
##
#  Ensure that root is running the script.
##
WHOAMI=`/usr/bin/whoami`
if [ $WHOAMI != "root" ]; then
        echo "You must be root to add news users!"
        exit 1
fi
##
#  Ask for username and fullname.
##
echo ""
echo -n "Username: "
read USERNAME
echo -n "Full name: "
read FULLNAME
#
echo "Adding user: $USERNAME."
#
# Note that the "" around $FULLNAME is required because this field is
# almost always going to contain at least on space, and without the "'s
# the useradd command would think that you we moving on to the next
# parameter when it reached the SPACE character.
#
/usr/sbin/useradd -c"$FULLNAME" -d$HOME/$USERNAME -e$EXPIRE \
        -f$INACTIVE -g$GROUP -m -k$SKEL -s$SHELL $USERNAME
##
#  Set password defaults
##
/bin/passwd -n $PASSMIN -w $PASSWARN $USERNAME >/dev/null 2>&1
##
#  Let the passwd command actually ask for password (twice)
##
/bin/passwd $USERNAME
##
#  Show what was done.
##
echo ""
echo "Entry from /etc/passwd:"
echo -n "   "
grep "$USERNAME:" /etc/passwd
echo "Entry from /etc/shadow:"
echo -n "   "
grep "$USERNAME:" /etc/shadow
echo "Summary output of the passwd command:"
echo -n "   "
passwd -S $USERNAME
echo ""
</code> 

<p>
ユーザの追加にスクリプトを利用することは直接<tt>/etc/passwd</tt>や
<tt>/etc/shadow</tt>を編集したり、Slackware の <tt>adduser</tt>プログ
ラムを利用するよりも望ましいです。このスクリプトをあなたのシステムに合
わせて変更して使ってください。

<p>
<tt>useradd</tt>についてのより詳しい説明はオンラインマニュアルを参照し
てください。
 

<sect2><heading>usermod
<p>
<tt>usermod</tt>プログラムはユーザについての情報を変更するためのもので
す。オプションは<tt>useradd</tt>とほとんど同じです。

<p>
<tt>fred</tt>のシェルを変えようと思ったら、以下のような操作をします:
<tscreen><verb>usermod -s /bin/tcsh fred</verb></tscreen>
これによって、<tt>/etc/passwd</tt>の<tt>fred</tt>のエントリーは次のよ
うに変更されます:
<tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/tcsh</verb></tscreen>
次に、<tt>fred</tt>のアカウントの期限を 1997年9月15日に設定してみましょ
う:
<tscreen><verb>usermod -e 09/15/97 fred</verb></tscreen>
これで<tt>/etc/shadow</tt>の<tt>fred</tt>のエントリーは次のよ
うに変更されます:
<tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0</verb></tscreen>

<p>
<tt>usermod</tt>についてのより詳しい説明はオンラインマニュアルを参照し
てください。


<sect2><heading>userdel
<p>
<tt>userdel</tt>は名前の通り、ユーザのアカウントを抹消します。使い方は
単に
<tscreen><verb>userdel -r username</verb></tscreen>
と入力するだけです。
<tt>-r</tt>オプションをつけるとユーザのホームディレクトリを(ホームディ
レクトリそのものも含めて)消去します。異なるファイルシステム上にあるファ
イルは手作業で消去しなければなりません。

<p>
アカウントを消すのではなく、単にロックするだけの場合には 
<tt>passwd</tt>コマンドを使います。


<sect1><heading>passwd コマンドとパスワードの期限設定
<p>
<tt>passwd</tt>コマンドは普通のパスワード変更の機能を持っています。こ
れに加えて、ユーザ<em>root</em>で実行した場合には、以下のことができま
す。

<itemize>
<item>アカウントのロック及びその解除
(<tt>-l</tt> と <tt>-u</tt>)
<item>パスワードの最短有効期間の設定
(<tt>-x</tt>)
<item>パスワード変更までの最短日数の設定(<tt>-n</tt>)
<item>期限の切れるパスワードに対して何日前から警告するかの設定
(<tt>-w</tt>)
<item>パスワードの期限切れからアカウントのロックまでの日数の設定
is locked (<tt>-i</tt>)
<item>アカウント情報を清書して表示(<tt>-S</tt>)
</itemize>

<p>
例として、再びユーザ<tt>fred</tt>を見てみましょう。
<tscreen><verb>passwd -S fred
fred P 03/04/96 0 60 0 0</verb></tscreen>
これは、<tt>fred</tt>のパスワードは有効であること、前回の変更は1996年3
月4日であったこと、いつでも変更可能であること、60日後に期限切れになる
こと、fred には警告はなされないこと、パスワードが期限切れになってもア
カウントは無効とならないことを意味しています。

<p>
これは、パスワードが期限切れになってから<tt>fred</tt>がログインすると
新しいパスワードを要求するプロンプトが出てくるということです。

<p>
もし、<tt>fred</tt>のパスワードが期限切れになる14日前に警告を出し、期
限切れの14日後にはアカウントが停止となるようにするためには次のような命
令を与えます。
<tscreen><verb>passwd -w14 -i14 fred</verb></tscreen>
このとき、<tt>fred</tt>の情報は次のようになります。
<tscreen><verb>fred P 03/04/96 0 60 14 14</verb></tscreen>
詳細については<tt>passwd</tt>のオンラインマニュアルを参照してください。


<sect1><heading>login.defs ファイル
<p>
<tt>/etc/login</tt>ファイルは<tt>login</tt>プログラムと<em>Shadow
Suite</em>全体の設定ファイルです。
<p>

<tt>/etc/login</tt> ファイルはプロンプト表示から、ユーザがパスワード変
更をした時に標準のパスワード期限はどうなるかまでの幅広い設定を持ってい
ます。

<p>
<tt>/etc/login.defs</tt> 内に詳しいコメントがありますが、いくつか注意
すべき点があります。
<itemize>
<item>発生したロギングの量を決定するフラグ(on あるいは off にできる)を含む
<item>他の設定ファイルへのポインタを含む
<item>パスワードの aging などについての標準の設定を含む
</itemize>

<p>
これらのことから重要なファイルであることがわかると思います。ですから、
ファイルがそのものが存在することと正しい設定になっているかどうかを必ず
確認してください。


<sect1><heading>グループのパスワード
<p>
<tt>/etc/groups</tt>ファイルは特定のグループのメンバになるためのパスワー
ドを含むことがあります。この機能はコンパイル時に
<tt>/usr/src/shadow-YYMMDD/config.h</tt> ファイル内で 
定数<tt>SHADOWGRP</tt> を定義していれば有効になっています。

<p>
この定数を定義してコンパイルを行なったならば、<tt>/etc/gshadow</tt>ファ
イルを作り、グループのパスワード及びグループ管理者についての情報を保持
させなければなりません。

<p>
<tt>/etc/shadow</tt> ファイルを作った時には <tt>pwconv</tt>と呼ばれる
プログラムを使いましたが、<tt>/etc/gshadow</tt>に対してはこれに相当す
るものはありません。しかし、このファイルは特に編集する必要はないので問
題にはなりません。

<p>
最初に <tt>/etc/gshadow</tt> ファイルを作るためには以下の操作を行ない
ます。
<tscreen><verb>touch /etc/gshadow
chown root.root /etc/gshadow
chmod 700 /etc/gshadow</verb></tscreen>

<p>
新しいグループを作ると自動的に<tt>/etc/group</tt>及び
<tt>/etc/gshadow</tt>ファイルに追加されます。ユーザの追加や削除、グルー
プのパスワードの変更などの修正が行なわれた場合には 
<tt>/etc/gshadow</tt>ファイルも変更されます。

<p>
<em>Shadow Suite</em> に含まれるグループを変更するためのプログラムとし
て<tt>groups</tt>, <tt>groupadd</tt>, <tt>groupmod</tt>,
<tt>groupdel</tt>があります。

<p>
<tt>/etc/group</tt> ファイルのフォーマットは次のようになっています。
<tscreen><verb>groupname:!:GID:member,member,...</verb></tscreen>
各フィールドの内容は次のようになっています:
<descrip>
<tag/<tt>groupname</tt></tag> グループ名
<tag/<tt>!</tt></tag> 通常はパスワードを保持するフィールドであるが、
<em>Shadow Suite</em> ではパスワードは<tt>/etc/gshadow</tt> ファイルに
格納される
<tag/<tt>GID</tt></tag> グループID(数値)
<tag/<tt>member</tt></tag> グループのメンバのリスト
</descrip>

<p>
<tt>/etc/gshadow</tt> ファイルのフォーマットは次のようになります。
<tscreen><verb>groupname:password:admin,admin,...:member,member,...</verb></tscreen>
各フィールドの内容は以下のようになっています:
<descrip>
<tag/<tt>groupname</tt></tag> グループの名前
<tag/<tt>password</tt></tag> エンコードされたパスワード
<tag/<tt>admin</tt></tag> グループの管理者のリスト
<tag/<tt>member</tt></tag> グループのメンバのリスト
</descrip>

<p>
<tt>gpasswd</tt>コマンドはグループに対して管理者やユーザの追加及び削除
を行なう時にだけ使います。<tt>root</tt>やグループの管理者リストに入っ
ているユーザはグループのメンバの追加や削除を行なうことができます。

<p>
グループのパスワードは <em>root</em> かグループの管理者リストに入って
いるユーザが<tt>passwd</tt>コマンドを使用することで変更できます。

<p>
現在のところ、<tt>gpasswd</tt>コマンドのオンラインマニュアルはありませ
んが、パラメータなして<tt>gpasswd</tt>を実行することでオプション一覧を
確認することができます。ファイルのフォーマットと意味を理解していればコ
マンドがどのように動作するのかを把握することは簡単です。


<sect1><heading>一貫性をチェックするプログラム
<p>

<sect2><heading>pwck
<p>
プログラム<tt>pwck</tt>は<tt>/etc/passwd</tt>と<tt>/etc/shadow</tt>
の内容に一貫性があるかどうかを調べるためのものです。このプログラムはそ
れぞれのユーザ名について以下の項目を調べます:
<itemize>
<item>フィールドの数が正しいか
<item>同じ名前のユーザ名がいないか
<item>ユーザID、グループIDが正しいか
<item>primary グループが正しいか
<item>ホームディレクトリが正しいか
<item>ログインシェルが正しいか
</itemize>

<p>
また、パスワード無しのアカウントがあれば警告します。

<p>
<em>Shadow Suite</em>をインストールしたら、<tt>pwck</tt>を実行するとい
うのは良い考えです。定期的(たとえば毎月、毎週)に実行するのもいいでしょ
う。<tt>-r</tt>オプションを使えば、<tt>cron</tt>を使って定期的に実行さ
せ、結果をメールで報告させることができます。

<sect2><heading>grpck
<p>
<tt>grpck</tt> は<tt>/etc/group</tt> と <tt>/etc/gshadow</tt> の一貫性
を確認するプログラムです。このプログラムは以下のチェックを行ないます:
<itemize>
<item>フィールドの数が正しいか
<item>グループ名の重複がないか
<item>メンバーと管理者のリストが正しいか
</itemize>

<p>
<tt>pwck</tt>コマンド同様に、<tt>-r</tt> オプションを使って自動的に結
果報告をさせることができます。


<sect1><heading>ダイアルアップ・パスワード
<p>
ダイアルアップ・パスワードはダイアルインのアクセスを許可しているシステ
ムの、通常のパスワード認証とは別の防衛線です。ローカルあるいはネットワー
ク経由で接続できるユーザは多くいるけれどダイアルインで接続できるユーザ
は制限したい場合には、ダイアルアップ・パスワードが役に立ちます。ダイア
ルアップ・パスワードを有効にするには、<tt>/etc/login.defs</tt>を編集し、
<tt>DIALUPS_CHECK_ENAB</tt> を <tt>yes</tt> にします。

<p>
ダイアルアップについての設定は2つのファイルで行います。一つは
<tt>/etc/dialups</tt>で、tty の設定を記述します。(回線一つに対して一行
書き、デバイス名の最初の"/dev/"を取り除いたものを記述します。) tty が
書かれていれば、ダイアルアップの接続に対するチェックが行われます。

<p>
もう一つのファイルは <tt>/etc/d_passwd</tt> です。このファイルには適切
なシェルのパス名と追加のパスワードを記述します。

<p>
もし、<tt>/etc/dialups</tt>に書かれている回線からユーザがログインし、
<tt>/etc/d_passwd</tt> にこのユーザのログインシェルが書かれているなら
ば、正しいパスワードを入力することでアクセス許可を得ることができます。

<p>
ダイアルアップ・パスワードは回線に特定のタイプ(PPPやUUCPなど)の接続だ
けを許す場合にも有効に利用できます。ユーザが他のタイプの接続(例えばリ
ストに載っているシェルを使う)を行う場合にはこの回線のパスワードを知っ
ている必要があります。

<p>
ダイアルアップ・パスワードを使う前には、前述の設定ファイルを作成する必
要があります。

<p>
コマンド <tt>dpasswd</tt> を使って <tt>/etc/d_passwd</tt>ファイルのシェ
ルに対するパスワードを設定することができます。詳しくはオンラインマニュ
アルを参照してください。


<sect><heading>Cプログラムを Shadow Suite に対応させる方法<label id="sec-adding">
<p>
プログラムに shadow サポートを加えるのは実際にはとても簡単です。問題は 
<tt>/etc/shadow</tt> ファイルにアクセスするためにプログラムはroot権限
で実行するか、rootに SUID して実行しなければならないことです。

<p>
これは重大な問題です。SUID するプログラムを作る時には非常に慎重にプロ
グラムする必要があります。例えば、シェルにエスケープできるプログラムは
プログラムがrootに SUID されていてもrootとして実行してはなりません。

<p>
パスワードのチェックはするが、それ以外にはrootとして動作する必要がな
いような場合で shadow サポートをプログラムに追加する時は shadow グルー
プに SGID する方がずっと安全です。xlock プログラムはこのような例の典型
です。

<p>
以下で示す例の pppd-1.2.1d は既にrootに SUID されているので、shadow サ
ポートを加えることで、プログラムがセキュリティ的により脆弱になることは
もはやありません。


<sect1><heading>ヘッダファイル
<p>
ヘッダファイルは <tt>/usr/include/shadow</tt> ディレクトリ内にあるべき
です。<tt>/usr/include/shadow.h</tt> も必要ですが、これは 
<tt>/usr/include/shadow/shadow.h</tt> へのシンボリックリンクになります。

<p>
プログラムに shadow サポートを加えるためには次のヘッダファイルをインク
ルードする必要があります:
<verb>
#include <shadow/shadow.h>
#include <shadow/pwauth.h>
</verb>

<p>
shadow 用のコードを条件コンパイルで利用できるようにコンパイラ命令を用
いるのは良い考えです。(以下の例でもそうしています。)


<sect1><heading>libshadow.a ライブラリ
<p>
<em>Shadow Suite</em> をインストールする時には <tt>libshadow.a</tt> も
作成され、<tt>/usr/lib</tt> にインストールされます。

<p>
プログラムで shadow サポートするためには、リンカに 
<tt>libshadow.a</tt> をリンクするように指示する必要があります。

<p>
これは以下のように行います:
<tscreen><verb>gcc program.c -o program -lshadow</verb></tscreen>

<p>
しかし、以下の例でわかるように大規模なプログラムでは大抵
<tt>Makefile</tt> を使いますから、普通は <tt>LIBS</tt> 変数を変更しま
す。


<sect1><heading>Shadow 構造体
<p>
<tt>libshadow.a</tt> ライブラリは <tt>spwd</tt> と呼ばれる構造体に
<tt>/etc/shadow</tt> ファイルから取り出した情報を格納します。これは ヘッ
ダファイル <tt>/usr/include/shadow/shadow.h</tt> における 
<tt>spwd</tt> の定義です:

<code>
struct spwd
{
  char *sp_namp;                /* login name */
  char *sp_pwdp;                /* encrypted password */
  sptime sp_lstchg;             /* date of last change */
  sptime sp_min;                /* minimum number of days between changes */
  sptime sp_max;                /* maximum number of days between changes */
  sptime sp_warn;               /* number of days of warning before password
                                   expires */
  sptime sp_inact;              /* number of days after password expires
                                   until the account becomes unusable. */
  sptime sp_expire;             /* days since 1/1/70 until account expires
*/
  unsigned long sp_flag;        /* reserved for future use */
};
</code>

<p>
<em>Shadow Suite</em> では <tt>sp_pwdp</tt> に単なるエンコードされたパ
スワードだけでなく、それ以外の情報も持たせることができます。例えば、パ
スワードフィールドが以下のような行を含んでいる場合です:
<tscreen><verb>username:Npge08pfz4wuk;@/sbin/extra:9479:0:10000::::</verb></tscreen>

<p>
これで、パスワードに加えて<tt>/sbin/extra</tt> プログラムをさらなる認
証に用いることを指示しています。呼び出されたプログラムは、ユーザ名とな
ぜ呼び出されたかを示すスイッチを渡されます。より詳しい情報を得るためには 
<tt>/usr/include/shadow/pwauth.h</tt> とソースコードに含まれる 
<tt>pwauth.c</tt> を読んでください。

<p>
これが意味するところは、2次認証に注意することと、実際の認証を行う時に
は関数 <tt>pwauth</tt> を用いるべきだということです。以下の例題ではこ
れを実行しています。

<p>
現在存在しているプログラムのほとんどがこれを行っていないため、
<em>Shadow Suite</em>の作者は将来のバージョンではこの機能を無くすか仕
様を変更することを言っています。

<sect1><heading>Shadow サポートのための関数

<p>
<tt>shadow.h</tt> ファイルには <tt>libshadow.a</tt> ライブラリが含んで
いる関数の関数プロトタイプも書かれています:

<code>
extern void setspent __P ((void));
extern void endspent __P ((void));
extern struct spwd *sgetspent __P ((__const char *__string));
extern struct spwd *fgetspent __P ((FILE *__fp));
extern struct spwd *getspent __P ((void));
extern struct spwd *getspnam __P ((__const char *__name));
extern int putspent __P ((__const struct spwd *__sp, FILE *__fp));
</code>

<p>
これから例題で用いる関数は <tt>getspnam</tt> (与えられた名前に対応する 
<tt>spwd</tt> 構造体を与える)です。


<sect1><heading>例題
<p>
これはデフォルトで shadow サポートをしていないプログラムを shadow 対応
させる例です。

<p>
この例では <em>Point-to-Point プロトコルサーバ</em>(pppd-1.2.1d) を用
いています。このプログラムは <em>PAP</em> や <em>CHAP</em> ファイルで
なく <tt>/etc/passwd</tt> ファイルから得たユーザ名とパスワードを用いて 
<em>PAP</em> 認証を行うモードを持っています。既に pppd-2.2.0 で shadow 
サポートが行われているので、pppd-2.2.0 に対して例題のコードを追加する
必要はありません。

<p>
pppd のこの機能はあまり使わないものですが、<em>Shadow Suite</em> をイ
ンストールするとパスワードが <tt>/etc/passwd</tt> に保持されなくなるた
めに、この機能は全く使えなくなってしまいます。

<p>
<tt>pppd-1.2.1d</tt> のユーザ認証の部分のコードは 
<tt>/usr/src/pppd-1.2.1d/pppd/auth.c</tt> ファイルにあります。

<p>
以下のコードはコード内の他の <tt>#include</tt> 命令よりも前に加える必
要があります。条件命令で <tt>#include</tt> を囲んでいます(したがって
shadow サポートありでコンパイルする時だけインクルードされます)。

<p>
<code>
#ifdef HAS_SHADOW
#include <shadow.h>
#include <shadow/pwauth.h>
#endif
</code> 

<p>
次の部分は実際のコードに対する変更点です。<tt>auth.c</tt> ファイルに更
に変更を加えます。

<p>
変更前の <tt>auth.c</tt>:

<code>
/*
 * login - Check the user name and password against the system
 * password database, and login the user if OK.
 *
 * returns:
 *      UPAP_AUTHNAK: Login failed.
 *      UPAP_AUTHACK: Login succeeded.
 * In either case, msg points to an appropriate message.
 */
static int
login(user, passwd, msg, msglen)
    char *user;
    char *passwd;
    char **msg;
    int *msglen;
{
    struct passwd *pw;
    char *epasswd;
    char *tty;

    if ((pw = getpwnam(user)) == NULL) {
        return (UPAP_AUTHNAK);
    }
     /*
     * XXX If no passwd, let them login without one.
     */
    if (pw->pw_passwd == '\0') {
        return (UPAP_AUTHACK);
    }

    epasswd = crypt(passwd, pw->pw_passwd);
    if (strcmp(epasswd, pw->pw_passwd)) {
        return (UPAP_AUTHNAK);
    }

    syslog(LOG_INFO, "user %s logged in", user);

    /*
     * Write a wtmp entry for this user.
     */
    tty = strrchr(devname, '/');
    if (tty == NULL)
        tty = devname;
    else
        tty++;
    logwtmp(tty, user, "");             /* Add wtmp login entry */
    logged_in = TRUE;

    return (UPAP_AUTHACK);
}
</code>

<p>
ユーザのパスワードは <tt>pw->pw_passwd</tt> に代入されているので、ここ
で行う必要があるのは関数 <tt>getspnam</tt> を追加することです。この関
数はパスワードを <tt>spwd->sp_pwdp</tt> に代入します。

<p>
次に、実際の認証を行うために関数 <tt>pwauth</tt> を加えます。この関数
は shadow ファイルが2次認証をするように設定されている場合には、自動的
に2次認証を実行します。

<p>
shadow をサポートするように変更した後の<tt>auth.c</tt>:

<code>
/*
 * login - Check the user name and password against the system
 * password database, and login the user if OK.
 *
 * This function has been modified to support the Linux Shadow Password
 * Suite if USE_SHADOW is defined.
 *
 * returns:
 *      UPAP_AUTHNAK: Login failed.
 *      UPAP_AUTHACK: Login succeeded.
 * In either case, msg points to an appropriate message.
 */
static int
login(user, passwd, msg, msglen)
    char *user;
    char *passwd;
    char **msg;
    int *msglen;
{
    struct passwd *pw;
    char *epasswd;
    char *tty;

#ifdef USE_SHADOW
    struct spwd *spwd;
    struct spwd *getspnam();
#endif

    if ((pw = getpwnam(user)) == NULL) {
        return (UPAP_AUTHNAK);
    }

#ifdef USE_SHADOW
        spwd = getspnam(user);
        if (spwd)
                pw->pw_passwd = spwd->sp-pwdp;
#endif
 
     /*
     * XXX If no passwd, let NOT them login without one.
     */
    if (pw->pw_passwd == '\0') {
        return (UPAP_AUTHNAK);
    }
#ifdef HAS_SHADOW
    if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
         && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
        || !valid (passwd, pw)) {
        return (UPAP_AUTHNAK);
    }
#else
    epasswd = crypt(passwd, pw->pw_passwd);
    if (strcmp(epasswd, pw->pw_passwd)) {
        return (UPAP_AUTHNAK);
    }
#endif

    syslog(LOG_INFO, "user %s logged in", user);

    /*
     * Write a wtmp entry for this user.
     */
    tty = strrchr(devname, '/');
    if (tty == NULL)
        tty = devname;
    else
        tty++;
    logwtmp(tty, user, "");             /* Add wtmp login entry */
    logged_in = TRUE;

    return (UPAP_AUTHACK);
}
</code>
<p>
注意深く調べれば、他にも変更点があることがわかります。オリジナルのバー
ジョンでは<tt>/etc/passwd</tt>ファイル内にパスワードがない場合にはアク
セスを許します。(UPAP_AUTHACK を戻し値にする。)これはあまり良くないこ
とです。普通のログインでは PPP プロセスへのアクセスを許す時に一つのア
カウントを用い、それから <tt>/etc/passwd</tt> ファイルのユーザ名と 
<tt>/etc/shadow</tt>ファイルのパスワードを利用して、入力されたユーザ名
とパスワードに対して PAP 認証を行うからです。

<p>
だから、もし元のバージョンをユーザ(例えば ppp)のシェルとして走らせると、
ユーザ <tt>ppp</tt> で空パスワードにして PAP を設定しても誰も PPP 接続
を得ることができなくなります。

<p>
パスワードが空の時には <tt>UPAP_AUTHNAK</tt> でなく 
<tt>UPAP_AUTHACK</tt>を戻し値とするようにすることでも修正できます。

<p>
面白いことに、<tt>pppd-2.2.0</tt> にも同じ問題があります。

<p>
次に、以下の2点について Makefile を修正する必要があります:
<tt>USE_SHADOW</tt> を定義することと、<tt>libshadow.a</tt> をリンク
するようにすることです。

<p>
Makefile を編集して、次の行を加えてください:
<tscreen><verb>LIBS = -lshadow
</verb></tscreen>

<p>
それから、次の行を見つけて:
<tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t
</verb></tscreen>

<p>
以下のように変更してください:
<tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW
</verb></tscreen>

<p>
最後に、コンパイル及びインストールを実行しましょう。


<sect><heading>よく聞かれる質問(Frequently Asked Questions).
<p>
<em>Q:</em> <tt>/etc/securettys</tt> ファイルを使って <em>root</em>が
ログインできる tty を制御しようとしているのですが、うまくいきません。

<p>
<em>A:</em> <tt>/etc/securettys</tt> は <em>Shadow Suite</em>がインス
トールされた後には全く意味を持ちません。<em>root</em>が利用できる tty 
を記述する設定ファイルは <tt>/etc/login.defs</tt>になります。このファ
イル内で他のファイルを指定することもあります。

<p>
<em>Q:</em> <em>Shadow Suite</em>をインストールしたのですが、ログイン
ができなくなってしまいました。何が悪いのでしょう？

<p>
<em>A:</em> おそらく<em>Shadow Suite</em>のプログラムはインストールし
たけれど、<tt>pwconv</tt>を実行していないか、<tt>/etc/npasswd</tt>を
<tt>/etc/passwd</tt>に、<tt>/etc/nshadow</tt>を<tt>/etc/shadow</tt>に
それぞれコピーするのを忘れるかしたのでしょう。<tt>login.defs</tt>を
<tt>/etc</tt>にコピーしていないのかもしれません。

<p>
<em>Q:</em>xlock の章で <tt>/etc/shadow</tt>ファイルの所有グループを
<tt>shadow</tt>にせよとありましたが、そのようなグループはありません。
どうしたら良いのでしょうか？

<p>
<em>A:</em>グループを追加しましょう。単に<tt>/etc/group</tt>ファイルを
編集して、shadow グループについての記述を加えるだけです。グループIDが
他と重複しないようにする点と、<tt>nogroup</tt>のエントリーより前に追加
する点には注意してください。単純に <tt>xlock</tt>を root に SUID する
という方法もあります。

<p>
<em>Q:</em> Linux 版 Shadow Suite についてのメーリングリストはあります
か？

<p>
<em>A:</em> あります。しかし、これは次のバージョンの Linux版Shadow
Suite の開発とβテストのためのものです。
<tt>shadow-list-request@neptune.cin.net</tt>宛にサブジェクトが
<tt>subscribe</tt>であるメールを送ることでメーリングリストに参加できま
す。このメーリングリストは Linux版<tt>shadow-YYMMSS</tt>についての議論
を行う場所です。開発に加わりたいか Shadow Suite をインストールしたので
新しいリリースについての情報を得たい場合には参加すると良いでしょう。

<p>
<em>Q:</em><em>Shadow Suite</em>をインストールしましたが、
<tt>userdel</tt>コマンドを実行すると"userdel: cannot open shadow group
file"というエラーが出ます。何がおかしいのでしょう？

<p>
<em>A:</em> <em>Shadow Suite</em> を<tt>SHADOWGRP</tt>オプションを有効
にしてコンパイルしたのに、<tt>/etc/gshadow</tt>ファイルがないのでしょ
う。<tt>config.h</tt>を修正して再コンパイルするか、<tt>/etc/group</tt>
ファイルを作りましょう。shadow グループの説明の章も確認しましょう。

<p>
<em>Q:</em> <em>Shadow Suite</em>をインストールしましたが、
<tt>/etc/passwd</tt>に暗号化されたパスワードが書かれてしまいます。
どうしてですか？

<p>
<em>A:</em>おそらく<tt>config.h</tt>ファイル内の<tt>AUTOSHADOW</tt>オ
プションを有効にしてコンパイルしたか、あなたの使っている<tt>libc</tt>
が<tt>SAHDOW_COMPAT</tt>オプションを有効にしてコンパイルされているかで
す。どちらが原因か確認して該当する方を再コンパイルしましょう。


<sect><heading>Copyright Message(著作権表示)

<p>
The Linux Shadow Password HOWTO is Copyright (c) 1996 Michael H. Jackson.
<p>
Permission is granted to make and distribute verbatim copies of
this document provided the copyright notice and this permission notice
are preserved on all copies.
<p>
Permission is granted to copy and distribute modified versions of this
document under the conditions for verbatim copies above, provided a notice
clearly stating that the document is a modified version is also included in
the modified document.
<p>
Permission is granted to copy and distribute translations of this document
into another language, under the conditions specified above for modified
versions.
<p>
Permission is granted to convert this document into another media under
the conditions specified above for modified versions provided the requirement
to acknowledge the source document is fulfilled by inclusion of an obvious
reference to the source document in the new media. Where there is any
doubt as to what defines 'obvious' the copyright owner reserves the right
to decide.

<em>注意</em>: 以下の和訳はあくまで参考です。著作権については原文の表
示に従ってください。

The Linux Shadow Password HOWTO は Michael H. Jackson の著作物です。
(Copyright (c) 1996 Michael H. Jackson)

著作権表示及びこの許諾表示を全てのコピーに残すことを条件に、この文書を
改変せずに複写及び配布することが可能です。

上記の条件を改変しないこと及び文書が改変されていること明記することを条
件に、この文書を改変したものを複写及び配布することが可能です。

上述の改変された文書に対する条件と同じ条件で、この文書を他の言語に翻訳
したものを複写及び配布することが可能です。

上述の改変された文書に対する条件に加え、新しいメディア内に元の文書への
明白な参照が含まれることで元の文書であることを主張する要求が果たされる
ことを条件に、この文書を他のメディアで配布することが可能です。
「明白に」の定義がはっきりしない場合には著作権者が決定する権利を保留し
ているものとします。


<sect><heading>その他 / 謝辞

<p>
例題の <tt>auth.c</tt> に対してのコードは pppd-1.2.1d と ppp-2.1.0e か
ら引用しました。これらのソフトウェアは Australian National University 
及び Carnegie Mellon University の著作物です。
(Copyright (c) 1993 and The Australian National University and
Copyright (c) 1989 Carnegie Mellon University)

<p>
Thanks to Marek Michalkiewicz &lt;marekm@i17linuxb.ists.pwr.wroc.pl> for
writing and maintaining the <em>Shadow Suite</em> for Linux, and for his
review and comments on this document.

<em>Shadow Suite</em>の作者/管理者であり、また、この文書を見てコメント
を下さった Marek Michalkiewicz 氏
&lt;marekm@i17linuxb.ists.pwr.wroc.pl&gt;
に感謝します。

<p>
この文書の批評及びテストを行って下さった
Ron Tidd 氏&lt;rtidd@tscnet.com&gt; に感謝します。

<p>
筆者にフィードバックを送り、この文書の改良に協力してくださった皆様に感
謝します。

<p>
コメントや提案があればどうか筆者にメールで知らせてください。

<p>
<htmlurl url="mailto:mhjack@tscnet.com" 
name="Michael H. Jackson &lt;mhjack@tscnet.com&gt;">


<sect><heading>訳者より
<p>
翻訳の配布条件は原文に従うものとします。また翻訳の内容については訳者
は一切の責任を持てませんので、皆さんの責任で利用してください。

誤訳などの指摘や訳に対するコメントをお待ちしています。
お気軽にメールください。

<htmlurl url="mailto:fujiwara@linux.or.jp"
name="藤原輝嘉 &lt;fujiwara@linux.or.jp&gt;">

</article>
