VirtualHost'ta Reverse Proxy ve Basit Authentication
11 Mart 2021 • ☕️ 3 dk okuma • 🏷 bilgisayar, yazılım
Yazar tarafından şu dillere çevrildi: English
Bir web sunucusu kurarken, genellikle erişimi kısıtlamak istediğimiz bölümler vardır. Web uygulamaları genellikle kendi kimlik doğrulama ve yetkilendirme yöntemlerini sağlarlar ancak bazı durumlarda web sunucusunun kendisi aracılığıyla erişimi kısıtlamak isteyebiliriz.
Reverse Proxy ihtiyacımız ise web sunucusunda çalışan bir servisi dış dünyaya açmak istediğimizde karşımıza çıkmaktadır. Örneğin 3100 prtunda çalışan bir servisiniz var ve bu servise servis.example.com aracılığı ile erişmek istiyorsunuz. Bu durumda bir yönlendiriciye ihtiyacınız olacaktır.
Bu yazıda ben VirtualHost kullanan bir web sunucusunda Reverse Proxy işleminin nasıl yapılacağını ve şifre korumasının nasıl uygulanabileceğini göstereceğim.
Parola Dosyasını Oluşturma
Öncelikle erişim iznine sahip olacak kullanıcı adlarının ve şifrelerinin sisteme tanıtılması gerekmektedir. Bunun için htpasswd komutuna ihtiyacımız var.
Eğer htpasswd sisteminizde kurulu değilse aşağıdaki şekilde kurulumunu sağlayabilirsiniz. Ben yum paket yöneticisini kullanıyorum. Sisteminize uygun kurulumu kısa bir araştırma ile kolayca bulabilirsiniz.
yum provides \*bin/htpasswd
ya da
yum install httpd-tools
Komut sistemimizde olduğuna göre artık şifreleri oluşturabiliriz. Bunun için sistemimizin /etc/httpd dizininde .htpasswd adında gizli bir dosya oluşturacağız.
Henüz ilk defa htpasswd kullanacağımızdan dolayı belirtilen dosyayı oluşturmak için -c seçeneğini eklememiz gerekir. Dosya içinde yeni bir girdi oluşturmak için komutun sonunda bir kullanıcı adı (bu örnekte admin) belirtiyoruz:
sudo htpasswd -c /etc/httpd/.htpasswd admin
Bu komutu çalıştırdıktan sonra sistem sizden bir parola isteyecektir. Parolanızı iki defa girdikten sonra admin kullanıcısı için şifre tanımlanmış olacaktır.
Bundan sonra başka kullanıcı eklemek isterseniz -c komutunu kullanmanıza gerek yok.
sudo htpasswd /etc/httpd/.htpasswd another_user
Dosyanın içeriğini görüntülersek, her kayıt için kullanıcı adını ve şifrelenmiş parolayı görebiliriz:
cat /etc/httpd/.htpasswd
Output
admin:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.
VirtualHost Basit Giriş Tanımlama
Şifre ile giriş ekleyecepğimiz virtualhost config dosyasını açalım. Benim örneğimde bu dosya /etc/httpd/conf/httpd.conf.
sudo nano /etc/httpd/conf/httpd.conf
Config dosyası içerisinde aşağıdaki gibi bir tanımlamanız olması gerekiyor.
<VirtualHost *:80>
ServerName service.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Giriş kısıtlaması dizin bazında yapılmaktadır. Bunun için Directory ya da Location tanımlamalarını kullanmamız gerekmektedir.
<VirtualHost *:80>
ServerName service.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/httpd/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
Artık service.example.com adresine erişmek istendiğinde kullanıcı adı ve şifre girilmesi gerekecektir.
Reverse Proxy
Reverse Proxy eklemek için ProxyPass ve ProxyPassReverse alanları işimizi görecektir. Reverse Proxy ve Basic Authentication işlemlerini birlikte içeren config şu şekilde olacaktır.
<VirtualHost *:80>
ServerName service.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyErrorOverride On
ProxyPass / http://127.0.0.1:3100/
ProxyPassReverse / http://127.0.0.1:3100/
<Location />
Authtype Basic
Authname "Password Required"
AuthUserFile /etc/httpd/.htpasswd
Require valid-user
Order allow,deny
Allow from all
</Location>
</VirtualHost>
Burada Directory’den farklı olarak Location kullanıldı. Dikkat edilmesi gerek bir nokta, ProxyPass ve ProxyPassReverse tanımlamalarındaki hedef url’in sonundaki / mutlaka koyulmalıdır. Yoksa doğru bir mapping yapılamayacaktır.
Kaynaklar
- https://httpd.apache.org/docs/2.4/programs/htpasswd.html
- https://httpd.apache.org/docs/current/mod/mod_proxy.html