自宅にある Linux マシンのうち一台で一般ユーザにおいて ping を実行すると「ping: socket: Operation not permitted」と表示され、ping が送信できない現象に気がついた。(root ユーザならちゃんと実行できる)
最初は setuid の問題かと思っていたのだけれど、一般ユーザで実行できる方のマシンの ping コマンドは
$ ls -la /bin/ping -rwxr-xr-x 1 root root 65088 Jan 14 2020 /bin/ping
で、特に setuid されていないにもかかわらず ping が実行できる。
調べてみたところ、ケイパビリティという仕組みで制御されているらしく、先の一般ユーザで実行できるマシンの ping コマンドは
$ /sbin/getcap /bin/ping /bin/ping = cap_net_raw+ep
となっていたが、実行できない方は設定が無かった。
と言うことで、実行できない方のマシンで、
# setcap cap_net_raw+ep /bin/ping
としたところ、一般ユーザでも実行できるようになった。
何で片方のマシンはケイパビリティが失われていたかと言うことなのだけれども、これはこのマシンで以前 root ファイルシステムを rsync でコピーしたことがあって、その時に -X オプションを設定しなかったので拡張属性が失われたためのようだ。(ケイパビリティは拡張属性で実装されている)
一つ賢くなったけれども、これは気がつかないわ・・・。安易に setuid しない方向なのだなぁ。