第4章 認証

目次

4.1. 通常のUnix認証
4.2. アカウントとパスワードの情報管理
4.3. 良好なパスワード
4.4. 暗号化されたパスワード作成
4.5. PAM と NSS
4.5.1. PAMとNSSによってアクセスされる設定ファイル
4.5.2. 最新の集中システム管理
4.5.3. 「どうしてGNUのsuはwheelグループをサポートしないのか」
4.5.4. パスワード規則強化
4.6. 他のアクセスコントロール
4.6.1. sudo
4.6.2. SELinux
4.6.3. サーバーのサービスへのアクセスの制限
4.7. 認証のセキュリティー
4.7.1. インターネット経由のセキュアーなパスワード
4.7.2. セキュアーシェル
4.7.3. インターネットのためのセキュリティー強化策
4.7.4. rootパスワードのセキュリティー確保

人(またはプログラム)がシステムへのアクセスの要求をした際に、認証はその正体が信頼できるものだと確認します。

[警告] 警告

PAMの設定のエラーはあなたをあなた自身のシステムから締め出すかも知れません。レスキューCDを手元に置くか代替ブートパーティション設定を必ずします。復元するには、それらを使ってシステムをブートしそこから修正します。

4.1. 通常のUnix認証

通常のUnix認証はPAM(プラグ可能な認証モジュール)のもとでpam_unix.so(8)モジュールによって提供される。":"で分離されたエントリーを持つその3つの重要な設定ファイルは次です。

表4.1 3つのpam_unix(8)に関する重要な設定ファイル

ファイル パーミッション(許可) ユーザー グループ 説明
/etc/passwd -rw-r--r-- root root (浄化された)ユーザーアカウント情報
/etc/shadow -rw-r----- root shadow 保護されたユーザーアカウント情報
/etc/group -rw-r--r-- root root グループ情報

"/etc/passwd" ファイルは次の内容です。

 ...
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
 ...

passwd(5) に説明されているように、このファイルの ":" で分離されたエントリーそれぞれは次の意味です。

  • ログイン名
  • パスワード規定エントリー
  • 数値のユーザーID
  • 数値のグループID
  • ユーザー名またはコメント領域
  • ユーザーのホームディレクトリー
  • ユーザーのコマンドインタープリター(無いこともある)

"/etc/passwd"の2番目のエントリーは暗号化したパスワードのエントリーとして使われていました。"/etc/shadow"が導入された後は、このエントリーはパスワード規定エントリーとして使われています。

表4.2 "/etc/passwd"の2番目のエントリーの内容

内容 意味
(空白) パスワード無しアカウント
x 暗号化したパスワードは"/etc/shadow"ファイルの中にあります。
* このアカウントへのログイン不可
! このアカウントへのログイン不可

"/etc/shadow" の内容は次です。

 ...
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
 ...

shadow(5)で説明されているように、このファイルの":"で分離されたエントリーそれぞれは次の意味です。

  • ログイン名
  • 暗号化されたパスワード(最初が"$1$"で始まっているのはMD5暗号化が使われていることを示します。"*"はログイン不可を示します。)
  • 1970年1月1日から、最後にパスワードが変更された日までの日数
  • パスワードが変更可能となるまでの日数
  • パスワードを変更しなくてはならなくなる日までの日数
  • パスワード有効期限が来る前に、ユーザーが警告を受ける日数

"/etc/group"のファイル内容は次です。

group1:x:20:user1,user2

shadow(5)で説明されているように、このファイルの":"で分離されたエントリーそれぞれは次の意味です。

  • グループ名
  • 暗号化されたパスワード(実際は使われていない)
  • 数値のグループID
  • ","で分離されたユーザー名のリスト
[注記] 注記

"/etc/gshadow"ファイルは"/etc/shadow"ファイルが"/etc/group"ファイルに対する機能と同様の機能がありますが、実際には使われていません。

[注記] 注記

もし"authoptionalpam_group.so"行が"/etc/pam.d/common-auth"に書き加えれ、"/etc/security/group.conf"に対応する設定がされていれば、実際のユーザーのグループメンバーシップは動的に割り当てられます。pam_group(8)を参照下さい。

[注記] 注記

base-passwd パッケージはユーザーとグループに関する権威のあるリストが含まれます: "/usr/share/doc/base-passwd/users-and-groups.html"。

4.2. アカウントとパスワードの情報管理

アカウント情報管理のための重要コマンドを記します。

表4.3 アカウント情報を管理するコマンドのリスト

コマンド 機能
getent passwd <user_name> "<user_name>"のアカウント情報の閲覧
getent shadow <user_name> "<user_name>"のシャドーされたアカウント情報の閲覧
getent group <group_name> "<group_name>"のグループ情報の閲覧
passwd アカウントのパスワード管理
passwd -e アカウント開設のための一回だけ使えるパスワードの設定
chage パスワードのエージング情報管理

一部機能が機能するにはroot権限が必要な場合があります。パスワードとデーターの暗号化はcrypt(3)を参照下さい。

[注記] 注記

Debianが提供するalioth機器と同様なPAMとNSSの設定をされたシステム上では、ローカルの"/etc/passwd"や"/etc/group"や"/etc/shadow"の内容がシステムにアクティブに利用されていないことがあります。

4.3. 良好なパスワード

passwd(1)によるとシステムインストール時やpasswd(1)コマンドによってアカウント作成する際には、次に記すようなセットからなる6から8文字の良好なパスワードを選択するべきです。

  • 小文字のアルファベット
  • 数字の0から9
  • 句読点
[警告] 警告

想像できるような単語はパスワードに選択禁止。

4.4. 暗号化されたパスワード作成

ソルトを使って暗号化されたパスワードを生成する独立のツールがあります。

表4.4 パスワード生成ツールのリスト

パッケージ ポプコン サイズ コマンド 機能
whois * V:10, I:88 372 mkpasswd crypt(3)ライブラリーの充実しすぎたフロントエンド
openssl * V:36, I:90 2352 openssl passwd パスワードハッシュの計算(OpenSSL)。passwd(1ssl)

4.5. PAM と NSS

Debianシステムのような最新のUnix的システムはPAM(プラグ可能な認証モジュール: Pluggable Authentication Modules)NSS(ネームサービススイッチ: Name Service Switch)メカニズムをローカルのシステム管理者がそのシステム管理用に提供します。それらの役割をまとめると次の様になります。

  • PAM は、アプリケーションソフトウエアーが使う柔軟な認証メカニズムを提供し、パスワードデーターの交換に関与します。
  • NSSは、ls(1)andid(1)等のプログラムがユーザーやグループの名前を得ためにC標準ライブラリー経由で頻用する柔軟なネームサービスメカニズムを提供します。

これらのPAMとNSSシステムは一貫した設定が必要です。

PAMとNSSシステムに関する注目のパッケージは次です。

表4.5 特記すべきPAMとNSSシステムのリスト

パッケージ ポプコン サイズ 説明
libpam-modules * V:84, I:99 1080 差し替え可能な認証モジュール(基本サービス)
libpam-ldap * V:2, I:4 380 LDAPインターフェースを可能にする差し替え可能な認証モジュール
libpam-cracklib * V:0.9, I:1.6 148 cracklibのサポートを可能にする差し替え可能な認証モジュール
libpam-doc * I:0.7 1208 差し替え可能な認証モジュール(htmlとtextの文書)
libc6 * V:96, I:99 9932 GNU Cライブラリー: "ネームサービススイッチ"も提供する共有ライブラリー
glibc-doc * I:3 1984 GNU C ライブラリー: マンページ
glibc-doc-reference * I:1.5 12016 GNU C ライブラリー: infoとpdfとhtmlフォーマットでのリファレンスマニュアル(non-free)
libnss-mdns * I:52 116 マルチキャストDNSを使った名前解決のためのNSSモジュール
libnss-ldap * I:4 312 LDAPをネームサービスとして使うNSSモジュール
libnss-ldapd * V:0.11, I:0.3 140 LDAPをネームサービスとして使うNSSモジュール(libnss-ldapの新たなフォーク)

  • libpam-doc中の"The Linux-PAM System Administrators' Guide"はPAM設定を学ぶ上で必須です。
  • glibc-doc-referenceの中の"System Databases and Name Service Switch"セクションはNSS設定を学ぶ上で必須です。
[注記] 注記

より大規模かつ最新のリストは"aptitudesearch'libpam-|libnss-'"コマンドを実行すると得られます。NSSという頭字語は "ネームサービススイッチ: Name Service Switch"と異なる"ネットワークセキュリティーサービス: Network Security Service"を指すこともあります。

[注記] 注記

PAMは個別プログラムに関する環境変数をシステム全体のデフォールト値に初期化する最も基本的な手段です。

4.5.1. PAMとNSSによってアクセスされる設定ファイル

PAM がアクセスする注目すべき設定ファイルを次に記します。

表4.6 PAMによりアクセスされる設定ファイルのリスト

設定ファイル 機能
/etc/pam.d/<プログラム名> "<program_name>"に関するPAM設定の設定; pam(7)とpam.d(5)参照
/etc/nsswitch.conf 各サービスに関するエントリーによるNSS設定の設定; nsswitch.conf(5)参照
/etc/nologin ユーザーのログイン制限のためにpam_nologin(8)モジュールがアクセス
/etc/securetty pam_securetty(8)モジュールによりrootアクセスに使うttyを制限
/etc/security/access.conf pam_access(8)モジュールによりアクセス制限を設定
/etc/security/group.conf pam_group(8)モジュールによりグループに基づく制約を設定
/etc/security/pam_env.conf pam_env(8)モジュールにより環境変数を設定
/etc/environment "readenv=1"引数を付きのpam_env(8)モジュールによって追加での環境変数を設定
/etc/default/locale "readenv=1envfile=/etc/default/locale"引数を付きのpam_env(8)モジュールによって追加でロケールを設定します。(Debian)
/etc/security/limits.conf pam_linits(8)モジュールによってリソース制限(ulimit, core, …)を設定
/etc/security/time.conf pam_time(8)モジュールによって時間制限を設定

パスワード選択の制限はpam_unix(8)とpam_cracklib(8)モジュールで実装されています。それらは引数を使って設定します。

[ティップ] ティップ

PAMモジュールはファイル名のサフィクスとして".so"を使います。

4.5.2. 最新の集中システム管理

集中化された軽量ディレクトリーアクセスプロトコル(LDAP)を採用することで多くのネットワーク上のUnix的や非Unix的システムを最新の集中システム管理が実現できます。軽量ディレクトリーアクセスプロトコルのオープンソース実装はOpenLDAPソフトウエアーです。

LDAPサーバーは、libpam-ldaplibnss-ldapパッケージで提供されるPAMとNSSを使うことでDebianシステムにアカウント情報を提供します。この実現ためにはいくつかの設定が必要です(著者は本設定を使っていないため、次の情報は完全に二次情報です。ご理解の上お読み下さい。)。

  • スタンドアローンのLDAPデーモンであるslapd(8)等のプログラムを走らせることで集中化されたLDAPサーバーを設置します。
  • デフォールトの"pam_unix.so"に代えて"pam_ldap.so"を使うには"/etc/pam.d/"ディレクトリー中のPAM設定ファイルを変更します。

    • Debianでは、"/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
  • デフォールト("compat"または"file")に代えて"ldap"を使うには"/etc/nsswitch.conf"ファイル中のNSS設定を変更します。

    • Debianでは、"/etc/libnss-ldap.conf"をlibnss-ldapの設定ファイルとして使っています。
  • パスワードのセキュリティー確保のためにlibpam-ldapSSL(もしくはTLS)接続を使うよう設定しなければいけません。
  • LDAPのネットワークオバーヘッドの犠牲はあるとはいえ、データーの整合性確保のためにlibnss-ldapSSL(もしくはTLS)接続を使うように設定できます。
  • LDAP のネットワークトラフィックを減少させるためにLDAPサーチ結果を一時保持するためのnscd(8)をローカルで走らせるべきです。

libpam-docパッケージで提供されるpam_ldap.conf(5)や"/usr/share/doc/libpam-doc/html/"やglibc-docパッケージで提供される"infolibc'NameServiceSwitch'"といった文書を参照下さい。

同様に、これに代わる集中化されたシステムは他の方法を使っても設定できます。

4.5.3. 「どうしてGNUのsuはwheelグループをサポートしないのか」

これはRichard M. Stallmanが書いた昔の"info su"の最後に書かれていた有名な文言です。ご心配は無用です。現在DebianにあるsuはPAMを使っているので"/etc/pam.d/su"の中の"pam_wheel.so"の行をエネーブルすることでsuを使えるのをrootグループに限定できます。

4.5.4. パスワード規則強化

libpam-cracklibパッケージをインストールすると、例えば"/etc/pam.d/common-password"に次のような行があれば、パスワード規則を強化できます。

