Категорії
Security

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)

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

7 коментарів “openvpn и авторизация по логину/паролю”

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

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

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

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff