Автентикация и оторизация с Apache HTTP сървър (Част 1)

keys-1.png Автентикацията е процес, при който се проверява, дали някой е този, за когото се представя, че е. Оторизацията е процес, при който на някого е позволено да бъде там, където иска да отиде или има достъп до информация, която някой му е позволил да има. С други думи, вие въвеждате потребителско име и парола в браузъра, браузърът ги изпраща към сървъра и ако те съвпадат с наличните потребителски имена и пароли в даден файл или база данни, тогава вие сте се автентицирали и получавате достъп до съответния ресурс. За да получите достъп до този ресурс, обаче, може да е необходима оторизация, в допълнение към автентикацията. Например, искате да получите достъп до даден ресурс в 2 часа сутринта, но администраторът е решил, че по това време вие да нямате оторизиран достъп до ресурса. По същият начин можете да бъдете оторизиран да разгледате определено съдържание от офиса, но не и от дома си.

Автентикация = кой сте вие (потребителско име и парола)
Оторизация = какво ви е позволено да правите

Как работи автентикацията?

http-authentication.png

Модулът mod_auth


Модулът mod_auth е подразбиращият се модул за автентификация на потребителите в Apache HTTP сървъра. Той позволява да се извърши автентикация на потребители, чийто имена и криптирани пароли са съхранени в текстов файл.
Препоръчително е модулът mod_auth да се използва за малък брой потребители. Ако текстовият файл с потребителски имена и пароли достигне няколко хиляди потребителски имена и пароли, производителността на сървъра спада значително.

Защита на директория чрез basic автентикация

Инструментът htpasswd
Автентикационните директиви могат да бъдат поставени в блоковете <Directory>, <Location>, <Files>, <Proxy>. Тези блокове могат да бъдат поставени в httpd.conf, в httpd-vhosts.conf или в .htaccess конфигурационните файлове.
Инструментът htpasswd (наличен в XAMPP, намира се в директорията /opt/lampp/bin) служи за създаване и ъпдейтване на файлове, които се използват за съхраняване на потребителски имена и криптирани пароли за осъществяване на HTTP basic автентикация на потребители.
За да създадем файл с имената и паролите на потребителите, които ще имат достъп до директория opt/lampp/htdocs/my.localhost, ще приложим htpasswd инструмента, който се намира в пакета apache2-utils. За да го инсталираме, в терминала въвеждаме:

sudo apt-get update
sudo apt-get install apache2-utils

За да разгледам съдържанието на пакета apache2-utils, в терминала въвеждам:

dpkg -L apache2-utils

apache2-utils.png

Информация за това как се работи с инструмента htpasswd може да получите като в терминала въведете: htpasswd –help.

htpasswd.help.jpg

Файлът с паролите можем да съхраним където пожелаем на твърдия диск (стига да е на място, недостъпно от уеб). Аз избирам да го съхраня в директорията /opt/lampp/etc. Ще дам наименование на файла .htpasswd. А името на потребителя ще е imposible.
В терминала въвеждаме:

sudo htpasswd -c /opt/lampp/etc/.htpasswd imposible


Ще бъдете подканени да въведете парола за потребителя и да я потвърдите чрез повторното й въвеждане:

htpasswd-1.png

А ето и съдържанието на файла .htpasswd, изведено в терминала с командата cat:

htpasswd-2.png

htpasswd криптира паролите като прилага bcrypt версия на MD5 алгоритъма за криптиране, SHA1 или функцията crypt(). Файловете, които се управляват от htpasswd могат да съдържат микстура от различни типове за криптиране, т.е. паролите на някои потребители могат да са bcrypt или MD5 криптирани, а други може да са криптирани с crypt(). По подразбиране паролата се криптира с MD5 алгоритъма за криптиране.
Ако искаме да добавим нов потребител с име possibly, изпускаме опция -c, защото файлът с паролите вече съществува:

sudo htpasswd /opt/lampp/etc/.htpasswd possibly

htpasswd-3.png

Ако искаме, паролата на потребителя да се криптира с функцията crypt(), тогава можем да приложим опция -d. В терминала въвеждаме:

sudo htpasswd -d /opt/lampp/etc/.htpasswd jones

htpasswd-4.png

За създаване на файла .htpaswd, може да приложите и вградения в XAMPP инструмент htpasswd, но в този случай, за да го стартирате, в терминала ще трябва да укажете пътя до него:

sudo /opt/lampp/bin/htpasswd /opt/lampp/etc/.htpasswd MyNameIs

htpasswd-6.png
Въпроси, свързани със сигурността, при работа с htpasswd
  • Файловете с криптираните пароли не бива да бъдат достъпни от уеб.
  • Инструментът htpasswd не е сигурен, ако е setuid изпълним.
  • Опцията -b не е препоръчителна, защото в командния ред трябва да въведете некриптирана парола.
  • Опцията -B се прилага, когато искаме да криптираме паролата с bcrypt алгоритъма. Приема се за най-надежден, защото паролите, криптирани с този алгоритъм, се декриптират много трудно.
  • SHA и crypt() алгоритмите не са препоръчителни за криптиране на паролата, защото по днешните стандарти са несигурни.

  • htpasswd-5.png

Конфигуриране на автентикация за директория


