[Linux] 一般ユーザのプロセスをポート1024番未満でBindする方法
ircdプログラムを導入しようとしてどうにも6667ポートで通信が出来ないのではまっていたのですが(6667は相変わらずつながらない)その際に別のポートにすればと思って443とか880とか適当にしていたのですが、Permission Deinedになっていました。
これIPのポート番号が1024未満(特権ポート privileged ports)に該当して、特権プロセス(CAP_NET_BIND_SERVICE ケーパビリティを持つプロセス)でないとアクセス出来ないことを無視していたために発生していました。初歩的な事でした。
実際にはrootユーザであればバインドして利用することが可能となりますが ircdのサービスの起動ユーザが irc 等であったたのでバインドが出来ない状態でした。ユーザを変更れば可能かもしれませんがプロセス自体にこの特権を与えることもできます。
この特権を個別にプロセスに付与するために、Linuxではケーパビリティという機能があり特権を少しづつ割り当てることができます。
$ sudo setcap CAP_NET_BIND_SERVICE+ep /usr/sbin/ngircd $ sudo getcap /usr/sbin/ngircd /usr/sbin/ngircd = cap_net_bind_service+ep
という設定を行います。この状態で起動すると
Jul 23 18:14:15 ubuntu ngircd[3286]: Reading configuration from "/etc/ngircd/ngircd.conf" ... Jul 23 18:14:15 ubuntu ngircd[3286]: No SSL server key configured, SSL disabled. Jul 23 18:14:15 ubuntu ngircd[3286]: Warning: Error during SSL initialization, continuing ... Jul 23 18:14:15 ubuntu ngircd[3287]: Running as user irc(39), group irc(39), with PID 3287. Jul 23 18:14:15 ubuntu ngircd[3287]: Not running with changed root directory. Jul 23 18:14:15 ubuntu ngircd[3287]: IO subsystem: epoll (hint size 100, initial maxfd 100, masterfd 4). Jul 23 18:14:15 ubuntu ngircd[3287]:Now listening on [0::]:1022 (socket 8). Jul 23 18:14:15 ubuntu ngircd[3287]:Now listening on [0.0.0.0]:1022 (socket 9).
という形で起動することができます。
参考までに権限を取り外すと
$ sudo setcap -r /usr/sbin/ngircd $ sudo getcap /usr/sbin/ngircd
起動すると
Jul 23 18:17:13 ubuntu ngircd[3325]: Reading configuration from "/etc/ngircd/ngircd.conf" ... Jul 23 18:17:13 ubuntu ngircd[3325]: No SSL server key configured, SSL disabled. Jul 23 18:17:13 ubuntu ngircd[3325]: Warning: Error during SSL initialization, continuing ... Jul 23 18:17:13 ubuntu ngircd[3326]: Running as user irc(39), group irc(39), with PID 3326. Jul 23 18:17:13 ubuntu ngircd[3326]: Not running with changed root directory. Jul 23 18:17:13 ubuntu ngircd[3326]: IO subsystem: epoll (hint size 100, initial maxfd 100, masterfd 4). Jul 23 18:17:13 ubuntu ngircd[3326]:Can't bind socket to address 0:::1022 - Permission denied Jul 23 18:17:13 ubuntu ngircd[3326]:Can't bind socket to address 0.0.0.0:1022 - Permission denied Jul 23 18:17:13 ubuntu ngircd[3326]: Server isn't listening on a single port! Jul 23 18:17:13 ubuntu ngircd[3326]: ngircd exiting due to fatal errors!
となり、1022番ポートではバインド出来ずPermission Deniedとなります。
参考文献
それにしてもngircdですがディフォルトのポート6667,6668,6669では相変わらず動かないのはなぜでしょうか? ローカルでBindはできているため別の理由によりつながらない模様です。ちょっと原因はさっぱりでした。ここ数年Linux界隈から遠ざかっていたので色々物忘れが激しいです。Ubuntuではセキュリティの機構としてAppArmorなども導入されておりそちらが原因なのか最初かなり悩んでしまいました。なかなか難しいものですね。