Zentyal и смена паролей пользователями

Хело, пипл!

Сие решение подойдет тем, кто использует Zentyal в качестве замены Active Directory, но большинство сотрудников используют свои ноуты для доступа к ресурсам…. и, они не могут просто так взять и сменить пароль, как это делают люди под ОС Windows, подключенные к домену.

Вариант решения

Реализовано будет с помощью https://ltb-project.org/documentation/self-service-password

Нужен любой сервер с пхп и следующими особенностями:

  • php-openssl
  • php-mbstring
  • php-curl
  • php-ldap
  • php-mcrypt

Поставить можно разными путями. Рекомендуемый — через репозитории.
Если у вас Debian/Ubuntu — то рекомендуемый способ установки:

# echo "deb [arch=amd64] https://ltb-project.org/debian/jessie jessie main" > /etc/apt/sources.list.d/ltb-project.list
# wget -O - https://ltb-project.org/wiki/lib/RPM-GPG-KEY-LTB-project | sudo apt-key add -
# apt-get update
# apt-get install self-service-password

после чего все необходимое у вас уже будет готово для использования с веб сервером Apache.

Однако, вы так же можете просто скачать deb файл, или же архив. Есть варианты для RHEL/CentOS.

Подробнее тут или на гитхабе.

Я использую nginx и php-fpm, и поэтому далее покажу изменения, которые мне пришлось сделать.

