openvpn и авторизация по логину/паролю

Иногда бывают ситуации, когда нужно использовать 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 выглядит так:

user1:pass1 user2:pass2 ...

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

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

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

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

auth-user-pass c:\\vpn\\pass.txt

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

username
password

Примечание.

Если в параметре 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, sid=e2fe5190 4600df99
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 и авторизация по логину/паролю: 6 комментариев

  1. Владислав

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

  2. sotariz

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

  3. Pavel

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

    1. skeletor Автор записи

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *