Zarejestruj się na BitBay.net
Home > Bezpieczeństwo, Linux, Uncategorized > Instalacja OpenVPN z autoryzacją PAM, LDAP, kluczami lub certyfikatami

Instalacja OpenVPN z autoryzacją PAM, LDAP, kluczami lub certyfikatami

openvpnVPN – vpn umożliwia nam stworzenie wirtualnego szyfrowanego tunlu np. pomiędzy nami, a jakimś serwerem bądź domową/firmową siecią. W skrócie po podłączeniu się przez VPN do naszej sieci jesteśmy traktowani tak jak byśmy siedzieli w firmie czyli mamy dostęp do naszej sieci lokalnej tak jak byśmy fizycznie siedzieli w firmie.

OpenVPN – pakiet oprogramowania, który implementuje techniki tworzenia bezpiecznych tuneli  VPN w sieciach routowanych lub mostkowanych. Umożliwia on tworzenie zaszyfrowanych połączeń między hostami przez sieć publiczną Internet (tunel) – używa do tego celu biblioteki OpenSSL oraz protokołów SSLv3/TLSv1. W przeciwieństwie do innych rozwiązań VPN nie bazuje na protokole IPsec jako medium. Pakiet ten dostępny jest na platformach Linux, BSD, Mac OS X oraz Windows 2000/XP/Vista.

OpenVPN może pracować w  trybie routowania(tun) lub bridge(tap):

  1. Tryb routownia – tworzona jest osobna prywatna podsieć np. 10.8.0.0/24, która łączy się z siecią po stronie serwera 129.168.1.0/24, poprzez statyczny routing. Po podłączeniu otrzymujemy adres z sieci 10.8.0.0/24 i nie mamy dostępu do usług w sieci 192.168.1.0/24 poza dostępem od serwera do którego się połączyliśmy. Jest to bardzo bezpieczne dlatego jest to najczęściej wykorzystywana metoda. Jeśli chcemy mieć dostęp np. do SAMBY, musimy także kazać jej nasłuchiwać na jakimś adresie z puli 10.8.0.0/24. Jeśli chcemy mieć dostęp do jakiegoś serwera, musimy mu nadać dwa adresy jeden z puli 192.168.1.0/24 drugi z puli 10.8.0.0/24. itd. Po stronie serwera OpenVPN tworzony jest wirtualny interfejs: tun
  2. Tryb bridge – Po stronie serwera OpenVPN tworzony jest wirtualny interfejs: tap0. Jesteśmy podłączeni bezpośrednio do sieci LAN serwera, otrzymując IP z tej samej podsieci co reszta urządzeń. Wymaga to zestawienia mostka pomiędzy wirtualnym interfejsem OpenVPN (tap0) oraz interfejsem mającym dostęp do sieci LAN serwera (np eth0). Pozwala na to m.in. narzędzie brctl, znajdujące się w pakiecie bridge-utils.

 

OpenVPN oferuje kilka metod uwierzytelniania użytkowników:

  1. Plik klucza – plik klucza jest identyczny dla klienta i serwera. Użycie pliku klucza jest najprostszym i najszybszym rozwiązaniem, ale ma również pewne wady. Jego użycie ogranicza się praktycznie do jednego urządzenia-klienta, a w przypadku przejęcia klucza ktoś inny może się podłączyć.
  2. Pliki certyfikatów – Uwierzytelnianie przy użyciu certyfikatów, jest ciut bardziej skomplikowane i wymaga pewnego przygotowania. Sprowadza się do wygenerowania głównego certyfikatu oraz klucza (root CA), w oparciu o które będziemy mogli generować certyfikaty dla serwerów i klientów.  Zaletą jest to, że każdy z użytkowników otrzyma swój unikalny certyfikat który w dodatku może być zabezpieczony pinem. W razie problemów możemy unieważnić dowolny certyfikat i dany klient już się nie połączy.
  3. Autoryzacja PAM – Wygodna metoda polegająca na skorzystaniu np. z bazy użytkowników systemu Linux. Wystarczy założyć użytkownika w systemie i ustawić mu hasło. Nasz klient zostanie poproszony o podanie loginu i hasła.
  4. Autoryzacja LDAP – Podobnie jak PAM tylko baza użytkowników trzymana jest na serwerze katalogowym LDAP. Nasz klient zostanie poproszony o podanie loginu i hasła.

 

Zanim zaczniesz konfigurować OpenVPNa przeczytaj to:

 

Konfiguracja OpenVPNa w CentOS – trybie routera (tun) 

 Sprawdzamy jak się nazywa nasz serwer:

# cat /etc/sysconfig/network|grep HOSTNAME

HOSTNAME=zeus

Sprawdzamy numer ip:

#ifconfig

eth0      Link encap:Ethernet  HWaddr 00:C0:9F:E0:99:28
inet addr:192.168.100.104  Bcast:192.168.100.255  Mask:255.255.255.0
inet6 addr: fe80::2c0:9fff:fee0:9928/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:472549 errors:0 dropped:0 overruns:0 frame:0
TX packets:282649 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:657815906 (627.3 MiB)  TX bytes:25950792 (24.7 MiB)
Interrupt:209 Base address:0xc000

Instalujemy potrzebny soft:

#yum install openvpn.i386 lzo.i386 openssl.i686

Możemy skopiować przykładowy plik konfiguracyjny serwera i zmodyfikować go ręcznie:

#cp /usr/share/doc/openvpn-2.2.2/sample-config-files/server.conf /etc/openvpn/

Bądź po prostu tworzymy plik o zawartości:

#gedit /etc/openvpn/server.conf

# wskazujemy ze openvpn ma być uruchomiony jako serwer w trybie tun
# z podsiecią łączącą 10.8.0.0/24 oraz weryfikować użytkowników w oparciu o certyfikat
local 192.168.100.104 #Server External IP
port 1194
proto tcp
dev tun
ca easy-rsa/keys/ca.crt  #weryfikacja z uzyciem certyfikatów
cert easy-rsa/keys/zeus.crt
key easy-rsa/keys/zeus.key #keep file secret
dh easy-rsa/keys/dh1024.pem
tls-auth easy-rsa/keys/ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8" #using Google Public DNS
push "dhcp-option DNS 8.8.4.4" #using Google Public DNS
keepalive 10 120
comp-lzo
max-clients 5
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3

# LDAP
#plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
#client-cert-not-required
#username-as-common-name

# Pam
#plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so /etc/pam.d/login
#client-cert-not-required
#username-as-common-name

gdzie:

  • dev tun – wykorzystujemy tryb routowania(tun) lub bridge(tap)
  • ca ca.crt – weryfikacja z użyciem certyfikatów
  • server 10.8.0.0 255.255.255.0 – będzie stanowić podsieć, do której będą przynależeć klienci. Istotne jest, by podsieć ta była unikalna, tj nie może się pokrywać z tą, do której aktualnie przynależymy (kawiarenka, hot spot), inaczej wystąpi konflikt, przy routowaniu pakietów.
  • comp-lzo – włącza kompresje, zmniejsza zużycie transferu
  • redirect-gateway – modyfikuje tablice routingu w systemie tak, by trasa przez tunel VPN miała niższą metrykę niż na zwykłym interfejsie eth0 (dzięki czemu pakiety będą przekierowywane przez tun/tap).
  • tls-auth ta.key 0 – podniesienie bezpieczeństwa serwera. Wymaga wygenerowania dodatkowego klucza TSL. Ochrania przed:
    • Ataki typu DoS na port OpenVPN-owy
    • Skanowanie portow w celu sprawdzenia, na ktorym nasłuchuje OpenVPN
    • Wszelkiego ataki rodzaju buffer-overflow spowodowane przez błędy w implementacji SSLa/TLSa
    • Odrzucenie błędnych połączeń SSL/TLS zaraz na samym początku

Kopiujemy skrypty do tworzenia certyfikatów:

#mkdir -p /etc/openvpn/easy-rsa/keys
#cd /etc/openvpn/easy-rsa
#cp -r /usr/share/doc/openvpn-2.2.2/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
#chmod 755 *

