Galera + systemd:wsrep_notify_cmdがsudoで失敗する(sudoers gidに変更できない:操作は許可されていません)

Galera + systemd:wsrep_notify_cmdがsudoで失敗する(sudoers gidに変更できない:操作は許可されていません)

私たちはsysvを使用してCentOS 7で実行されているGaleraクラスタを持っており、systemdに移行することを検討しています。ノードの状態変更をアプリケーションに通知するためにaを呼び出し、アプリケーションがアクセス権を持たない他のユーザー/グループのディレクトリにあるため、wsrep_notify_cmdそれらを組み合わせる必要があります。sudomysql

sysv init を使用すると、コマンド/スクリプトが root で始まるため、正常に動作します。 systemdを使用すると、コマンド/スクリプトがユーザーの下で実行されるため、mysqlこれが機能するようにsudoerを構成する必要があります。それとも私たちはそう思いました。

systemdに切り替えた後、sudo: unable to change to sudoers gid: Operation not permittedログを調べてテスト/デバッグを実行しました。まずmysql、特権のあるスクリプトを起動してから、そのスクリプトをwsrep_notify_cmd/data/app/notify.shsudo

メモ:SELinuxが無効になっています。

MySQLサーバーの設定

MySQLサーバー(テスト)の構成:wsrep_notify_cmd='/mysql/notify.sh'

Sudoersの設定

/etc/sudoers.d/mysql構成は次のとおりです。

Defaults:mysql !requiretty
Defaults:mysql umask=0007

Cmnd_Alias NOTIFY = /bin/bash /data/app/notify.sh*
mysql ALL=(app_user) NOPASSWD: NOTIFY

手動テスト

これでsudo su - mysql手動で実行すると/mysql/notify.shトリックが実行されます。

[mysql@testhost /mysql]$ /bin/sudo -u app_user /bin/bash /data/app/notify.sh --status Synced
[mysql@testhost /mysql]$ 

/data/app/notify.sh実行されるスクリプトは、app_user渡されたすべてのパラメータをファイルに書き込み、上記のコマンドを手動で実行すると正常に実行されます。

[root@testhost /data/app]# cat output.log 
--status Synced

同じことですが、systemd mysqlサービスの初期化の内部で

ただし、実行されると、service mysql startスクリプト/mysql/notify.shは期待される操作を実行せず、代わりにアクセスが拒否されます。どの sudo発注する: sudo: unable to change to sudoers gid: Operation not permitted

stderrを使用してこのスクリプトを実行し#!/bin/bash -xv、ログファイルにリダイレクトします。

[mysql@testhost /mysql]$ cat debug.log 

file=/mysql/args.log
+ file=/mysql/args.log

echo $USER
+ echo mysql

ARGS="$@"
+ ARGS='--status Synced'

/bin/sudo -K
+ /bin/sudo -K
sudo: unable to change to sudoers gid: Operation not permitted
/bin/sudo -u app_user /bin/bash /data/app/notify.sh $ARGS
+ /bin/sudo -u app_user /bin/bash /data/app/notify.sh --status Synced
sudo: unable to change to sudoers gid: Operation not permitted

ご覧のとおり、mysqlユーザーシェルで手動で実行できたのと同じコマンドは次のとおりです。いいえsystemdの一部として実行されたときに同じスクリプトから呼び出されたときに機能しますservice mysql start

この問題の原因は何ですか?

ベストアンサー1

ここでシステムセキュリティを無効にするには、次のようにデバイスの機能を変更できます。

# systemctl show mysql | grep Cap

-- CapabilityBoundingSet=16384

# vim /usr/lib/systemd/system/mariadb.service

-- CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_NET_RAW CAP_NET_ADMIN CAP_SETUID CAP_SYS_ADMIN

systemctl daemon-reload

systemctl restart mysqld

systemctl show mysql | grep Cap

-- CapabilityBoundingSet=2126016

少数の機能が必要な場合があります。これは簡単なテストです。

実際のファイルを変更しないでください。たとえば、/etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf を使用します。

おすすめ記事