コンテンツにスキップ

NSSとPAMによるLinuxログイン

Linux ログインでは、ユーザー・グループ情報の検索は NSS、認証やセッション処理は PAM が担当する。


LDAPに追加しただけではログインできない理由

Section titled “LDAPに追加しただけではログインできない理由”

LDAP にユーザーエントリを追加しても、それだけでは Linux はそのユーザーを知らない。

Linux がログインユーザーとして扱うには、少なくとも次の 2 つが必要になる。

役割 担当
ユーザー名、UID、GID、ホームディレクトリ、ログインシェルを取得する NSS
パスワード認証、アカウント検査、セッション処理を行う PAM

LDAP は情報源であり、NSS / PAM がその情報源を使う設定になって初めて Linux ログインに関係する。


NSS は Name Service Switch の略で、ユーザー、グループ、ホスト名などの名前解決をどこから取得するか決める仕組みである。

設定ファイルは /etc/nsswitch.conf である。

passwd: files ldap
group: files ldap
shadow: files ldap

この例では、 passwd や group をまずローカルファイルから探し、見つからなければ LDAP を見る。

データベース 主な意味
passwd ユーザー名、UID、GID、ホームディレクトリ、シェル
group グループ名、GID、所属ユーザー
shadow パスワード関連情報
hosts ホスト名と IP アドレス

getent は NSS を通して検索するため、LDAP 連携の確認に使いやすい。

Terminal window
getent passwd ldapuser
getent group developers
id ldapuser

/etc/nsswitch.conf の右側には、参照する情報源を順番に書く。

passwd: files ldap
値 意味
files /etc/passwd、 /etc/group などのローカルファイル
ldap libnss-ldapd などを通して LDAP を参照する
sss SSSD を通して参照する

順番は重要である。 files ldap ならローカルファイルを先に見る。 files sss ならローカルファイルの次に SSSD を見る。


PAM は Pluggable Authentication Modules の略で、認証やアカウント処理を差し替え可能にする仕組みである。

sshd、 login、 sudo などのアプリケーションは、直接 LDAP パスワードを検査するのではなく PAM に処理を委ねる。

PAM には主に次の処理グループがある。

グループ 役割
auth パスワードなどで本人確認をする
account ログイン可能なアカウントか確認する
password パスワード変更を扱う
session ログイン前後のセッション処理を行う

NSS と PAM は似て見えるが、役割が違う。

質問 主に担当
このユーザー名は存在するか NSS
UID / GID は何か NSS
ホームディレクトリはどこか NSS
入力されたパスワードは正しいか PAM
アカウントが期限切れではないか PAM
ログイン時にホームディレクトリを作るか PAM

Linux ログインでは両方が必要になる。NSS でユーザー情報を引けても、PAM の認証が通らなければログインできない。逆に PAM が LDAP Bind できても、NSS が UID や homeDirectory を取得できなければログイン環境を作れない。


OpenLDAP を Linux ログインに使う場合の流れは、概念的には次のようになる。SSH は一例であり、ローカルログイン、 su、 sudo、ディスプレイマネージャーなども PAM を通る構成がある。

login program
-> PAM
-> libpam-ldapd or SSSD
-> LDAP Bind
-> slapd
-> NSS
-> libnss-ldapd or SSSD
-> LDAP search
-> slapd

ログイン処理を行うプログラムは PAM に認証を依頼する。PAM は nslcd または SSSD を通じて LDAP Bind を行う。ユーザーの UID、GID、ホームディレクトリ、グループ所属などは NSS が LDAP 検索で取得する。


LDAPログインで必要になるLDAP側の情報

Section titled “LDAPログインで必要になるLDAP側の情報”

Linux アカウントとして扱うには、LDAP エントリに POSIX ユーザー属性 が必要になる。

代表的には次の属性である。

属性 役割
uid ログイン名
uidNumber Linux の UID
gidNumber 主グループの GID
homeDirectory ホームディレクトリ
loginShell ログインシェル
cn 表示名、または posixAccount の必須属性
userPassword LDAP Bind やパスワード検証に使われる値

コマンド 通る層 何を確認できるか
ldapsearch LDAP 直接 LDAP サーバーにエントリがあるか
getent passwd ldapuser NSS Linux がユーザーとして見つけられるか
id ldapuser NSS UID / GID / 補助グループを解決できるか
su - ldapuser、SSH、コンソールログインなど PAM + NSS 実際にログインできるか

ldapsearch が成功しても、 getent が失敗するなら NSS 設定の問題である可能性が高い。 getent が成功してもログインできないなら、PAM、パスワード、アクセス制御、ホームディレクトリ、シェルなどを確認する。



  • nsswitch.conf(5) NSS のデータベースと参照順序。

  • pam(8) PAM の概要、処理グループ、設定ファイル。

  • nslcd.conf(5) nss-pam-ldapd で LDAP を NSS / PAM の情報源にする設定。