ユーザーは passdb にありますが、getpwnam() は失敗します。

ユーザーは passdb にありますが、getpwnam() は失敗します。

私はstackoverflowでこの質問をしましたが、ここでより良い回答が得られるかもしれないと気づきました。

Linux 上で nss_ldap を使用して Samba + OpenLDAP をセットアップしようとしています。すべてのソフトウェアはソースから私がコンパイルしたものなので、RPM、YUM などはありません。

弊社独自のディストリビューションである Pozix Linux を使用します。これは、標準の /etc/passwd、/etc/group に依存するバニラ ログイン システムです。

システムを LDAP ベースのシステムに変換するために必要なすべてのソフトウェアをインストールしました。このシステムは、SAMBA 以外の SSH などの他のソフトウェアでも動作するようです。

Windows7 を Samba スタンドアロン PDC に参加させることができましたが、そのアカウントが /etc/passwd ファイルにも追加されていない限り、ドメイン アカウントでログインすることはできません。

passdb にユーザーはいますが、getpwnam() は失敗します。

私が読んだものはすべて NSS_LDAP の問題を指摘しています。私が実行したことのリストは次のとおりです。

  1. getent passwdはユーザーに完全に正常であることを示している
  2. LDAP データベースにのみ存在するユーザー アカウントを使用して、同じ Linux ホストに ssh で接続できます。
  3. 動作するIDテスト(テストはLDAP内のテストアカウントのみ)
  4. ./pdbedit -Lv テストは動作する
  5. ./net rpc rights list accounts -Uroot は機能し、root には必要な権限がすべてあることがわかります
  6. stackoverflow からの提案に従って、nsswitch.conf ファイルを (files ldap) から (ldap files) に変更しましたが、これによって getent passwd のダンプ順序が本質的に変更され、問題は解決されませんでした。
  7. rootbinddnをコメントアウトし、パスワードのクリアテキストバージョンを含むbindpwを追加して、ldap.secretによる質問を排除します。
  8. smb.conf に ldapsam:trusted = yes がある
  9. smb.confとldap.confの両方でSSLがオフになっています
  10. nscd を実行していません

samba.org サイトの第 5 章の「ユーザーを満足させる方法」に記載されている内容はすべて有効ですが、次の点が異なります。

./smbclient //tsrvr/test -Utest

これにより、log.smbd に件名のエラー メッセージが生成され、ldap デバッグ ログにはエラーのないテストのクエリと成功した戻り値が表示されます。

/etc/passwd に 'test' と入力すると、動作します。

nss_ldap と smbd の関係が壊れているようなのですが、LDAP は正常に動作しているように見えるため (slapcat、ldapsearch など、すべて動作)、関係を強調しています... nss_ldap ライブラリは、smbd に返されたときに何らかの理由で理解されない戻り値を取得しているようです。

何かアドバイスがあれば、本当にありがたいです。この問題はよく見かけます。PAM に関連することが多いのですが、私は PAM を使用していません。

さらに、/etc/passwd ファイルを開いて、問題のユーザーの行を追加すると、ログインできるようになります。

私は PAM を使用していません。Samba.org サイトに従って、必要な 2 つの Windows7 レジストリ更新を追加しました。

ソフトウェアスタックは次のとおりです: Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264

- - - - - - - - - - -[ アップデート ] - - - - - - - - - - -

私はSambaのソースコードを調べ始めました。

この関数は samba3/auth/auth_util.c (約 580 行目) で見つかりました。

auth_serversupplied_info *result; 
const char *username = pdb_get_username(sampass); 
pwd = getpwnam_alloc(result, username);

ユーザー名が有効であっても、pwd は NULL と評価されます。getpwnam_alloc は結果構造体にメモリを割り当て、Unix UID、プライマリ GID などでそれを埋めます。

私が読んだものすべてでは、この呼び出しは NSS を使用すると述べています。これについて私よりも詳しい Samba チームの誰かがコメントしてくれることを願っています。

---------------------[ 更新 ]--------------------- samba のソースコードを調べると、次のことがわかりました。

失敗はauth/auth_util.c(行580)のgetpwnam_allocの呼び出しで発生しています。

getpwnam_alloc は何らかのキャッシュを試み、ユーザー名が最近のキャッシュに見つからない場合、コードは次の呼び出しで失敗します。

sys_getpwnam は lib/system.c にありますが、これは getpwnam のラッパーです。

