Üdvözlöm!
Minden vállalat előbb vagy utóbb, hirtelen, távoli hozzáférésre lesz szüksége.
A távoli hozzáférés megszervezésének szükségességével szinte minden IT-s találkozik.
Engem, akárcsak sokakat, ez a szükséglet a 'tegnap' címszóval ért el. Elemezve minden 'pro' és 'contra' tényezőt, valamint rengeteg információt átnézve és egy kis elméletet is kipróbálva, úgy döntöttem, hogy nekilátok a telepítésnek.
A biztonság érdekében az OpenVPN-t választottam a következő megvalósításban: egy Windows Server 2012 operációs rendszert futtató virtuális gépet állítottam be egy szerveren, amelyen szintén Windows Server 2012 futott, és erre telepítettem az OpenVPN szervert, amely kiadta és aláírta a tanúsítványokat.
A kényelmes használat érdekében nevezzük el ezt 'tanúsítványkezelő szervernek'. Ezután levettem a szerver tanúsítványát, betettem a Mikrotikbe, és a Mikrotik routeren beállítottam az OpenVPN-t a fiókokkal és profilokkal. A kliens tanúsítvány kiadásához szintén a tanúsítványkezelő szervert használtam.
A megvalósítás természetesen problémás volt, és bár akkoriban a hasonló dolgokban szerzett tapasztalatom, mondjuk, nem volt elegendő a biztonság garantálásához, ez nem volt a legrosszabb megoldás.
Ez a kombináció egy ideig működött, és új feladatot kaptam: a tanúsítványkezelő szerver áthelyezése Linuxra, miközben a Mikrotikkal való kapcsolatot meg kell tartani — az ügyfeleknek nem szabad szenvedniük.
A tudásom Linuxról akkoriban Ubuntu 16.04LTS-re korlátozódott, amelyet terminálként használtam a Windows szerver RDP-hez való csatlakozáshoz. Tehát, sudo apt-get -f install -y, és semmi több.
Miután megvizsgáltam, hogy melyik Linux disztribúció a legstabilabb és legígéretesebb a szervezetem számára, a CentOS 7 Minimal mellett döntöttem.
Először úgy döntöttem, hogy egy kicsit beleáshatok a elméletbe, hogy megértsem, hogy ez az egész hogyan működik. Megnéztem videókat a (Egyáltalán nem reklám, csak ők voltak az első, akikkel találkoztam). Egy kedves hangú lány ismertette velem az általam választott operációs rendszer alapjait.
Először elindítottam a Hyper-V-t a gépemen, telepítettem rá a CentOS 7 Minimal-t, a telepítés során létrehoztam egy Admin felhasználót, és teljesen letiltottam a root ssh hozzáférést. Búcsút intve a szép színes képernyőnek, beléptem a fekete-fehér terminál világába.
Azt hiszem, nincs értelme a szoftver telepítési folyamatát részletezni, inkább a problémákra szeretném felhívni a figyelmet, amelyek a folyamat során felmerültek, és amelyek megoldásához egy kis skriptet kellett írnom (az alábbiakban található. Az egyes eszközök leírását az interneten megtalálhatja, de abban a pillanatban, amikor mindezt csináltam, még nem létezett ez a skript, minden először történt, tapogatózva és főleg találomra).
A skriptben megpróbáltam automatizálni a szerverhez minimálisan szükséges eszközök telepítését, kikapcsolni a Selinuxot, csatlakoztatni az Epel repót, telepíteni az OpenVPN-t, és így tovább. Alább található maga a skript, egyszerű, de felhasználható. Nem fogom részletezni, de ha valakinek szüksége van rá, írjon, válaszolok.
A skript használatának eredményeként egy már beállított OpenVPN szerver fog megjelenni, zöld szemmel kacsintva.
#!/bin/bash
cd /etc/sysconfig/
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' selinux
sudo setenforce 0
cd /home/Admin
sudo yum update -y
sudo yum install epel-release -y
sudo yum install mc -y
sudo yum install nano -y
sudo cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax
sudo yum install chrony -y
sudo systemctl start chronyd
sudo systemctl enable chronyd
sudo yum install net-tools -y
sudo yum install iftop -y
sudo yum install htop -y
sudo yum install lsof -y
sudo yum install dos2unix -y
sudo yum install wget -y
sudo yum install tcpdump -y
sudo yum install openvpn -y
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz
sudo tar -xvzf EasyRSA-3.0.3.tgz
sudo chown -R Admin:Admin /var/log
sudo chmod 755 /var/log
mkdir /var/log/openvpn
mkdir /etc/openvpn/ccd
sudo chown -R Admin:Admin /etc/openvpn/ccd
sudo chown -R Admin:Admin /var/log/openvpn
chmod 755 /etc/openvpn/ccd
chmod 755 /var/log/openvpn
echo >/var/log/openvpn/openvpn-status.log
echo >/var/log/openvpn/openvpn.log
sudo chown -R Admin:Admin /etc/resolv.conf
chmod 755 /etc/resolv.conf
echo nameserver 8.8.8.8 >>/etc/resolv.conf
cd /etc/openvpn/
sudo /home/Admin/EasyRSA-3.0.3/easyrsa init-pki
sudo chown -R Admin:Admin /etc/openvpn
chmod 755 /etc/openvpn
echo set_var EASYRSA_DN "org" >/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_COUNTRY "RU" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_KEY_SIZE 4096 >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_PROVINCE "LIP" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_CITY "Lipetsk" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_ORG "Cool-Admin" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_EMAIL "xxx.ru" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_OU "Our_ORG" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_REQ_CN "changeme" >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_CERT_EXPIRE 3650 >>/home/Admin/EasyRSA-3.0.3/test
echo set_var EASYRSA_DH_KEY_SIZE=2048 >>/home/Admin/EasyRSA-3.0.3/test
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-ca nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-server-full Serv nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-client-full Client1 nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-dh
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-crl
mkdir keys
sudo chown -R Admin:Admin /etc/openvpn/keys
chmod 755 /etc/openvpn/keys
sudo cp /etc/openvpn/pki/ca.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/dh.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/crl.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/issued/Serv.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/private/Serv.key /etc/openvpn/keys
echo port 443 >/etc/openvpn/server.conf
echo proto udp >>/etc/openvpn/server.conf
echo dev tun >>/etc/openvpn/server.conf
echo ca /etc/openvpn/keys/ca.crt >>/etc/openvpn/server.conf
echo cert /etc/openvpn/keys/Serv.crt >>/etc/openvpn/server.conf
echo key /etc/openvpn/keys/Serv.key >>/etc/openvpn/server.conf
echo dh /etc/openvpn/keys/dh.pem >>/etc/openvpn/server.conf
echo crl-verify /etc/openvpn/keys/crl.pem >>/etc/openvpn/server.conf
echo client-config-dir /etc/openvpn/ccd >>/etc/openvpn/server.conf
echo topology subnet >>/etc/openvpn/server.conf
echo server 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf
echo route 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.8.8" >>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.4.4" >>/etc/openvpn/server.conf
echo keepalive 10 120 >>/etc/openvpn/server.conf
echo persist-key >>/etc/openvpn/server.conf
echo persist-tun >>/etc/openvpn/server.conf
echo status /var/log/openvpn/openvpn-status.log >>/etc/openvpn/server.conf
echo log-append /var/log/openvpn/openvpn.log >>/etc/openvpn/server.conf
echo verb 2 >>/etc/openvpn/server.conf
echo mute 20 >>/etc/openvpn/server.conf
echo daemon >>/etc/openvpn/server.conf
echo mode server >>/etc/openvpn/server.conf
echo user nobody >>/etc/openvpn/server.conf
echo group nobody >>/etc/openvpn/server.conf
sudo chown -R Admin:Admin /etc/sysctl.conf
chmod 755 /etc/sysctl.conf
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server
sudo systemctl status openvpn@serverAz OpenVPN telepítése nem egészen sikerült.
Annak ellenére, hogy nem tudtam a Linux rendszereken a jogokkal kapcsolatos politikák sajátosságairól, rengeteg időt töltöttem a naplók és a fájlok szükséges jogainak beállításának tanulmányozásával.
Amikor az OpenVPN gomb zöldre váltott, nagyon megörültem, de kiderült, hogy ez csak a kezdet volt. Az egyszerűség kedvéért azt terveztem, hogy kicserélem a gyökér tanúsítványokat és a crl.pem fájlt, bízva abban, hogy minden működni fog. Végül a következő fájlokat kellett átkonvertálnom a szerverről Windows-ra:
Serv.crt — A szerver tanúsítványa
Serv.key — A szerver kulcsa
Ca.crt — A gyökér tanúsítvány
Ca.key — A gyökér kulcs
Crl.pem — A visszavont tanúsítványok fájlja
Dh.pem — A Diffie-Hellman kulcs
Index.txt — Fájl az aktuális tanúsítványokkal kapcsolatos információkkal
Serial — ez is a tanúsítványok érvényességéért felelős
Továbbá szükség volt a certs_by_serial mappára, a vars fájlra, és az összes kliens kulcsra és tanúsítványra.
A Mikrotikon a tanúsítványok a helyükön maradtak, ezért minden működött.
Problémák merültek fel, amikor megpróbáltam visszavonni a tanúsítványt, ez teljesen nem működött — az index.txt fájlt unix formátumba kellett volna konvertálnom, de ezt azonnal nem tettem meg. A dos2unix eszközt használtam.
Most a tanúsítványokat vissza lehetett vonni, de továbbra is működtek minden probléma nélkül, mert a Mikrotik nem tudta, hogy vissza lettek vonva, és valahogy erről értesítenie kellett volna.
Az utasítások elolvasása és Alexander ERI-vel folytatott konzultáció után (hatalmas köszönet!), egy egyszerű Apache HTTP szervert indítottam a tanúsítványi szerveren, és közzétettem rajta a visszavont tanúsítványok fájlját. Teljesen lezártam a hozzáférést, kivéve a közzétett fájl számára egy IP-címről.
A Mikrotik terminálban a /System/Certificates/CRL fül alatt megadtam a közzétett crl.pem elérési útját. Itt fontos megjegyezni, hogy a Mikrotik a CRL fül számára csak http-t és abszolút címet fogad el, tehát így kellett kinéznie:
Minden működött, legalábbis a 6.4.2.x RouterOS verziók esetében, de a kliens konfigurációkat kézzel kellett létrehoznom, ami sajnos kellemetlenségeket okozott számomra. Amikor egy héttel később körülbelül 50 kliens számára kellett konfigurációkat létrehoznom, elhatároztam, hogy felgyorsítom ezt a folyamatot, és ehhez felhasználtam egy interneten talált idegen szkript egy részletét.
A szkript így működik: a futtatás után megadjuk a "kliens nevét", válaszolunk a kérdésre "jelszót akarunk-e vagy sem", ezt követően pedig elérjük a már elkészült konfigurációs fájlt "client.ovpn", melybe integrálva vannak a tanúsítványok és beállítások. A használatához az /etc/openvpn mappában kell lennünk. Kommentálni fogom azokat a sorokat, ahol az utat a saját utunkra kell módosítani. Szintén létre kell hozni egy beállítási fájlt a kliens számára, hogy a szkript azokat be tudja illeszteni a konfiguráció létrehozása során.
#!/bin/bash
function newClient () {
echo ""
echo "Tell me a name for the client."
echo "Use one word only, no special characters."
until [[ "$CLIENT" =~ ^[a-zA-Z0-9_]+$ ]]; do
read -rp "Client name: " -e CLIENT
done
echo ""
echo "Do you want to protect the configuration file with a password?"
echo "(e.g. encrypt the private key with a password)"
echo " 1) Add a passwordless client"
echo " 2) Use a password for the client"
until [[ "$PASS" =~ ^[1-2]$ ]]; do
read -rp "Select an option [1-2]: " -e -i 1 PASS
done
#cd /etc/openvpn/easy-rsa/ || return
case $PASS in
1)
sudo /home/admin/EasyRSA-3.0.3/easyrsa build-client-full "$CLIENT" nopass
;;
2)
echo "You will be asked for the client password below"
./easyrsa build-client-full "$CLIENT"
;;
esac
# Generates the custom client.ovpn
cp /etc/openvpn/client-template.txt "$home/home/admin/IT/Temp/$CLIENT.ovpn"
#Директория в которой хранится файл с настройками клиента.
#Директория, в которой сформируется файл конфигурации
{
echo "<ca>"
cat "/etc/openvpn/pki/ca.crt" #Директория хранения корневого сертификата
echo "</ca>"
echo "<cert>"
awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$CLIENT.crt" #Директория с созданным #сертификатом клиента
echo "</cert>"
echo "<key>"
cat "/etc/openvpn/pki/private/$CLIENT.key" #Директория с созданным ключом клиента
echo "</key>"
} >> "$home/home/admin/IT/Temp/$CLIENT.ovpn" #Директория, в которой сформируется файл #конфигурации
echo ""
echo "Client $CLIENT added, the configuration file is available at $home/admin/IT/OVPN/Temp/$CLIENT.ovpn."
echo "Download the .ovpn file and import it in your OpenVPN client."
exit 0;
}
newClient
Néhány idő elteltével az új irányelv a távoli hozzáférés tilalmára arra kényszerített, hogy megöljem ezt a szervert és a Mikrotikkel működő párost. Egy új OpenVPN szerver készült az IT osztály munkatársai számára, amely most már teljes mértékben CentOS-on működik. De ez már egy teljesen más történet.
Hatalmas köszönetet mondok Ivannak és Pavlónak a cikk szerkesztésében nyújtott segítségükért.
Forrás: habr.com
