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 には以下の設定が入っています。
これは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 オプションでも同じ効果になります)
コメント