Как то понадобилось настроить ВПН сервер с максимально жестокими политиками доступа: авторизация по ключу — для каждого юзера отдельного, авторизация по паре логин+пароль. причем ключ и пара логин+пароль у каждого юзера строго индивидуальны. стал рыть маны, искать статьи на сайте в основном делал по статье поэтому не буду пересказывать как ставить и настраивать, как генерить ключи (по статье сам лично разобрался, разумеется не без пива =))
А расскажу лучше про фишки 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 If method is set to «via-env», OpenVPN will call script with the If method is set to «via-file», OpenVPN will write the username The script should examine the username and password, returning a This directive is designed to enable a plugin-style interface To protect against a client passing a maliciously formed user- Care must be taken by any user-defined scripts to avoid creating |
Смысл в следующем: есть возможность запускать в дополнение авторизации по ключам отдельный пользовательский скрипт для авторизации, и передавать ему логин пасс либо через переменные окружения (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 убрать путь к файлу, будет запрашиваться логин/пароль.