
私たちはsysvを使用してCentOS 7で実行されているGaleraクラスタを持っており、systemdに移行することを検討しています。ノードの状態変更をアプリケーションに通知するためにaを呼び出し、アプリケーションがアクセス権を持たない他のユーザー/グループのディレクトリにあるため、wsrep_notify_cmd
それらを組み合わせる必要があります。sudo
mysql
sysv init を使用すると、コマンド/スクリプトが root で始まるため、正常に動作します。 systemdを使用すると、コマンド/スクリプトがユーザーの下で実行されるため、mysql
これが機能するようにsudoerを構成する必要があります。それとも私たちはそう思いました。
systemdに切り替えた後、sudo: unable to change to sudoers gid: Operation not permitted
ログを調べてテスト/デバッグを実行しました。まずmysql
、特権のあるスクリプトを起動してから、そのスクリプトをwsrep_notify_cmd
。/data/app/notify.sh
sudo
メモ: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 を使用します。
答え2
他の回答で説明されている機能を設定する必要がありますが、少なくともmySQLの代わりにMariaDBを使用するだけでは十分ではありません。
機能を追加する場合を除き、NoNewPrivileges
false(またはなし)でなければなりません。これは set として暗示されるので、
これを false にオーバーライドする必要があります。NoNewPrivileges
PrivateDevices
mariadb.service
/etc/systemd/system/mariadb.service.d/mariadb-sudo.conf
Ubuntu 18 LTSでこれらの設定を正常に使用しました(元のファイルを編集せず)(Galeraは提供されているmysqlパッケージをサポートしていません)mariadb.service
。
[Service] CapabilityBoundingSet=CAP_SETUID CapabilityBoundingSet=CAP_SETGID CapabilityBoundingSet=CAP_AUDIT_WRITE PrivateDevices=false
mariadb.service
があるので でAlias=mysql.service
始めることが可能なservice mysql start
ので元の質問と一致するようです。