Nginx
root@zentyal:/# cat /etc/nginx/sites-enabled/passw.conf 
server {
    listen 80;

    root /usr/share/self-service-password;
    index index.php;

    server_name ssp.mydomain.ru;  #заменить домен на ваш
    
    sendfile off;

    gzip on;
    gzip_comp_level 6;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
    gzip_vary on;
    gzip_proxied any;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    location ~ \.php {
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    error_page 404 /404.html;
    location = /404.html {
        root /usr/share/nginx/html;
        internal;
    }

    location ~ /\. {
        log_not_found off; 
        deny all;
    }

    location ~ /scripts {
        log_not_found off; 
        deny all;
    }
}

В принципе, ничем не отличается от оригинала.

php-fpm
root@zentyal:/# cat /etc/php/7.0/fpm/pool.d/selfservicepassword.conf | grep -v ";"

[selfservicepassword]
user = www-data
group = www-data
listen = /run/php/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_value[session.save_path] = /tmp
php_admin_value[upload_max_filesize] = 10M
php_admin_value[post_max_size] = 16M
php_admin_value[max_execution_time] = 600
php_admin_value[request_terminate_timeout] = 600
php_admin_value[expose_php] = Off
php_admin_value[output_buffering] = 4096

Последний блок отличается от оригинала, тк у меня несколько php-fpm пулов. Если у вас пул один, то можно все положить в основной php.ini.

ldap

Так же пришлось внести корректив в конфиш ldap.conf:

root@zentyal:/# cat /etc/ldap/ldap.conf 

TLS_CACERT /etc/ssl/certs/ca-certificates.crt

TLS_REQCERT allow #Пришлось добавить это, иначе приложение не могло подключиться к DC.
SSP

Теперь сам конфиг ssp.

root@zentyal:/# cat /usr/share/self-service-password/conf/config.inc.php 
<?php
$debug = false;

$ldap_url = "ldaps://192.168.23.1"; #обязательно LDAPS! Иначе нет доступа.
$ldap_starttls = false;
$ldap_binddn = "CN=selfpass service,OU=System Users,DC=home,DC=local"; #пользователь с АДМИНИСТРАТИВНЫМИ правами. Иначе, по почте и через смс пароль не будет сбрасываться. 
$ldap_bindpw = "top_secret"; #пароль для этого самого пользователя
$ldap_base = "dc=home,dc=local"; #настраивается согласно вашему домену
$ldap_login_attribute = "sAMAccountName"; #атрибут с логином. Тут тоже можно использовать и любой другой, но ввести логин проще. 
$ldap_fullname_attribute = "cn"; #атрибут с полным именем
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";


$ad_mode = true;
$ad_options['force_unlock'] = false;
$ad_options['force_pwd_change'] = false;
$ad_options['change_expired_password'] = true;

$samba_mode = false;
$shadow_options['update_shadowLastChange'] = false;
$shadow_options['update_shadowExpire'] = false;
$shadow_options['shadow_expire_days'] = -1;

$hash = "auto";

$hash_options['crypt_salt_prefix'] = "$6$";
$hash_options['crypt_salt_length'] = "6";
$pwd_min_length = 0;
$pwd_max_length = 0;
$pwd_min_lower = 0;
$pwd_min_upper = 0;
$pwd_min_digit = 0;
$pwd_min_special = 0;
$pwd_special_chars = "^a-zA-Z0-9";
$pwd_no_reuse = true;
$pwd_diff_login = true;
$pwd_complexity = 0;
$use_pwnedpasswords = false;
$pwd_show_policy = "never";
$pwd_show_policy_pos = "above";

$who_change_password = "user";
$use_change = true;
$change_sshkey = false;
$change_sshkey_attribute = "sshPublicKey";
$who_change_sshkey = "user";
$notify_on_sshkey_change = false;
$use_questions = false;
$answer_objectClass = "extensibleObject";
$answer_attribute = "info";
$crypt_answers = true;
$use_tokens = true;
$crypt_tokens = true;
$token_lifetime = "3600";


$mail_attribute = "mail"; #указывается атрибут с почтовым адресом.
$mail_address_use_ldap = true;
$mail_from = "ssp@zentyal.home.com"; #тоже требует замены
$mail_from_name = "Self Service Password";
$mail_signature = "";
$notify_on_change = true;
$mail_sendmailpath = '/usr/sbin/sendmail';
$mail_protocol = 'smtp';
$mail_smtp_debug = 0;
$mail_debug_format = 'error_log';
$mail_smtp_host = 'localhost';
$mail_smtp_auth = false;
$mail_smtp_user = '';
$mail_smtp_pass = '';
$mail_smtp_port = 25;
$mail_smtp_timeout = 30;
$mail_smtp_keepalive = false;
$mail_smtp_secure = 'none';
$mail_smtp_autotls = false;
$mail_contenttype = 'text/plain';
$mail_wordwrap = 0;
$mail_charset = 'utf-8';
$mail_priority = 3;
$mail_newline = PHP_EOL;


$use_sms = false; #можно использовать и такой способ. Но, он денег стоит)
$sms_method = "mail";
$sms_api_lib = "lib/smsapi.inc.php";
$sms_attribute = "mobile";
$sms_partially_hide_number = true;
$smsmailto = "{sms_attribute}@service.provider.com";
$smsmail_subject = "Provider code";
$sms_message = "{smsresetmessage} {smstoken}";
$sms_sanitize_number = false;
$sms_truncate_number = false;
$sms_truncate_number_length = 10;
$sms_token_length = 6;
$max_attempts = 3;

$keyphrase = "SuperSecret"; #тоже надо менять на любую другую фразу из случайных символов.

$show_help = true;

$lang = "ru";
$allowed_lang = array();
$show_menu = true;
$login_forbidden_chars = "*()&|";

$use_recaptcha = false; #если сервис будет доступен в интернете, то рекомендуется включить капчу.
$recaptcha_publickey = "";
$recaptcha_privatekey = "";
$recaptcha_theme = "light";
$recaptcha_type = "image";
$recaptcha_size = "normal";
$recaptcha_request_method = null;

$default_action = "change";
if (file_exists (__DIR__ . '/config.inc.local.php')) {
    require __DIR__ . '/config.inc.local.php';
}
END

и вот вроде и все.
Перезапускаете php-fpm, nginx, настраиваете ваш ДНС — и оно заработает.

После всех изменений и настроек пароль можно будет менять в любом браузере!

Кстати, таким же недостатком (невозможностью сменить пароль пользователю) страдает и nethserver. Поэтому очень хорошо, что разработчик сразу создал пакеты и для centos 7.