PostgreSQL
と
setproctitle(3)
2018 年 8 月 28 日
(株)創夢 内藤 祐一郎
PostgreSQL
●
Linux 版の PostgreSQL を ps コマンドで見てみると
次のように表示されることがあります。
– “postgres: userA dbB 192.168.1.11(60936) INSERT”
●
これは今まさに userA が dbB に対して insert を実行してい
るよ、という表示です。
●
クライアントの IP アドレス、ポート番号も表示されます。
●
この表示は SQL の発行毎に書き換わるため、少し忙しいシステ
ムになると秒間数千〜数万程度書き換わる可能性があります。
PostgreSQL
●
FreeBSD だとデフォルトでは使用しないようになっており、
●
postgresql.conf には以下の注意書きがあります。
– # On FreeBSD, this is a performance hog, so keep it off
if you need speed
– (意訳:スピードが欲しければ OFF にしてお
け)
– update_process_title = off
●
なんでこんなことが書かれているのか?
setproctitle(3) の実装
●
FreeBSD ではプロセスタイトルの書き換えに
setproctitle(3) という libc の関数が用意されています。
●
これは posix ではありません。 BSD 系列の独自実装です。
●
この関数は以下のような sysctl を呼び出します。
– sysctl("kern.proc.proc_args.<pid>", NULL, 0,
– " プロセスタイトルの文字列 ", 文字数 )
●
pid を必要とすることから getpid(2) も呼び出します。
●
setproctitle(3) 内では2つのシステムコールが呼び出されます。
setproctitle(3) の高速化
●
ちなみに Linux では argv[0] を書き換えます。
➔システムコールが呼び出されない分、高速で
す。
●
FreeBSD でも同様にプロセスが起動時に呼び出された argv
の配列を取得し、その領域を書き換えるようします。
●
これは sysctlbyname(“kern.ps_strings”) で取得できます。
●
その後、カーネルにはこの値を見るように設定します。
setproctitle(3) の高速化
●
一度取得したメモリアドレスは static な変数に保存しておきま
すので、2回目以降はメモリ書き換えのみになります。
➔ Linux とほぼ同じ性能になります。
●
head 及び stable/11 では変更済です。
➔次期リリースでは update_process_title = on が利
用可能に!
bhyve で問題発生
●
先ほどの更新された setproctitile(3) が bhyve で使えないこと
が分かりました。
– ( 前回の workshop で動作がおかしいと言って
いた話です )
●
なんで使えないのか?
➔ capability mode だから
➔ bhyve は 11.2-R から capability mode で動作します
➔ capability mode では sysctl(2) が使えません
bhyve の修正
●
capability mode で使えないならば、
capability mode に入る前にセットすれば良い。
➔ head 及び stable/11 では修正済
●
前述の通り、一度呼び出しておけば、
capability mode でも使用可能。
➔2回目以降は sysctlbyname(2) を呼び出さない
ため
setproctitle(3) の論点
●
必要なリソースは capability mode の前に取得しておけ、とい
う思想には反していない。
●
setproctitle という名前からリソース取得が必要とは想像しに
くい。
●
取得しているメモリアドレスは自分のプロセスのものであり、
情報漏えいには当たらない。
●
capability mode でも setproctitle(3) できたほうが便利。
➔以上がざっと思いつく論点です
setproctitle(3) のその後
●
おそらく BSDCam 2018
( 8/15 〜 17@ イギリス、ケンブリッジ)
で議論された結果
●
カーネルに capability mode でも
kern.ps_strings だけは読み込み可能にするフラグが
追加されました。
●
capability mode でも問題なく setproctitle(3) できるようにな
ります。

Psql & proctitle

  • 1.
    PostgreSQL と setproctitle(3) 2018 年 8月 28 日 (株)創夢 内藤 祐一郎
  • 2.
    PostgreSQL ● Linux 版の PostgreSQLを ps コマンドで見てみると 次のように表示されることがあります。 – “postgres: userA dbB 192.168.1.11(60936) INSERT” ● これは今まさに userA が dbB に対して insert を実行してい るよ、という表示です。 ● クライアントの IP アドレス、ポート番号も表示されます。 ● この表示は SQL の発行毎に書き換わるため、少し忙しいシステ ムになると秒間数千〜数万程度書き換わる可能性があります。
  • 3.
    PostgreSQL ● FreeBSD だとデフォルトでは使用しないようになっており、 ● postgresql.conf には以下の注意書きがあります。 –# On FreeBSD, this is a performance hog, so keep it off if you need speed – (意訳:スピードが欲しければ OFF にしてお け) – update_process_title = off ● なんでこんなことが書かれているのか?
  • 4.
    setproctitle(3) の実装 ● FreeBSD ではプロセスタイトルの書き換えに setproctitle(3)という libc の関数が用意されています。 ● これは posix ではありません。 BSD 系列の独自実装です。 ● この関数は以下のような sysctl を呼び出します。 – sysctl("kern.proc.proc_args.<pid>", NULL, 0, – " プロセスタイトルの文字列 ", 文字数 ) ● pid を必要とすることから getpid(2) も呼び出します。 ● setproctitle(3) 内では2つのシステムコールが呼び出されます。
  • 5.
    setproctitle(3) の高速化 ● ちなみに Linuxでは argv[0] を書き換えます。 ➔システムコールが呼び出されない分、高速で す。 ● FreeBSD でも同様にプロセスが起動時に呼び出された argv の配列を取得し、その領域を書き換えるようします。 ● これは sysctlbyname(“kern.ps_strings”) で取得できます。 ● その後、カーネルにはこの値を見るように設定します。
  • 6.
    setproctitle(3) の高速化 ● 一度取得したメモリアドレスは staticな変数に保存しておきま すので、2回目以降はメモリ書き換えのみになります。 ➔ Linux とほぼ同じ性能になります。 ● head 及び stable/11 では変更済です。 ➔次期リリースでは update_process_title = on が利 用可能に!
  • 7.
    bhyve で問題発生 ● 先ほどの更新された setproctitile(3)が bhyve で使えないこと が分かりました。 – ( 前回の workshop で動作がおかしいと言って いた話です ) ● なんで使えないのか? ➔ capability mode だから ➔ bhyve は 11.2-R から capability mode で動作します ➔ capability mode では sysctl(2) が使えません
  • 8.
    bhyve の修正 ● capability modeで使えないならば、 capability mode に入る前にセットすれば良い。 ➔ head 及び stable/11 では修正済 ● 前述の通り、一度呼び出しておけば、 capability mode でも使用可能。 ➔2回目以降は sysctlbyname(2) を呼び出さない ため
  • 9.
    setproctitle(3) の論点 ● 必要なリソースは capabilitymode の前に取得しておけ、とい う思想には反していない。 ● setproctitle という名前からリソース取得が必要とは想像しに くい。 ● 取得しているメモリアドレスは自分のプロセスのものであり、 情報漏えいには当たらない。 ● capability mode でも setproctitle(3) できたほうが便利。 ➔以上がざっと思いつく論点です
  • 10.
    setproctitle(3) のその後 ● おそらく BSDCam2018 ( 8/15 〜 17@ イギリス、ケンブリッジ) で議論された結果 ● カーネルに capability mode でも kern.ps_strings だけは読み込み可能にするフラグが 追加されました。 ● capability mode でも問題なく setproctitle(3) できるようにな ります。