pgpool-Ⅱ 「checking setuid bit of ～」への対処


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権限で実行される。


```bash
$ 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に下記の設定を追加

```bash
postgres ALL=(root) NOPASSWD: /sbin/ip
postgres ALL=(root) NOPASSWD: /usr/sbin/arping
```

---

### 1 : 実行パスにsudoを指定して対処する例

下記のようにpgpool.confの実行コマンドに/usr/bin/sudoを指定すると、一時的にrootユーザでの実行が可能となる。

```bash
#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

```bash
#!/bin/bash
echo "Exec ip with params $@ at `date`"
sudo /sbin/ip $@
exit $?
```

* /usr/sbin/arping_w

```bash
#!/bin/bash
echo "Exec arping with params $@ at `date`"
sudo /usr/sbin/arping $@
exit $?
```

実行権を付与する

```bash
$ chmod 0755 /sbin/ip_w
$ chmod 0755 /usr/sbin/arping_w
```

```bash
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'
```

---

## 参考

* [pgpoolチュートリアル](https://www.pgpool.net/pgpool-web/contrib_docs/watchdog_master_slave/ja.html#thisis)

* https://lets.postgresql.jp/documents/technical/pgpool-II-3.3-watchdog/1

* [シェルスクリプト: コマンドをラップする](http://www.usupi.org/sysad/109.html)

* http://saule1508.github.io/pgpool/

* https://dinfratechsource.com/2019/07/09/postgresql-high-availability-using-pgpool-ii/

* [PostgreSQLストリーミングレプリケーション設定(CentOS7)](https://knowhow.hirohiro716.com/?p=784)

* [pgpool-IIを使ってPostgreSQLのアクティブ・スタンバイ(1+1構成)を試してみた](https://hnakamur.github.io/blog/2016/09/15/experiment-postgresql-active-standby-using-pgpool-ii/)