パスワードの管理と運用を考える:Linux管理者への道(1)(1/2 ページ)
管理者として避けて通れないのが、一般ユーザーも含めたパスワードの管理と運用である。一般ユーザーのパスワードがセキュリティホールになる可能性もあるが、ユーザーに対して「適切なパスワードにしろ」というだけではうまくいくはずがない。管理者として何ができるのか、何をすべきなのかを再検討してみよう。(編集局)
LinuxでTelnetやFTPなどのサービスを利用するには、システムからその利用を許可されている必要があります。大きくは、
- 「あるIPアドレスからの要求は拒否する」など
接続元ホストによって許可/拒否を決定する方法 - 「あるユーザーからの接続は認める」など
接続ユーザーによって許可/拒否を決定する方法
の2つが考えられます。通常はこれら2つの方法を組み合わせて、ユーザーにシステムを利用させるのですが、今回は後者のユーザーベースで認証する方法を取り上げます。
パスワードの仕組みとウイークポイント
Linuxは、ログインプロセスによって正当なユーザーであるかどうかを検証します。ユーザーがシステムにログインする際は、ユーザー名とパスワードの提示を行い、システムの利用の可否や割り当てられた権限での作業を行うことができます。
そのため、パスワードは絶対に破られてはならないものになります。小まめに情報をチェックしてセキュリティを保っているつもりでも、簡単に破られるパスワードを設定していることがセキュリティホールになっている場合も多くあります。
Linuxにおける認証の仕組み
従来のUNIXの認証方式は、単純に/etc/passwdを参照するというものでした。しかし、現在のLinuxディストリビューションはセキュリティ確保のためMD5やシャドウパスワードなど、さまざまな認証方法を採用するようになっています。そうなってくると、ユーザー認証が必要なプログラムもそれぞれが多くの認証方式に対応しなければならなくなってきます。これでは開発の手間ばかりが増加してしまいます。
そこで、アプリケーションからより簡単にユーザー認証のカスタマイズを行うために、最近のLinuxおよびUNIXではPAM(Pluggable Authentication Modules)が利用されています。現在では、ほとんどのディストリビューションがデフォルトで利用しています。従来の認証が必要な際も、PAMから呼び出されて利用されます。
認証に必要なデータをローカルマシン以外から取得することも可能です。その場合は、PAMの設定(Red Hat Linuxでは/etc/pam.dディレクトリ以下の設定ファイル)とともに、NSS(Name Service Switch:/etc/nsswitch.conf)の設定が必要になります。
/etc/nsswitch.conf
このファイルでは、アカウントやパスワードなどのデータをどこから検索するのかを定義します。特に何も意識しなければ、ローカルに存在する/etc/passwdや/etc/shadow、/etc/groupといったファイルが参照されます。この設定ファイルを編集することによって、ユーザーアカウントなどの情報の検索順序をLDAPデータベース→NISデータベース→ローカルファイルのように指定することができます。
/etc/pam.dディレクトリ
このディレクトリに各サービスの設定ファイルを作成します。設定ファイルでは、認証方法、パスワードの変更方法、認証後の動作などを設定できます。
また、一言に「パスワード」といっても、さまざまなものが存在します。システムにアクセスするためのパスワードは基本的には/etc/passwd(最近は/etc/shadow)にありますが、SambaやApacheのベーシック認証、APOPなどを使用する場合は/etc/passwdとは別のファイルで独自に管理されます。
パスワードへの攻撃と対策
パスワードはどのようにして破られるのでしょうか。以下のようなことがその原因として考えられます。
- 総当たり攻撃
パスワードは文字の組み合わせです。その組み合わせをすべて試せば、どれかは正解になります。パスワードに設定できるASCII文字95種で、例えば4文字のパスワードを設定すると8000万以上の組み合わせが考えられます。8000万以上というと十分にみえるかもしれませんが、最新のコンピュータでは毎秒800万件近くの組み合わせを検証できるため、ものの十数秒でパスワードを破られてしまいます。
パスワードを8文字まで増やすと、6600兆もの組み合わせになります。総当たりで正解を見つけようとすると、単純計算で20年以上の時間が必要になります。
- 辞書攻撃
総当たり攻撃よりも効率よくパスワードを破る方法として、辞書攻撃があります。パスワードに使われそうな単語を集めた辞書をpasswdプログラムと同じ暗号化アルゴリズムで暗号化し、それらを比較することでパスワードを解析します。
総当たりや辞書攻撃からパスワードを守るには、簡単に破られるパスワードを設定しないことが原則となります。具体的には、以下の項目について考える必要があるでしょう。
安易な文字列 | 自分の名前や生年月日、電話番号など、簡単に予測できるものは使用しない |
---|---|
短過ぎるパスワード | 総当たり攻撃に弱い |
辞書に載っているような単語 | 辞書攻撃に弱い |
記憶できない文字列 | パスワードを長く、複雑にし過ぎると覚えられない。すると、逆にデスクトップ上にパスワードのメモを張り付けたりするユーザーが増え、危険になる |
定期的なパスワード変更 | パスワードを変更しないと総当たり攻撃に弱い |
- 盗聴
ネットワークサービスの多くは、それ自身暗号化機能を持っていません。FTP、Telnet、POP3など、パスワード認証を伴うネットワークサービスは、アカウント/パスワードを平文のままネットワークに流してしまいます。平文のアカウント/パスワードは、盗聴ツールを使えば非常に簡単に見ることができます。
盗聴からパスワードを守るには、ワンタイムパスワードの利用やデータの暗号化が考えられます。
- ユーザーの意識の問題
安易に他人にパスワードを教えてしまうことや、パスワードを覚えようとせず、メモをディスプレイに張っているユーザーの存在は悩みの種の1つです。パスワードの大切さをユーザーに認識させる必要があります。
まずは、ユーザーに対してデータの大切さを教育する必要があります。また、パスワードの定期的な変更を強制する手段を提供しましょう。
パスワード変更を強制する有効期限
パスワードに有効期限を設定することもできます。これは、/etc/shadowで管理されています(LDAPなどで管理することも可能です)。
/etc/shadowの各行には、「:」(コロン)で区切られた9つのフィールドが存在します。
- ログイン名
- 暗号化されたパスワード
- 1970年1月1日から最後にパスワードを変更した日までの日数
- パスワードが変更可となるまでの日数(最低日数)
- パスワードを変更しなければならなくなる日までの日数(有効日数)
- パスワード有効期限が来ることを何日前からユーザーに警告するか
- パスワード有効期限が過ぎてからアカウントがロックされるまでの日数
- 1970年1月1日からアカウントがロックされる日までの日数
- 予約欄。特に使用されていない
これらの値はvipwコマンドで編集するか、あるいはchageコマンドで設定可能です。ユーザーアカウントを引数にしてchageコマンドを実行すると、対話的に
- Minimum Password Age(最低日数)
- Maximum Password Age(有効日数)
- Last Password Change(最終変更日)
- Password Expiration Warning(アカウントをロックする日付)
- Password Inactive(パスワード期限切れ後、アカウントをロックするまでの日数)
を指定できます。
# chage test Changing the aging information for test Enter the new value, or press return for the default Minimum Password Age [0]: Maximum Password Age [99999]: Last Password Change (YYYY-MM-DD) [2002-06-07]: Password Expiration Warning [7]: Password Inactive [-1]: Account Expiration Date (YYYY-MM-DD) [1969-12-31]:
また、以下のオプションを利用すると、対話形式ではなく直接設定変更が可能です。ただし、この書式が使えるのはrootユーザーのみです。
オプション | 設定項目 |
---|---|
-m | パスワードの変更可能最低日数。パスワードを変更したくないユーザーが、パスワードを一時変更した後、もう一度元のパスワードを使用することを防ぐ効果がある。「0」を指定すると、ユーザーはいつでもパスワードを変更できる |
-M | パスワードの最大有効日数 |
-d | (1970年1月1日から)パスワード最終更新日までの日数。「YYYY/MM/DD」という書式でも指定できる |
-E | (1970年1月1日から)アカウントがロックされて使用できなくなるまでの日数。「YYYY/MM/DD」という書式でも指定できる |
-I | 有効期限後、アカウントがロックされるまでの日数。「0」を指定すると、この機能が無効になる |
-W | パスワードの変更が必要になる前に警告を出す日数 |
また、/etc/login.defsによって上記項目の一部のデフォルト値を設定できます。パスワードの変更可能最低日数、有効期限、警告日数は、それぞれPASS_MIN_DAYS、PASS_MAX_DAYS、PASS_WARN_AGEに対応しています。
Copyright © ITmedia, Inc. All Rights Reserved.