Codeigniter аутентификация через Ldap

Так, как последнее время я работаю используя Codeigniter, то соответственно начал искать модуль для LDAP аутентификации, в итоге, поиски привели меня на Хабр. Статья оказалась полезной, и помогла начать работу с библиотекой adldap.php

В процессе создания внутреннего сайта одной из российских компаний, возникла необходимость ограничить доступ пользователей к некоторым страницам, функциям. Так как все пользователи в домене, то и на сайте есть смысл использовать доменную аутентификацию.

Найти самостоятельно информацию в принципе не трудно. Поисковые системы еще ни кто не отменял. Я просто решил собрать найденные кусочки и объединить их в один, на русском языке.

Допустим, что CI уже установлен и настроен. Добавим библиотеку и конфигурационный файл.Конечно, существуют некоторые функции в самом PHP, но использовать их не всегда рационально. За основу возьмем библиотеку adLDAP. В ней есть все необходимое и даже больше.

Первым делом создадим конфигурационный файл, например adldap.php и положим его в \system\application\config\

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['account_suffix'] = '@dom.ru';
$config['base_dn'] = 'DC=dom,DC=ru';
$config['domain_controllers'] = array ("DC01.dom.ru");
$config['ad_username'] = 'web_user';
$config['ad_password'] = 'web_passS8';
$config['real_primarygroup'] = true;
$config['use_ssl'] = false;
$config['use_tls'] = false;
$config['recursive_groups'] = true;
?>

Далее необходимо добавить библиотеку. Но как сделать так, что бы ей можно было пользоваться в CI, как остальными? За нас это уже сделал один программист, и предоставил для общественного пользования (онутверждает, что лицензия не нарушена). Ее мы и добавим в \system\libraries\ и назовем, например Adldap.php.

После выше описанных манипуляций библиотекой можно пользоваться в Codeigniter-е, как и другими, например:

<?php
$this->load->library('Adldap');
$this->adldap->authenticate($username, $password);
?>

Напишем небольшой код авторизации

Сделать это проще простого.
Во-первых, создадим форму для ввода логина и пароля:

<?php
<form_ action=«info.dom.ru/login/gateway» method=«post»>
<input_ name=«username» type=«text» value=«Логин»>
<input_ name=«password» type=«password» value=«Пароль»>
<input_ type=«submit» name=«submit» value=«Войти» />
</form_>
?>

Во-вторых, контролер и саму функцию для авторизации в домене. Но домен большой и пользователей много и если просто проверять пароль и логин, то к ограниченным частям сайта будут иметь все члены домена.

Для более тонкой настройки нужен еще один параметр для проверки — группа (Active Directory). Назовем ее, например Web_Group, и добавим нужных нам пользователей:

<?php
//Создаем контроллер
class login extends Controller {

//Функция для проверки логина, пароля и группы
function gateway() {

//Подключаем библиотеку
$this->load->library('Adldap');

//Проверяем логин и пароль
$authUser = $this->adldap->authenticate($this->input->post('username'), $this->input->post('password'));

//проверяем наличие пользователя в группе
$groupinfo = $this->adldap->user_ingroup($this->input->post('username'), 'Web_Group', 'NULL');

//В случае если $authUser и $groupinfo истина
if ($authUser === true and $groupinfo === true) {

//Осталось только добавить информацию в массив сессии о том, что проверка успешна и доступ к определенным ресурсам открыт
$data = array('username' => $this->input->post('username'), 'usergroup_access' => 'Web_Group', 'is_logged_in' => true);
$this->session->set_userdata($data);
redirect();
} else {
echo "Ошибка авторизации";
}
}
}
?>

Вот и все. Теперь в любой другой функции можно делать проверку и в зависимости от результата предоставлять или не предоставлять доступ.
Примерно это должно выглядеть так:

<?php
function view_data() {

//Вытаскиваем и проверяем прошел или нет пользователь авторизацию
if ($this->session->userdata('is_logged_in') == true) {

echo "Доступ к данным открыт";

} else {

echo "Доступ закрыт";
}
}
?>

Теперь осталось только дописать функцию уничтожения сессии (Logout):

<?php
function logout() {
$this->session->sess_destroy();
redirect();
}
?>

Настройка авторизации Cacti через LDAP в AD

