Linux Shadow Password HOWTO Michael H. Jackson, mhjack@tscnet.com v1.3, 1996年4月3日 藤原輝嘉, fujiwara@linux.or.jp この文書は Linux のパスワードを shadow 化する Shadow Suit の入手、イン ストール及び設定の方法について説明するものです。また、ユーザのパスワー ド認証を行うソフトウェアやデーモンの(再)インストールについても解説しま す。これらのプログラムは Shadow Suit の一部ではありませんが、Shadow Suit をサポートするためには再コンパイルする必要があります。また、この 文書には shadow パスワードをサポートするプログラムの例も書いてありま す。将来の改定ではよく聞かれる質問への回答もさらに加えるつもりです。 ______________________________________________________________________ 目次 1. はじめに 1.1 以前の版からの変更点 1.2 この文書の最新版について 1.3 フィードバック 2. shadow パスワードを使うべき理由 2.1 shadow パスワードを使わないほうが良い場合 2.2 /etc/passwd ファイルのフォーマット 2.3 shadow ファイルのフォーマット 2.4 crypt(3) の概要 3. Shadow Suite の入手 3.1 Linux 用の Shadow Suite の歴史 3.2 Shadow Suite の入手 3.3 Shadow Suite には何が含まれているか 4. プログラムのコンパイル 4.1 アーカイブの展開 4.2 config.h による設定 4.3 元のプログラムのバックアップの作成 4.4 Make の実行 5. インストール 5.1 システム破壊に備えてのブートディスク作成 5.2 重複するオンラインマニュアルの削除 5.3 make install の実行 5.4 pwconv の実行 5.5 npasswd と nshadow のリネーム 6. アップグレードするかパッチを当てる必要があるプログラム 6.1 Slackware adduser program 6.2 wu_ftpd サーバ 6.3 標準の ftpd 6.4 pop3d (Post Office Protocol 3) 6.5 xlock 6.6 xdm 6.7 sudo 6.8 imapd (E-Mail (Fpine パッケージ]) (PHR(Pimapd は pop3d のようなメールサーバです。 imapd は pine E-mail パッケージに付属しています。パッ ケージに付属するドキュメントには Linux システムに対する標準設定で shadow をサポートしていると書かれています。しかし、これは正しくない記 述です。さらに、このパッケージでは実行ファイル生成スクリプトと Makefile の組合せが必要で、コンパイル時にlibshadow.aを加える ことがが難しいのです。そういうわけで、私はまだ imapd が shadow サポートするようにはできていません。)P(P)P(Pもし成功した人がいましたら、筆者のところにメールで知らせてください。この 項目に加えたいと思います。)P(P)P(P(SECT1(HEADINGpppd (PPP プロトコルサーバ) 7. Shadow Suite を使ってみる 7.1 ユーザの追加、変更、削除 7.1.1 useradd 7.1.2 usermod 7.1.3 userdel 7.2 passwd コマンドとパスワードの期限設定 7.3 login.defs ファイル 7.4 グループのパスワード 7.5 一貫性をチェックするプログラム 7.5.1 pwck 7.5.2 grpck 7.6 ダイアルアップ・パスワード 8. Cプログラムを Shadow Suite に対応させる方法 8.1 ヘッダファイル 8.2 libshadow.a ライブラリ 8.3 Shadow 構造体 8.4 Shadow サポートのための関数 8.5 例題 9. よく聞かれる質問(Frequently Asked Questions). 10. Copyright Message(著作権表示) 11. その他 / 謝辞 12. 訳者より ______________________________________________________________________ 1. はじめに この文書は Linux Shadow-Password-HOWTO です。この文書は Linux システム になぜ shadow パスワードを導入するのか、またどのように導入するのかを説 明します。Shadow Suite の機能の利用法についての説明もあります。 Shadow Suite をインストールする時や、ユーティリティを使う時には root でなければなりません。Shadow Suite をインストールする際にはシステムの 基幹ソフトウェアの変更が行われるので、後で説明するようにバックアップを 取るべきです。また作業を始める前には、これから行う説明をすべて読み、理 解しておくべきでしょう。 1.1. 以前の版からの変更点 追加: shadow パスワードをインストールしないほうがよい場合についての節を追加 xdm の更新についての節を追加 Shadwo Sutie の動作のさせかたについての章を追加 よく聞かれる質問についての章を追加 訂正/更新: Sunsite の html への参照を訂正 wu-ftp の章で Makefile に -lshadow を Makefile に加えるよう訂正 誤字脱字の訂正 wu-ftp の章で ELF をサポートするよう変更 プログラム'login'でおこるセキュリティ上の問題を更新 Marek Michalkiewicz 氏による Linux Shadow Suite を推奨するよう更新 1.2. この文書の最新版について この文書の最新版は以下のサイトから anonymous FTP で入手できます: sunsite.unc.edu /pub/Linux/docs/HOWTO/Shadow-Password-HOWTO あるいは: /pub/Linux/docs/HOWTO/other-formats/Shadow-Password-HOWTO{-html.tar,ps,dvi}.gz あるいは、WWW を利用して、 Linux Documentation Project Web Server の Shadow-Password-HOWTO のペー ジから入手することもできます。 また、筆者() から直接入手することもできますし、 comp.os.linux.answers ニュースグループにも投稿されます。 この文書は現在は Shadow-YYDDMM パッケージにも含まれるようになりまし た。 訳注: 日本語訳の最新版については WWWが利用できるならば JF-INDEX から、 ftp が利用できるならば jf.linux.or.jp の/Linux/JF/ディレクトリなどから 入手できます。 1.3. フィードバック コメントや訂正、提案などは筆者(Michael H. Jackson )に送って下さい。早くフィードバックを得られれば、そ れだけ早くこの文書を直すことができます。あまりネットニュースは見ていな いので、不具合を見つけた場合には直接メールを送って下さい。 2. shadow パスワードを使うべき理由 現在はほとんどの Linux のパッケージでは Shadow Suite は標準ではインス トールされません。Slackware 2.3, Slackware 3.0 や他のポピュラーなパッ ケージでそうなっています。この理由の一つはオリジナルの Shadow Suite の 著作権表示は、無料配布でない場合について不明確だからです。Linux は CD- ROM のような配布に便利なメディアへパッケージ化し、これに対する報酬を受 け取ることが行いやすい GNU Copyright (Copyleft とも言われますが)を採用 しています。 現在Shadow Suiteをメンテナンスしている, Marek Michalkiewicz 氏は元の作者から、再配布のできる BSD スタイルの著作権のもとにソースコードを受け取っています。現在は著作 権の問題は解決しているので、将来は標準で Linux のパッケージに Shadow Suite が含まれることになるでしょう。それまでは、ユーザが自分自身でイン ストールしなければなりません。 パッケージを CD-ROM からインストールする場合には、パッケージ自体は Shadow Suite をインストールしなくても、Shadow Suite のインストールに必 要なファイルは CD-ROM に含まれていることがあります。 しかし、バージョン3.3.1, 3.3.1-2の Shadow Suite と shadow-mk では login プログラムとroot に suid されたプログラムでセキュリティ上の問題 を起こします。ですから、これらを使ってはいけません。 必要なファイルは anonymous FTP や WWW を利用して入手することができま す。 Shadow Suite がインストールされていない Linux システムではパスワードを 含めたユーザ情報は /etc/passwd ファイルに記録されています。もちろん、 パスワードは暗号化された状態で記録されています。しかし、暗号の専門家に 言わせるとこれは暗号化(encrypt)ではなくエンコード(encode)に過ぎないそ うです。crypt(3) を用いる場合の文字列が空であればパスワードはキーに なってしまうからです。この理由から、これ以降の文書中では'暗号化'ではな く 'エンコード'の語を用います。 ここでパスワードをエンコードするために用いられるアルゴリズムは、技術的 には単方向のハッシュ関数と言われるものです。これは、ある方向には計算し やすいけれど、その逆方向の計算は非常に難しいというアルゴリズムです。実 際のアルゴリズムについてのより詳しい説明は 2.4節か crypt(3) のマニュア ルを参照して下さい。 ユーザがあるパスワードを決めた場合、このパスワードはランダムに決められ た salt と呼ばれる値を用いてエンコードされます。こうすることで一つの文 字列がエンコードされた結果として取りうる結果は 4096 通りになりま す。salt の値はエンコードされたパスワードと一緒に記録されます。 ユーザがログイン時にパスワードを入力すると、まず salt がエンコードされ ているパスワードから取り出されます。そして、入力されたパスワードを salt を用いてエンコードしてその結果をエンコードされた文字列と比較しま す。これが一致した場合に正しいユーザとして認証します。 ランダムにエンコードされたパスワードを入手し、元のパスワードを復元する ことは計算の点から困難です(不可能ではない)。しかし、複数以上の人が使う システムでは少なからずのパスワードはありふれた単語(あるいはありふれた 単語を少し変えただけのもの)になっています。 クラッカーはこのような事情をよく知っているので 4096 個全ての salt を用 いて辞書の単語とよく使われそうなパスワードをあらかじめエンコードしてお きます。そして、/etc/passwd に書かれているエンコードしたパスワードをこ の結果と比較します。ここで一致するものが見つかれば、クラッカーは他人の パスワードを破ったことになるわけです。これは「辞書攻撃」と呼ばれるもの で、正規の認証を受けずにシステムにアクセスするための常套手段です。 ある 8 文字からなるパスワードは 、13 文字から成る 4096 通りの文字列の どれかにエンコードされます。したがって、基本語や固有名詞とそれに簡単な 変化をつけたものを集めて作った400,000 語程度の辞書は 4GB のハードディ スクに十分収まるくらいの大きさです。クラッカーはこれらをソートしてお き、 /etc/passwd の文字列と一致するかどうかを調べるだけでよいので す。4GB のハードディスクは 1,000 ドル以下で買えるくらいですから、大抵 のクラッカーは持っていると考えるべきです。 また、クラッカーが最初にあなたの /etc/passwd ファイルを手に入れた場合 にはクラッカーはこのファイルに含まれているsaltを使って辞書をエンコード してゆけばよいだけになってしまいます。ディスク数百メガバイトと486クラ スのCPUを持つマシンがあれば、この程度のことは子供でもできてしまいま す。 大量のディスクがなくても crack(1) のようなユーティリティを用いれば、あ る程度以上の数のユーザがいるシステムの少なくとも一つはパスワードを破る ことができます。(ユーザは自分で各自のパスワードを決めるものとします。) /etc/passwd ファイルには多くのシステムプログラムが使うユーザ ID やグル ープID のような情報が書かれています。従って、このファイルは世界中から アクセスできなければなりません。例えば、 /etc/passwd ファイルを誰も読 めないようにしてしまったら、て驚くはめになるでしょう。 Shadow Suite はパスワードを別の場所に移すことでこの問題を解決します(通 常は /etc/shadow)。このファイルは誰も読めないように設定されま す。rootだけが /etc/shadow ファイルを読み書きできます。いくつかのプロ グラム(xlock など)は /etc/shadow を変更はできなくてもいいですが、パス ワードの確認は行う必要があります。このようなプログラムは root に SUID するか、shadow グループに属する必要があります。パスワードを確認するた めだけに root に SUID するよりは、shadow に SGID する方が良い考えと言 えます。 パスワードを /etc/shadow に移動させることによって、クラッカーがエンコ ードされたパスワードにアクセスして辞書攻撃に利用することを防げます。 加えて、Shadow Suite は以下のような特長を持っています: o ログイン時のデフォルトを設定するコンフィグレーションファイ ル(/etc/login.defs) o ユーザアカウントやグループを追加、修正、削除するためのユーティリ ティ o 古いパスワードのチェックや期限設定 o アカウントの期限設定とロッキング o 倍長パスワード (16文字のパスワード) 推奨しません] o ユーザのパスワード決定を制御しやすい o ダイアルアップ・パスワード o 2次認証プログラム [推奨しません] Shadow Suit をインストールすることでシステムのセキュリティを強化するこ とができますが、Linux システムのセキュリティをより強化するためには、他 にもやるべきことは数多くあります。セキュリティ強化の方法とセキュリティ に関係する話題について解説する Linux Security HOWTO シリーズがそのうち できることでしょう。 既知のセキュリティホールについての警告など、 Linux のセキュリティにつ いての最新の情報を得るためにはLinux Security ホームページ を参照して下さい。 2.1. shadow パスワードを使わないほうが良い場合 Shadow Suiteをインストールすることがかならずしも良いことではない環境や システム構成もあります。 o システムにユーザアカウントがない場合。 o コンピュータが LAN に繋がっていて、ユーザ名やパスワードは NIS (Network Information Services) 経由でネットワーク上の他のマシンから 得ている場合。(これは本文書の範囲を外れている点と、あまりセキュリ ティ向上は望めないので説明しません) o システムが NFS (Network File System)や NIS などを用いてユーザ認証を するためにターミナルサーバによって利用される場合 o ユーザ認証はするが、shadow パスワードに対応しておらず、ソースコード も無いソフトウェアを使わなければならない場合 2.2. /etc/passwd ファイルのフォーマット shadow 化されていない /etc/passwd ファイルは以下のようなフォーマットに なっています: username:passwd:UID:GID:full_name:directory:shell ここで、 username ユーザのログインネーム passwd エンコードされたパスワード UID ユーザ ID (数値) GID デフォルトのグループ ID (数値) full_name ユーザの本名。実際にはこのフィールドは GECOS (General Electric Comprehensive Operating System) フィールドと呼ばれ、ユーザの本名 以外の情報も保持できます。Shadow Suite のコマンドおよびオンライ ンマニュアルではコメントフィールドとして記述されています。 directory ユーザのホームディレクトリ shell ユーザのログインシェル(絶対パス記述) 例えば次のようになります: username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh ここで、第2フィールドの Np は salt で、ge08pfz4wuk はエンコードされた パスワードです。同じパスワードでも、salt/パスワードの組み合わせは kbe- MVnZM0oL7I のようになる場合もあります。ある一つのパスワードに関してエ ンコードされ得る可能性は 4096通りです。(この例で用いた 'password' とい うパスワードは破られやすい点において非常に悪いパスワードです。) Shadow suite がインストールされると、/etc/passwd ファイルは以下のよう になります: username:x:503:100:FullName:/home/username:/bin/sh この場合の2番目のフィールドの 'x' は単に場所を埋めているだけです。エン コードされたパスワードは含まれなくなりますが、 /etc/passwd ファイルの フォーマット自体は変わりません。従って、 /etc/passwd ファイルを読むけ れどパスワード認証は行わないプログラムは以前の通りに動作します。 パスワードは shadow ファイル(通常 /etc/shadow) に移されます。 2.3. shadow ファイルのフォーマット /etc/shadowファイルには以下のような情報が記述されています: username:passwd:last:may:must:warn:expire:disable:reserved 内容は以下のような意味を持ちます: username ユーザ名 passwd エンコードされたパスワード last 1970年1月1日から、パスワードが最後に更新された日までの日数 may 何日前にパスワードが変更されたと思われるか must パスワードを変更しなければならない期限 warn パスワードの期限切れの何日前にユーザに警告するか expire パスワード期限切れの何日後にアカウントを抹消するか disable 1970年1月1日から、アカウントが抹消された日までの日数 reserved 予約フィールド さきほどと同じ例では /etc/shadow はこのようになります: username:Npge08pfz4wuk:9479:0:10000:::: 2.4. crypt(3) の概要 crypt(3) のオンラインマニュアルより: "cryptはパスワードの暗号化関数である。これは Data Encryption Standard (DES) のアルゴリズムに、特にキー検索のハードウェア実装をしにくくするこ とを特に意図した変化をつけたものに基づいている。 キーはユーザの入力したパスワードである。 [エンコードされた文字列はすべ てNULLである。] salt は [a-zA-Z0-9./] の中から2文字を選んだ文字列である。この文字列は アルゴリズムの中で4096通りの異なる結果から一つを適当に選び出すために用 いられる。 キーの各文字の下位7ビットを取り出すことで 56ビットのキーが得られる。こ の56ビットのキーは定数文字列(通常は全て0の文字列を含む)を繰り返し暗号 化するために用いられる。戻し値は暗号化されたパスワードへのポインタであ り、このパスワードは13文字の ASCII 文字である(最初の2文字はsaltそのも のである)。戻し値のポインタが指す領域は呼び出しごとに上書きされる静的 なデータである。 警告:キー空間は 2の56乗(=7.2e16)個の値を取ることができる。このキー空間 は大量の並列計算機を用いれば全探索することが可能である。また、crack(1) のようなソフトウェアは人間がパスワードに用いそうな単語が作るキー空間の 部分空間に絞って検索を行う。従って、パスワードの選択ではありふれた単語 や名前の使用は避けるべきである。パスワードを決める際には破られやすいパ スワードのチェックを行う passwd(1) プログラムを利用すると良いだろう。 DES アルゴリズム自体には癖があるので、crypt(3)のインタフェースはパスワ ード認証の他に使うべきではない。crypt(3)のインタフェースを暗号そのもの に関わるプロジェクトに利用してはならない。このような場合には、暗号化に ついて書いてある良い本と広く利用することができる DES ライブラリを入手 するべきである。" ほとんどの Shadow Suites パッケージにはパスワードを16文字に倍長化する コードが含まれています。しかしDESの専門家はこれを推奨していません。パ スワードの長さが倍でも、最初に左半分をエンコードして、次に右半分をエン コードしているだけだからです。これはcryptの動作のためであり、始めから 倍長パスワードが使われていなかった場合と比べても、より脆弱なパスワード を作ってしまいます。また、ユーザに16 文字のパスワードを覚えてもらうこ とは困難であるという理由もあります。 cryptに代るもので、より安全で長いパスワードをサポートし(特に MD5 アル ゴリズム)、さらにcryptとの互換性を保持しているような認証アルゴリズムを 開発しようとしているプロジェクトがあります。 もし、読者が暗号化についての良い本を探しているなら、筆者は以下の本を推 薦しておきます: "Applied Cryptography: Protocols, Algorithms, and Source Code in C" by Bruce Schneier ISBN: 0-471-59756-2 3. Shadow Suite の入手 3.1. Linux 用の Shadow Suite の歴史 セキュリティ上の問題があるので、この節で述べる古いパッケージを使っては いけません。 オリジナルの Shadow Suite は John F. Haugh II氏によって作成されまし た。 Linux システム上で用いられてきたバージョンはいくつかあります: o shadow-3.3.1 はオリジナルです。 o shadow-3.3.1-2 は Florian La Roche 氏によって 書かれた Linux 専用のパッチで、独自の拡張もしています。 o shadow-mk Linux 専用のパッケージです。 shadow-mkパッケージは John F. Haugh II 氏が配布している shadow-3.3.1 パッケージに shadow-3.3.1-2 へのパッチ、 Mohan Kokal 氏によってなされたインストールを簡単にするための修 正、Joseph R.M. Zbiciak 氏による /bin/login の -f, -h のオプション時の 動作についてのセキュリティホールを塞ぐための login1.c (login.secure) に対するパッチ及びその他いくつかの変更を加えたものです。 shadow.mkパッケージは 以前は推奨されていましたが、 loginプログラムのセ キュリティ上の問題があるので使うべきではないでしょう。 バージョン 3.3.1, 3.3.1-2 の Shadow と shadow-mk ではloginプログラムに セキュリティ上の問題があります。このlogin のバグはログイン名の長さを チェックしないというものです。これによりバッファがオーバーフローしてプ ログラムが異常動作してしまいます。システム上にアカウントを持っている人 間は、このバグと共有ライブラリを使って root の権限を手に入れることがで きるという噂が流れました。私はこれについて詳しい話をするつもりはありま せん。影響をうける Linux システムは多いけれど、これらのShadow Suites をインストールした Linux システムや初期バージョンの ELF 版パッケージの システムでShadow Suitesをインストールしていないものは危険にさらされる からです。 この話題や、その他の Linux のセキュリティについての情報を得るために は、 Linux Security ホームページ (共有ライブラリとloginプログラム の脆 弱性) を見るとよいでしょう。 3.2. Shadow Suite の入手 現在推奨される唯一の Shadow Suite はまだβバージョンですが、最新のもの は作っている環境では安全であり、危険な loginプログラムも含んでいませ ん。 パッケージは以下の名前付けの規則を使っています: shadow-YYMMDD.tar.gz は、Shadow Suite の YY年MM月DD日 公開した版であることを意味します。 このバージョンは現在βテスト中であり、やがてバージョン 3.3.3 になるで しょう。今はMarek Michalkiewicz 氏 によってメンテナンスされており、 shadow-current.tar.gz から入手可能です。 また、以下のミラーサイトもあります: o ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz o ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz o ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz o ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz 現在利用できる最新版を利用しましょう。 shadow-960129より古いバージョンのものは先程述べたように loginプログラ ムに問題があるので使ってはいけません。 この文書中で Shadow Suite と書く時は、このパッケージについて記述してい るものとします。また、あなたが使うパッケージもこれであるものと仮定しま す。 参考のために、shadow-960129 に基づいてインストールの手順を作成しまし た。 もしあなたが現在shadow-mkを使っているならば、すべて再構築してこのバー ジョンにアップグレードするべきでしょう。 3.3. Shadow Suite には何が含まれているか Shadow Suiteは以下のコマンドを置き換えます: su, login, passwd, newgrp, chfn, chsh, and id また、パッケージには以下の新しいプログラムが含まれています: chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod, groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv, and pwunconv 加えて、パスワードにアクセスする必要があるプログラムを作るためのライブ ラリ libshadow.a が含まれています。 そして、プログラムのオンラインマニュアルも含まれています。 /etc/login.defs としてインストールされる、login プログラムの設定ファイ ルも含まれています。 4. プログラムのコンパイル 4.1. アーカイブの展開 パッケージを入手した後の最初の作業はこれを展開することです。パッケージ は tar (Tape ARchive) でまとめた後に gzip で圧縮してあるので、まずパッ ケージを /usr/src に移動させてから次のように入力して下さい: tar -xzvf shadow-current.tar.gz この操作でパッケージは /usr/src/shadow-YYMMDD というディレクトリに展開 されます。 4.2. config.h による設定 まず最初に行なうことはMakefileとconfig.hの2つを上書きコピーすることで す: cd /usr/src/shadow-YYMMDD cp Makefile.linux Makefile cp config.h.linux config.h まず config.h ファイルを見てください。このファイルには設定オプションの 定義が書かれています。もし、あなたが推奨されているパッケージを用いてい る場合には、まずグループのshadowサポートをまず無効にしましょう。 標準ではグループのパスワードは有効になっています。これを無効にするため にはconfig.hを編集し、#define SHADOWGRP を #undef SHADOWGRP に変更しま す。とりあえずはこれを無効にしておき、あとで本当にグループのパスワード やグループの管理者が必要となった時に Shadow Suite を再コンパイルするべ きでしょう。もし有効なままにしておくのならば、/etc/gshadow ファイルを 作らなければなりません。 倍長パスワードを有効にすることは前に述べた理由のため、推奨しません。 #undef AUTOSHADOW の設定は絶対に変更してはいけません。 AUTOSHADOW オプションは shadow を理解できないプログラムも機能するよう にするために設計されたものです。これは良いことのように思えますが、きち んと動きません。このオプションを有効にし、root でプログラムを実行する と、 getpwnam() 関数を呼び出された場合には変更されたエントリーを /etc/passwd ファイルに書き戻してしまいます。 (もはやshadow 化されたパ スワードなくなってしまう) chfn や chsh がこれに該当するプログラムで す。getpwnam()を呼び出す前に真のUIDと実効UIDをうまく切替えることで回避 するという方法は使えません。 chfn や chsh は root 権限で動作するからで す。 libc には同じ意味を持つ SHADOW_COMPAT オプションがありますが、同じ注意 が libc を作る際にも当てはまります。使うべきではありません! もし/etc/passwdファイルにエンコードされたパスワードが現われるようなら ば問題です。 もし4.6.27 以前のバージョンのlibcを使っているなら、 config.hとMakefileをそれぞれ変更する必要があります。 config.h は以下の 部分を: #define HAVE_BASENAME このように変更してください: #undef HAVE_BASENAME Makefile についても同様です: 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 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 libc 4.6.27 以降ではこれらの変更はbasename.cに対して行われています。 4.3. 元のプログラムのバックアップの作成 Shadow Suite が置き換えてしまうプログラムをあらかじめ確認しておき、 バックアップを取っておくのは良い考えです。Slackware 3.0 パッケージでは 以下のファイルが該当します: o /bin/su o /bin/login o /usr/bin/passwd o /usr/bin/newgrp o /usr/bin/chfn o /usr/bin/chsh o /usr/bin/id β版パッケージには Makefile 中にsave というターゲットがありますが、コ メントアウトされています。パッケージが異なればプログラムの置き場所も異 なるからです。 /etc/passwdファイルのバックアップも取っておいたほうが良いでしょ う。passwdコマンドと同じディレクトリに置いて上書きしてしまわないよう に、何か別の名前にしましょう。 4.4. Make の実行 インストール作業のほとんどはrootとして行う必要があります。 パッケージの実行ファイルをコンパイルするために make を実行して下さい: make all rcsid defined but not used というウォーニングが出るかもしれませんが、 無視して構いません。これは作者がバージョン管理ツールを使っているために 起こるものです。 5. インストール 5.1. システム破壊に備えてのブートディスク作成 最悪の事態に備えて、ブートディスクを作っておきましょう。システムをイン ストールした時のブートディスクとルートディスクがあれば十分です。無い場 合には、ブートディスクの作成についての説明が書かれている Bootdisk- HOWTO を参照し て下さい。 5.2. 重複するオンラインマニュアルの削除 置き換えられる古いマニュアルはどこかに移しておくべきです。バックアップ なしで Shadow Suite をインストールする場合でも、古いマニュアルを消して しまいたくなるでしょう。古いマニュアルはおそらく圧縮されているので、新 しいマニュアルはうまく上書きされないからです。 man -aW と locate コマンドを使って移動(削除)すべきマニュアルの位置を調 べることができます。一般的には make install を実行した後よりも実行する 前の方が古いマニュアルの場所を見つけるのが容易です。 Slackware 3.0 パッケージの場合には削除すべきマニュアルは以下の場所にあ ります: o /usr/man/man1/chfn.1.gz o /usr/man/man1/chsh.1.gz o /usr/man/man1/id.1.gz o /usr/man/man1/login.1.gz o /usr/man/man1/passwd.1.gz o /usr/man/man1/su.1.gz o /usr/man/man5/passwd.5.gz /var/man/cat[1-9] にも同じ名前のオンラインマニュアルがあるかも知れない ので、あれば削除する必要があります。 5.3. make install の実行 以下のコマンドを実行しましょう:(rootになってから実行して下さい) make install これで、新しいプログラム及び置き換えられるプログラムがインストールさ れ、ファイルのパーミッションが修正されます。また、オンラインマニュアル もインストールされます。 Shadow Suite のインクルードファイルが 正しい場所 (/usr/include/shadow) にインストールされたかどうか確認して下さい。 β版パッケージを使っている場合には、login.defsを手動で /etcへコピーし て、root だけしか読み書きできないようにしなければなりません。 cp login.defs /etc chmod 700 /etc/login.defs このファイルはloginプログラムの設定ファイルです。このファイルはあなた のシステムに合わせて変更してください。このファイルでは、どの tty から root のログインを許すかなどセキュリティに関する設定(パスワードの期限設 定など)ができます。 5.4. pwconv の実行 次のステップは pwconv を実行することです。これもroot 権限で行わなけれ ばなりません。また、/etc ディレクトリへ移動してから実行して下さい: cd /etc /usr/sbin/pwconv pwconv は /etc/passwd の各フィールドを取り出して、 /etc/npasswd と /etc/nshadow の2つのファイルを作ります。 pwunconv というコマンドもあり、もし必要ならば /etc/passwd と /etc/shadow から普通の /etc/passwd を生成することもできます。 5.5. npasswd と nshadow のリネーム pwconv を実行したことで /etc/npasswd と /etc/nshadow が得られたはずで す。これらのファイルをそれぞれ /etc/passwd と /etc/shadow に上書きして ください。上書きの前には元の /etc/passwd のバックアップを作り、この バックアップは root 以外のユーザは読めないようにしておきましょう。バッ クアップは root のホームディレクトリに作ると良いでしょう: cd /etc cp passwd ~passwd chmod 600 ~passwd mv npasswd passwd mv nshadow shadow さらに、ファイルのオーナとパーミッションが正しいかどうか確認しましょ う。 X-Window System を使っているならば、xlock や xdm は shadow ファイ ルを読めるようになっていなければなりません(書き込みができる必要はあり ません)。 これには2つの方法があります。一つは、xlockを root に SUID する方法で す。(xdm はいずれにせよ root として動作するので関係ありません。) もう 一つは shadow ファイルの所有者はrootに、グループはshadowにする方法で す。このような設定にする前には、/etc/group ファイルを見て、 shadow グ ループがあるかどうかをまず確認してください。shadow グループに属するユ ーザは一人もいてはいけません。 chown root.root passwd chown root.shadow shadow chmod 0644 passwd chmod 0640 shadow これであなたのシステムのパスワードは shadow 化されました。ここで、新し く仮想端末を開いてログインができるかどうか確認してみましょう。 さあ、やってみましょう! もしうまくいかない場合は、どこかで間違えています。shadow 化されていな い状態に戻すためには以下のような手続きを行って下さい: cd /etc cp ~passwd passwd chmod 644 passwd 最初にバックアップを取った他のファイルも正しい場所に戻しましょう。 6. アップグレードするかパッチを当てる必要があるプログラム Shadow Suite にはパスワードにアクセスするプログラムほとんどの代替品を 含んでいますが、ほとんどのシステムでは他にもいくつかのプログラムが必要 となります。 Debian パッケージでは(そうでない場合でも構いませんが)、以下の場所から システムの再構築に必要なプログラムの Debian パッケージののソースを入手 することができます。 ftp://ftp.debian.org/debian/stable/source/ この節の残りはadduser, wu_ftpd, ftpd, pop3d, xlock, xdm and sudo が Shadow Suite をサポートできるようにするため行うアップグレードについて 説明します。 他のプログラムも shadow サポートできるようにする方法は ``Cプログラムを Shadow Suite に対応させる方法'' の章を参照して下さい。(実際に shadow ファイルにアクセスするためには root に SUID するか shadow に SGID する 必要があります。) 6.1. Slackware adduser program Slackware パッケージ(おそらく他のパッケージにも)には /sbin/adduser と いう対話的に新しいユーザを追加するプログラムが含まれています。このプロ グラムの shadow 対応版は ftp://sunsite.unc.edu/pub/Linux/ system/Admin/accounts/adduser.shadow-1.4.tar.gz から入手できます。 筆者は slackware のadduserの代りにShadow Suiteに含まれているプログラ ム(useradd, usermod, userdel)を使うことを勧めます。使い方は新たに覚え なければなりませんが、それだけの価値はあります。より細かい制御ができま すし、 (adduserでは行わない) /etc/passwd や /etc/shadowのロッキングも してくれるからです。 詳しくは ``Shadow Suite を使ってみる'' の章を見てください。 それでも adduser を使いたいならば、以下のような手順でインストールして ください: tar -xzvf adduser.shadow-1.4.tar.gz cd adduser make clean make adduser chmod 700 adduser cp adduser /sbin 6.2. wu_ftpd サーバ 大部分の Linux システムでは wu_ftpd サーバを使っています。もし、あなた の使っているパッケージに Shadow Suiteがインストールされていない場 合、wu_ftpd も shadow をサポートするようにはなっていないでしょ う。wu_ftpd は inetd/tcpd からrootのプロセスとして起動されます。もし、 あなたが古い wu_ftpd デーモンを走らせているなら、バージョンを上げてく ださい。古いバージョンは rootのアカウントを認めてしまうバグを持ってい ることで知られているからです。(詳しくは Linux security ホームページ ) を参照して下さい。 ) 幸い、shadow を有効にするためにはソースコードを入手して再コンパイルす るだけです。 ELF システムでない場合には、wu_ftpサーバは Sunsite に wu- ftp-2.4-fixed.tar.gz の名前で置いているものが利用できます。 ファイルを入手したら、このファイルを /usr/src に置いてから、以下のよう な操作を行ってください: 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 次に ./src/makefiles/Makefile.lnx ファイルの以下の部分を: LIBES = -lbsd -support 次のように変更します: LIBES = -lbsd -support -lshadow そして、実行ファイル生成スクリプトの実行及びインストールを行います: 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 これは、Linux 用 shadow の設定ファイルを使ってサーバのコンパイル及びイ ンストールを行います。 筆者の Slackware 2.3 システムでは実行ファイル生成スクリプトを実行する 前に以下の操作を行う必要がありました: cd /usr/include/netinet ln -s in_systm.h in_system.h cd - ELF システム上ではコンパイルがうまくいかないことが報告されていますが、 次のリリースのβ版を使えばうまくいくようです。これは、wu- ftp-2.4.2-beta-10.tar.gz として入手できます。 ファイルを入手したら、これを /usr/src に置いて、以下の操作を行ってくだ さい: cd /usr/src tar -xzvf wu-ftpd-2.4.2-beta-9.tar.gz cd wu-ftpd-beta-9 cd ./src/config 次に config.lnx ファイルの以下の部分を #undef SHADOW.PASSWORD 次のように変更します。 #define SHADOW.PASSWORD それから、 cd ../Makefiles を行い、カレントディレクトリを変更してから Makefile.lnx ファイルの LIBES = -lsupport -lbsd # -lshadow の部分を次のように変更します。 LIBES = -lsupport -lbsd -lshadow そして実行ファイル生成とインストールを行います: cd .. build lnx cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old cp ./bin/ftpd /usr/sbin/wu.ftpd /etc/inetd.conf ファイルに wu_ftpd 本体の置き場所が書かれているかどう かを確認するのを忘れないようにしましょう。パッケージによってはサーバデ ーモンの置場所が違い、wu_ftpd が別の名前になっているものもあるという報 告がありました。 訳注: Slackware 3.1 では shadow パスワード化を行った場合、wu-ftpd のコ ンパイルに失敗する場合があります。下記のようなエラーが出る場合には src/makefiles/Makefile.lnx の CFLAGS に "-DDIRENT_ILLEGAL_ACCESS" を加 えてみてください。 (この情報は高石@広島電機大さんより頂きました。) ______________________________________________________________________ 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 ______________________________________________________________________ 6.3. 標準の ftpd 標準の ftpd サーバを使っている場合には wu_ftpd サーバにアップグレード することを勧めます。先程述べたバグを除けば、より安全だとされているから です。 どうしても標準のものを使いたい場合や、NIS をサポートする必要がある場合 には Sunsite から ftpd-shadow-nis.tgz を入手して下さい。 6.4. pop3d (Post Office Protocol 3) もし、POP3(the third Post Office Protocol) をサポートする必要がある場 合には pop3d を再コンパイルする必要があります。 pop3d は inet/tcpd か らroot権限で実行されます。 Sunsite から2つの異なるバージョンのものを入手できます: pop3d-1.00.4.linux.shadow.tar.gz と pop3d+shadow+elf.tar.gz です。 どちらの場合も問題なくインストールできるでしょう。 6.5. xlock Shadow Suite をインストールし、X Window システム上で xlock をアップグ レードしないままで実行した場合には、 CNTL-ALT-Fx で別のコンソールに切 替えてログインし xlock のプロセスを殺す(あるいは CNTL-ALT-BS で X サー バを殺す)以外にどうしようもない状態になってしまいます。幸いなことに、 xlock をアップグレードするのはとても簡単です。 もし、XFree86 のバージョン 3.x.x を利用している場合には、 xlockmore (lock 機能に加えてスクリーンセーバ機能を持つ)を使っていると思います。 このパッケージは再コンパイルすることで shadow をサポートできます。古い xlock を使っている場合には xlockmore にアップグレードすることを勧めま す。 xlockmore-3.5.tgz は以下の場所で入手できます: インストールは基本的には以下のような操作で行います: xlockmore-3.5.tgz を入手し、/usr/src で展開します: tar -xzvf xlockmore-3.7.tgz /usr/X11R6/lib/X11/config/linux.cf を編集し、 #define HasShadowPasswd NO の行を #define HasShadowPasswd YES のように変更します。 そして、実行ファイルを作成します: cd /usr/src/xlockmore xmkmf make depend make ファイルを移動し、オーナとパーミッションを設定します: 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 これで、うまく動く xlock ができたはずです。 6.6. xdm xdmは X Window のログイン画面を表示するプログラムです。特定の run level に移行したときにxdmが実行されるシステムもあります。 (/etc/inittab参照) Shadow Suiteのインストールを行なうと、xdmも更新しなければなりません。 しかしxdmのアップグレードは簡単なので問題ありません。 xdm.tar.gz は以下のURLで入手できます: xdm.tar.gz ファイルを入手して、/usr/srcに置いてから以下のようにして展 開します: tar -xzvf xdm.tar.gz /usr/X11R6/lib/X11/config/linux.cf 内の #define HasShadowPasswd NO の部分を #define HasShadowPasswd YES のように変更します。 実行ファイルを作ります: cd /usr/src/xdm xmkmf make depend make ファイルをインストールします: cp xdm /usr/X11R6/bin/ xdm は root 権限で動作するのでファイルのパーミッションを変える必要はあ りません。 6.7. sudo sudoプログラムはシステム管理者が通常root権限を必要とするプログラムをユ ーザに実行させるために用います。管理者がrootのアカウントへのアクセスを 制限したままで、ユーザにディスクのマウント等の操作を許可するときに便利 なプログラムです。 sudo は実行された時にユーザのパスワード認証を行うので、パスワードファ イルを読めなければなりません。sudo は最初からrootに SUID されて動作す るので、/etc/shadow へのアクセスについては問題ありません。 Shadow Suit 対応の sudo は以下のURLで入手できます: 警告: sudoをインストールする際に /etc/sudoersファイルは標準のものと置 き換えられてしまいます。ですから、標準の状態から変更がある場合にはバッ クアップを取っておく必要があります。(Makefile を変更して標準のファイル を/etcにコピーする部分の処理を削除するという方法もあります。) このパッケージは既に shadow 対応の設定がなされているので、パッケージを 再コンパイルするだけで利用できます(ソースは /usr/src に展開して下さ い): cd /usr/src tar -xzvf sudo-1.2-shadow.tgz cd sudo-1.2-shadow make all make install 6.8. imapd は pop3d のようなメールサーバです。 imapd は pine E-mail パッケージに付属しています。パッ ケージに付属するドキュメントには Linux システムに対する標準設定で shadow をサポートしていると書かれて います。しかし、これは正しくない記 述です。さらに、このパッケージでは 実行ファイル生成スクリプトと Makefile の組合せが必要で、コンパイル時 に libshadow.a を加える ことがが難しいのです。そういうわけで、私はまだ imapd が shadow サポートするようにはできていません。 もし成功した人がいましたら、筆者のところにメールで知らせてください。こ の 項目に加えたいと思います。 6.9. pppd (PPP プロトコルサーバ) pppd サーバは認証の方式を複数利用できるように設定できます。 Password Authentication Protocol (PAP) と Cryptographic Handshake Authentication Protocol (CHAP)です。pppd サーバは普通パスワード文字列 を /etc/ppp/chap-secrets か /etc/ppp/pap-secrets (あるいは両方)から得 ます。pppd に標準の動作をさせている場合には pppd を再インストールする 必要はありません。 pppd はloginパラメータを使うようにすることもできます(コマンドライン か、設定ファイルで指定するか options ファイル内で指定)。もしlogin オプ ションが指定されると pppd は PAP で /etc/passwd ファイルのユーザネーム とパスワードを使います。パスワードを shadow 化するともちろん、これは動 作しなくなります。 pppd-1.2.1d では shadow をサポートするためにはプロ グラムを変更しなければなりません。 次の章での例題は pppd-1.2.1d(バージョンが古い pppd)に shadow サポート を加えるというものです。 pppd-2.2.0 では既に shadow 対応が行われています。 7. Shadow Suite を使ってみる この章ではシステムにShadow Suiteをインストールした後に知っておくべきだ と思われることを説明します。より詳しい説明は各コマンドのオンラインマ ニュアルを参照してください。 7.1. ユーザの追加、変更、削除 Shadow Suite にはユーザを追加、変更、削除するためのプログラムが含まれ ています。既にadduserプログラムも持っているかもしれません。 7.1.1. useradd useraddコマンドはシステムにユーザを追加するために用います。標準の設定 を変えるときにもこのコマンドを実行します。 最初に行なうべきことは標準設定を確認してあなたのシステムに合わせて変更 を加えることです: useradd -D ______________________________________________________________________ GROUP=1 HOME=/home INACTIVE=0 EXPIRE=0 SHELL= SKEL=/etc/skel ______________________________________________________________________ 標準設定はおそらく気に入らないでしょうから、ユーザを加えるときに各ユー ザに対して全ての項目をいちいち指定するよりも、標準の設定を変えてしまい ましょう。 筆者のシステムでは以下のような設定に変えています: o 標準のグループ ID を 100 に o パスワードの期限を 60 日に o パスワードの期限切れによるアカウントのロックは行なわない o 標準のシェルを/bin/bash に このような変更を行なうには次のコマンドを実行します: useradd -D -g100 -e60 -f0 -s/bin/bash この状態で useradd -D を実行すると以下の結果を得ます: ______________________________________________________________________ GROUP=100 HOME=/home INACTIVE=0 EXPIRE=60 SHELL=/bin/bash SKEL=/etc/skel ______________________________________________________________________ もし知りたければ、これらの標準設定は/etc/default/useradd ファイルで確 認できます。 これでユーザの追加に useradd を使えるようになりました。例えば、標準の 設定を使ってユーザ fred を追加するためには以下のような操作を行ないま す: useradd -m -c "Fred Flintstone" fred このコマンドは/etc/passwd ファイル内に以下のようなエントリーを作りま す: fred:*:505:100:Fred Flintstone:/home/fred:/bin/bash また、/etc/shadowファイル内に以下のエントリーを作ります: fred:!:0:0:60:0:0:0:0 -mオプションがついているので、ユーザfred のホームディレクトリも生成さ れ、/etc/skelディレクトリの内容がコピーされます。 UID は指定していなくても適当に決めてくれます。 これでfredのアカウントができましたが、アカウントのロックを解除しない限 りfredはログインすることはできません。ロックの解除はパスワードを変える ことによって行ないます。 passwd fred ______________________________________________________________________ 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: ******* ______________________________________________________________________ これで /etc/shadowは以下のような内容になります: fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0 そして、fredはシステムにログインできるようになります。他のプログラムで なく useradd を使う利点は/etc/passwd と/etc/shadowの変更が不可分に行な われることです。つまり、あなたがユーザを登録するのと同時に他のユーザが パスワードを変更したとしても、両方とも正しく実行されます。 直接 /etc/passwd や /etc/shadow を編集するのはやめて、用意されたコマン ドを利用するべきです。あなたが /etc/passwd を編集している間に、あるユ ーザがパスワードを変更したとすると、そのユーザのパスワード変更はあなた がファイルをセーブした時に失われてしまいます。 以下に示すのはuseraddとpasswdを使った簡単な対話的ユーザ追加スクリプト です。 ______________________________________________________________________ #!/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 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 "" ______________________________________________________________________ ユーザの追加にスクリプトを利用することは直接/etc/passwdや /etc/shadowを編集したり、Slackware の adduserプログラムを利用するより も望ましいです。このスクリプトをあなたのシステムに合わせて変更して使っ てください。 useraddについてのより詳しい説明はオンラインマニュアルを参照してくださ い。 7.1.2. usermod usermodプログラムはユーザについての情報を変更するためのものです。オプ ションはuseraddとほとんど同じです。 fredのシェルを変えようと思ったら、以下のような操作をします: usermod -s /bin/tcsh fred これによって、/etc/passwdのfredのエントリーは次のように変更されます: fred:*:505:100:Fred Flintstone:/home/fred:/bin/tcsh 次に、fredのアカウントの期限を 1997年9月15日に設定してみましょう: usermod -e 09/15/97 fred これで/etc/shadowのfredのエントリーは次のように変更されます: fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0 usermodについてのより詳しい説明はオンラインマニュアルを参照してくださ い。 7.1.3. userdel userdelは名前の通り、ユーザのアカウントを抹消します。使い方は単に userdel -r username と入力するだけです。 -rオプションをつけるとユーザのホームディレクトリ を(ホームディレクトリそのものも含めて)消去します。異なるファイルシステ ム上にあるファイルは手作業で消去しなければなりません。 アカウントを消すのではなく、単にロックするだけの場合には passwdコマン ドを使います。 7.2. passwd コマンドとパスワードの期限設定 passwdコマンドは普通のパスワード変更の機能を持っています。これに加え て、ユーザrootで実行した場合には、以下のことができます。 o アカウントのロック及びその解除 (-l と -u) o パスワードの最短有効期間の設定 (-x) o パスワード変更までの最短日数の設定(-n) o 期限の切れるパスワードに対して何日前から警告するかの設定 (-w) o パスワードの期限切れからアカウントのロックまでの日数の設定 is locked (-i) o アカウント情報を清書して表示(-S) 例として、再びユーザfredを見てみましょう。 passwd -S fred fred P 03/04/96 0 60 0 0 これは、fredのパスワードは有効であること、前回の変更は1996年3 月4日で あったこと、いつでも変更可能であること、60日後に期限切れになるこ と、fred には警告はなされないこと、パスワードが期限切れになってもアカ ウントは無効とならないことを意味しています。 これは、パスワードが期限切れになってからfredがログインすると新しいパス ワードを要求するプロンプトが出てくるということです。 もし、fredのパスワードが期限切れになる14日前に警告を出し、期限切れ の14日後にはアカウントが停止となるようにするためには次のような命令を与 えます。 passwd -w14 -i14 fred このとき、fredの情報は次のようになります。 fred P 03/04/96 0 60 14 14 詳細についてはpasswdのオンラインマニュアルを参照してください。 7.3. login.defs ファイル /etc/loginファイルはloginプログラムとShadow Suite全体の設定ファイルで す。 /etc/login ファイルはプロンプト表示から、ユーザがパスワード変更をした 時に標準のパスワード期限はどうなるかまでの幅広い設定を持っています。 /etc/login.defs 内に詳しいコメントがありますが、いくつか注意すべき点が あります。 o 発生したロギングの量を決定するフラグ(on あるいは off にできる)を含 む o 他の設定ファイルへのポインタを含む o パスワードの aging などについての標準の設定を含む これらのことから重要なファイルであることがわかると思います。ですから、 ファイルがそのものが存在することと正しい設定になっているかどうかを必ず 確認してください。 7.4. グループのパスワード /etc/groupsファイルは特定のグループのメンバになるためのパスワードを含 むことがあります。この機能はコンパイル時に /usr/src/shadow- YYMMDD/config.h ファイル内で定数SHADOWGRP を定義していれば有効になって います。 この定数を定義してコンパイルを行なったならば、/etc/gshadowファイルを作 り、グループのパスワード及びグループ管理者についての情報を保持させなけ ればなりません。 /etc/shadow ファイルを作った時には pwconvと呼ばれるプログラムを使いま したが、/etc/gshadowに対してはこれに相当するものはありません。しかし、 このファイルは特に編集する必要はないので問題にはなりません。 最初に /etc/gshadow ファイルを作るためには以下の操作を行ないます。 touch /etc/gshadow chown root.root /etc/gshadow chmod 700 /etc/gshadow 新しいグループを作ると自動的に/etc/group及び /etc/gshadowファイルに追 加されます。ユーザの追加や削除、グループのパスワードの変更などの修正が 行なわれた場合には /etc/gshadowファイルも変更されます。 Shadow Suite に含まれるグループを変更するためのプログラムとしてgroups, groupadd, groupmod, groupdelがあります。 /etc/group ファイルのフォーマットは次のようになっています。 groupname:!:GID:member,member,... 各フィールドの内容は次のようになっています: groupname グループ名 ! 通常はパスワードを保持するフィールドであるが、 Shadow Suite では パスワードは/etc/gshadow ファイルに格納される GID グループID(数値) member グループのメンバのリスト /etc/gshadow ファイルのフォーマットは次のようになります。 groupname:password:admin,admin,...:member,member,... 各フィールドの内容はは以下のようになっています: groupname グループの名前 password エンコードされたパスワード admin グループの管理者のリスト member グループのメンバのリスト gpasswdコマンドはグループに対して管理者やユーザの追加及び削除を行なう 時にだけ使います。rootやグループの管理者リストに入っているユーザはグル ープのメンバの追加や削除を行なうことができます。 グループのパスワードは root かグループの管理者リストに入っているユーザ がpasswdコマンドを使用することで変更できます。 現在のところ、gpasswdコマンドのオンラインマニュアルはありませんが、パ ラメータなしてgpasswdを実行することでオプション一覧を確認することがで きます。ファイルのフォーマットと意味を理解していればコマンドがどのよう に動作するのかを把握することは簡単です。 7.5. 一貫性をチェックするプログラム 7.5.1. pwck プログラムpwckは/etc/passwdと/etc/shadow の内容に一貫性があるかどうか を調べるためのものです。このプログラムはそれぞれのユーザ名について以下 の項目を調べます: o フィールドの数が正しいか o 同じ名前のユーザ名がいないか o ユーザID、グループIDが正しいか o primary グループが正しいか o ホームディレクトリが正しいか o ログインシェルが正しいか また、パスワード無しのアカウントがあれば警告します。 Shadow Suiteをインストールしたら、pwckを実行するというのは良い考えで す。定期的(たとえば毎月、毎週)に実行するのもいいでしょう。-rオプション を使えば、cronを使って定期的に実行させ、結果をメールで報告させることが できます。 7.5.2. grpck grpck は/etc/group と /etc/gshadow の一貫性を確認するプログラムです。 このプログラムは以下のチェックを行ないます: o フィールドの数が正しいか o グループ名の重複がないか o メンバーと管理者のリストが正しいか pwckコマンド同様に、-r オプションを使って自動的に結果報告をさせること ができます。 7.6. ダイアルアップ・パスワード ダイアルアップ・パスワードはダイアルインのアクセスを許可しているシステ ムの、通常のパスワード認証とは別の防衛線です。ローカルあるいはネットワ ーク経由で接続できるユーザは多くいるけれどダイアルインで接続できるユー ザは制限したい場合には、ダイアルアップ・パスワードが役に立ちます。ダイ アルアップ・パスワードを有効にするには、/etc/login.defsを編集し、 DIALUPS_CHECK_ENAB を yes にします。 ダイアルアップについての設定は2つのファイルで行います。一つは /etc/dialupsで、tty の設定を記述します。(回線一つに対して一行書き、デ バイス名の最初の"/dev/"を取り除いたものを記述します。) tty が書かれて いれば、ダイアルアップの接続に対するチェックが行われます。 もう一つのファイルは /etc/d_passwd です。このファイルには適切なシェル のパス名と追加のパスワードを記述します。 もし、/etc/dialupsに書かれている回線からユーザがログインし、 /etc/d_passwd にこのユーザのログインシェルが書かれているならば、正しい パスワードを入力することでアクセス許可を得ることができます。 ダイアルアップ・パスワードは回線に特定のタイプ(PPPやUUCPなど)の接続だ けを許す場合にも有効に利用できます。ユーザが他のタイプの接続(例えばリ ストに載っているシェルを使う)を行う場合にはこの回線のパスワードを知っ ている必要があります。 ダイアルアップ・パスワードを使う前には、前述の設定ファイルを作成する必 要があります。 コマンド dpasswd を使って /etc/d_passwdファイルのシェルに対するパスワ ードを設定することができます。詳しくはオンラインマニュアルを参照してく ださい。 8. Cプログラムを Shadow Suite に対応させる方法 プログラムに shadow サポートを加えるのは実際にはとても簡単です。問題は /etc/shadow ファイルにアクセスするためにプログラムはroot権限で実行する か、rootに SUID して実行しなければならないことです。 これは重大な問題です。SUID するプログラムを作る時には非常に慎重にプロ グラムする必要があります。例えば、シェルにエスケープできるプログラムは プログラムがrootに SUID されていてもrootとして実行してはなりません。 パスワードのチェックはするが、それ以外にはrootとして動作する必要がない ような場合で shadow サポートをプログラムに追加する時は shadow グループ に SGID する方がずっと安全です。xlock プログラムはこのような例の典型で す。 以下で示す例の pppd-1.2.1d は既にrootに SUID されているので、shadow サ ポートを加えることで、プログラムがセキュリティ的により脆弱になることは もはやありません。 8.1. ヘッダファイル ヘッダファイルは /usr/include/shadow ディレクトリ内にあるべきで す。/usr/include/shadow.h も必要ですが、これは /usr/include/shadow/shadow.h へのシンボリックリンクになります。 プログラムに shadow サポートを加えるためには次のヘッダファイルをインク ルードする必要があります: #include #include shadow 用のコードを条件コンパイルで利用できるようにコンパイラ命令を用 いるのは良い考えです。(以下の例でもそうしています。) 8.2. libshadow.a ライブラリ Shadow Suite をインストールする時には libshadow.a も作成され、/usr/lib にインストールされます。 プログラムで shadow サポートするためには、リンカに libshadow.a をリン クするように指示する必要があります。 これは以下のように行います: gcc program.c -o program -lshadow しかし、以下の例でわかるように大規模なプログラムでは大抵 Makefile を使 いますから、普通は LIBS 変数を変更します。 8.3. Shadow 構造体 libshadow.a ライブラリは spwd と呼ばれる構造体に /etc/shadow ファイル から取り出した情報を格納します。これは ヘッダファイル /usr/include/shadow/shadow.h における spwd の定義です: ______________________________________________________________________ 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 */ }; ______________________________________________________________________ Shadow Suite では sp_pwdp に単なるエンコードされたパスワードだけでな く、それ以外の情報も持たせることができます。例えば、パスワードフィール ドが以下のような行を含んでいる場合です: username:Npge08pfz4wuk;@/sbin/extra:9479:0:10000:::: これで、パスワードに加えて/sbin/extra プログラムをさらなる認証に用いる ことを指示しています。呼び出されたプログラムは、ユーザ名となぜ呼び出さ れたかを示すスイッチを渡されます。より詳しい情報を得るためには /usr/include/shadow/pwauth.h とソースコードに含まれる pwauth.c を読ん でください。 これが意味するところは、2次認証に注意することと、実際の認証を行う時に は関数 pwauth を用いるべきだということです。以下の例題ではこれを実行し ています。 現在存在しているプログラムのほとんどがこれを行っていないため、 Shadow Suiteの作者は将来のバージョンではこの機能を無くすか仕様を変更すること を言っています。 8.4. Shadow サポートのための関数 shadow.h ファイルには libshadow.a ライブラリが含んでいる関数の関数プロ トタイプも書かれています: ______________________________________________________________________ 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)); ______________________________________________________________________ これから例題で用いる関数は getspnam (与えられた名前に対応する spwd 構 造体を与える)です。 8.5. 例題 これはデフォルトで shadow サポートをしていないプログラムを shadow 対応 させる例です。 この例では Point-to-Point プロトコルサーバ(pppd-1.2.1d) を用いていま す。このプログラムは PAP や CHAP ファイルでなく /etc/passwd ファイルか ら得たユーザ名とパスワードを用いて PAP 認証を行うモードを持っていま す。既に pppd-2.2.0 で shadow サポートが行われているので、pppd-2.2.0 に対して例題のコードを追加する必要はありません。 pppd のこの機能はあまり使わないものですが、Shadow Suite をインストール するとパスワードが /etc/passwd に保持されなくなるために、この機能は全 く使えなくなってしまいます。 pppd-1.2.1d のユーザ認証の部分のコードは /usr/src/pppd-1.2.1d/pppd/auth.c ファイルにあります。 以下のコードはコード内の他の #include 命令よりも前に加える必要がありま す。条件命令で #include を囲んでいます(したがって shadow サポートあり でコンパイルする時だけインクルードされます)。 ______________________________________________________________________ #ifdef HAS_SHADOW #include #include #endif ______________________________________________________________________ 次の部分は実際のコードに対する変更点です。auth.c ファイルに更に変更を 加えます。 変更前の auth.c: ______________________________________________________________________ /* * 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); } ______________________________________________________________________ ユーザのパスワードは pw->pw_passwd に代入されているので、ここで行う必 要があるのは関数 getspnam を追加することです。この関数はパスワードを spwd->sp_pwdp に代入します。 次に、実際の認証を行うために関数 pwauth を加えます。この関数は shadow ファイルが2次認証をするように設定されている場合には、自動的に2次認証を 実行します。 shadow をサポートするように変更した後のauth.c: ______________________________________________________________________ /* * 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); } ______________________________________________________________________ 注意深く調べれば、他にも変更点があることがわかります。オリジナルのバー ジョンでは/etc/passwdファイル内にパスワードがない場合にはアクセスを許 します。(UPAP_AUTHACK を戻し値にする。)これはあまり良くないことです。 普通のログインでは PPP プロセスへのアクセスを許す時に一つのアカウント を用い、それから /etc/passwd ファイルのユーザ名と /etc/shadowファイル のパスワードを利用して、入力されたユーザ名とパスワードに対して PAP 認 証を行うからです。 だから、もし元のバージョンをユーザ(例えば ppp)のシェルとして走らせる と、ユーザ ppp で空パスワードにして PAP を設定しても誰も PPP 接続を得 ることができなくなります。 パスワードが空の時には UPAP_AUTHNAK でなく UPAP_AUTHACKを戻し値とする ようにすることでも修正できます。 面白いことに、pppd-2.2.0 にも同じ問題があります。 次に、以下の2点について Makefile を修正する必要があります: USE_SHADOW を定義することと、libshadow.a をリンクするようにすることです。 Makefile を編集して、次の行を加えてください: LIBS = -lshadow それから、次の行を見つけて: COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t 以下のように変更してください: COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW 最後に、コンパイル及びインストールを実行しましょう。 9. よく聞かれる質問(Frequently Asked Questions). Q: /etc/securettys ファイルを使って rootがログインできる tty を制御し ようとしているのですが、うまくいきません。 A: /etc/securettys は Shadow Suiteがインストールされた後には全く意味を 持ちません。rootが利用できる tty を記述する設定ファイルは /etc/login.defsになります。このファイル内で他のファイルを指定すること もあります。 Q: Shadow Suiteをインストールしたのですが、ログインができなくなってし まいました。何が悪いのでしょう? A: おそらくShadow Suiteのプログラムはインストールしたけれど、pwconvを 実行していないか、/etc/npasswdを /etc/passwdに、/etc/nshadowを/etc/shadowにそれぞれコピーするのを忘れる かしたのでしょう。login.defsを /etcにコピーしていないのかもしれませ ん。 Q:xlock の章で /etc/shadowファイルの所有グループを shadowにせよとあり ましたが、そのようなグループはありません。どうしたら良いのでしょうか? A:グループを追加しましょう。単に/etc/groupファイルを編集して、shadow グループについての記述を加えるだけです。グループIDが他と重複しないよう にする点と、nogroupのエントリーより前に追加する点には注意してくださ い。単純に xlockを root に SUID するという方法もあります。 Q: Linux 版 Shadow Suite についてのメーリングリストはありますか? A: あります。しかし、これは次のバージョンの Linux版Shadow Suite の開発 とβテストのためのものです。 shadow-list-request@neptune.cin.net宛にサ ブジェクトが subscribeであるメールを送ることでメーリングリストに参加で きます。このメーリングリストは Linux版shadow-YYMMSSについての議論を行 う場所です。開発に加わりたいか Shadow Suite をインストールしたので新し いリリースについての情報を得たい場合には参加すると良いでしょう。 Q:Shadow Suiteをインストールしましたが、 userdelコマンドを実行する と"userdel: cannot open shadow group file"というエラーが出ます。何がお かしいのでしょう? A: Shadow Suite をSHADOWGRPオプションを有効にしてコンパイルしたの に、/etc/gshadowファイルがないのでしょう。config.hを修正して再コンパイ ルするか、/etc/group ファイルを作りましょう。shadow グループの説明の章 も確認しましょう。 Q: Shadow Suiteをインストールしましたが、 /etc/passwdに暗号化されたパ スワードが書かれてしまいます。どうしてですか? A:おそらくconfig.hファイル内のAUTOSHADOWオプションを有効にしてコンパイ ルしたか、あなたの使っているlibc がSAHDOW_COMPATオプションを有効にして コンパイルされているかです。どちらが原因か確認して該当する方を再コンパ イルしましょう。 10. Copyright Message(著作権表示) The Linux Shadow Password HOWTO is Copyright (c) 1996 Michael H. Jackson. 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. 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. Permission is granted to copy and distribute translations of this document into another language, under the conditions specified above for modified versions. 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. 注意: 以下の和訳はあくまで参考です。著作権については原文の表示に従って ください。 The Linux Shadow Password HOWTO は Michael H. Jackson の著作物です。 (Copyright (c) 1996 Michael H. Jackson) 著作権表示及びこの許諾表示を全てのコピーに残すことを条件に、この文書を 改変せずに複写及び配布することが可能です。 上記の条件を改変しないこと及び文書が改変されていること明記することを条 件に、この文書を改変したものを複写及び配布することが可能です。 上述の改変された文書に対する条件と同じ条件で、この文書を他の言語に翻訳 したものを複写及び配布することが可能です。 上述の改変された文書に対する条件に加え、新しいメディア内に元の文書への 明白な参照が含まれることで元の文書であることを主張する要求が果たされる ことを条件に、この文書を他のメディアで配布することが可能です。「明白 に」の定義がはっきりしない場合には著作権者が決定する権利を保留している ものとします。 11. その他 / 謝辞 例題の auth.c に対してのコードは 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) Thanks to Marek Michalkiewicz for writing and maintaining the Shadow Suite for Linux, and for his review and comments on this document. Shadow Suiteの作者/管理者であり、また、この文書を見てコメントを下さっ た Marek Michalkiewicz 氏 に感謝し ます。 この文書の批評及びテストを行って下さった Ron Tidd 氏 に感謝します。 筆者にフィードバックを送り、この文書の改良に協力してくださった皆様に感 謝します。 コメントや提案があればどうか筆者にメールで知らせてください。 Michael H. Jackson 12. 訳者より 翻訳の配布条件は原文に従うものとします。また翻訳の内容については訳者は 一切の責任を持てませんので、皆さんの責任で利用してください。 誤訳などの指摘や訳に対するコメントをお待ちしています。お気軽にメールく ださい。 藤原輝嘉 } 訳者より