Авторизация клиентов openvpn по логину и паролю.
У вас уже наверно есть настроенный vpn и вы задумались, что уже порядком надоело генерировать сертификаты каждому клиенту, потом отзывать их когда человек перестал пользоваться. Предлагаем вам простой и удобный способ авторизовывать клиентов на вашем vpn сервер по логину и паролю. В данном примере за авторизацию будет отвечать php скрипт который взаимодействует с базой данных mysql. Но вы можете использовать любой другой язык программирования. Openvpn ожидает от скрипта 2 ответа: 0 — авторизация успешна, 1 — авторизация не успешна.
Вам необходимо перейти на ваш сервер и установить php, mysql. Для удобства использования можно сразу установить lamp и через phpmyadmin управлять вашими пользователями:
Статьи о том как установить lamp:
Установка LAMP на Debian 10.
LAMP вы успешно установили переходим с созданию базы данных и пользователя для работы с базой данных:
mysql -u root -p
create database vpn;
CREATE USER 'vpn'@'localhost' IDENTIFIED BY 'strongpassword';
Назначаем полные привелегии пользователю:
GRANT ALL PRIVILEGES ON vpn.* to 'vpn'@'localhost' IDENTIFIED BY 'strongpassword' WITH GRANT OPTION;
Перезагружаем привелегии:
FLUSH PRIVILEGES;
Переходим в phpmyadmin
http://ip/phpmyadmin/
Выбираем базу данных vpn и переходим на вкладку sql и выполняем следующий sql запрос:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE users
(
id
int(5) NOT NULL,
username
varchar(15) NOT NULL,
password
varchar(100) NOT NULL,
date
int(18) NOT NULL DEFAULT '1835008257',
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE users
ADD PRIMARY KEY (id
);
ALTER TABLE users
MODIFY id
int(5) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
COMMIT;
Рассмотрим подробней структуру таблицы:
id — идентификато пользователя
username — имя пользователя
password — пароль. в базе дынных хранится в виде md5 хеша.
date — дата в формате Unix Time Stamp, после которой пользователю будет отказано в авторизации. По умолчанию устанавливается 1835008257 (02/24/2028 @ 12:30pm (UTC))
Переходим на вкладку Вставить. И добавляем новую строку в базу данных.
Перейдем к донастройке vpn, если у Вас ещё не настроен vpn почитайте статью:
Установка openvpn на Debian 10 (Buster)
Нам необходио добавить в конфигурационный файл
script-security 3
auth-user-pass-verify "/usr/bin/php /etc/openvpn/verify.php" via-env
client-cert-not-required
username-as-common-name
И создать файл /etc/openvpn/verify.php он будет отвечать за авторизацию клиентов.
#!/usr/bin/php
<?php
$bd = mysqli_connect("localhost","vpn","strongpassword");
mysqli_select_db($bd,"vpn");
$user = getenv("username");
$password = md5(getenv("password"));
$nowtime=time();
$qr="SELECT * FROM users
where username='".$user."' AND password='".$password."' AND date>".$nowtime;
$query=mysqli_query($bd,$qr) or die(mysqli_error());
$strok=mysqli_num_rows($query);
if ($strok==1)
exit(0);
}else
{
exit(1);
}
?>
Настройки на сервере закончены. Переходим к настройкам клиента.
Рядом с конфигурационным файлом необходимо созадть файл user.txt с содержимым
user
password
И добавить в конфигурационный файл строку:
auth-user-pass user.txt
Теперь всем клиентам можно выдавать один и тот же комплект сертификатов, поскольку commonname будет определен как username при авторизации.
https://nix-notes.com/debian/nastrojka-double-vpn-na-debian-10/
как к этой статье применить?
script-security 3
auth-user-pass-verify «/usr/bin/php /etc/openvpn/verify.php» via-env
client-cert-not-required
username-as-common-name
я добавил в конфиг сервера к которому конектятся клиенты вот это и поставил php на сервер.
и в клиентский конфиг добавил адреса.