Następnie edytujemy plik vars i podmieniamy domyślne wartości które mają być widoczne w certyfikatach. Możemy też zwiększyć długość klucza RSA z 1024 (domyślne) do 2048 bitów.

#gedit vars
export KEY_COUNTRY="PL"
export KEY_PROVINCE="Opolskie"
export KEY_CITY="Opole"
export KEY_ORG="Dobry Projekt"
export KEY_EMAIL="ktos@gmail.com"
export KEY_EMAIL="ktos@jakasfirma.pl"
export KEY_CN=DP-server
export KEY_NAME=DP-server-key
export KEY_OU=DP-server
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Po edycji wykonujemy polecenia:

 #source ./vars
#./clean-all

Generowanie kluczy oraz certyfikatów dla maszyny certyfikującej (CA)

#./build-ca

Generowanie kluczy oraz certyfikatów dla serwera

#./build-key-server zeus
pass: 123456

Błąd: failed to update database TXT_DB error number 2
Może okazać się, że musimy wystawić certyfikat z takim samym polem Common Name jeszcze przed wygaśnięciem poprzedniego. Należy wtedy zmienić wpis w pliku:

easy-rsa\keys\index.txt.attr z unique_subject = yes na unique_subject = no.

Generowanie kluczy oraz certyfikatów dla klienta o nazwie kamil:

#./build-key kamil
pass: gienia