lennyの場合:

password required pam_cracklib.so retry=3 minlen=9 difok=3
password required pam_unix.so use_authtok nullok md5

squeezeの場合:

password required pam_cracklib.so retry=3 minlen=9 difok=3
password [success=1 default=ignore] pam_unix.so use_authtok nullok md5
password requisite pam_deny.so
password required pam_permit.so

4.6. 他のアクセスコントロール

[注記] 注記

カーネルのセキュアーアテンションキー(SAK)機能の制限は「Alt-SysRqキー」を参照下さい。

4.6.1. sudo

sudoはシステム管理者がユーザーに制限付きのroot権限を与え、そのroot活動を記録するように設計されたプログラムです。sudoはユーザーの通常パスワードだけが必要です。sudoパッケージをインストールし、"/etc/sudoers"の中のオプションを設定することによりアクティベートして下さい。"/usr/share/doc/sudo/examples/sudoersの設定例を参照下さい。

単一ユーザーシステムにおける私のsudoの使い方(see「sudoの設定」)は自分自身の失敗からの防衛を目指しています。sudoを使うことは、常にrootアカウントからシステムを使うよりは良い方法だと個人的には考えます。例えば、次は"<some_file>"の所有者を"<my_name>"に変更します。

$ sudo chown <my_name> <some_file>

rootのパスワード(自分でシステムインストールをしたDebianユーザーなら当然知っています)を知っていれば、どのユーザーアカウントからいかなるコマンドも"su -c"とすればrootもとで実行できます。

4.6.2. SELinux

セキュリティー強化したLinux(SELinux)強制アクセス制御(MAC)ポリシーのある通常のUnix的な権限モデルより厳格な枠組みです。ある条件下ではrootの権限すら制限を受けます。

4.6.3. サーバーのサービスへのアクセスの制限

システムのセキュリティーのためにできるだけ多くのサーバープログラムを無効とするのは良い考えです。このことはネットワークサーバーの場合は決定的です。直接デーモンとしてであれスーパーサーバープログラム経由であれ有効にされている使っていないサーバーがあることはセキュリティーリスクと考えられます。

sshd(8)等の多くのプログラムがPAMを使ったアクセスコントロールを使っています。サーバーサービスへのアクセスを制限するには多くの方法があります。

「ランレベル管理例」「各initスクリプトのデフォールトのパラメーター」「PAMとNSSによってアクセスされる設定ファイル」「ネットワークサービスの初期化」「Netfilterインフラ」を参照下さい。

[ティップ] ティップ

NFS他のRPCを使うプログラムためにはSun RPCサービスはアクティブにする必要があります。

[ティップ] ティップ

もし現代的なDebianシステムでリモートアクセスで問題に会った場合には、"/etc/hosts.deny"中に"ALL:PARANOID"等の問題となっている設定があればコメントアウトします。(ただしこの種の行為に関するセキュリティーリスクに注意を払わなければいけません。)

4.7. 認証のセキュリティー

ここに書かれている情報はあなたのセキュリティーのニーズに充分ではないかもしれませんが、良いスタートです。

4.7.1. インターネット経由のセキュアーなパスワード

多くのトランスポーテーションレイヤーサービスはパスワード認証も含めて暗号化せずにメッセージをプレーンテキストで通信します。途中で傍受されかねないインターネットの荒野を経由して暗号化せずパスワードを送ることは非常によくない考えです。これらに関しては、"トランスポーテーションレイヤーセキュリティー"(TLS)もしくはその前身の"セキュアーソケットレイヤー"(SSL)で暗号化することでパスワードを含むすべての通信をセキュアーにしてサービスができます。

表4.7 インセキュアーとセキュアーのサービスとポートのリスト

インセキュアーなサービス名 ポート セキュアーなサービス名 ポート
www (http) 80 https 443
smtp (mail) 25 ssmtp (smtps) 465
ftp-data 20 ftps-data 989
ftp 21 ftps 990
telnet 23 telnets 992
imap2 143 imaps 993
pop3 110 pop3s 995
ldap 389 ldaps 636

