この章では、NIS+ の鍵と、鍵を管理する方法について説明します。
Solstice AdminSuite ツールを利用した方が容易に NIS+ セキュリティタスクを実行できます。
NIS+ 鍵は NIS+ の関連情報を暗号化するために使用します。
この章では、NIS+ セキュリティシステム全体と、特にシステムで鍵が果たす役割について、十分理解しているユーザーを想定しています。(詳しくは、第 6 章「セキュリティの概要」を参照してください。)
NIS+ 鍵に関するコマンドとその構文やオプションについての詳しい説明は、nis+(1) のマニュアルページを参照してください。また、nisaddcred コマンドも鍵に関連のある働きをします。詳細は、「nisaddcred コマンド」を参照してください。
主体がログインする時、パスワードの入力を求めるプロンプトが現れます。このパスワードはユーザーがセキュリティゲートをパスし、ネットワークにアクセスするために必要なものです。ログインプロセスは、ユーザーのホームドメインの cred テーブルにあるユーザーの非公開鍵を復号化しキーサーバーへ渡します。キーサーバーはその復号化された非公開鍵を使って、ユーザーが NIS+ オブジェクトにアクセスするつど、ユーザーの認証を行います。
通常は、この場合だけ主体にパスワードが要求されます。しかし、cred テーブルにある主体の非公開鍵がユーザーのログインパスワードと異なるパスワードを使用して暗号化されていると、ログインプロセスはそれを login の際にログインパスワードを使って復号化できないので、キーサーバーに復号化した非公開鍵を提供できません。(これは cred テーブル内にあるユーザーの非公開鍵が、ログインパスワードと異なる Secure-RPC パスワードを使用して暗号化された場合に多く起こります。)
「ネットワークパスワード」と「Secure-RPC パスワード」を同意語として使用する場合があります。
この問題を一時的に解決するには、ログインの後には必ず主体が keylogin コマンドを使用して、キーログインを実行する必要があります。-r フラグを使って、スーパーユーザー主体にログインし、ホストの /etc/.rootkey にスーパーユーザーの鍵を格納します。
主体ユーザーの場合
keylogin |
主体マシンの場合 (一度だけ)
keylogin -r |
しかしながら、オリジナルのパスワードを使用して確実にキーログインを実行しても、そのログインセッションにおいて一時的に問題が解決するだけです。cred テーブルの非公開鍵はユーザーのログインパスワードと異なるパスワードを用いて暗号化されたままであり、次にユーザーがログインした時に同じ問題が起こります。この問題を永久的に解決するには、chkey コマンドを使用して、非公開鍵の暗号化に使ったパスワードをユーザーのログインパスワードに変更します (「NIS+ 主体の鍵の変更」を参照)。
chkey コマンドは cred テーブルに格納されている NIS+ 主体の公開および非公開鍵を変更します。このコマンドは passwd テーブル内もしくは /etc/passwd ファイル内のいずれのエントリにも影響を与えません。
新規に鍵を作成し、パスワードを用いて非公開鍵を暗号化します。-p オプションをつけて実行した場合、chkey コマンドは既存の非公開鍵を新規のパスワードで再暗号化します。
新規に Diffie-Hellman の鍵ペアを作成し、提供されたパスワードを使用して非公開鍵を暗号化します (各主体に複数の Diffie-Hellman の鍵のペアが存在することは可能) 。しかし、ほとんどの場合ユーザーは新規の鍵ペアを求めず、既存の非公開鍵を新規のパスワードを使って再暗号化しようとします。これを行うには、-p オプション付きで chkey を実行します。
これらのテーマの詳細は、マニュアルを参照してください。
NIS+ 環境においては、どんな管理ツールまたは passwd (もしくは nispasswd) コマンドを用いてログインパスワードを変更しても、cred テーブル内の非公開鍵は新規のパスワードを使用して自動的に再暗号化されます。従って、ログインパスワードの変更後に chkey コマンドを実行する必要はありません。
chkey コマンドはキーサーバー、cred テーブル、および passwd テーブルとの関連で動作します。chkey を実行するには次のようにします。
ホームドメインの passwd テーブルにエントリが必要です。この条件を満たさなければ、エラーメッセージが返ります。
cred テーブルの変更権を持っていなければなりません。この権限がない場合は「permission denied」などのエラーメッセージが返ります。
cred テーブル内の非公開鍵の暗号化に使われた、オリジナルのパスワードを知らなくてはなりません (ほとんどの場合、これは Secure-RPC パスワード)。
ログインパスワードを使って非公開鍵を再暗号化するために chkey コマンドを使用するには、最初にオリジナルのパスワードを用いて keylogin を実行し、次に chkey -p を実行します。表 8-1 では、主体ユーザーの keylogin と chkey の実行方法を示します。
表 8-1 非公開鍵の暗号化:コマンドの説明
作業 |
コマンド |
---|---|
ログインする |
Sirius% login Login-name |
ログインパスワードを入力する |
Password: |
ログインパスワードと Secure RPC パスワードが異なっている場合、keylogin を実行する |
Sirius% keylogin |
非公開鍵の暗号化に使用したオリジナルパスワードを入力する |
Password: Secure RPC password |
chkey を実行する |
Sirius% chkey -p Updating nisplus publickey database Updating new key for 'unix.1199@Doc.com.' |
ログインパスワードを入力する |
Enter login password: login-password |
ログインパスワードを再入力する |
Retype password: |
次の節では、NIS+ 主体の鍵の変更方法を説明します。
サーバーの鍵を変更するときは、常にドメイン内の全クライアントの鍵情報も更新する必要があります。その方法は、「クライアントの鍵情報を更新する」で説明します。
ルートマスター (root として) からルートマスターサーバーの鍵を変更するには、表 8-2 の手順を実行します。
表 8-2 ルートマスターからルートマスター鍵を変更する
作業 |
コマンド |
---|---|
新規 DES 資格を作成 |
rootmaster# nisaddcred des |
rpc.nisd のプロセス ID を発見 |
rootmaster# ps -e | grep rpc.nisd |
NIS+ デーモンを終了 |
rootmaster# kill pid |
セキュリティなしで NIS+ デーモンを再起動 |
rootmaster# rpc.nisd -S0 |
keylogout を実行 (以前の keylogin はタイムアウト) |
rootmaster# keylogout -f |
マスターがディレクトリに保管していた鍵を更新 |
rootmaster# nisupdkeys dirs |
rpc.nisd のプロセス ID を発見 |
rootmaster# ps -e | grep rpc.nisd |
NIS+ デーモンを終了 |
rootmaster# kill pid |
デフォルトセキュリティで NIS+ デーモンを再起動 |
rootmaster# rpc.nisd |
keylogin を実行 |
rootmaster# keylogin |
pid は ps -e | grep rpc.nisd コマンドで通知されるプロセス ID 番号
dirs は更新するディレクトリオブジェクト (rootmaster によって保管されたディレクトリオブジェクト)
表 8-2 に示すプロセスの最初の手順では、nisaddcred がルートマスターの cred テーブルを更新し、/etc/.rootkey を更新し、ルートマスターのキーログインを実行します。この時点では、マスターに保管されたディレクトリオブジェクトが更新されておらず、その資格情報とルートマスターとは同期がとれていません。表 8-2 のその後の手順は、すべてのオブジェクトを更新するのに必要です。
サーバーの鍵を変更するときは、常にドメイン内の全クライアントの鍵情報も更新する必要があります。その方法は、「クライアントの鍵情報を更新する」で説明します。
別のマシンからルートマスターの鍵を変更する場合、それに必要な NIS+ 資格とそれを行う承認を得ていなくてはなりません。
表 8-3 異なるマシンによるルートマスターの鍵の変更 - コマンド一覧
作業 |
コマンド |
---|---|
新規の DES 資格を作成 |
othermachine% nisaddcred -p principal -P nisprincipal des |
ディレクトリオブジェクトを更新 |
othermachine% nisupdkeys dirs |
/etc.roootkey を更新 |
othermachine% keylogin -r |
クライアントとして再度初期化 |
othermachine% nisinit -cH |
principal はルートマシンの Secure RPC ネット名。たとえば、unix.rootmaster@doc.com (ドットで終わらない)
nis-principal はルートマシンの NIS+ 主体名。たとえば、rootmaster.doc.com. (ドットで終わる)
dirs は更新するディレクトリオブジェクト (rootmaster で保管されたディレクトリオブジェクト)
nisupdkeys を実行する場合、関連したディレクトリオブジェクトすべてを同時に更新するように注意します。すなわち、すべてを 1 つのコマンドで行います。分割して更新すると、認証エラーになります。
サーバーの鍵を変更するときは、常にドメイン内の全クライアントの鍵情報も更新する必要があります。その方法は 「クライアントの鍵情報を更新する」で説明します。
複製からルート複製の鍵を変更する手順を次に示します。
replica# nisaddcred des replica# nisupdkeys dirs |
dirs は更新するディレクトリオブジェクト (replica で保管されたディレクトリオブジェクト)
nisupdkeys を実行する場合、関連したディレクトリオブジェクトのすべてを同時に更新するように注意します。すなわち、すべてを 1 つのコマンドで行います。分割して更新すると、認証エラーになります。
サーバーの鍵を変更するときは、常にドメイン内の全クライアントの鍵情報も更新する必要があります。その方法は、「クライアントの鍵情報を更新する」で説明します。
サーバーからルート以外のサーバー (マスターまたは複製) の鍵を変更する手順を以下に示します。
subreplica# nisaddcred des subreplica# nisupdkeys parentdir dirs |
parentdir はルート以外のサーバーの親ディレクトリ (subreplica の NIS+ サーバーを持つディレクトリ)
dirs は更新しようとするディレクトリオブジェクト (subreplica で保管されたディレクトリオブジェクト)
nisupdkeys を実行する場合、関連したディレクトリオブジェクトのすべてを同時に更新するように注意します。すなわち、すべてを 1 つのコマンドで行います。分割して更新すると、認証エラーになります。
サーバーの鍵を変更するときは、常にドメイン内の全クライアントの鍵情報も更新する必要があります。その方法は、「クライアントの鍵情報を更新する」で説明します。
NIS+ サーバーの公開鍵は名前空間のあちこちに格納されています。サーバーに新規の資格情報を作成する場合、新規の鍵ペアが作成され cred テーブルに格納されます。しかし、名前空間ディレクトリオブジェクトには、まだサーバーの古い公開鍵のコピーが残っています。nisupdkeys コマンドを使用して、これらのディレクトリオブジェクトのコピーを更新します。
古い鍵ペアの保全が危うくなったり、非公開鍵の暗号化に使ったパスワードを忘れてしまったりして新規の鍵ペアを作成する場合、nisupdkeys を使用してディレクトリオブジェクト内の古い公開鍵を更新できます。
1 台の特定サーバーの鍵を更新する
NIS+ ディレクトリオブジェクトをサポートしているサーバーすべての鍵を更新する
サーバーの公開鍵をディレクトリオブジェクトから削除する
サーバーの IP アドレスが変更された場合にそれを更新する
しかしながら、nisupdkeys は主体ワークステーション上の NIS_COLD_START ファイルを更新できません。サーバーの鍵のコピーを更新するには、NIS+ クライアントが nisclient コマンドを実行しなければなりません。もしくは、NIS+ キャッシュマネージャを実行中でかつコールドスタートファイル内で1つ以上のサーバーを利用できる場合、主体はディレクトリオブジェクト上で生存期間がタイムアウトするまで待つことができます。タイムアウトが発生すると、キャッシュマネージャはコールドスタートファイルを自動的に更新します。生存期間のデフォルトは 12 時間です。
nisupdkeys を使うには、NIS+ ディレクトリオブジェクトへの変更権が必要です。
nisupdkeys コマンドは /usr/lib/nis にあります。nisupdkeys コマンドは次の引数を使います。nisupdkeys コマンドの詳細と引数すべてのリストは、nisupdkeys(1M) のマニュアルページを参照してください。
表 8-4 nisupdkeys の引数
引数 |
Effect |
---|---|
(引数なし) |
カレントドメインのサーバーの鍵をすべて更新する |
ディレクトリ名 |
ディレクトリ名で指定したディレクトリオブジェクトの鍵を更新する |
-H サーバー名 |
カレントドメインディレクトリオブジェクト内のサーバー名で指定したサーバーの鍵を更新する。他のドメインにあるサーバーの鍵を更新する場合は、完全ホスト名を使用する |
-s -H サーバー名 |
サーバー名で指定したサーバーで保管されたディレクトリオブジェクトすべての鍵を更新する |
-C |
鍵をクリアする |
表 8-5 で公開鍵の更新手順の例を示します。
表 8-5 公開鍵の更新: コマンド例
タスク |
コマンド |
---|---|
カレントドメイン (doc.com) のすべてのサーバーのすべての鍵を更新 |
rootmaster# /usr/lib/nis/nisupdkeys Fetch Public key for server rootmaster.doc.com. netname='unix.rootmaster@doc.com' Updating rootmaster.doc.com.'s public key. Public key: public-key |
sales.doc.com ドメインのディレクトリオブジェクトをサポートしているすべてのサーバーの鍵を更新 |
salesmaster# nisupdkeys sales.doc.com (画面上には何も表示されません。) |
すべてのディレクトリ内のサーバー名が master7 であるサーバーの鍵を更新 |
rootmaster# nisupdkeys -H master7 |
sales.doc.com ディレクトリオブジェクトで保管された鍵をクリア |
rootmaster# nisupdkeys -C sales.doc.com |
カレントドメインのディレクトリオブジェクトのサーバー名が master7 であるサーバーの鍵をクリア |
rootmaster# nisupdkeys -C -H master7 |
サーバーの IP アドレスを変更するか、またはアドレスを追加する場合、NIS+ アドレス情報を更新するために nisupdkeys を実行する必要があります。
1 つ以上のサーバーの IP アドレスを更新するには、-a オプション付きで nisupdkeys を使用します。
rootmaster# nisupdkeys -a domain |
特定サーバーの IP アドレスを更新。
rootmaster# nisupdkeys -a -H server |
サーバーの鍵を変更するときは、常に全クライアントの鍵情報も更新する必要があります。NIS+ のサーバーは NIS+ のクライアントでもあります。そのため、あるサーバーの鍵を更新した場合は、それが NIS+ のサーバーであるか通常のクライアントであるかにかかわらず、ドメイン内にあるほかのすべてのマシンの鍵情報を更新する必要があります。
クライアントの鍵情報を更新するには、以下の 3 通りの方法があります。
最も簡単に個々のクライアントの鍵情報を更新するには、クライアント側で nisclient スクリプトを実行します。『Solaris ネーミングの設定と構成』を参照してください。
別の方法で個々のクライアントの鍵情報を更新するには、クライアント側で nisinit コマンドを実行します。「クライアントを初期設定する」を参照してください。
ドメイン内にある全てのマシンのクライアントの鍵情報を一括で更新するには、ドメインのディレクトリオブジェクトの生存期間の値を短くします。「クライアントの鍵情報を一括で更新する」を参照してください。
サーバーの鍵を変更したあとで、ドメイン内にあるすべてのマシンのクライアントの鍵情報を一括更新できます。
nischttl コマンドを使用して、ドメインのディレクトリオブジェクトの生存期間 (TTL) を、すぐに満了するような小さな値にしてください。
たとえば、sales.doc.com. ドメイン内のサーバーの鍵を変更した場合、ディレクトリの TTL 値を 1 分にするには、以下のように入力します。
client% nischttl 60 sales.doc.com. |
ディレクトリの TTL 値が満了すると、キャッシュマネージャはエントリを終了し、クライアントのために新しく更新された情報を入手します。
ディレクトリオブジェクトの TTL 値が満了したあとで、ディレクトリオブジェクトの TTL 値をデフォルト値に戻します。
たとえば、sales.doc.com. ドメインのディレクトリオブジェクトの TTL 値を 12 時間に戻すには、以下のように入力します。
client% nischttl 12h sales.doc.com. |
TTL 値の使用の詳細は、「nischttl コマンド」を参照してください。