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 ldapgroup: files ldapshadow: files ldapこの例では、 passwd や group をまずローカルファイルから探し、見つからなければ LDAP を見る。
| データベース | 主な意味 |
|---|---|
passwd |
ユーザー名、UID、GID、ホームディレクトリ、シェル |
group |
グループ名、GID、所属ユーザー |
shadow |
パスワード関連情報 |
hosts |
ホスト名と IP アドレス |
getent は NSS を通して検索するため、LDAP 連携の確認に使いやすい。
getent passwd ldapusergetent group developersid ldapusernsswitch.confの files ldap sss
Section titled “nsswitch.confの files ldap sss”/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の役割分担
Section titled “NSSとPAMの役割分担”NSS と PAM は似て見えるが、役割が違う。
| 質問 | 主に担当 |
|---|---|
| このユーザー名は存在するか | NSS |
| UID / GID は何か | NSS |
| ホームディレクトリはどこか | NSS |
| 入力されたパスワードは正しいか | PAM |
| アカウントが期限切れではないか | PAM |
| ログイン時にホームディレクトリを作るか | PAM |
Linux ログインでは両方が必要になる。NSS でユーザー情報を引けても、PAM の認証が通らなければログインできない。逆に PAM が LDAP Bind できても、NSS が UID や homeDirectory を取得できなければログイン環境を作れない。
Linuxログインの流れ
Section titled “Linuxログインの流れ”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 やパスワード検証に使われる値 |
確認コマンドの意味
Section titled “確認コマンドの意味”| コマンド | 通る層 | 何を確認できるか |
|---|---|---|
| ldapsearch | LDAP 直接 | LDAP サーバーにエントリがあるか |
getent passwd ldapuser |
NSS | Linux がユーザーとして見つけられるか |
id ldapuser |
NSS | UID / GID / 補助グループを解決できるか |
su - ldapuser、SSH、コンソールログインなど |
PAM + NSS | 実際にログインできるか |
ldapsearch が成功しても、 getent が失敗するなら NSS 設定の問題である可能性が高い。 getent が成功してもログインできないなら、PAM、パスワード、アクセス制御、ホームディレクトリ、シェルなどを確認する。
- OpenLDAPとLinux連携コンポーネント
- RFC 2307のユーザーとグループ
- BindとSASL認証
- ldapsearch
- ldapwhoami
- Linuxユーザー認証の設定(TLSなし)
- Linuxユーザー認証の設定(StartTLS)
Linux man-pages
Section titled “Linux man-pages”-
nsswitch.conf(5) NSS のデータベースと参照順序。
-
pam(8) PAM の概要、処理グループ、設定ファイル。
Debian manpages
Section titled “Debian manpages”- nslcd.conf(5)
nss-pam-ldapdで LDAP を NSS / PAM の情報源にする設定。