暗号化にはCPUタイムがかかります。CPUに友好的な代替方法として、POPには"パスワードを認証されたポストオフィスプロトコル"(APOP)やSMTPやIMAPには"チャレンジレスポンス認証メカニズムMD5"(CRAM-MD5)といったセキュアーな認証プロトコルでパスワードのみを保護しつつ通信はプレーンテキストですることもできます。(最近メールクライアントからメールサーバーにインターネット経由でメールメッセージを送る際には、CRAM-MD5で認証をしたのちネットワークプロバイダーによるポート25ブロッキングを避けて従来のSMTPポート25の代わりにメッセージサブミッションポート587を使うことがよく行われます。)

4.7.2. セキュアーシェル

セキュアーシェル(SSH)プログラムはセキュアーな認証とともにインセキュアーなネットワークを通過したお互いに信頼し合っていないホスト間のセキュアーで暗号化された通信を可能にします。OpenSSHクライアントssh(1)とOpenSSHデーモンsshd(8)から成り立っています。SSHはポートフォーワーディング機能を使いPOPやXのようなインセキュアープロトコルの通信をインターネット経由でトンネルするのに使えます。

クライアントは、ホストベースド認証、公開鍵認証、チャレンジレスポンス認証、パスワード認証を使って認証をとろうとします。公開鍵認証を利用すると、リモートからのパスワード無しログインができるようになります。「リーモートアクセスサーバーとユーティリティー(SSH)」を参照下さい。

4.7.3. インターネットのためのセキュリティー強化策

たとえ、セキュアーシェル (SSH)ポイントツーポイントトンネリングプロトコル(PPTP)サーバーのようなセキュアーサービスを走らせる場合でも、ブルートフォースのパスワード推測等による侵入の可能性は残っています。次のようなセキュリティーのためのツールとともに、ファイアーウォールポリシー(「Netfilterインフラ」参照)を使うのはセキュリティー状況を向上させることが期待できます。

表4.8 追加セキュリティー策を提供するツールのリスト

パッケージ ポプコン サイズ 説明
knockd * V:0.14, I:0.4 164 小さなポートノックのデーモンknockd(1)とクライアントkonck
denyhosts * V:1.8, I:2 432 sshからの侵入者をシステム管理者が排除することを助けるユーティリティー
fail2ban * V:3, I:4 660 複数回の認証エラーを発生させるIPを使用禁止にします
libpam-shield * V:0.01, I:0.06 104 パスワード推測によるリモートからの攻撃者を締め出す

4.7.4. rootパスワードのセキュリティー確保

あなたの機器に他人がroot権限を持ってアクセスするのを阻止するには、次のアクションが必要です。

  • ハードディスクへの物理的アクセスを阻止
  • BIOSに鍵を書け、リムーバブルメディアからの起動を阻止
  • GRUBのインタラクティブセッションのパスワードを設定
  • GRUBのメニュー項目編集に施錠

ハードディスクへの物理的アクセスがあれば、パスワードをリセットすることは次の手順を使うと比較的簡単です。

  1. ハードディスクをCDから起動可能なBIOSのついたPCに移動します。
  2. レスキューメディア(Debianブートディスク、Knopix CD、GRUB CD、...)でシステムを起動します。
  3. ルートパーティションを読出し/書込みアクセスでマウントします。
  4. ルートパーティションの"/etc/passwd"を編集し、rootアカウントの2番目の項目を空にします。

grub-rescue-pcの起動時にGRUBのメニュー項目を編集可能(「2段目: ブートローダー」参照)なら、次の手順を使えてさらに簡単です。

  1. カーネルパラメーターを"root=/dev/hda6 rw init=/bin/sh"のような感じに変更してシステムを起動します。
  2. "/etc/passwd"を編集し、rootアカウントの2番目の項目を空にします。
  3. システム再起動します。

これで、システムのrootシェルにパスワード無しに入れるようになりました。

[注記] 注記

rootシェルにアクセスさえできれば、システム上の全てにアクセスできシステム上のどのパスワードでもリセットできます。さらに。johnとかcrackパッケージ(「システムのセキュリティーと整合性のチェック」参照)のようなブルートフォースのパスワードクラッキングツールを使ってすべてのユーザーアカウントのパスワードが破られるかもしれません。こうして破られたパスワードは他のシステムへの侵入を引き起こしかねません。

この様な懸念を回避できる唯一の合理的なソフトウエアー的解決法は、dm-cryptとinitramfs(「データー暗号化ティップ」参照)をつかう、ソフトウエアー暗号化されたルートパーティション(もしくは"/etc" パーティション)を使うことです。でも、パスワードがシステム起動毎に必要になってしまいます。