LPIC 202 対策:認証設定について
1. PAM (Pluggable Authentication Modules) の詳細と設定ファイル
PAMは、認証サービスを抽象化し、アプリケーションと認証機能(パスワード、LDAP、Kerberosなど)を分離するフレームワークです。
1-1. PAM設定ファイル /etc/pam.d/<サービス名>
PAMの設定ファイルは、サービスごとに/etc/pam.dディレクトリ内に存在し、上から順に処理される認証のスタックを定義します。
📄 設定ファイルの記述書式と意味(コメント詳細)
各行は以下の4つのフィールドで構成され、評価順に上から記述されます。
# モジュールタイプ 制御フラグ モジュールパス 引数
auth required pam_unix.so nullok_secure
| フィールド | 役割 | 技術的な詳細 |
|---|---|---|
| モジュールタイプ | 認証機能の種類。 |
auth (ユーザー認証)、account (アカウント有効性チェック)、password (パスワード更新)、session (セッション管理)の4種。 |
| 制御フラグ | モジュールの評価方法。 |
required、requisite、sufficient、optionalの4種が主要。スタックの最終結果に与える影響が異なる。 |
| モジュールパス | 認証処理を行う共有ライブラリファイル。 | 通常は/lib/security/または/lib64/security/以下にあるpam_*.soファイル。 |
| 引数 | モジュールに渡すオプション。 | 例: shadow (/etc/shadowを使用)、debug (詳細ログ出力)、nullok (空パスワードを許可)。 |
制御フラグ(評価方法)の技術的深掘り
| フラグ | 挙動の詳細なコメント | 最終結果の決定 |
|---|---|---|
required |
成功は必須。しかし、失敗しても評価はスタックの最後まで続行される。複数の認証方法を組み合わせる場合にログを残すためによく使われる。 | 少なくとも1つのrequiredが失敗した時点で、最終結果は失敗。 |
requisite |
成功は必須。失敗した場合、即座に認証失敗として終了し、以降のモジュールは評価されない。 | 失敗した場合、即座に失敗。効率的な拒否処理に利用。 |
sufficient |
成功した場合、それまでのrequiredモジュールが成功していれば、成功が確定し、以降の評価はスキップされる。 |
成功した場合、最終結果は成功。他の認証方法(例: SSH鍵)が成功した際に、パスワード入力を省略するために使われる。 |
2. LDAP (Lightweight Directory Access Protocol) の構造と技術
LDAPは、読み取り性能を最適化した階層型データベース(ディレクトリ)であり、情報の一元管理に利用されます。
2-1. LDAPデータ構造(DIT)の構成要素
| 項目 | 意味 | 技術的な詳細なコメント |
|---|---|---|
| 構造 | DIT (Directory Information Tree) と呼ばれる階層構造。 | ベースDN(dc=...)から始まり、ou=...、cn=...とツリー状に展開する。 |
| エントリ | ディレクトリ内の情報レコード。 | DN (Distinguished Name) でDIT内で一意に識別される。 |
| スキーマ | ディレクトリ内のエントリの設計図。 |
オブジェクトクラス(例: inetOrgPerson)とその属性(必須/任意)を定義する。 |
| オブジェクト識別子 (OID) | スキーマ内の各要素(属性やオブジェクトクラス)に割り当てられた世界的に一意な番号。 | 独自のスキーマを定義する際に必要となる。 |
| ホワイトページ | LDAPで管理される情報のうち、主に人や組織に関する情報。 | LDAPの主な利用目的の一つ(電話帳的な役割)。 |
2-2. LDIF (LDAP Data Interchange Format) の詳細
| 項目 | 役割 | 記述形式と技術的なコメント |
|---|---|---|
| LDIF / LDIFファイル | エントリや操作を記述するための標準テキストフォーマット。 |
ldapaddやslapaddでインポート、ldapsearchやslapcatでエクスポートされる形式。 |
| 継続行 | 長い属性値は次の行に継続。 | 次の行の先頭を半角スペースで始めることで、前の行からの継続と見なされる。 |
2-2. LDIF (LDAP Data Interchange Format) の詳細とファイル構造
LDIFは、LDAPディレクトリのエントリや変更操作を記述するための標準的なテキストファイル形式です。データのインポート(ldapadd/slapadd)やエクスポート(ldapsearch/slapcat)に必須のフォーマットです。
1. LDIFファイルの基本構造
LDIFファイルは、エントリの定義または操作の定義の集まりであり、各エントリ/操作は**空行(2連続の改行)**で区切られます。
| 構造要素 | 記述形式 | 役割と技術的なコメント |
|---|---|---|
| 識別名 (DN) | dn: <Distinguished Name> |
必須項目。これから定義または操作するエントリの完全なパス(DIT内での一意な識別名)を記述する。 |
| 属性と値 | <属性名>: <値> |
エントリが持つ個々の情報。スキーマに基づき、必須属性(例: cn, sn)は必ず含める必要がある。 |
| オブジェクトクラス | objectClass: <クラス名> |
エントリの**型(種類)を指定。必須項目。personやinetOrgPersonなど、そのエントリが満たすスキーマの定義を指定する。 |
| 継続行 | <値の残りの部分> |
属性の値が長すぎる場合、次の行の先頭を半角スペース**で始めることで、前の行からの継続であることを示します。 |
2. LDIFファイルによる操作の記述例
LDIFは、エントリの新規追加だけでなく、既存エントリの属性変更にも使用されます。
エントリの新規追加(ADD操作)
操作タイプを明示しない場合、通常はエントリの追加(add)と見なされます。
# 【LDIFファイル名】user_add.ldif (新規ユーザー追加の例)
# dn: エントリを一意に特定するための完全な識別名
dn: cn=Taro Suzuki,ou=People,dc=example,dc=com
# objectClass: ユーザーエントリを定義するオブジェクトクラス(複数指定可能)
objectClass: top
objectClass: inetOrgPerson
# inetOrgPersonは、POSIXアカウント情報(uid, uidNumberなど)を格納できる属性を提供する。
# cn: 共通名 (Common Name)。通常、フルネームを指定。
cn: Taro Suzuki
# sn: 姓 (SurName)。personオブジェクトクラスの必須属性。
sn: Suzuki
# uid: ユーザーID。システムログインなどに使用される。
uid: tsuzuki
# userPassword: パスワード。slappasswdで生成したハッシュ値を格納することが推奨。
userPassword: {SSHA}xxxxxxxxxxxxxxxxx
# mail: メールアドレス。値が長いため継続行を使用。
mail: taro.suzuki@
example.com # <-- この行は半角スペースから始まり、上の行の値の続きであることを示す。
既存エントリの変更(MODIFY操作)
既存エントリの属性値を変更、追加、削除する場合、**changetype: modify**を指定し、操作を明示します。
# 【LDIFファイル名】user_modify.ldif (属性変更の例)
# dn: 変更対象のエントリを特定
dn: cn=Taro Suzuki,ou=People,dc=example,dc=com
# changetype: 属性の変更を行うことを明示。必須。
changetype: modify
# replace: 属性の置換操作
replace: mail
mail: taro.s@newmail.com
# 既存の 'mail' 属性の値をすべて破棄し、この行の値に置き換える。
- # <-- 各操作(replace, add, delete)の終了を示すハイフンのみの行
# add: 属性の追加操作
add: telephoneNumber
telephoneNumber: +81-03-xxxx-xxxx
# 既存のエントリに 'telephoneNumber' 属性がまだ存在しない場合に、新しい値を追加する。
- # <-- 各操作の区切り
# delete: 属性の削除操作
delete: description
# 属性名のみを記述し、その属性全体をエントリから削除する。
3. OpenLDAP 設定ファイル slapd.conf の詳細 ⚙️
OpenLDAPのデーモン(slapd)の動作を制御するファイルです。
#######################################################################
# A. グローバル設定(Daemon全体の動作設定)
#######################################################################
# include: 外部設定ファイルやスキーマ定義ファイルを読み込む。
# LDAPでユーザー情報やグループ情報(POSIX属性)を扱うために必須のスキーマファイルを指定する。
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/inetorgperson.schema
# pidfile: slapdデーモンのPIDが書き込まれるファイルのパス。
# systemdなどのinitシステムがデーモンプロセスを管理するために使用する。
pidfile /var/run/slapd/slapd.pid
# -----------------------------------------------------------------------
# B. データベース設定(バックエンドとディレクトリの定義)
# -----------------------------------------------------------------------
# database: 使用するバックエンド(データ格納エンジン)を指定。
database hdb
# hdb(Hierarchical DataBase)は、トランザクション機能と階層構造のサポートに優れている。
# suffix: このデータベースが管理するルートDN(ベースDN)を指定。
suffix "dc=example,dc=com"
# クライアントがこのDN以下の情報を検索する。LDAPツリーの最上位を示す。
# rootdn: このデータベースの管理者ユーザーのDNを指定。
rootdn "cn=Manager,dc=example,dc=com"
# ACLを無視して全操作が可能。rootのDNはsuffixの下である必要はない。
# rootpw: 管理者パスワード。slappasswdで生成したハッシュ値で記述。
rootpw {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
# セキュリティのため、平文ではなく必ずハッシュ化された値を使用する。
# directory: データベースファイルが格納されるディレクトリパス。
directory /var/lib/ldap
# slapdデーモンを実行するユーザー(例: ldap)が書き込み権限を持つ必要がある。
# index: 検索性能を向上させるため、対象属性にインデックスを作成する。
# eq: 等価検索、sub: 部分文字列検索、hash: userPassword用のハッシュインデックス。
index objectClass eq
index cn,sn,uid eq,sub
index userPassword hash
# -----------------------------------------------------------------------
# C. アクセス制御 (ACL)
# -----------------------------------------------------------------------
# access to <対象> by <主体> <権限>
# LDAPのアクセス制御は「最初に見つかった一致ルールが適用される (First Match Wins)」の原則。
# userPassword属性に対するアクセス制御の定義
access to attrs=userPassword
# by self write: ユーザー自身はパスワードを変更可能
by self write
# by anonymous auth: 匿名ユーザーは認証を試みること(パスワード提供)のみ許可
by anonymous auth
# by * none: その他のユーザーはアクセス拒否
by * none
4. 認証関連技術とコマンドの詳細
4-1. 認証関連技術
| 技術 | 役割 | 技術的な詳細なコメント |
|---|---|---|
| SSSD | System Security Services Daemon。 | PAM/NSS(Name Service Switch)の統一インターフェース。LDAP/Kerberosの情報をキャッシュし、オフライン認証を可能にする。従来のnss_ldap/pam_ldapを置き換える。 |
| SASL | Simple Authentication and Security Layer。 | LDAPなどのプロトコルで、Kerberosなどのより高度な認証機構を外部からプラグインするためのフレームワーク。 |
| 簡易認証 | Simple Authentication。 | **DNとパスワード(平文または暗号化)**を使用する最も基本的な認証方式。通常、LDAPS(ポート636)またはStartTLSで暗号化して使用される。 |
4-2. コマンドと実行環境
| コマンド | 役割 | 実行環境と注意点の詳細なコメント |
|---|---|---|
slappasswd |
slapd.confで使用する暗号化パスワードハッシュを生成。 |
サーバーOS上で実行。セキュリティのため、平文パスワードをコマンドライン引数で渡すのは避けるべき。 |
slapcat |
オフラインでLDAPデータベースをLDIF形式でエクスポート。 | slapdデーモンを停止した状態で実行。バックアップやマイグレーションの主要コマンド。 |
slapindex |
データベースのインデックスを再構築し、検索性能を最適化。 | slapdデーモンを停止した状態で実行することが強く推奨される。 |
slapadd |
オフラインでLDIFファイルの内容をデータベースにインポート。 | slapdデーモンを停止した状態で実行。データ復元や大規模な初期データ投入に利用。 |
ldapadd |
オンラインでLDIFファイルの内容を稼働中のLDAPサーバーに追加。 | LDAPクライアントとして実行。管理者のDNとパスワード(またはKerberos認証)が必要。 |
ldapsearch |
LDAPディレクトリからエントリを検索・抽出。 | LDAPクライアントとして実行。デバッグやユーザー情報の問い合わせに不可欠なコマンド。 |