Pull to refresh

Comments 11

Почти всё тоже самое, только лучше, одним скриптом и для центос:
#!/usr/bin/env bash
yum install epel-release -y ; yum install htop nano bash-completion-extras openvpn easy-rsa -y
export EASYRSA_VARS_FILE="/etc/openvpn/vars"

cat << EOF > $EASYRSA_VARS_FILE
export EASYRSA_PKI="/etc/openvpn/pki"
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Moscow"
export KEY_ORG="Home"
export KEY_EMAIL="blackhole@alexgluck.ru"
export KEY_CN="${STAND}${VPN_DOMAIN:-vpn.alexgluck.ru}"
export KEY_OU="bedroom"
export KEY_NAME="${VPN_DOMAIN:-vpn.alexgluck.ru}"
export KEY_ALTNAMES="openvpn.${VPN_DOMAIN:-vpn.alexgluck.ru}"
EOF

# shellcheck disable=SC1090
source "$EASYRSA_VARS_FILE"
/usr/share/easy-rsa/3/easyrsa --batch init-pki
/usr/share/easy-rsa/3/easyrsa --batch build-ca nopass
/usr/share/easy-rsa/3/easyrsa gen-dh
/usr/share/easy-rsa/3/easyrsa --batch gen-req --req-cn="$KEY_NAME" "$KEY_NAME" nopass
/usr/share/easy-rsa/3/easyrsa --batch sign-req server "$KEY_NAME"
openvpn --genkey --secret "$EASYRSA_PKI"/ta.key

cat << EOF > /etc/openvpn/server/"${VPN_PROTO:-udp}".conf
local ${VPN_BIND:-0.0.0.0}
port ${VPN_PORT:-1194}
proto ${VPN_PROTO:-udp}
dev tun
ca $EASYRSA_PKI/ca.crt
cert $EASYRSA_PKI/issued/${KEY_NAME}.crt
key $EASYRSA_PKI/private/${KEY_NAME}.key
dh $EASYRSA_PKI/dh.pem
tls-auth $EASYRSA_PKI/ta.key 0
topology subnet
server ${VPN_SUBNET:-10.254.250.0} 255.255.255.0
ifconfig-pool-persist ipp-${VPN_PROTO:-udp}.txt
keepalive 10 120
persist-key
persist-tun
# log-append /var/log/openvpn/openvpn-${VPN_PROTO:-udp}.log
verb 3
mode server
tls-server
comp-lzo yes
cipher BF-CBC
EOF

echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p

mkdir -p /var/log/openvpn
firewall-cmd --permanent --add-port=${VPN_PORT:-1194}/${VPN_PROTO:-udp}
firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -s ${VPN_SUBNET:-10.254.250.0}/24 -j MASQUERADE
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -s ${VPN_SUBNET:-10.254.250.0}/24 -j ACCEPT
firewall-cmd --reload

cat << EOF > "$EASYRSA_PKI"/ovpn.template
client
resolv-retry 15
nobind
remote ${KEY_NAME} ${VPN_PORT:-1194}
proto ${VPN_PROTO:-udp}
dev tun
comp-lzo yes
tls-client
key-direction 1
keepalive 10 120
persist-key
persist-tun
auth-nocache
remote-cert-tls server
verb 3
cipher BF-CBC
EOF

cat << EOF > /etc/openvpn/create_new_client.sh
#!/bin/bash
export EASYRSA_VARS_FILE="/etc/openvpn/vars"
source "${EASYRSA_VARS_FILE}"
# каталог в котором будет создан файл *.ovpn
OUTPUT_DIR=/etc/openvpn/client/
BASE_CONFIG=${EASYRSA_PKI}/ovpn.template

/usr/share/easy-rsa/3/easyrsa --batch gen-req --req-cn="\${1}" \${1} nopass
/usr/share/easy-rsa/3/easyrsa --batch sign-req client \${1}

cat \${BASE_CONFIG} \
<(echo ) \
<(echo -e '<ca>') \
\${EASYRSA_PKI}/ca.crt \
<(echo -e '</ca>\n<cert>') \
\${EASYRSA_PKI}/issued/\${1}.crt \
<(echo -e '</cert>\n<key>') \
\${EASYRSA_PKI}/private/\${1}.key \
<(echo -e '</key>\n<tls-auth>') \
\${EASYRSA_PKI}/ta.key \
<(echo -e '</tls-auth>') \
> \${OUTPUT_DIR}/\${1}.ovpn
EOF

chmod 740 /etc/openvpn/create_new_client.sh
systemctl enable --now openvpn-server@${VPN_PROTO:-udp}



Переменные, которые доступны для изменения при создании впн сервера:

${STAND}
${VPN_PORT:-1194}
${VPN_PROTO:-udp}
${VPN_SUBNET:-10.254.250.0}
${VPN_DOMAIN:-vpn.alexgluck.ru}
Как поднять опенвпн сервер:
Установить OS: centos 7 minimal

Запустить на нём скрипт
Создать конфигурации для клиентов /etc/openvpn/create_new_client.sh <ИМЯ_ПОЛЬЗОВАТЕЛЯ>

Отправить конфигурации из папки /etc/openvpn/client/ пользователям
Пользоваться
Когда истечёт сертификат сервера, перевыпустить его:

export EASYRSA_VARS_FILE="/etc/openvpn/vars"
/usr/share/easy-rsa/3/easyrsa --batch renew "$KEY_NAME"
systemctl restart openvpn-server@${VPN_PROTO:-udp}

Когда истечёт СА сертификат, пересоздать впн. (Есть получше механизм, но описывать пока некогда)

А где в этом скрипте второй ЦС и защита закрытого ключа?

Второй ЦС одним скриптом делать не стоит, тут его нет, поэтому я и написал «почти тоже самое».
Механизм «получше» это тупо создать новые корневой сертификат с другой датой, подписанный тем же приватным ключём, что и старый? Интересно, что это этом многие не знают — всё упорно обновляют корневые сертификаты у сотен клиентов.

Вот только надо не теорию сказать, а команду дать, как это выполнить на easyrsa3, желательно проверить работоспособность.

Всё равно ca у клиентов обновлять, мы же новые сертификат выпускаем ца.

Автоматизация — это конечно хорошо, сам за нее топлю, но этот скрипт написан под один сервер на котором и openvpn и ЦС. Даже не меняются права доступа, в плане безопасности это совсем печально. Но соглашусь, что этот скрипт отлично подойдет для частного использования.
Он был сделан для бастион хоста, как инструкция, что делать, для понимания как в общих чертах настраивать openvpn. На работе мы просто добавили авторизацию через АД и второй фактор, помимо сертификатов. Я сейчас продвигаю иной механизм выдачи впн конфигов, сотрудники сами в веб интерфейсе должны получать свой впн конфиг. Сотрудник авторизуется на веб интерфейсе с помощью АД учётки и двухфакторки, если сотруднику разрешено пользоваться впн, ему показывает БОЛЬШУЮ кнопку скачать и инструкцию как установить и настроить впн.
Идея, чтобы сотрудники сами себе скачивали из веба клиентский сертификат хорошая, но это уже другая песня. ЦС мы ведь делаем один раз на долгий срок, а клиентские сертификаты могут штамповаться до посинения и тут скрипты, да еще и для самовыпуска через веб отлично подойдут.
  1. Автор убери копирование скриптов easyrsa в /etc/openvpn.
  2. Убери копирование dh,ta,ca,server сертификатов и ключа (при обновлении этих файлов придётся делать лишние движения, которые не нужны).
  3. Храни pki каталог отдельно от openvpn.
  4. Опиши нормальную настройку фаервола, таблица форвард может иметь свои правила.
Отвечу по пунктам:
1. Не понимаю, о копировании каких скриптов говорится.
2. Тут уж дело вкуса каждого, где хранить готовые сертификаты и ключи. Их конечно можно положить и в пользовательскую директорию с указанием пути к ним в конфиге или оставить в самой директории pki, но при перевыпуске сертификатов их все равно придется переносить с одного сервера на другой, так какая разница, куда переносить?
3. Тут и так два pki на двух разных серверах, которые в обычное время выключены. А pki, который на сервере OpenVPN выпускает запросы и ключи ta.key и dh.pem, не такая большая прореха в безопасности, но соглашусь, если ее закрыть, то будет лучше.
4. В статье я указал, что упор делаю на двухуровневую иерархию ЦС, а не на OpenVPN и привел ufw и правило пересылки пакетов для примера, как это работает.
Sign up to leave a comment.

Articles