Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Не вовсе типовой подход к организации доступа к WiFi сети (Cisco WLC -> FreeRadius -> PHP -> страничка в сети )

Anna | 31.05.2014 | нет комментариев
Хочу поделиться решением одной нетривиальной задачи. Было нужно организовать комфортный доступ к беспроводной сети в офисе организации. Сеть предоставляет доступ только к public internet, с корпоративной сетью ничто не объединяет — всецело изолированная система. Исключительный всеобщий компонент — пользователи. Для облегчения процесса решено аутентификацию делать на ярусе Layer 3 — то есть сеть открытая, позже подключения нужно вводить пароль для доступа к интернету (Cisco WLC Web Auth).
В тезисе все легко, заводятся учетные записи на всякого пользователя, и все готово. Но, ввиду недобора хелпдеск персонала, заниматься созданием логинов и, тем больше, выдачей паролей персоналу было некому. Была поставлена задача применять один из существующих источников аутентификации, что в стандартной обстановки сделать довольно легко: скажем для MS Active Directory дозволено применять NPS в качестве радиус сервера, на LDAP же дозволено подключаться напрямую).
В нашем случае было и то, и другое (AD для сети и LDAP для доступа к корпоративному интранету ), но из WiFi сегмента туда не было вообще никакого доступа. Максимум что нам сумели дать, это тестовые AD акаунт и акаунт для интранета. Сели, подумали… и вот что придумали
У FreeRadius есть вероятность запрашивать аутентификацию у внешнего скрипта, скажем PHP. Делается это вот так:

authorize{
    update control { 
        Auth-Type := `/usr/bin/php -f /etc/raddb/yourscript.php '%{User-Name}' '%{User-Password}'`
    }

В этом случае, PHP должен только проверить логин&пароль и ответить либо Accept либо Reject.

Применяя это мы с триумфом загвоздку решили. Диаграмма того, что получилось:

PHP скрипт логинится на интранет страничку с переданными ему ‘%{User-Name}’ ‘%{User-Password}’` через curl, проверяет удалось ли это, и делает echo «Accept» если удалось.

Вот код скрипта (вход в интранет с применением IBM Tivoli Access Manager WebSEAL)

        $authSuccessful = False;
        $user = $argv[1];
        $password = $argv[2];
        $url = 'https://intranet.of.the.company.accessible.from.internet/pkmslogin.form';
        $fields_string= "username=".$user."&password=".$password."&login-form-type=pwd&submit=Login";
        //open connection
        $ch = curl_init();
        //set the url, number of POST vars, POST data
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
        curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
        curl_setopt($ch,CURLOPT_COOKIEJAR, "cookie.txt");
        curl_setopt($ch,CURLOPT_COOKIEFILE, "cookie.txt");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_POSTREDIR, 0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
        //execute post
        $result = curl_exec($ch);
        curl_close($ch);
        if (strpos($result,'Your login was successful') !== false)
                $authSuccessful = True;

        if ($authSuccessful == True)
                echo "Acceptn";
        else
                echo "Rejectn";

Работало все на славу, все были довольны…, помимо тех, кто не помнил свой интранет пароль (по какой-то причине пароли на интранет отличались от AD паролей). IT руководство, взамен того Дабы намекнуть юзерам что пароли нужно помнить все а не только стержневой (в данном случае основным паролем оказался AD), попросило нас решить загвоздку техническими способами.
По радостной случайности, у конторы был Citrix XenApp сервер с Web Interface доступным из интернета и MS AD в качестве источника аутентификации. Чем и воспользовались:
Код скрипта (логин на Citrix Web Interface v 5.4)

        $authSuccessful = False;
        $user = $argv[1];
        $password = $argv[2];
        //WebInterface 5.4.x
        $url = 'https://the.web.interface.of.citrix.xenapp/Citrix/XenApp/auth/login.aspx';
        $fields_string= "user=".$user."&password=".$password."&LoginType=Explicit";
        //open connection
        $ch = curl_init();
        //set the url, number of POST vars, POST data
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
        curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
        curl_setopt($ch,CURLOPT_COOKIEJAR, "cookie.txt");
        curl_setopt($ch,CURLOPT_COOKIEFILE, "cookie.txt");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_POSTREDIR, 0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
        //execute post
        $result = curl_exec($ch);
        //close connection
        curl_close($ch);
        if (strpos($result,'default.aspx') !== false) {
                $authSuccessful = True;
        }

        if ($authSuccessful == True)
                echo "Acceptn";
        else
                echo "Rejectn";

Решили пойти еще дальше, и объединили оба скрипта в один — сейчас вначале проверяется интранет логин, после этого MS AD через Citrix WI

Код финального скрипта

        $authSuccessful = False;
        $user = $argv[1];
        $password = $argv[2];
        $url = 'https://intranet.of.the.company.accessible.from.internet/pkmslogin.form';
        $fields_string= "username=".$user."&password=".$password."&login-form-type=pwd&submit=Login";
        //open connection
        $ch = curl_init();
        //set the url, number of POST vars, POST data
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
        curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
        curl_setopt($ch,CURLOPT_COOKIEJAR, "cookie.txt");
        curl_setopt($ch,CURLOPT_COOKIEFILE, "cookie.txt");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_POSTREDIR, 0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
        //execute post
        $result = curl_exec($ch);
        curl_close($ch);
        if (strpos($result,'Your login was successful') !== false)
                $authSuccessful = True;
        if ($authSuccessful == False) {
  //WebInterface 5.4.x
        $url = 'https://the.web.interface.of.citrix.xenapp/Citrix/XenApp/auth/login.aspx';
        $fields_string= "user=".$user."&password=".$password."&LoginType=Explicit";
        //open connection
        $ch = curl_init();
        //set the url, number of POST vars, POST data
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
        curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
        curl_setopt($ch,CURLOPT_COOKIEJAR, "cookie.txt");
        curl_setopt($ch,CURLOPT_COOKIEFILE, "cookie.txt");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_POSTREDIR, 0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
        //execute post
        $result = curl_exec($ch);
        //close connection
        curl_close($ch);
        if (strpos($result,'default.aspx') !== false) {
                $authSuccessful = True;
        }
}
        if ($authSuccessful == True)
                echo "Acceptn";
        else
                echo "Rejectn";
 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB