Автентикация при Squid

Написана от Мартин Петров (amri|amridikon)
Благодарнoсти на www.dhstudio.eu

      Squid има голям брой характеристики като поддръжката на HTTP прокси автентикация. С прокси автентикацията HTTP заявките на клиентите съдържат свойте удостоверения за самоличност. Обикновенно удостоверението е потребителско име и парола. До момента Squid поддържа три техники за получаване на потребителски удостоверения за самоличност:

> HTTP основен протокол
> DIGEST автентикационен протокол
> NTLM (NT Lan Manager)

      HTTP основния протокол има много несигурна техника за автентикация. Потребителското име и пароли се изпращат заедно основно в чист текст. DIGEST автентикацията е по- сигурна, но също и малко по- сложна. И двете техники HTTP и DIGEST са документирани в RFC 2617. NTLM има съшо по- добра сигурност в сравнение със HTTP автентикацията. NTLM е патентован протокол разработен от Microsoft.

      Ние ще разгледаме HTTP и DIGEST техниките за автентикация при Squid.

<1.0> HTTP основен метод за автентикация:

       Основната техника за автентикация е проста и най- несигурна. Тя обикновенно предава потребителските имена и пароли в чист текст. За пример, ако потребителското име е : Martin, а паролата е Petrov, потребителския агент(user-agent) комбинира двете в едно като разделя потребителското име и парола със две точки(:):
Martin:Petrov

Тогава в хедъра на пакета се наблюдава следното:
Proxy-Authorization: Basic YW1yaTo1YThiOGM0ZDFlMGZhbXJp\r\n
Credentials: Martin:PetrovMartin
\r\n

HTTP основния автентикационен метод поддържа следните auth_param параметри:

> auth_param basic program command
> auth_param basic children number
> auth_param basic realm string
> auth_param basic credentialsttl time-specification

      Program параметъра характеризира командата включително и аргументите за помощната програма за автентикация. В повечето случаи това ще бъде пътя на програмите за автентикация които Вие сте компилирали. По подразбиране те се намират във: /usr/lib/squid/
      Children параметъра казва на Squid колко процеси да се ползват. По подразбиране са 5 процеса което е добро начало ако Ннзнаете все още на какво натоварване ще бъде подложен Squid.
      Realm параметъра е автентикиращия стринг които потребителя ще получи когато трябва да въведе своите потребителско име и парола. Вие може да ползвате нещо просто като: "Access to The Squid Caching Proxy."
      Credentialsttl параметъра характеризира времето през което Squid кешира автентикационните данни. По- голямата стойност намалява зареждането на автентикационните процеси, но същевременно Squid по- бавно разбира когато има промяна във базата със потребителски имена и пароли. Бележка: това оказва влияние само за коректни потребителски имена и пароли. Грешно въведените потребителски имена и пароли не се кешират в Squid. По подразбиране TTL(Time to Live) стойността е 2 часа.

      Това е завършен пример които може да ползвате като добавите редовете по- долу в конфигурационния файл на Squid (/etc/squid/squid.conf) и след това рестартирате Squid (/etc/init.d/squid restart). :

## Added by (amri|amridikon)
auth_param basic program /usr/lib/squid/pam_auth
auth_param basic children 10
auth_param basic realm My Awesome Squid Cache
auth_param basic credentialsttl 1 hour
acl KnownUsers proxy_auth REQUIRED
http_access allow KnownUsers

<2.0> DIGEST автентикацията е проектирана да бъде по- сигурна от основната HTTP автентикация. Обикновенно вместо изпращането на потребителски имена и пароли в чист текст потребителския агент изпраща "съобщение digest" на потребителското име, парола и друга информация(За повече инфо разгледайте RFC 2617).

      HTTP Digest автентикацията поддържа следните auth_param параметри:

> auth_param digest program command
> auth_param digest children number
> auth_param digest realm string
> auth_param digest nonce_garbage_interval time-specification
> auth_param digest nonce_max_duration time-specification
> auth_param digest nonce_max_count number
> auth_param digest nonce_strictness on|off
      Параметрите: program, children i realm са едни и същи както и при основната HTTP автентикация. Всички от уникалните параметри свързани с Digest автентикацията използват noonce (Специален стринг).
      Noonce е специален стринг, които се променя. По време на автентикационния процес, Squid предоставя noonce стойност на клиента. Клиента използва noonce стойността когато генерира digest. Без noonce потенциален атакуващ би могъл да вземе digest и да го използва за да вземе достъп до Squid.
      Nonce_garbage_interval параметъра казва на Squid колко често да изтрива noonce кеша. Подразбиращата стойност е 5 минути.
      Noonce_max_duration параметъра конкретизира колко време noonce стойност ще бъде валидна. Когато клиента се опита да използва noonce стойност по- стара от времето за валидност тогава Squid генерира 401(Unauthorized) отговор и го изпраща на клиента. Подразбиращата стойност е 30 минути. Бележка: Възможно е прихванат автентикационен хедър да бъде използван за атака докато на noonce стойността и изтече валидността.
      Noonce_max_count параметъра описва броя на noonce стойности които могат да бъдат използвани. След конкретния брой заявки, Squid връща 401 ( Unauthorized ) отговор и нова noonce стойност. Подразбиращата стойност е 50 заявки. Броя на Noonce е друга характеристика предназначена с цел предотвратяване на потенциални атаки. Squid изпраща qop=auth в 401 отговор. Това кара потребителския агент да включи noonce броя в отговора и да използва noonce броя когато генерира digest. Noonce трябва винаги да се увеличават с времето. Намаляването на noonce индикира за потенциална атака. Понякога noonce се увеличава без да е в последователност т.е. 5,6,8,9. Параметъра noonce_strictness определя какво да прави Squid в такъв случай. Ако е сетнат на < on >, Squid връща отговор 401. Ако е сетнато на < off > Squid позволява пролука в noonce.

      Това е завършен пример които може да ползвате. Създайте файл: /etc/squid/password с потребителските имена и пароли на потребилите разделени с две точки(:). Пример за такъв файл може да видите по- долу:
downloader:1_011downFFload110_1
amri:password

      Сега е необходимо да добавите редовете по- долу в конфигурационния файл на Squid (/etc/squid/squid.conf).:

## Added by (amri|amridikon)
auth_param digest program /usr/lib/squid/digest_pw_auth /etc/squid/password
auth_param digest children 8
auth_param digest realm Access to Squid
auth_param digest nonce_garbage_interval 10 minutes
auth_param digest nonce_max_duration 45 minutes
auth_param digest nonce_max_count 100
auth_param digest nonce_strictness on
acl KnownUsers proxy_auth REQUIRED
http_access allow KnownUsers

      След създаването на файл /etc/squid/password и добавянето на редовете по- горе е необходимо да рестартирате Squid (/etc/init.d/squid restart).