Linux基礎

PAM と NSS の違い、LDAP連携のイメージ

PAMとNSSwitchのLDAP連携イメージ

PAM も NSSwitch も共に Linux OS上で基本的な動作をする、Linuxシステムに欠かせないモジュールです。LDAP連携とかを勉強していくと「あれ?これってどう違うんだっけ?」みたいな疑問にぶち当たることも多いようなので、これらがどのように違うのかを解説します。

PAMとNSSのLDAP連携のイメージは以下の通りです。

/etc/pam.d のディレクトリ配下には、PAMに対応したアプリケーションのPAM設定ファイルが格納されます。例えばdovecotをインストールするタイミングでdovecotというファイルが生成されます。

このファイルには、そのアプリケーションがどのように認証され、どのような前処理を施されるかを定義します。デフォルトでは /etc/passwdや/etc/shadow 等を使う設定となっていますが、今回は設定で『Linux へのログイン(system-auth)と IMAP 認証(dovecot)には LDAP 認証を使う!』と書いたとします。

するとクライアントからLinuxログインやdovecot IMAP認証の要求があった場合、pamはLDAPを使うと判断し、nslcd.confの設定に従ってLDAPサーバへ認証をしに行きます

なお、nslcd.confは以前はnss_pam_ldap というパッケージに含まれています。

PAMとNSSの違い

PAM は各アプリケーションがどのような認証を行うかを指定するものNSS は FQDN の名前解決やサービスの名前解決、ユーザアカウントの検索などをどのような手段で行うか (およびその順番) を指定するものです。

例えば /etc/pam.d/system-auth の最初の 4 行は以下のように設定されています。

[root@localhost ~]# cat /etc/pam.d/system-auth
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so

1行目は /etc/security/pam_env.conf に沿って環境変数をリセット、2行目は /etc/passwd や /etc/shadow によって認証を行う、3行目は認証したユーザの uid が1000以上であることを要求する(999以下はシステム利用ユーザ)、4行目は、3行目までに認証されていなければ認証を失敗させる、という意味です。詳細はともかく、「どう認証させるか?」に特化した内容になっています。

一方、NSSはどうかというと、ユーザ検索等に使われます

system-authを pam_ldap.so を使ってLDAP連携し、nsswitch.conf

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

と書いた場合は、getent passwd コマンドで LDAPユーザを一覧に表示させることができます。

[root@localhost ~]# getent passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
~~~
ldapuser1:x:~~
ldapuser2:x:~~
~~

しかし、以下のように passwd の箇所のldap を外すと、

passwd: files
shadow: files ldap
group: files ldap

getent passwd を打っても、システムユーザしか出てきません。

[root@localhost ~]# getent passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
~~~
(ldapuserは表示されない)

これは winbind 連携時でのsamba用Linuxアカウントについても同じような状態になります。(passwd: files winbindだとgetent passwdで連携アカウントが表示される)

というわけで、PAM は認証NSS は名前解決およびユーザ検索、という使い分けがあるのです。

/etc/nsswitch.conf の services: の項目は何に使うものぞ?

/etc/nsswitch.conf には以下の設定が入っています。

services: files

これはtcp ポート番号をサービス名に変換、もしくはその逆を行う手段を記述したものです。files の場合は /etc/services に記載された情報を使って変換を行います。

[root@localhost ~]# more /etc/services
# /etc/services:
~~~
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
telnet 23/tcp
telnet 23/udp
~~~
domain 53/tcp # name-domain server
domain 53/udp
whois++ 63/tcp whoispp
whois++ 63/udp whoispp
~~~

例えば以下のように tcpdump をしてみます。

[root@localhost ~]# tcpdump -i ens33 -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
00:01:33.698999 IP localhost.localdomain.ssh > 192.168.75.1.59554: Flags [P.], seq 2585071239:2585071479, ack 2569631001, win 278, length 240
00:01:33.700261 IP localhost.localdomain.32928 > gateway.domain: 6595+ PTR? 1.75.168.192.in-addr.arpa. (43)
00:01:33.713509 ARP, Request who-has localhost.localdomain tell gateway, length 46
00:01:33.713535 ARP, Reply localhost.localdomain is-at 00:0c:29:a5:c1:d7 (oui Unknown), length 28
00:01:33.713859 IP gateway.domain > localhost.localdomain.32928: 6595 NXDomain 0/0/0 (43)
00:01:33.715505 IP localhost.localdomain.49157 > gateway.domain: 20287+ PTR? 131.75.168.192.in-addr.arpa. (45)
00:01:33.725975 IP gateway.domain > localhost.localdomain.49157: 20287 NXDomain 0/0/0 (45)
00:01:33.726509 IP localhost.localdomain.55606 > gateway.domain: 35534+ PTR? 2.75.168.192.in-addr.arpa. (43)
00:01:33.727225 IP localhost.localdomain.ssh > 192.168.75.1.59554: Flags [P.], seq 240:480, ack 1, win 278, length 240
00:01:33.731296 IP 192.168.75.1.59554 > localhost.localdomain.ssh: Flags [.], ack 480, win 256, length 0
10 packets captured
12 packets received by filter
0 packets dropped by


ssh と domain というワードが出てきました。これは ssh=22番ポート、domain=53番ポートの意味なのですが、これがnsswitch.conf で services: files とする効果です。試しに services: (空) にすると、

 [root@localhost ~]# tcpdump -i ens33 -c 10<
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
00:09:06.716382 IP localhost.localdomain.22 > 192.168.75.1.59554: Flags [P.], seq 2585099863:2585100103, ack 2569645785, win 278, length 240
00:09:06.717201 IP localhost.localdomain.54294 > gateway.53: 5582+ PTR? 1.75.168.192.in-addr.arpa. (43)
00:09:06.726410 IP gateway.53 > localhost.localdomain.54294: 5582 NXDomain 0/0/0 (43)
00:09:06.727986 IP localhost.localdomain.32920 > gateway.53: 8957+ PTR? 131.75.168.192.in-addr.arpa. (45)
00:09:06.732380 IP gateway.53 > localhost.localdomain.32920: 8957 NXDomain 0/0/0 (45)
00:09:06.733005 IP localhost.localdomain.60689 > gateway.53: 53856+ PTR? 2.75.168.192.in-addr.arpa. (43)
00:09:06.733293 IP localhost.localdomain.22 > 192.168.75.1.59554: Flags [P.], seq 240:464, ack 1, win 278, length 224
00:09:06.734230 IP 192.168.75.1.59554 > localhost.localdomain.22: Flags [.], ack 464, win 251, length 0
00:09:06.736353 IP gateway.53 > localhost.localdomain.60689: 53856 NXDomain 0/0/0 (43)
00:09:06.737175 IP localhost.localdomain.22 > 192.168.75.1.59554: Flags [P.], seq 464:1360, ack 1, win 278, length 896
10 packets captured
11 packets received by filter
0 packets dropped by kernel
[root@localhost ~]#

番号で表示されるようになりました。(tcpdump の -nn オプションでも同じ効果になります)

コメント

タイトルとURLをコピーしました