Следващата стъпка, която трябва да направим е да настроим Apache уеб сървъра да изисква парола преди да покаже защитено съдържание на директория. Това може да се направи по два начина:
  1. Да редактираме конфигурационния файл на Apache и/или httpd-vhosts.conf. Този метод е препоръчителен.

  2. Да модифицираме .htaccess файла. Този файл позволява да се правят конфигурационни промени за директория. Избягвайте го, ако имате достъп до httpd.conf на сървъра. Всяка директива, която може да се включи в .htaccess файла, е по-добре да бъде поставена в блок <Directory> в конфигурационния файл на сървъра. Ефектът ще е същия, но Apache ще работи по-бързо.
За да демонстрирам как се конфигурира автентикация за директория, създадена в Document Root на сървъра, ще се възползвам от вече създадена от мен директория, която ползвам като виртуален хост- my.localhost (Създаване на виртуален хост: http://dreamlandpoly.blogspot.com/p/virtual-hosting.html).
За да конфигурирам контрола за достъп до my.localhost, e необходимо да направя конфигурационни промени във файла httpd-vhosts.conf. За целта, в терминала въвеждам:

sudo geany /opt/lampp/etc/extra/httpd-vhosts.conf

Отваря се файлът httpd-vhosts.conf. Добавям блок <Directory .......> и в него указвам директорията, за разглеждането на която ще е необходима автентикация.

<VirtualHost *:80>
ServerAdmin webmaster@my.localhost
DocumentRoot "/opt/lampp/htdocs/my.localhost"
ServerName my.localhost
ServerAlias www.my.localhost
ErrorLog "logs/my.localhost-error_log"
CustomLog "logs/my.localhost-access_log" common

<Directory "/opt/lampp/htdocs/my.localhost">

</Directory>
</VirtualHost>

С този блок казвам на Apache, че искам да конфигурирам Basic автентикация за директорията my.localhost. Кои са директивите, които е необходимо да бъдат поставени във вътрешността на блока <Directory>?

AuthType- тази директива определя вида на автентикационния контрол. Възможностите са две: Basic и Digest.

AuthName- задава името на ареала, в който са валидни потребителско име и парола. Ако името на този ареал съдържа интервали, трябва да го поставим в кавички, например: “Ограничен достъп!”.

AuthBasicProvider – тази директива на е задължителна. Тя определя дали файлът с имената и криптираните пароли е обикновен текстов файл или база данни. Подразбиращата се стойност за тази директива е file.

AuthUserFile- съдържа пътя до файла с потребителските имена и криптирани пароли. Файлът не трябва да бъде достъпен от уеб, т.е. трябва да е съхранен извън папката с документи на уеб сървъра. Не я поставяйте в директорията, която искате да защитите, защото в този случай потребителите, имащи достъп до тази директория, ще могат да свалят файла с имената и паролите.

Require- тази директива осъществява оторизационния процес, като определя кой е потребителят на когото е позволено да има достъп до защитената директория на сървъра. Възможните стойности за тази директива са:
[user user1 user2 ...]
[group group1 group2]
[valid- user]
[valid-user] [valid-group]
Ако изберем опцията valid-user, допускат се всички потребители, които са намерени във файла с потребителски имена и криптирани пароли.

Satisfy- тази директива се грижи за оторизацията.

След лиричното отклонение, което направих, е време да се завърна при файла httpd-vhosts.conf. Във вътрешността на блока добавяме:

AuthType Basic
AuthName "Restricted Content"
AuthBasicProvider file
AuthUserFile /opt/lampp/etc/.htpasswd
Require valid-user

Блокът <VirtualHost> трябва да изглежда така:

<VirtualHost *:80>
ServerAdmin webmaster@my.localhost
DocumentRoot "/opt/lampp/htdocs/my.localhost"
ServerName my.localhost
ServerAlias www.my.localhost
ErrorLog "logs/my.localhost-error_log"
CustomLog "logs/my.localhost-access_log" common

<Directory "/opt/lampp/htdocs/my.localhost">
AuthType Basic
AuthName "Restricted content"
AuthBasicProvider file
AuthUserFile /opt/lampp/etc/.htpasswd
Require valid-user
Satisfy all
</Directory>


</VirtualHost>

Съхраняваме файла и рестартираме сървъра.

authentication-1.png

При непотвърдени потребителско име или парола или при клик върху бутон Cancel от формата:

authentication-2.png

При успешна автентикация:

authentication-3.png

А ако желанието ми е да защитя директория, която е вътрешна спрямо Document Root (в случая my.localhost) на виртуалния хост?
Въвеждам блок <Location ......> във файла httpd-vhosts.conf или блок <Directory ......> в конфигурационния файл на сървъра.

<VirtualHost *:80>

ServerAdmin webmaster@my.localhost
DocumentRoot "/opt/lampp/htdocs/my.localhost"
ServerName my.localhost
ServerAlias www.my.localhost
ErrorLog "logs/my.localhost-error_log"
CustomLog "logs/my.localhost-access_log" common
ScriptAlias /cgi-bin/ “/usr/local/apache/cgi-bin/”

#<Directory "/opt/lampp/htdocs/my.localhost">
#AuthType Basic
#AuthName "Restricted content"
#AuthBasicProvider file
#AuthUserFile /opt/lampp/etc/.htpasswd
#Require valid-user
#Satisfy all
#</Directory>

<Location "/opt/lampp/htdocs/my.localhost/secret">
AuthType Basic
AuthName "Restricted content"
AuthUserFile /opt/lampp/etc/.htpasswd
Require valid-user
Satisfy all
</Location>


</VirtualHost>

Съхраняваме файла и рестартираме сървъра.

Повече информация: http://httpd.apache.org

sign.png

Няма коментари:

Публикуване на коментар