第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)コマンドによってアカウント作成する際に次に記すようなセットからなる6から8文字の良好なパスワードpasswd(1)によると選択するべきです:

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

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

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

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

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

パッケージ popcon サイズ コマンド 機能
whois V:11, I:89 344 mkpasswd crypt(3)ライブラリーの充実しすぎたフロントエンド
openssl V:29, I:90 2360 openssl passwd パスワードハッシュの計算(OpenSSL)。passwd(1ssl)

4.5. PAM と NSS

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

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

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

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

表4.5 注目すべきPAMとNSSシステムのリスト。

パッケージ popcon サイズ 説明
libpam-modules V:82, I:99 972 差し替え可能な認証モジュール(基本サービス)
libpam-ldap V:1.8, I:4 404 LDAPインターフェースを可能にする差し替え可能な認証モジュール
libpam-cracklib V:0.8, I:1.8 132 cracklibのサポートを可能にする差し替え可能な認証モジュール
libpam-doc I:0.8 1156 差し替え可能な認証モジュール(htmlとtextの文書)
libc6 V:95, I:99 11496 GNU Cライブラリー: "ネームサービススイッチ"も提供する共有ライブラリー
glibc-doc I:4 1800 GNU C ライブラリー: マンページ
glibc-doc-reference I:1.5 12160 GNU C ライブラリー: infoとpdfとhtmlフォーマットでのリファレンスマニュアル(non-free)
libnss-mdns I:54 144 マルチキャストDNSを使った名前解決のためのNSSモジュール
libnss-ldap I:4 312 LDAPをネームサービスとして使うNSSモジュール
libnss-ldapd V:0.12, I:0.2 356 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という頭字語は "ネームサービススイッチ:NameServiceSwitch"と異なる"ネットワークセキュリティサービス:NetworkSecurityService"を指すこともあります。

[注意] 注意

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コンフィギュレーションファイルを変更します。
  • デフォルト("compat"または"file")に代えて"ldap"を使うには"/etc/nsswitch.conf"ファイル中のNSS設定を変更します。
  • Debianでは、"/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
  • Debianでは、"/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
  • パスワードのセキュリティ確保のために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. サーバーのサービスへのアクセスの制限

インターネットスーパーサーバーinetdは、"/etc/init.d/inetd"にシムリンクされた"/etc/rc2.d/S20inetd"(RUNLEVEL=2の場合)によってブート時に起動されます。基本的に、inetdは一つの実行デーモンによりいくつかの他のデーモンを起動できるようにすることで、システムのロードを下げます。

サービス要求が到達する度に、そのプロトコルとサービスが"/etc/protocols"と"/etc/services"というデータベースを照覧することで確認されます。さらにinetdは、"/etc/inetd.conf"の中にある通常のインターネットサービスか、"/etc/rpc.conf"の中にあるSun RPC準拠サービスを照覧します。

システムのセキュリティのために"/etc/inetd.conf"にある不使用のサービスは確実にディスエーブルしましょう。NFS他のRPCを使うプログラムためにはSun RPCサービスはアクティブにする必要があります。

時々、inetdが対象となるサーバーを直接起動せずに、対象となるサーバー名を"/etc/inetd.conf"中に引数とし記載したTCPデーモンラッパープログラムtcpd(8)を起動することがあります。この様な場合には、tcpdは要求を記録し"/etc/hosts.deny"や"/etc/hosts.allow"を用いた追加確認後で適切なサーバープログラムを起動します。

もし最近のDebianシステムでリモートアクセスで問題があった場合には、"/etc/hosts.deny"中に"ALL:PARANOID"という文言があるならコメントアウトしましょう。

詳しいことは、inetd(8)とinetd.conf(5)とprotocols(5)とservices(5)とtcpd(8)とhosts_access(5)とhosts_options(5)を参照下さい。

Sun RPCに関してさらに詳しいことは、rpcinfo(8)とportmap(8)と"/usr/share/doc/portmap/portmapper.txt.gz"を参照下さい。

atd(8)とcron(8)に関しては、PAM以外のアクセスコントロールがあります。

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のようなインセキュアプロトコルの通信をインターネット経由でトンネルするのに使えます。

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

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

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

表4.8 セキュリティ強化策のためのツール表

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

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

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

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

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

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

grub-rescue-pcの起動時にGRUBのメニュー項目を編集できる(「2段目: ブートローダ」参照)のならもっと簡単です。

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

システムのrootシェルにパスワード無しに入ることが出きるようになりました。

[注意] 注意

rootシェルにアクセスさえできれば、johnとかcrackパッケージ(「System security and integrity check」参照)のようなブルートフォースのパスワードクラッキングツールを使ってすべてのユーザアカウントのパスワードを破る事ができます。

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