書いてる人: 高橋カヲル | [mixi] | [PGP] | [TETRiS DS] | [portscout] | [RSS]
落ち着いたんでメモ。ベースはねぎ支障の SSH アクセス方式。 dynamic DNS だけならこれで十分やね。もちろん BIND がすでに動いているホストなら BIND を使うけど。 tinydns がすでに動いていたホストだったから tinydns を使っただけなんです。
利用者には SSH の公開鍵を提出してもらう。アカウントを作る必要はない。 ~dyndns/.ssh/authorized_keys に鍵を追加する。ここで command オプションを使ってホスト名を与えておく。
command="/var/dyndns/root/dnsupdate --host=kaoru --ttl=60 --verbose" 1024 35 (以下略)
ホストと公開鍵を一対一対応させている。この例だと、ある秘密鍵を持っている人だけが --host=kaoru で dnsupdate を実行できるようになっている。
やんごとなき理由により、利用者が IP を指定したい場合に対応しておくことにした。 command= を使って制限した場合、利用者が実行しようと目論んだコマンドが SSH_ORIGINAL_COMMAND に入る。ここを使って IP アドレスを陽に指定することができるようにしてある。もちろん、利用者が信用できない環境では SSH_CLIENT だけを使おう。信用できる利用者にだけ許すように、コマンドラインオプションを追加しておくといいかもしれない。(今気づいた) SSH_ORIGINAL_COMMAND で渡すなんて使い方は邪道なのでむやみに使うな>カヲル。
use strict qw(vars subs refs);
use Getopt::Long;
GetOptions("help", "version", "verbose", "host=s", "ip=s", "ttl=i");
if ($main::opt_help) {
print STDOUT << "END_USAGE" ;
Usage: dnsupdate [OPTION]
Startup:
--version display the version of dnsupdate and exit.
--help print this help.
--verbose be verbose.
--host=HOST set hostname
--ip=IP set IP address
--ttl=TTL set TTL
END_USAGE
exit 0;
}
my $DYNDNSDIR='/var/dyndns/root';
my @DOMAINS = ( 'dyn.example.com',
'dyn.example.org',
'dyn.example.net' );
my $COMMAND = "cd ${DYNDNSDIR} && /usr/bin/make ";
my $TTL = $main::opt_ttl || 60;
my $HOST = $main::opt_host || die;
my $IP = $main::opt_ip
|| (split(/\s/, $ENV{SSH_ORIGINAL_COMMAND}))[0]
|| (split(/\s/, $ENV{SSH_CLIENT}))[0]
|| die "Can't detect IP address";
unless ($IP =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
die 'Invalid IP adderss';
}
open(HOSTFILE, ">${DYNDNSDIR}/${HOST}.data") or die;
foreach (@DOMAINS) {
print HOSTFILE "=${HOST}.$_:${IP}:${TTL}\n";
print STDERR "=${HOST}.$_:${IP}:${TTL}\n" if $main::opt_verbose;
}
close HOSTFILE;
if ($main::opt_verbose) {
system("$COMMAND");
} else {
system("$COMMAND > /dev/null");
}
これは普通に。
data.cdb: data /usr/local/bin/tinydns-data data: *.data ns.data cat $> | sort -u > $@
ns.data には静的な部分を入れてある。
.dyn.example.com:192.168.170.84:ns.dyn.example.com:3600 .dyn.example.net:192.168.170.84:ns.dyn.example.net:3600 .dyn.example.org:192.168.170.84:ns.dyn.example.org:3600
利用者は ssh dyndns@ns.dyn.example.com するだけ。 ssh dyndns@ns.dyn.example.com 10.0.0.2 のように IP アドレスを指定することも可能だが、それは routeing が不安定な謎環境でのスクリプト中での使用を目的にしたもの。 known_hosts 問題を除けば、利用者のコマンドラインは変更しないで済むように設計したつもり。他の名前でなく、ns.dyn.example.com である理由はそれ。 SSH_ORIGINAL_COMMAND で IP アドレスを渡す機能は不必要なら必ず切ること。念のため。
なお、単一アカウントに対する ssh で committer を区別できるようにするため、committer 各人で異なる鍵を使用し、authorized_keys 内で、鍵毎に異なる command ないし environment を設定する。
Powered by 早起き生活