понедельник, 4 апреля 2011 г.

Скрипт аутенификации в OpenVPN по текстовому файлу с паролями

Возникла необходимость создания OpenVPN-сервера с простой авторизацией по юзернему-паролю. В итоге вышел небольшой скрипт на perl, указанный ниже, который вызывался OpenVPN-ом, и читал из файла логины-пароли вида:
пользователь:пароль

Вот конфиг сервера:
port 2002
proto udp
dev tun
script-security 3 ## Обязательно, иначе не будет вызывать наш скрипт
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
server 10.10.22.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-config-dir ccd
auth-user-pass-verify keys/checkpasswd.pl via-env ## Вот собственно и вызов нашего скрипта
client-to-client
username-as-common-name
auth MD5
cipher AES-128-CBC
keepalive 10 40
comp-lzo
max-clients 20
user nobody
group nobody
persist-key
persist-tun

Собственно скрпт checkpasswd.pl:
#!/usr/bin/perl
use strict;

## Password file here. Must be an absolute path!
## Example content of passwords file:
## user:password
## foo:bar

my $file = '/usr/local/etc/openvpn/keys/passwords.txt';


## Dont touch below!
my $givenlogin = $ENV{username};
my $givenpass = $ENV{password};

open(CONF,'<',$file) or exit 1;

while() {
    ## Login will be $credentials[0] , password = credentials[1]
    my @credentials=split(':',$_);
    foreach(@credentials){
        chomp($_);
    }
    ## Check if login is in passwords file
    if($givenlogin eq $credentials[0]) {
    ## Check passwords is match
        if($givenpass eq $credentials[1]) {
    close(CONF);
            exit 0;
        }
        else {
    close(CONF);
            exit 1;
        }
    }
}
close(CONF);
exit 1;

Комментариев нет: