pgpoolを起動した際に、下記のように、「checking setuid bit of ~」という警告メッセージが表示されるケースがある。
DEBUG: initializing pool configuration
DETAIL: num_backends: 2 total_weight: 2.000000
DEBUG: initializing pool configuration
DETAIL: backend 0 weight: 1073741823.500000 flag: 0000
DEBUG: initializing pool configuration
DETAIL: backend 1 weight: 1073741823.500000 flag: 0000
WARNING: checking setuid bit of if_up_cmd
DETAIL: ifup[/sbin/ip] doesn't have setuid bit
WARNING: checking setuid bit of if_down_cmd
DETAIL: ifdown[/sbin/ip] doesn't have setuid bit
WARNING: checking setuid bit of arping command
DETAIL: arping[/usr/sbin/arping] doesn't have setuid bit
postgresユーザでコマンド(/usr/sbin/arpingと/sbin/ip)の実行を試みた際に、rootユーザではないため、実行時に警告が表示されたというもの。
この場合の対処例を記載。
setuid(set user id)を設定して対処
それぞれのコマンドにsetuidをつける。
setuidをつけたコマンドは、実行時に対象のコマンドをファイル所有者で実行する。
つまり、postgresユーザで実行しても、ファイルの所有者がrootであれば、root権限で実行される。
$ chmod u+s /usr/sbin/arping
$ ls -l /usr/sbin/arping
-rwsr-xr-x. 1 root root 23744 Aug 4 2017 /usr/sbin/arping
$ chmod u+s /sbin/ip
$ ls -l /sbin/ip
-rwsr-xr-x. 1 root root 470592 Aug 8 23:55 /sbin/ip
ただし、上記のように直接対象コマンドにsetuidをつけるのは、セキュリティ的によくないので、実際にはWrapperプログラムを作成し、Wrapperプログラムから該当コマンドを実行するケースが多いようだ。(後述)
実行コマンドにsudoをつけて対処
- /etc/sudoersに下記の設定を追加
postgresユーザがroot権限のコマンドをパスワード認証不要で実行させるため、visudoコマンドで/etc/sudoersに下記の設定を追加
postgres ALL=(root) NOPASSWD: /sbin/ip
postgres ALL=(root) NOPASSWD: /usr/sbin/arping
1 : 実行パスにsudoを指定して対処する例
下記のようにpgpool.confの実行コマンドに/usr/bin/sudoを指定すると、一時的にrootユーザでの実行が可能となる。
#if_cmd_path = '/sbin'
#if_up_cmd = 'ip addr add $_IP_$/24 dev eth0 label eth0:0'
#if_down_cmd = 'ip addr del $_IP_$/24 dev eth0'
# 以下のように変更↓
#
if_cmd_path = '/usr/bin'
if_up_cmd = 'sudo ip addr add $_IP_$/24 dev eth0 label eth0:0'
if_down_cmd = 'sudo ip addr del $_IP_$/24 dev eth0'
#arping_path = '/usr/sbin'
#arping_cmd = 'sudo arping -U $_IP_$ -w 1'
# 以下のように変更↓
#
arping_path = '/usr/bin'
arping_cmd = 'sudo arping -U $_IP_$ -w 1'
2 : Wrapperプログラムを使用する例
下記のようにWrapperプログラムを作成し、
必ず、rootユーザで実行されるようにする。
- /sbin/ip_w
#!/bin/bash
echo "Exec ip with params $@ at `date`"
sudo /sbin/ip $@
exit $?
- /usr/sbin/arping_w
#!/bin/bash
echo "Exec arping with params $@ at `date`"
sudo /usr/sbin/arping $@
exit $?
実行権を付与する
$ chmod 0755 /sbin/ip_w
$ chmod 0755 /usr/sbin/arping_w
if_cmd_path = '/sbin'
if_up_cmd = 'ip_w addr add $_IP_$/24 dev eth0 label eth0:0'
if_down_cmd = 'ip_w addr del $_IP_$/24 dev eth0'
arping_path = '/usr/sbin'
arping_cmd = 'arping_w -U $_IP_$ -w 1'