Jukka Laitinen

dyfi-update.pl:n muuttaminen käyttämään TLS:ää

12.12.2012

Muokattu: 10.3.2019 01:11

Liityin hiljan käyttämään suomalaista dynaamisen DNS:n palveluntarjoajaa, dy.fi:tä. Ip:n ja nimen yhdistelmän päivittämiseen sivuilla on tarjolla eri menetelmiä, minulle parhaiten sopii Perlillä tehty taustaprosessina toimiva ohjelma. Siinä välitetään tunnus ja salasana dy.fi:n palvelimelle selväkielisenä, kaiketi siksi, koska ohjelma on haluttu pitää riippumattomana erikseen asennettavista moduuleista. Joten lisäsin tuen salaukselle, ja myös oikeuksien laskemiseen halutun käyttäjän tasolle. Diffissä käyttäjän nimi on 'dyfi', vaihda se haluamaksesi.

Koodi GitHubissa.
diff --git a/dyfi-update.pl b/dyfi-update.pl
  index da871ea..46a5ee0 100755
  --- a/dyfi-update.pl
  +++ b/dyfi-update.pl
  @@ -92,6 +92,8 @@ require 5.002;
   use Socket;
   use strict;
   use Fcntl qw(:flock);
  +use IO::Socket::SSL;
  +use POSIX qw/setuid setgid/;
   
   my ($debug, $log, $pidfile, $cfgfile,
    $update_host, $update_uri, $update_port,
  @@ -113,7 +115,7 @@ $do_release = 0;
   # a transparent proxy)
   $update_host = 'www.dy.fi';
   $update_uri = '/nic/update';
  -$update_port = 8180;
  +$update_port = 443;
   # checkip server
   $checkip_host = 'checkip.dy.fi';
   $checkip_uri = '/';
  @@ -150,6 +152,10 @@ Please remember: dyfi-update.pl is a daemon, not a cron script.
   
   ";
   
  +# drop privileges
  +my $username = 'dyfi';
  +drop_privileges($username);
  +
   #
   #	parse arguments
   #
  @@ -195,6 +201,15 @@ if (!$pidfile) {
    exit 1;
   }
   
  +# Drop privileges.
  +sub drop_privileges {
  +	my $username = shift;
  +	
  +	my ($uid, $gid) = (getpwnam($username))[2, 3];
  +	setgid($gid) || crash("Can't drop privileges: $!");
  +	setuid($uid) || crash("Can't drop privileges: $!");
  +}
  +
   #
   #	read & parse config file
   #
  @@ -333,6 +348,13 @@ sub htget {
      return;
    }
    
  +	# turn socket to ssl socket only when c_redentials needed
  +	if ($ht_user && $ht_passwd && !IO::Socket::SSL->start_SSL(\*SOCK)) {
  +		my $err = IO::Socket::SSL::errstr();
  +		error("Cannot upgrade socket to use IO::Socket::SSL: $err");
  +		return;
  +	}
  +	
    my($request)	= "GET $ht_uri HTTP/1.0\r\n"
        . $basicauth
        . "User-Agent: $me $version ($$)\r\n"

Comments

Previous