В общем, документации по данному вопросу не шибко много, в интернете то же можно найти крохи информации, поэтому покажу настройки которые у меня заработали.

Первое, это путь к группе пользователи которой будут иметь доступ:

Group Distingished Name (DN) — CN=cacti,OU=ITDepartment,OU=ITDepartment,OU=Kyiv,OU=corp,DC=osticket,DC=org

далее

Group Member Attribute — member
Group Member Type — Distingished Name

Теперь переходим к настройке поиска. Исходная точка поиска у меня:

Search Base — OU=corp,DC=osticket,DC=org

и самое интересное это фильтр:

Search Filter — (&(objectclass=user)(objectcategory=user)(sAMAccountName=<username>))

Не про пользователя с именем которого мы будем подсоединяться к AD:

Search Distingished Name (DN) — osticket\user

и естественно его пароль

Postfix + проверка существования почтовых ящиков через Ldap

В папке /etc/postfix, создаем файлик ldap.cf содержащий:

server_host = 192.168.0.10
version = 3
server_port = 389
timeout = 60
search_base = dc=EDDNET, dc=ORG
query_filter = (&(proxyAddresses=smtp:%s)(|(objectClass=user)(objectClass=group)(objectClass=contact)(objectClass=publicFolder)))
leaf_result_attribute = mail
result_format = %s
result_attribute = cn
special_result_attribute =
scope = sub
bind = yes
bind_dn=user@osticket
bind_pw=******

Теперь немного подробнее о некоторых параметрах, server_host — имя или Ip адрес Ldap сервера, search_base — база где будет производиться поиск, bind_dn — имя пользователя имеющего доступ к базе, обязательно без зоны, то есть только чистое название домена после собаки, bind_pw — пароль пользователя.

В main.cf добавляем —

virtual_mailbox_maps = ldap:/etc/postfix/ldap.cf

PhP авторизация через LDAP

Возникла у меня необходимость в аутентификации через LDAP, да еще и в PhP реализации. Основными условиями было проверка логина и пароля пользователя, плюс он должен был быть в определенной группе в AD. Если оба условия выполняются, то дается доступ к определенному контенту. Вот к чему я пришел:

Continue reading

Active Directory аутентификация в Apache через Ldap

В принципе ничего сложного в этом нет, но все же есть кое какие нюансы. Покажу вам пример конфигурации в котором буду необходимые комментарии что бы понять что к чему. Права доступа я выставляю на папку /var/www/vhosts/weather.teaseo.ru/httpdocs/

SuexecUserGroup demo demo
ServerAdmin admin@localhost
DocumentRoot /var/www/vhosts/weather.teaseo.ru/httpdocs
ServerName weather.teaseo.ru
ScriptAlias /cgi-bin/ «/var/www/vhosts/weather.teaseo.ru/cgi-bin/»
DirectoryIndex index.php index.html index.shtml
ErrorLog /var/www/vhosts/weather.teaseo.ru/logs/error.log
CustomLog /var/www/vhosts/weather.teaseo.ru/logs/access.log common DirectoryIndex index.php index.htm index.html
Options +Indexes // распространяется на файлы в /var/www/vhosts/weather.teaseo.ru/httpdocs/ и все другие папки и файлы в этой директории
AllowOverride all
AuthName «Weather Access»
AuthType Basic
AuthBasicProvider ldap // Собственно включаем ldap аутентификацию
AuthzLDAPAuthoritative Off //означает, что впоследствии модуль может разрешать доступ даже в тех случаях, если LDAP отклоняет авторизацию
AuthLDAPUrl ldap://ip адрес AD сервера:порт(как пример 192.168.1.1:389)/ou=организейшен юнит,dc=домен(как пример demo),dc=домен(как пример ua)?sAMAccountName?sub?(objectClass=*) // Сдесь есть маленький нюанс, как видите путь начинается с организационного юнита и это не спроста, иначе работать ничего не хочет, причину к сожалению обнаружить не удалось
AuthLDAPBindDN demo@teaseo.ru // имя пользователя который имеет право смотреть в АД
AuthLDAPBindPassword «пароль» // Тут пароль на доступ в домен в кавычках обязательно
Require ldap-group cn=wm,ou=users_ITDepartment,ou=ITDepartment,ou=myou,dc=osticket,dc=org // Тут полный путь к группе в которую будут входить пользователи имеющие доступ