ここに文書化されています:http://opengroup.org/onlinepubs/007908775/xsh/getpwnam.html

Samba が説明されている errno をチェックしている時点では表示されません。デバッグを追加してレポートします。

間違いなく getpwnam を実装する OS ライブラリの失敗ですが、まだ原因はわかりません。

答え1

解決しました!!!!!!!!!!!!

Samba (NMBD、SMBD) と OpenLDAP (SLAPD) を起動するスクリプトがあります。これは、ファイルから構成データを読み取り、どのプロセスがすでに実行されているか、依存プロセスが起動に失敗したかどうかなどを判断する RC スクリプトです。以下は、スクリプトの関連部分の抜粋です。最後の行は、LDAP ルックアップを使用するように指定する nsswitch.conf のバージョンをコピーします。

while [ $i -lt $MAXPROCS ];
  do
   PID=${PROC[$i]}
   StartProc $PID

   if test $? != 0; then
    echo "!!! Aborting Any Remaining Start-up Processes !!!"
    exit 1
   fi

  i=$(($i+1))
done

 cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf

シャットダウン時に次の操作を実行しました。「noldap」エントリが含まれる nsswitch.conf ファイルをコピーしていることに注意してください。

while [ $i -lt $MAXPROCS ];
do
  PID=${PROC[$i]}
  StopProc $PID
  i=$(($i+1))
done

cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf

起動シナリオでは、samba は起動前に nsswtich.conf コンテンツに ldap エントリが存在することを必要としていることがわかりました。問題を解決するために私が行ったことは次のとおりです。

cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf

while [ $i -lt $MAXPROCS ];
  do
   PID=${PROC[$i]}
   StartProc $PID

   if test $? != 0; then
    cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf
    echo "!!! Aborting Any Remaining Start-up Processes !!!"
    exit 1
   fi

  i=$(($i+1))
done

要約すると、SMBD の起動方法は、起動するタイミングと同じくらい重要であるようです。nsswitch.conf に LDAP エントリがないときに SMBD を起動すると、nss_ldap.so にリンクされた smbd のバージョンが実行され、/etc/passwd のみに依存する (nsswitch.conf ファイルにあるのがこれだけである場合) と判断され、SMBD の実行後に nsswitch.conf の内容を変更しても効果はありません。

これが他のシステムビルダーの役に立つことを願っています。

答え2

nss_ldap は、Linux ログイン システムが認証に Samba ではなく LDAP を使用するように設定します。それでも、認証に ldap を使用するよう Samba に指示する必要があります。例:

ldap ssl = off
ldap admin dn = cn=Manager,dc=ldappdc,dc=mydomain,dc=com
ldap suffix = dc=ldappdc,dc=mydomain,dc=com
ldap user suffix = ou=People
ldap group suffix = ou=Group
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Hosts

もちろん、Samba は LDAP サポート付きで構築されている必要があります。

今すぐ入手smbldap ツールLDAP データベースにユーザー/グループなどを作成するためのツールです。smbldap-tools は、適切なパスワード形式 (Linux 用と Samba 用) とその他の必要な属性を持つユーザー アカウントを作成します。

完全な LDAP エントリは次のようになります。

dn: uid=someuser,ou=People,dc=corp,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: someuser
displayName: someuser
gecos: System User
gidNumber: 513
givenName: someuser
homeDirectory: /home/someuser
loginShell: /bin/bash
sambaAcctFlags: [U]
sambaHomeDrive: H:
sambaHomePath: \\%L\someuser
sambaKickoffTime: 2147483647
sambaLMPassword: FBB7BAF5868B4CBAAAD3B435B51404EE
sambaLogoffTime: 2147483647
sambaLogonScript: logon.bat
sambaLogonTime: 0
sambaNTPassword: D4CB2D67B19490FB090A6EDEC60E3EAE
sambaPrimaryGroupSID: S-1-5-21-1603264347-769597993-3324459097-513
sambaProfilePath: \\%L\profiles\someuser
sambaPwdCanChange: 0
sambaPwdLastSet: 1277051243
sambaPwdMustChange: 1280939243
sambaSID: S-1-5-21-1603264347-769597993-3324459097-3006
shadowLastChange: 14780
shadowMax: 45
sn: someuser
uid: someuser
uidNumber: 1003
userPassword:: e1NTSEF9Z2RueUNBMnVDMWVrejZLZGg4OGNLUmRJRU9zdlJFdE8=

関連情報