hkucuk

VirtualHost'ta Reverse Proxy ve Basit Authentication

March 11, 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