Linuxでは、idコマンドはユーザーグループまたは使用するpamモジュールをどのようにインポートしますか?

Linuxでは、idコマンドはユーザーグループまたは使用するpamモジュールをどのようにインポートしますか?

SSD構成は次のとおりです。

id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;

ご覧のとおり、私たちはユーザーとグループを列挙しないので、広告にユーザーとグループを表示しませんgetent passwdgetent group

id -a <aduser>これで、コマンドがユーザーとそのグループを表示する方法を理解したいと思います。私が知る限り、与えられたユーザー名をリアルタイムで取得するか、SSDキャッシュから取得します。しかし、sssdからこの情報を取得するようにidコマンドに指示するものが正確に何であるかを知りたいです。

私の質問に関する背景情報:

私はmysql 5.6 Community Serverでldap認証を設定しようとしています。これを行うには、ローカル仮想マシンのperconaサーバーからコピーしたauth_pam.soを使用しています。

プロキシユーザーを作成し、ad_dbaldapグループ:にマップし、mysql_dba 次のpamサービスを作成しました。

# cat /etc/pamd./mysqld
#%PAM-1.0
auth    include  password-auth audit
account include password-auth audit

だから私のauth_stringは次のようになります。mysqld, ad_dba=mysql_dba

これで、プロキシユーザーにすべての権限を付与します。ad_dba

ただし、ADユーザーを介してのみ認証できますが、権限はありません。私の理解は、グループマッピングが機能しないことです。

mysqlがグループメンバーシップをどのようにチェックするのかわかりません。この情報セットを取得するためにPAMに特定のモジュールを追加できることを確認したいと思います。

編集1:

ソースコードでは、mysqlプラグインが組み込みLinux関数を使用していることがわかりますgetgrouplistgetgrgid_r

そのため、必要なグループとユーザーをグループデータベースに一覧表示する方法を見つけるか、コードを変更して再コンパイルする必要があります。私の質問は今この質問とは関係ありません。しかし、私はまだidがこの情報をどのように取得するのか知りたいです。

答え1

このidコマンドは、次のソースからCライブラリを要求してグループ情報を取得します。getent groupその後、Cライブラリはその行を調べ、group適切な/etc/nsswitch.confライブラリの関数を使用してlibnss_<name>.so答えを取得します。

PAMライブラリはここではまったく使用されていません。

たとえば、あなたの場合は、nsswitch.conf少なくとも次のように話す必要があります。

passwd: files sss
group: files sss

これを行うと、Cライブラリは最初にusingを使用してクエリを実行し(およびをlibnss_files.so調べます)、そこで答えが見つからない場合はwithを使用します(尋ねます)。/etc/passwd/etc/grouplibnss_sss.sosssd

GNU Cライブラリ()glibcのすべてのユーザー名/グループルックアップメカニズムはこのメカニズムを使用するため、このidコマンドとMySQLは最終的に同じ情報ソースを使用します。

ただし、お客様の場合は、行に(または)のみをnsswitch.conf含めることができます。ファイルを確認し、必要に応じて追加する必要があります。filescompatpasswdgroupnsswitch.confsss

答え2

idは情報を得るためにいくつかのコアユーティリティを使用します。見たらid.cmgetgroups.h ファイルが含まれていて、関数 xgetgroups を呼び出すのがわかります。管理グループ...続きを追跡すると、呼び出される関数とその関数を含む場所を追跡できます。デフォルトでは、グループデータベースから関連情報を取得するシステムコールがあります。これは、理論的には、「group:」行で指定されたソースからデータベースを構築するためにnsswitch.conf情報を使用して構築されます。

関連情報