Идентификация (лат. identifico - отъждествяване) - установяване личността на субекта.
Аутентификация (англ. authentication) - удостоверяване истинността на субекта. Процедура, при която се проверява съответствието на името с прикрепена към него уникална информация, например, парола.
Авторизация (англ. authorization) - проверка на правата за достъп на субекта към ресурсите на сайта.
Настройка
Аутентификация се настройва в файл httpd.conf или с помощта на файл .htaccess.
Демонстрацията протича на Debian/Ubuntu сървър и ще се огранича до втория начин. В самото начало е необходимо да убедим, че директива AllowOverride е All в файл /etc/apache2/sites-enabled/000-default. Тя разрешава на Apache да зачита указанията в файл .htaccess.
Остава да създадем:
- файл с пароли за съответните потребители;
- да укажем защитавания ресурс.
Реализация
Примерно, в каталог my_site нека създадем зона за аутентификация. Това е каталог auth. Стартираме терминала и изпълняваме следната команда:
mkdir -p /var/www/my_site/auth
Създаваме файл .htpasswd. Този файл ще съдържа паролите на регистрираните потребители, които ще имат достъп до каталог auth. За целта се използва стандарта утилита htpasswd, входяща в състава на сървър Apache. Създаваме:
sudo htpasswd -c /var/www/my_site/auth/.htpasswd profruit
Параметър -c се използва при първоначален старт на htpasswd и указва създаване на нов файл. Ако такъв съществува ще бъде презаписан от новосъздадения. Следва посочване пълния път до файл .htpasswd, а след него потребителското име, в случая моето. Два пъти ще се поиска въвеждане на парола, която няма да се види с цел повишена безопасност (някой може да стои зад вас в този момент). Въведената парола е 123456, адската и любимата.
Проверяваме резултата:
cat /var/www/my_site/auth/.htpasswd
profruit:o3jEkKjqqT9BI
Файлът създаден, с права 0440 (-r--r-- 1 root www-data). Съдържа указано потребителско име и съответна паролата. Става ясно, че създадения плосък файл ще бъде списък от всеки пореден потребител, допуснат до този ресурс. Първата част в открит текстови вид съдържа ника, а след двуточието представлява паролата в зашифрован вид от модифицирана версия на MD5. Отлично.
Следва да укажем на Apache, че това е закрита зона, достъпна само за регистрирани потребители. Създаваме файл .htaccess:
cd /var/www/my_site/auth
touch .htaccess
Стартираме редактор nano
nano .htaccess
... и набираме следния текст:
AuthType Basic
AuthName "Private zone. Only for valid users!"
AuthUserFile "/var/www/my_site/auth/.htpasswd"
require valid-user
# достъп закрит
<Files /var/www/my_site/auth/.htpasswd>
deny from all
</Files>
Съхраняваме.
Пробваме да влезем в защитения каталог auth, набирайки адреса му в браузър. Изпълнението ще генерира форма за достъп, която е индивидуална за модела браузър. Под Opera изглежда така.
Набираме своето име, но грешна парола. Нищо. Браузърът презарежда и подканва отново да въведем потребителско име и парола в формата. И така до безкрай. Ако натиснем бутон Cancel се генерира следното съобщение:
Authorization Required
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.
Apache/2.2.14
(Ubuntu) Server at localhost Port 80
При набор на коректно име и парола получаваме достъп.
Подводни камъни
Какво следва да знаем, за подобен род реализация към закрит ресурс?
За целта ще ползваме add-ons Live HHTP headers в браузър Firefox. Това е подобие на снифер, прихващаш диалога между браузъра и сървъра. Стартираме Firefox, стартираме Live HТTP headers. Набираме адреса на закрития каталог. Генерира се формата с полета за аутентификация. Четем диалога в Live HТTP headers.
http://localhost/my_site/auth/ GET /my_site/auth/ HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate DNT: 1 Connection: keep-alive HTTP/1.1 401 Authorization Required Date: Sat, 04 May 2013 11:42:35 GMT Server: Apache/2.2.14 (Ubuntu) WWW-Authenticate: Basic realm="Private zone. Only for valid users!" Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 340 Keep-Alive: timeout=15, max=98 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1Чрез метод GET браузърът иска от localhost ресурс my_site/auth/ по протокол HTTP/1.1. Сървърът честно отговаря 401 Authorization Required, на което браузърът генерира формата. Следва бла-бла-бла до специална заглавка WWW-Authenticate: Basic realm, тоест, начина по които иска Apache, да получи логин и парола.
Basic е базова авторизация. Кодирането е налично на двата края, но клиента предава паролата недостатъчно зашифрована. Причината е в алгоритъм Base64.
realm на пръв поглед се очаква да бъде предупредителния израз, който се генерира в модалния прозорец на формата. Да речем, че имаме форум, а към него админ зона. Потребител, авторизиран на форума не следва да премине в админ зоната. Това разпределение на нещата осигурява realm. За да бъде ясно, просто израза "Private zone. Only for valid users!", чието съдържание е по хрумване на администратора, напомня за този преход.
ОК, нека въведем правилен ник: profruit и парола: 123456 и отново прочетем заглавките:
http://localhost/my_site/auth/ GET /my_site/auth/ HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate DNT: 1 Authorization: Basic cHJvZnJ1aXQ6MTIzNDU2 Connection: keep-alive HTTP/1.1 200 OK Date: Sat, 04 May 2013 13:06:59 GMT Server: Apache/2.2.14 (Ubuntu) Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 403 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html;charset=UTF-8Този път Apache отговаря с статус 200 или моля, заповядайте. Но, аутентификация е предадена в този хедър Authorization: Basic cHJvZnJ1aXQ6MTIzNDU2. Копираме я и пускаме в първия online Base64 decoder.
От снимката черно на бяло се вижда как моята парола може да се изведе на дневна светлина и още веднъж да ви накара да се загледате в червения предупреждаващ надпис на Operа от снимката горе. Този начин с лекота може да бъде компрометиран от "човек по средата".
И още.
В вашия браузър се изпраща срита сесионна бисквитка и вие сте авторизирани до закриване на сеанса/затваряне на браузъра. Паралелно се създава променлива на обкръжението REMOTE_USER. Тя може да бъде използвана за приветствие на логнатия потребител getenv("REMOTE_USER")/apache_getenv("REMOTE_USER").
<html> <head> <title>REMOTE_USER</title> </head> <body> <?php echo 'Здравейте '. apache_getenv("REMOTE_USER") . "\n"; echo "Вашата парола е: {$_SERVER['PHP_AUTH_PW']}"; ?> </body> </html>
до нови срещи ^.^
0 Response to "Базова аутентификация в Apache"
Публикуване на коментар