Birçok iş ortamına uzaktan bağlantıda, izole bağlantılarda, güvenli olmayan bir ağdan dışarıya bağlantıda güvenliği artırmaya çalışırken, uzaktan çalışanların veya yolculuk yapanların işyeri kaynaklarına erişimlerinde ve benzer birçok senaryoda VPN sunucuları kullanılıyor. Ücretli ve ücretsiz hazır VPN çözümleri dışarı erişim için kullanılsa da birçok kişi bu çözümlere güvenmiyor. Ayrıca, iş ortamlarında veya bulut ortamlarında olan VPN çözümleri her senaryoyu karşılayamayabiliyor veya ürünlerin ücretleri kullanım alanlarına göre çok yüksek olabiliyor. Bu yazıda, Docker kullanarak VPN sunucu kurulumunu, OpenVPN sunucusu kurarak inceleyeceğiz. Ayrıca, kurulum sürecini basitleştirerek 5 dakikadan az sürede tamamlanabilir hale nasıl getirebileceğimize bakacağız.
Kuracağımız OpenVPN sunucusunun birden çok kullanıcı hesabı içerebilmesini istiyoruz. Docker’ın port açma ve port yönlendirme işlerini oldukça kolaylaştırmasından da faydalanarak kurulumu dış dünyadan erişebileceğimiz bir hale getireceğiz. OpenVPN üzerinde varsayılan porttan (UDP 1194) farklı olarak UDP 3000 portunu kullanarak başlayacağız. Bu uygulamada hazır bir imaj kullanmak yerine, kylemanna tarafından yazılan, MIT lisansına sahip Dockerfile’ı ve diğer scriptleri kullanarak kendi imajımızı üreteceğiz. Bu repoyu klonlayacak ve kendi imajımızı üreteceğiz.
Ön Kurulum & Hazırlıklar
Uygulamayı Docker kurulu bir GNU/Linux sunucu üzerinde yapabilirsiniz. Yazı hazırlanırken Ubuntu 16.04 Server kullanılmış ve (hızlı olması için) Docker şu komutla kurulmuştur:
$ curl -sSL https://get.docker.com | bash
İlk olarak repoyu sunucumuza klonlayalım:
git clone https://github.com/kylemanna/docker-openvpn.git
Çalışılan dizini klonlanan reponun bulunduğu dizin olarak ayarlayalım:
cd docker-openvpn/
Bu dosyalardan yeni bir Docker imajı oluşturalım. Bu örnekte imajı vpnimajim olarak isimlendireceğiz:
docker build -t vpnimajim .
Kurulum
Ayar dosyalarını ve anahtarları saklamak için bir volume veya dizine ihtiyacımız olacak. Anahtarlar da bu dizine koyulacağı için, bu aşama oldukça önemli. Sonuç olarak, bu dizini güvenli/güvende tutmanızı öneririm.
cd ..
mkdir vpn-data
Artık OpenVPN ayar dosyasını oluşturarak esas kurulma başlayabiliriz. Ayar dosyasını da Docker imajına oluşturtarak işimizi kolaylaştırıyoruz:
$ docker run -v $PWD/vpn-data:/etc/openvpn --rm vpnimajim ovpn_genconfig -u udp://IP_ADDRESS:3000
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Successfully generated config
Cleaning up before Exit ...
Yukarıdaki komutta IP_ADDRESS yerine IP adresinizin yazılı olduğuna emin olun. Portu da bu aşamada değiştirebilirsiniz. Bu örnekte, UDP 3000 portunu kullandık. İşler yolunda gittiğinde, bu örnektekine benzer bir çıktı almanız gerekiyor.
Artık PKI’yı başlatabiliriz. Bu aşama, kendi CA sertifikamızı üretmeyi ve PKI’ya ait bir özel anahtar üretimini kapsıyor. Özel anahtarı korumak için bir parola girmemiz istenecek. Komut ve komutun çıktısının kısaltılmış hali şuna benzeyecektir:
$ docker run -v $PWD/vpn-data:/etc/openvpn --rm -it vpnimajim ovpn_initpki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki
Generating a 2048 bit RSA private key
............................................................................+++
....+++
writing new private key to '/etc/openvpn/pki/private/ca.key.XXXXCFGIEm'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
...
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:g
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
... # Wait a while
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
...
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
Bu işlemin son aşamalarında size tekrardan CA parolası sorulacaktır. Yazarak devam edebilirsiniz. Ayrıca, arada sorulan sertifika otoritesine ait bilgileri de uygun şekilde doldurabilirsiniz. Son olarak, VPN sunucusunu bu ayarlara göre başlatabiliriz:
$ docker run -v $PWD/vpn-data:/etc/openvpn -d -p 3000:1194/udp --cap-add=NET_ADMIN vpnimajim
Henüz herhangi bir kullanıcı oluşturmadık. Kurduğumuz OpenVPN sunucusuna bağlanabilmek için her bağlantıya bir kullanıcı tanımlayabiliriz:
$ docker run -v $PWD/vpn-data:/etc/openvpn --rm -it vpnimajim easyrsa build-client-full user1 nopass
Generating a 2048 bit RSA private key
........................................................+++
..........................................................+++
writing new private key to '/etc/openvpn/pki/private/user1.key.XXXXeoGIJE'
-----
Using configuration from /usr/share/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
...
Bu komutta, user1 kullanıcı adına sahip bir kullanıcı oluşturduk ve nopass seçeneğini ilettik. Bu seçenekle birlikte kullanıcı ayar dosyasını kullanarak doğrudan giriş yapabilecektir. Bu aynı zamanda, biri az sonra üreteceğimiz ayar dosyasını ele geçirirse, başka hiçbir şeye ihtiyaç duymadan kurduğumuz VPN sunucusuna bağlanabileceği anlamına geliyor. Ayrıca, kullanıcı oluştururken önceki aşamalarda oluşturulan sertifika otoritesinin parolası da tekrardan sorulacaktır.
Son aşama olarak, kullanıcıya gönderebileceğimiz bir ayar dosyası oluşturalım. Bu dosyası oluşturmak için çalıştıracağımız komut:
docker run -v $PWD/vpn-data:/etc/openvpn --rm vpnimajim ovpn_getclient user1 > user1.ovpn
Sonuç
Oluşan user1.ovpn dosyasını artık SCP, SFTP veya istediğiniz başka bir yöntem ile kopyalayabilirsiniz. Kullanıcılar, sunucuya bu dosyayı kullanarak bağlanacaklar. Ben MacOS üzerinde Tunnelblick adlı uygulamayı kullanıyorum, kullandığınız işletim sistemine uygun bir istemciye bu ayar dosyasını sağlayarak bağlantı kurabilirsiniz. Bu aşamaları takip edip, elde ettiğim dosyayı eklediğimde elde ettiğim sonuç:
Son yazdığımız 2 komutu kullanarak farklı kullanıcılar oluşturabilir ve onlara ait ayar dosyalarını elde edebilirsiniz. Ayrıca OpenVPN ayar dosyaları üzerinde değişiklik yaparak OpenLDAP veya Active Directory gibi yerlerden kullanıcı girişi yapılacak şekilde ayarlayabilirsiniz.