現在 Solaris にログインしているユーザーが LDAP ユーザーかローカル ユーザーかを識別する方法を知りたいです。
何かコマンド?
または、ユーザーがログインした後に LDAP ユーザーまたはローカル ユーザーであることを示す属性を返す getspname、getpwnam などの C ランタイム関数はありますか?
5 に答える
Ldaplist は、ユーザーが LDAP データベースにエントリを持っているかどうかを教えてくれます。ただし、ユーザーが /etc/passwd ファイルにもエントリを持っている場合は整理されません。
ldaplist passwd username
パッケージsss
の一部として使用している場合は、ipaclient
getent --service=sss passwd $USER | wc -l
ユーザーが FreeIPA サーバーの LDAP データベースに存在するかどうかがわかります。
「ローカル」の UID は「LDAP」とは別の範囲にあると想定しています。また、passwd、shadow、および group にファイルと ldap を使用するように nsswitch が構成されていると想定しています。コマンド「getent」は、GNU libc システムに存在する必要があります。ローカルの「ファイル」データベースは ldap ソースよりも小さいと想定するので、2 つのソースのうち小さい方および/またはより高速な方をテストする必要があります。
特定の UID がデータベースの 1 つに存在するかどうかを判断したい場合は、次のようなものを実行できます
$ getent --service=files passwd | grep 655
これはファイル内のデフォルトの GID と一致する可能性があるため、よりクリエイティブな grep が必要になる場合があります。
$ getent --service=files passwd | grep -e $.*:.*:655
これをスクリプト可能な項目に変えたい場合は、最後に「wc」を追加して整数テストを行う必要があります。
$ getent --service=files passwd | grep -e $.*:.*:655 | wc -l
見つからない場合は 0 を返し、見つかった場合は 1 (またはそれ以上) を返します。有効な UID をテストしていて、ここにない場合は他のソースにあると想定しているため、1 つのソースのみをテストします。
最後に、nsswitch を使用している限り、これをサポートする任意の C ライブラリを使用して有効かどうかを確認できます。私はそれらを実際に使用した経験はありませんが、ここで行ったように、特定のソースのみを使用するオプションを渡すことができると思います。または、上記と同じロジックを使用して、cat /etc/passwd だけを使用することもできます。彼らがここにいない場合、彼らはldapにいると再び仮定します。
簡単なことではありません。パスワードファイルを開いて探すことができます。そこにない場合は、LDAP を終了します。もちろん、それがNISでない限り。またはケルベロス。お使いの Solaris のバージョンに PAM が含まれている場合は、それを読んで、提供できる救済策があるかどうかを確認できます。
実際に認証に使用された資格情報を確認する方法はわかりませんが、LDAP データベースでそれらを調べて、そこにあるかどうかを確認する方が簡単なはずです。私は ldap_client ユーティリティを使用して、常に人を調べています。LDAP サーバーの名前と、その他の詳細をいくつか知っておく必要があります。マニュアルページで確認してください。たとえば、ユーザーがローカル アカウントを持っていて、それらが LDAP にある場合、ログイン時にチェックされるパスワードはシステム構成によって異なります。