auth user pass verify

Как то понадобилось настроить ВПН сервер с максимально жестокими политиками доступа: авторизация по ключу — для каждого юзера отдельного, авторизация по паре логин+пароль. причем ключ и пара логин+пароль у каждого юзера строго индивидуальны. стал рыть маны, искать статьи на сайте в основном делал по статье поэтому не буду пересказывать как ставить и настраивать, как генерить ключи (по статье сам лично разобрался, разумеется не без пива =))

А расскажу лучше про фишки OpenVPN. Вот выдержка из мана:

—auth-user-pass-verify script method
Require the client to provide a username/password (possibly in
addition to a client certificate) for authentication.

OpenVPN will execute script as a shell command to validate the
username/password provided by the client.

If method is set to «via-env», OpenVPN will call script with the
environmental variables username and password set to the user-
name/password strings provided by the client. Be aware that
this method is insecure on some platforms which make the envi-
ronment of a process publicly visible to other unprivileged pro-
cesses.

If method is set to «via-file», OpenVPN will write the username
and password to the first two lines of a temporary file. The
filename will be passed as an argument to script, and the file
will be automatically deleted by OpenVPN after the script re-
turns. The location of the temporary file is controlled by the
—tmp-dir option, and will default to the current directory if
unspecified. For security, consider setting —tmp-dir to a
volatile storage medium such as /dev/shm (if available) to pre-
vent the username/password file from touching the hard drive.

The script should examine the username and password, returning a
success exit code (0) if the client’s authentication request is
to be accepted, or a failure code (1) to reject the client.

This directive is designed to enable a plugin-style interface
for extending OpenVPN’s authentication capabilities.

To protect against a client passing a maliciously formed user-
name or password string, the username string must consist only
of these characters: alphanumeric, underbar (‘_’), dash (‘-‘),
dot (‘.’), or at (‘@’). The password string can consist of any
printable characters except for CR or LF. Any illegal charac-
ters in either the username or password string will be converted
to underbar (‘_’).

Care must be taken by any user-defined scripts to avoid creating
a security vulnerability in the way that these strings are han-
dled. Never use these strings in such a way that they might be
escaped or evaluated by a shell interpreter.

Смысл в следующем: есть возможность запускать в дополнение авторизации по ключам отдельный пользовательский скрипт для авторизации, и передавать ему логин пасс либо через переменные окружения (via-env), либо через файл (via-file).
Скрипт после проверки должен завершатся либо с кодом 0 — проверка успешна, либо с кодом 1 — сбой авторизации
Сразу скажу что в логине можно использовать только буквы латинского алфавита, цифры, (‘_’), (‘-‘), (‘.’), (‘@’). (про русские имена пользователей можно СРАЗУ ЗАБЫТЬ!)

Я не стал передавать параметры через файл — потенциальная дырка, а передал через переменные окружения (via-env)

Не стану выкладывать полный код (писался для довольно специфичной базы), приведу лишь выдержку которой вполне хватит для того чтобы разобратся как дальше дописать под себя

вот мой получившийся конфиг сервера

все остальное делал по статье, добавил скриптик для упрощения генерации ключей, админку прикрутил на пыхе, поднял nginx — и жить стало легче!
P.S. сервер работает не первый месяц в продакшне — нестабильности не выявил =)

P.S.S
скрипт для создания таблички

размещено: 2008-11-26,
последнее обновление: 2008-12-04,
автор: arksu

Reported by: lhejrovsky Owned by:
Priority: major Milestone:
Component: Generic / unclassified Version: OpenVPN 2.2.2 (Community Ed)
Severity: Not set (select this one, unless your’e a OpenVPN developer) Keywords: password verify env empty
Cc:

Description

OpenVPN 2.3.12 x86_64-redhat-linux-gnu
When option auth-user-pass-verify via-env is used, I can print username, but password is empty.

openvpnserver.conf:
auth-user-pass-verify /etc/openvpn/LDAP/test.pl via-env

Example test script here:

Folowing script writes username to the openvpn log file, but password is not written. Apparently the variable $p is empty.

I know the password is passed from client to OpenVPN server fine, because I run succesfull test with «via-file» method, where both username and password were written to the temp file.

Иногда бывают ситуации, когда нужно использовать openvpn и авторизацию не по ключам, а по логину паролю. Можно так же использовать совместно, для увеличения безопасности оба этих метода.

Тестовый стенд: Debian 6 (kernel 2.6.32-5-686), openvpn 2.1.3.

1) Настройка сервера.

Добавляем в конфигурационный файл вашего сервера такие строки:

auth-user-pass-verify /etc/openvpn/verify.sh via-file
client-cert-not-required
username-as-common-name
tmp-dir /etc/openvpn/tmp
script-security 2

Пояснение.

auth-user-pass-verify — отвечает за авторизацию по логину паролю. При каждом подключении будет запускаться файл /etc/openvpn/verify.sh, который собственно и будет производить проверку. В результате проверки скрипт вернёт 0 (при успехе) и 1 (при ошибке). По этому коду openvpn собственно или предоставит доступ или откажет. То есть авторизацию будет производить не сам openvpn, а внешний скрипт.

client-cert-not-required — это значит, что при проверке логина/пароля не будет запрашиваться проверка сертификата.

username-as-common-name — она позволяет использовать для дальнейшей идентификации клиента не CommonName (имя из предъявленного сертификата клиента), а введенный UserName.

tmp-dir — путь к временной папке, где будет создавать файл с переданным логином/паролем, который потом будет передаваться как аргумент в наш скрипт проверки для сверки с файлом паролей

script-security — для того, что бы можно было выполнять внешние скрипты; иногда без этой опции не работает.

Примечание.

Если нужно дополнительно проверка сертификатов, тогда нужно будет убрать опцию client-cert-not-required

Вот сам скрипт проверки verify.sh

#!/bin/sh
## format: username:password username:password .
## you can even have same usernames with different passwords
# USERS=’user1:pass1 user2:pass2 user3:pass3′
## you could put username:password in
## a separate file and read it like this
USERS=`cat /etc/openvpn/user.pass`
vpn_verify() <
if [ ! $1 ] || [ ! $2 ]; then
#echo «No username or password: $*»
exit 1
fi
## it can also be done with grep or sed
for i in $USERS; do
if [ «$i» = «$1:$2» ]; then
## you can add here logging of users
## if you have enough space for log file
#echo `date` $1:$2 >> your_log_file
exit 0
fi
done
>
if [ ! $1 ] || [ ! -e $1 ]; then
#echo «No file»
exit 1
fi
## $1 is file name which contains
## passed username and password
vpn_verify `cat $1`
#echo «No user with this password found»
exit 1

а файл с паролями /etc/openvpn/user.pass выглядит так:

то есть идёт через пробел пара логин:пароль. Пароль находится в открытом виде!

Не забудьте сделать файл verify.sh исполняемым!

2) Настройка клиента.

В конфигурационный файл добавляем такую строку:

и создаём соответственно файл pass.txt, где будет находится логин и пароль в таком виде:

Примечание.

Если в параметре auth-user-pass убрать путь к файлу, будет запрашиваться логин/пароль.

3) Запуск и проверка.

После запуска в логах сервера увидим такое:

Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Re-using SSL/TLS context
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 LZO compression initialized
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Control Channel MTU parms [ L:1618 D:138 EF:38 EB:0 ET:0 EL:0 ]
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Data Channel MTU parms [ L:1618 D:1450 EF:86 EB:135 ET:32 EL:0 AF:3/1 ]
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Local Options hash (VER=V4): ‘ca81f7f4’
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Expected Remote Options hash (VER=V4): ‘9da06d93’
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 TLS: Initial packet from [AF_INET]10.1.0.22:1440, s > Tue Sep 6 12:25:31 2011 10.1.0.22:1440 TLS: Username/Password authentication succeeded for username ‘user’ [CN SET]
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Data Channel Encrypt: Cipher ‘BF-CBC’ initialized with 128 bit key
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Data Channel Encrypt: Using 512 bit message hash ‘SHA512’ for HMAC authentication
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Data Channel Decrypt: Cipher ‘BF-CBC’ initialized with 128 bit key
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Data Channel Decrypt: Using 512 bit message hash ‘SHA512’ for HMAC authentication
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA
Tue Sep 6 12:25:31 2011 10.1.0.22:1440 [user] Peer Connection Initiated with [AF_INET]10.1.0.22:1440
Tue Sep 6 12:25:31 2011 user/10.1.0.22:1440 OPTIONS IMPORT: reading client specific options from: /etc/openvpn/ccd/user
Tue Sep 6 12:25:33 2011 user/10.1.0.22:1440 PUSH: Received control message: ‘PUSH_REQUEST’
Tue Sep 6 12:25:33 2011 user/10.1.0.22:1440 SENT CONTROL [user]: ‘PUSH_REPLY,route 10.10.10.0 255.255.255.0,route 10.1.44.0 255.255.255.0,dhcp-option DNS 10.0.101.100,dhcp-option DNS 10.0.102.225,dhcp-option DNS 127.0.0.1,route-gateway 10.10.10.1,ping 10,ping-restart 120,ifconfig 10.10.10.2 10.10.10.1’ (status=1)

Как видим, идёт проверка только логина/пароля, без проверки сертификата

openvpn и авторизация по логину/паролю : 8 комментариев

Доброго времени суток. Настроил конфиг на сервере, все прошло на ура! Но вот со стороны клиента ошибки выходят. Не мог ли бы вы по подробнее объяснить «что, куда добавлять, и если нужно закомментировать подсказать где ?» Спасибо!

Извиняюсь, ошибка была в скрипте, в ковычках.

Было бы здорово более детально рассказать про настройки подключения со стороны клиента. И еще бы полный пример конфига сервера. Настроил но у клиента отваливается подключение по таймауту, на сервере порт открыт и в логах пусто.
Спасибо!

Дополнительно можно поискать по сайту по слову openvpn

Пытаюсь настроить подключение на роутере. И возник такой момент что нужно как-то указать логин и пароль в строке auth-user-pass, это возможно?

Нет. В auth-user-pass-verify должен вернуться код возврата проверки (0 — успех, остальное — fail).

Подскажите, как сделать подключение по лог и паролю для смартфона?

В конфигурационный файл добавляем такую строку:

Если в параметре auth-user-pass убрать путь к файлу, будет запрашиваться логин/пароль.

Оцените статью