(jeśli zależy nam aby każdy miał swoje hasło do klucza to zamiast powyższego wydajemy polecenie: #./build-key-pass kamil)

Generowane danych dla protokołu Diffiego-Hellmana (protokół wymiany kluczy szyfrujących)

#./build-dh

Generowanie klucza TLS (dodatkowa ochrona):

#openvpn --genkey --secret keys/ta.key

W wyniku powyższych poleceń zostanie utworzony katalog keys, w którym będą się znajdowały pliki certyfikatów (z rozszerzeniem .crt) i prywatne pliki kluczy (z rozszerzeniem .key) oraz plik dfX.pem (gdzie X to domyślnie 1024 bity). Pliki .csr odnoszą się do sytuacji gdy generujemy plik klucza z dala od maszyny certyfikującej (posiadającej plik ca.key),czyli w sytuacji gdy nie mamy możliwości dostarczenia klucza do serwera/klienta w bezpieczny sposób. W tym przypadku robimy wszystko na tej samej maszynie, więc nie są one nam potrzebne (w pewnym sensie nie korzystamy tutaj z tego przywileju jaki daje nam architektura PKI).

Następnie dostarczamy odpowiednie pliki do odpowiednich urządzeń:

  • do serwera: ca.crt, dhX.pem, zeus.crt, zeus.key ta.key
  • do maszyny podpisującej certyfikaty (w naszym przypadku również jest to serwer): ca.key
  • do klienta/ów: ca.crt , kamil.crt, kamil.key ta.key

Pliki certyfikatów (.crt) mogą być publicznie dostępne, pliki kluczy (.key) są przeznaczone tylko dla tego dla kogo zostały wygenerowane, i powinny być trzymane w ukryciu (a zwłaszcza plik ca.key)

Jeśli zajdzie potrzeba odwołania któregoś z podpisanych certyfikatów wystarczy wykonać

#./revoke-full <identyfikator klienta>

w wyniku którego do katalogu keys zostanie zapisany plik ctr.pem, do którego ścieżkę należy podać w konfiguracji serwera: crl-verify crl.pem

Włączamy przekazywania pakietów między interfejsami (pomiędzy eth0 a tun0). Zmiana ta będzie brana pod uwagę, do momentu restartu systemu. Aby zastosować ją na stałe należy edytować plik /etc/sysctl.conf oraz zmienic wartość net.ipv4.ip_forward na 1

#echo 1 > /proc/sys/net/ipv4/ip_forward

Firewall:

#iptables -A INPUT -p tcp --dport 1194 -j ACCEPT

Translacja adresów (NAT) na serwerze:

#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Zapamiętujemy konfigurację aby po restarcie zadziałało:

# /sbin/service iptables save

Zapisywanie reguł zapory sieciowej do /etc/sysconfig/iptabl [  OK  ]

Odpalamy openvpna:

# /etc/init.d/openvpn start

Uruchamianie OpenVPN:                                      [  OK  ]

Sprawdzamy czy jest odpalony:

# ps -aux|grep openvpn

nobody   12738  0.0  0.1   8852  1184 ?        Ss   17:48   0:00 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/server.pid --config server.conf --cd /etc/openvpn --script-security 2

Dodajemy do autostartu:

#chkconfig --levels 345 openvpn on

Sprawdzamy czy pojawił się interface tun0:

#ifconfig

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Gdy coś jest nie tak, sprawdzamy logi:

#cat /var/log/openvpn.log

Sprawdzamy czy openvon nasłuchuje:

#netstat -ltnup | grep 1194

Status openvpna:

# cat /etc/openvpn/openvpn-status.log

Pliki po stronie klienta:

– ca.crt
– kamil.crt
– kamil.key
– ta.key
– kamil.ovpn:

client
dev tun
proto tcp
remote 80.70.130.140 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert kamil.crt
key kamil.key
tls-auth ta.key 1
ns-cert-type server
comp-lzo
verb 3
keepalive 10 120
route-method exe
route-delay 2

Autoryzacja przez PAM:
W pliku konfiguracyjnym server.conf dodajemy:

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so /etc/pam.d/login
client-cert-not-required
username-as-common-name

W pliku konfiguracyjnym klienta kamil.ovpn dodajemy:

auth-user-pass

W linuxie dodajemy użytkownika i ustawiamy hasło:

#useradd -s /bin/false -M -e 2012-10-21 -c "Kamil Kobak" kamil
#passwd kmail

wyświetlanie informacji o użytkowniku:

#finger kamil

blokowanie usera:

#passwd -l kamil

odblokowywanie usera:

#passwd -u kamil

Autoryzacja przez LDAP:
W pliku server.conf dodajemy:

plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
client-cert-not-required
username-as-common-name

W pliku konfiguracyjnym klienta kamil.ovpn dodajemy:

auth-user-pass

Konfigurujemy ldpa plugin /etc/openvpn/auth/ldap.conf:

<LDAP>
# LDAP server URL
URL             ldap://localhost

# Bind DN (If your LDAP server doesn't support anonymous binds)
#BindDN         uid=Manager,ou=People,dc=zeus,dc=pl
#BindDN         uid=admin,ou=Administrators,dc=zeus,dc=pl
BindDN          cn=admin,ou=Administrators,dc=zeus,dc=pl

# Bind Password
Password        fEqNDco3Yq9h5ZUglD3CZJC4lBs=

# Network timeout (in seconds)
Timeout         15

# Enable Start TLS
TLSEnable       yes

# Follow LDAP Referrals (anonymously)
FollowReferrals yes

# TLS CA Certificate File
TLSCACertFile   /usr/local/etc/ssl/ca.pem

# TLS CA Certificate Directory
TLSCACertDir    /etc/ssl/certs

# Client Certificate and key
# If TLS client authentication is required
TLSCertFile     /usr/local/etc/ssl/client-cert.pem
TLSKeyFile      /usr/local/etc/ssl/client-key.pem

# Cipher Suite
# The defaults are usually fine here
# TLSCipherSuite        ALL:!ADH:@STRENGTH
</LDAP>

<Authorization>
# Base DN
BaseDN          "ou=People,dc=zeus,dc=pl"

# User Search Filter
SearchFilter    "(&(uid=%u)(accountStatus=active))"

# Require Group Membership
RequireGroup    false

# Add non-group members to a PF table (disabled)
#PFTable        ips_vpn_users

<Group>
BaseDN          "ou=Groups,dc=zeus,dc=pl"
SearchFilter    "(|(cn=developers)(cn=artists))"
MemberAttribute uniqueMember
# Add group members to a PF table (disabled)
#PFTable        ips_vpn_eng
</Group>
</Authorization>
  1. Brak komentarzy
  1. Brak jeszcze trackbacków
*