PAM を介して LDAP ユーザーをフィルタリングし、存在しないように見せかける

PAM を介して LDAP ユーザーをフィルタリングし、存在しないように見せかける

私たちの企業環境では、ずっと昔に、ある賢者がユーザー「mysql」を LDAP に入れることを決定しました。

アカウントが無効になっています:

$ sudo su - mysql
This account is currently not available.

...しかし、その ID はまだ存在します:

$ id mysql
uid=2050913(mysql) gid=867(ENG) groups=867(ENG)

/var/run/mariadbこれにより、ディレクトリを mysql が所有するように割り当てようとする tmpfile ルールによって作成されるため、CentOS7 での mariadb のインストールが失敗します。ただし、LDAP/ネットワークが起動して実行されるまで mysql は存在せず、mysqlユーザーがすでに ldap に存在するため、mariadb インストールではユーザーが作成されません。

PAM (または何か) をローカルで強制して、LDAP 内のユーザー mysql を無視させる方法はありますか? または、ldapmysqlユーザーの名前を に変更しますかmysql_ldap?

唯一の回避策は、エントリを手動で追加することですか/etc/passwd? (または、別のユーザー名を使用するように mariadb 設定を変更します。) rpm から取得される config ファイルと systemd ファイルへの変更は最小限に抑えたいと思います。

mysql( LDAP から削除すると、多くのレガシー インフラストラクチャが破壊される可能性があるため、あまり期待していません。)

ちなみに、変更を実装するには Ansible を使用します。

追加:

質問のタイトルを変更しました:

ローカルの " " ユーザーを追加すると、mysqlLDAP " mysql" ユーザーのユーザー ID が所有するファイルがなければ、問題なく動作することがわかりました。ls -laファイルを追加すると、nscd (または sssd) キャッシュが汚染され、 " mysql" が再び LDAP ユーザーに解決されます。私が本当に望んでいるのは、この LDAP " " ユーザーを消すために、何らかの方法でアカウントの PAM フィルターを構築することのようですmysql

答え1

これが、Ansible でコード化された最終的な解決策です。

- name: Disable ldap users                                                  
  ini_file: dest=/etc/sssd/sssd.conf section='nss' 
            option=filter_users value={{ filter_ldap_users | join(",") }}
  register: sssd_conf_users                                                   

- name: Disable ldap groups                                                 
  ini_file: dest=/etc/sssd/sssd.conf section='nss' 
            option=filter_groups value={{ filter_ldap_groups | join(",") }}
  register: sssd_conf_groups                                                  

- name: Restart SSSD                                                        
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  service: name=sssd state=restarted                                          

- name: Flush NSCD cache                                                    
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  shell: "for db in /var/db/nscd/*; do nscd -i $(basename $db); done"         

- name: Flush SSSD cache                                                     
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  command: /usr/sbin/sss_cache -E        

答え2

PAM レベル:
必要なのは、LDAP 内のユーザーを無視することだけです。したがって、使用している特定の LDAP クライアント (CentOS では sssd) を設定し、カスタム LDAP UID/GID ルックアップ フィルターを使用して "mysql" レコードを無視します。既存のシステムでは、sssd キャッシュを消去して再起動すると、ユーザーはなくなります。mariadb を再インストールすると、ローカルの mysql ユーザーが作成されます。

パッケージ レベル:
ネットワーク上のどこかに、mysql ユーザーの問題を修正するポスト インストール スクリプトを含むパッケージを含むカスタム Yum リポジトリを設定します。また、そのリポジトリに mariadb パッケージを配置する必要があります。次に、そのパッケージと mariadb を含むパッケージ グループを定義してインストールします。
または、mysql ユーザーの作成を処理する更新された、よりインテリジェントなポスト インストール スクリプトを使用して mariaDB パッケージを再構築することもできます。

私は A を選びます - B は​​少しわかりにくいです :)

答え3

%postこれは私が現在回避策として使用しているものです。LDAPを有効化/セットアップする前に、これをキックスタート ファイルに追加して実行します。

# Install and de-install mariadb-server to create mysql
# user before LDAP is enabled.
yum -d1 -e1 -y install yum-plugin-remove-with-leaves mariadb-server
yum -d1 -e1 -y erase mariadb-server --remove-leaves

useradd仕様ファイルを読んで手動で実行するつもりでしたmariadb-server:詳細は、こちらを参照してください。

%pre server
/usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || :
/usr/sbin/useradd -M -N -g mysql -o -r -d %{mysqluserhome} -s /sbin/nologin \
  -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || :

...しかし、rpm をインストールしてすぐに実行する方が安心です。

これについても、私は完全に満足しているわけではありません。なぜなら、LDAP の「mysql」ユーザー ID を持つファイルを見つけた場合、ユーザー ID の逆引きによって、nscd または sssd が間違った「mysql」ユーザーで汚染されてしまうからです。

答え4

ldapユーザーを解決したくない場合は、/etc/nsswitch.confを編集し、ユーザーとグループのエントリからsssd(またはldap)エントリを削除します。次に、nscdキャッシュをフラッシュします。

関連情報