14.04.2021

AWS üzerinde WireGuard VPN sunucu kurulumu

Amazon Web Services üzerinde düşük özelliklere sahip bir sunucu ücretsiz olarak kurulabiliyor. Bir hesap açarak aws.amazon.com adresine girerek bu işlemi yapabiliriz. Bunu yaptıktan sonra bugün için 1 GB RAM'e sahip, 1 CPU ve 8 GB depolamaya sahip bir linux sunucumuz olacak.

Yukarıdaki tabloda da görüldüğü gibi aylık 15 GB kotaya sahip olacağız. Ücretsiz kullanımda bizi sınırlayan tek ölçüt bu olacak.

Free Instance'ımızı oluşturduktan sonra bir linux sunucuyu uzaktan yönetmek için bize tahsis edilmiş bir de özel anahtar dosyamız olacak. *.pem uzantılı bu dosyayı işin sonunda download etmeyi unutmamak gerek. Ayrıca security bölümünden inbound rules'a bir SSH bağlantısı (22/TCP) izni oluşturmamız gerek.

Sunucumuza uzak bağlantıyı aşağıdaki gibi yapabiliriz.

> ssh ubuntu@sunucu_ip_adresi_veya_ismi -i ozel_anahtarimiz.pem

Özel anahtarımız aracılığıyla şifresiz ssh bağlantısı yapabiliriz. Oluşabilecek hatalar pem dosyasının yetkilerinin gereğinden fazla olmasından kaynaklanabilir. Bunun için yetkileri kısmak gerek. Sadece kendi kullanıcımıza yetki verelim.

Şu an için benim elimde Ubuntu 20.04.3 LTS bir sunucu var. İlk yapmak gereken paketleri bir güncellemek

> sudo apt update && sudo apt upgrade

Bir sonraki adım otomatik süreçte oluşturulan ubuntu kullanıcısından kurtulup kendi belirlediğimiz bir kullanıcı ve kendi yarattığımız bir özel anahtarla oturum açmak için. Çok gerekli mi? Değil. Ama ben yapmayı tercih ediyorum. Yeni bir grup ve kullanıcı oluşturalım.

> sudo groupadd metin

> sudo adduser metin

Yeni oluşturduğumuz kullanıcıya ayrıcalıklı yetkiler vermek için bazı grupların üyesi yapalım.

> sudo usermod -aG admin,adm,sudo,ssh metin

Bir de varsayılan grup olayımız var

> sudo usermod -g metin metin

Bu kullanıcı için bir RSA anahtar çifti oluşturmamız gerek. Daha sonra SSH bağlantımızı bu kullanıcı üzerinden yapacağız. Bunu yapmanın birkaç yolu var. Yollardan biri ssh-keygen'i ubuntu kullanıcısıyla çalıştırıp yaratılan dosyaları yeni kullanıcımızın profiline aktarmak. ssh-keygen varsayılan olarak 3072 bitlik bir anahtar çifti oluşturacak ve bunları varsayılan olarak .ssh klasörünün altında id_rsa ve id_rsa.pub dosyalarına yazacak. Ubuntu kullanıcısından yaptığımız bu işlem sonucunda oluşan dosyaları metin kullanıcısının authorized_keys dosyasına aktaracağım.

> sudo cp .ssh/id_rsa.pub /home/metin/.ssh/authorized_keys

Sonrasında ssh bağlantısını kesip özel anahtarımızı yerel bilgisayara aktaralım.

> scp -i ozel_anahtarimiz.pem ubuntu@sunucu_ip_adresi_veya_ismi:/home/ubuntu/.ssh/id_rsa D:\ssh\ozel_anahtarim

Özel anahtarımız pem dosyasının yerine geçecek. Bu dosyanın da yetkilerinin sadece kendi kullanıcımızla kısıtlı olması gerek. OpenSSH bu konuda katı. Bu işlemden sonra yeni kullanıcımız ve yeni anahtarımızla bağlantı yapabiliyor olmamız gerek. Deneyelim:

> ssh -i D:\ssh\ozel_anahtarim metin@sunucu_ip_adresi_veya_ismi

Artık ubuntu kullanıcısı ve ev klasörünün altındaki (/home/ubuntu) dosyalara ihtiyacımız kalmadı. Silebiliriz.

Sonrasında benim yapmayı tercih ettiğim ilk şey bir güvenlik duvarı ve fail2ban kurmak.

> sudo apt install ufw fail2ban

Sunucumuza uzaktan ssh ile bağlandığımız için güvenik duvarını kurduktan sonra etkinleştirmeden önce ilk yapmamız gereken SSH bağlantılarına izin veren bir kural oluşturmak.

> sudo ufw allow ssh

> sudo ufw enable

Artık sadece 22 TCP bağlantısına izin verilen bir sunucumuz var. Ben bununla yetinmiyorum. Böyle bir sunucuyu internete bağlı bırakmak aracınızı kilitleyip herkesin kendi anahtarını deneyerek açmaya çalışacağı bir pazar alanına bırakmak gibi. Sürekli birileri gelip bağlanmayı deneyecek. Bunu nispeten engelleyebilmek için fail2ban çok güzel bir çözüm. Fail2ban'in yapılandırma dosyası /etc/fail2ban/jail.conf adresinde. Ama bu dosyayı doğrudan düzenlemek yerine aynı klasöre jail.local kopyası oluşturup onun üzerinden düzenlemek önerilmiş. jail.local kopyası boş olabilir, ya da şu adreste gösterildiği gibi jail.conf dosyasının satırlarının başına # karakteri getirilerek etkisizleştirilmiş bir kopyası olabilir:

> awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

Sonuçta bu dosyayı açıp içinde bazı düzenlemeler yapmamız gerek. Bu dosyaya sadece ben, belirsiz birkaç yerden bağlanacağım. Şifreyi en fazla 2 kere yanlış girme ihtimalim üzerinden yapılandıracağım. Aynı IP adresinden 10 dakika içinde 2'den fazla yanlış şifre denemesi olursa bu IP aderesinin engellenmesini istiyorum. Engelleme de süresiz olacak. Ama güvenli bir IP adresi vereceğim; bu adresten gelen bağlantılar engellenmeyecek. Bunu yapabilmek için şu satırları ekliyorum.

[DEFAULT]
ignoreip = 222.222.222.222
bantime = -1
findtime = 600
maxretry = 3

SSH protokolü varsayılan olarak jail.conf dosyasında izleniyor. Bazı kaynaklarda ssh için aşağıdaki gibi satırların eklenmesi önerilmiş ama ben eklemedim. Buna rağmen SSH protokolü izlemede.

[ssh]
enabled     = true
port        = ssh
filter      = sshd
logpath     = /var/log/auth.log

Fail2ban'in durumunu sorgulamak için

> sudo fail2ban-client status

ya da özellikle sshd durumunu öğrenmek için

> sudo fail2ban-client status sshd

yazıp engellenmiş IP adresi var mı, öğrenebiliriz. Engellenen bir IP adresini karalisteden çıkarmak için ise

> sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx

ya da bir IP adresini engellemek için

> sudo fail2ban-client set sshd banip 1xx.1x.2x.2x

Artık VPN kurulumuna başlayabiliriz. VPN kurulumu işin en kolay kısmı. Wolfgang sağolsun, şu videosunda konuyu oldukça basite indirgemiş.

> wget https://git.io/wireguard -O wireguard-install.sh && sudo bash wireguard-install.sh

Cep telefonlarından bağlanabilmek için Wireguard'ı kurup QR kodu okutmak yeterli. Bilgisayardan yapıyorsanız bu işlem sonucunda oluşan /root klasörünün altındaki *.conf dosyasını bilgisayarınıza aktarmanız yeterli. Linux'ta /etc/wireguard/wg0.conf dosyasına, Windows'da ize grafik arayüzden Wireguard uygulamasının için bu verileri aktararak bağlantı oluşturabilirsiniz. Sınırsız kullanıcı oluşturmak mümkün. Her cihaz/kullanıcı için 

> sudo bash wireguard-install.sh

komutunu tekrar çalıştırmak gerek. Sınır olmadığı için bunu yapmaktan kaçınmamak, bir cihazın/kullanıcının verilerini başka bir cihaz/kullanıcı ile paylaşmamak önerildiği için bu kurala uyuyoruz. Linux'ta VPN'i devreye almak için

> sudo wg-quick up wg0

komutunu çalıştırmak gerekli. Wireguard varsayılan olarak UDP 51820 portunu kullanıyor ama değişitirilebilir. Bu port için de güvenlik duvarının üzerinde izin vermek gerek. Hem Ubuntu'nun güvenlik duvarı, hem de Amazon'un Security Rules içinde. Ubuntu için bu

> sudo ufw allow 51820/UDP

ile mümkün.

Wireguard UDP kullandığı için ve UDP de TCP gibi oturumlu olmadığı için çalışıyor mu diye kontrol etmek biraz daha zor. Kontrol etmek için bir yöntem VPN'i devreye aldıktan sonra sunucuya dahili IP adresi üzerinden ping atmak olabilir. Wireguard kendi içinde başka bir IP aralığı kullanıyor. Örneğin 

> ping 10.7.0.1

ile istemcimiz sunucuya ping atabiliyor mu, ya da sunucu üzerinden

> ping 10.7.0.2

gibi bir şekilde sunucu istemciye ping atabiliyor mu, bakabiliriz. Artan cihaz sayısı ile son oktet değişecektir. Ya da sunucu tarafında 51820 portu üzerinden gerçekleşen trafiğe bakabiliriz.

> sudo tcpdump -i eth0 port 51820

Kriptolanmış paketlerin içini görmeye kalkışmadan bu trafiğin varlığının sistemin çalıştığını gösterdiğine kanaat getirmek genel olarak tercih edilen bir yöntem.

2023-08-13 Ek: Wireguard için kernel debug logu aktifleştirmek için

# echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

yapılabilir. Bundan sonra da kernel loglarına

# dmesg -wT

ile bakılabilir. İhtiyacımız kalmadığında wireguard kernel loglarını devre dışı bırakmak için

# echo "module wireguard -p" | sudo tee /sys/kernel/debug/dynamic_debug/control

 Bu güzel bilgi de şu adresten alındı.

Hiç yorum yok: