個人サーバのファイアウォールを活かしつつ、どこからでもログインする方法 (CGI編)

以前、

いつでもどこからでもサーバにログインしたくなるときってありますよね。かといって、サーバの sshd への接続を全世界から可能にしておくというのは、たとえパスワード認証を無効化していても避けたいところ

Dynamic DNS を使って SSH アクセスを制限する方法 - kazuhoのメモ置き場

ということでDynamic DNSを使う方法でやってきてたんだけど、いろいろ不便があったので、HTTPベースに変えた。具体的に言うと、

#! /usr/bin/perl

use strict;
use warnings;

my $TARGET_FILE = '/etc/hosts.allow.d/www/update_addr_cgi';

print "Content-Type: text/plain\r\n\r\n";

my $remote_addr = $ENV{REMOTE_ADDR}
    or die "no remote addr\n";

open my $fh, '>', $TARGET_FILE
    or die "failed to open $TARGET_FILE:$!";
print $fh "$remote_addr\n";
close $fh;

print "address updated to:$remote_addr\n";

のような CGI を個人サーバの秘密の場所*1に設置して、/etc/hosts.allowに

ssh: /etc/hosts.allow.d/www/update_addr_cgi

と書いた感じ*2(実際は他のサービスもマッピングしてる)。

サーバプロセスをファイアウォール(というかtcpwrapper)で保護することでインターネットから攻撃される可能性を下げつつ、CGIを一発たたいたらどこからでも作業できるようになるので、わりと便利。

*1:Basic認証等をセットしてもいいが、このCGIの目的はssh等による認証の前のノッキングだと考えるならば必ずしも必須ではない

*2:/etc/hosts.allow.d/wwwはCGIの実行権限で書き込み可能にしておく