[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なども導入されておりそちらが原因なのか最初かなり悩んでしまいました。なかなか難しいものですね。

さくらインターネットVPSのUbuntuを12.4にアップグレードする

Read More

何をおもったのか先日はサーバをアップデートしたのですがUbuntu11.4でやめてしまいました。よく考えたらもっと新しいバージョンが出ているわけです。なんか11.4が耳慣れていてそこでやめてしまいました (^^;

1 tmux

root@ubuntu:/home# do-release-upgrade

後2回実施して 11.10 。そしてつい先日でた 12.4 にあげておく事にします。

一番の変更してしまうのはMySQLが5.5になってしまう事のような気もします。アプリケーションとしては前回同様にあまり導入されていないのでさほど変更はありませんでした。念のため構成ファイルが置き換わるものは以前のものをコピーしておいて後から書き換えるようにしています。

ubuntuはそういえば、ローリングリリースになるとか行っていたのですがまだ半年おきのアップデートなんですかね?色々区分するにも分かりやすくて良いのですが。 


あと、今回は容量も大きいのでgitも使えるようにして起きました。これでローカルに今までおいておいたソースなどはすべてサーバ側におくように出来ます。普段は家のファイルサーバにバックアップとっていたのですがこれで複数の端末から作業が出来ます。今更なんですがね。

普段からWindowsが仕事で使っているのでMac/Windows共存の環境を心がけないといけないのですが最近色々さぼっていたらバラバラになってしまって何やら大変なのです。以前Gitを用いて設定ファイルを管理されている方がいたので同じように頑張りたいなと思っているのですが。

後はRedmineを入れないといけないなと思いながら会社で作りたいので自分のサーバにいれてもなとも思っているところ。一度設定すると色々バージョンに縛られて遊びづらいというのもあるしな。ちょっとプライベートも仕事も redmine + toodledo + evernote(memo) で管理していこうかなと思ったりしています。

さくらインターネットVPSのUbuntuを11.4にアップグレードする

Read More

今日横浜での雹にびっくりした @tokida です。帰り道、まだ氷が道路の脇にありました。


photo credit: Kat Gloor via photo pin cc

MacOSはパッチがあたってそうそうと忘れていた、さくらインターネットVPSのUbuntuを最新版に上げます。gitを使おうとおもってパッケージ見たら古いのしか無くて今更ながらにバージョンが古いのを認識しました。

現在のバージョンの確認

root@ubuntu:/home# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

設定ファイルの更新(release-upgradesの最後の指定を normal に変更します)

root@ubuntu:/home# cat /etc/update-manager/release-upgrades
# Default behavior for the release upgrader.

[DEFAULT]
# Default prompting behavior, valid options:
#
#  never  - Never check for a new release.
#  normal - Check to see if a new release is available.  If more than one new
#           release is found, the release upgrader will attempt to upgrade to
#           the release that immediately succeeds the currently-running
#           release.
#  lts    - Check to see if a new LTS release is available.  The upgrader
#           will attempt to upgrade to the first LTS release available after
#           the currently-running one.  Note that this option should not be
#           used if the currently-running release is not itself an LTS
#           release, since in that case the upgrader won't be able to
#           determine if a newer release is available.
#Prompt=lts
Prompt=normal

最後にアップデートコマンドで最新版のUbuntu11.04にアップします。

root@ubuntu:/home# do-release-upgrade

ちなみに、サポートされない(gnupg-curl libmpfr1ldbl)と 削除(libc6-i686 libept0)がありましたが悩んでも仕方ないのでyで進めていきます。それにしてもOSのりリースアップデートがこんなに楽なんて素晴らしいですね。昔からDebian系を結構使っていたのですが相変わらずスムースでした。
殆どアプリケーションも入れていない状態なので特にアップグレード時の質問は困るものはありませんでした。変更が多いと差分みてとメモしながらのほうがいいかと思います。

root@ubuntu:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.10
DISTRIB_CODENAME=maverick
DISTRIB_DESCRIPTION="Ubuntu 10.10"

さてバージョンを見てみると 10.10 ですね。11.4には一気にはバージョンアップできないのです。なのでこのままもう一度、do-release-upgrade を行うことで完了となります。

root@ubuntu:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

ということでようやく natty になりました。
これで心置きなく他のアプリも入れて見ることが出来ます。本来ならNgnixとかWordpressとか入れる前にやっておきたい作業でしたね。