Tiarra (あるいはPerl) からhosts.allowとか使ってアクセス制御する話

諸般の事情で、ついに Tiarra ユーザーになったんですけど、Dynamic DNS を使って SSH アクセスを制限する方法 - kazuhoのメモ置き場 に書いたようにサーバのアクセス制限を hosts_access 使ってやってるので Tiarra についても同様にしたい。

Perl の場合は Authen::Libwrap モジュールを使えばいいので、パッチ書いた。取り込んでもらおうとか別に思ってないので、モジュールがなかった場合の処理とか入ってないですが。

これで SSH をはじめ各種デーモンのアクセス制御を統一的にできるので楽ちん。

$ diff -u main/RunLoop.pm.orig main/RunLoop.pm
--- main/RunLoop.pm.orig	2010-12-01 17:02:14.000000000 +0900
+++ main/RunLoop.pm	2010-12-01 17:05:54.000000000 +0900
@@ -11,6 +11,7 @@
 use strict;
 use warnings;
 use UNIVERSAL;
+use Authen::Libwrap ();
 use Carp;
 use IO::Socket::INET;
 use IO::Select;
@@ -874,7 +875,10 @@
 		# クライアントからの新規の接続
 		my $new_sock = $sock->accept;
 		if (defined $new_sock) {
-		    if (!$this->{terminating}) {
+                    if (! Authen::Libwrap::hosts_ctl("tiarra", $new_sock)) {
+                        $this->notify_error("access denied by hosts_ctl");
+                        $new_sock->shutdown(2);
+		    } elsif (!$this->{terminating}) {
 			eval {
 			    my $client = new IrcIO::Client($this, $new_sock);
 			    push @{$this->{clients}},$client;

以上、備忘録をかねて。