Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...

Уеб-сървър Apache разполага в арсенала си с опция за настройка на идентификация, аутентификация и авторизация. Това ви дава възможност да добавите зона на вашия сайт достъпна само за регистрирани потребители.

Идентификация (лат. 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, адската и любимата.

htpasswd

Проверяваме резултата:

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.

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>
авторизация






до нови срещи   ^.^
04.05.2013 profruit 

0 Response to "Базова аутентификация в Apache"

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

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: openHAB, Ubuntu, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога