Какой портал следует использовать для изменения паролей учетных записей Active Directory?

Здравствуйте! У меня есть контроллер домена AD с примерно 300 пользователями. Иногда пользователи хотят сменить свои доменные пароли и обращаются в Helpdesk с этой просьбой. У меня возникла идея создать портал, на котором они смогут изменять свои пароли. Я установил на виртуальную машину Debian пакет samba, winbind и nginx и добавил её в домен. Теперь я хочу реализовать функционал смены пароля через php-скрипт, который будет вызываться из портала. 

У меня есть два вопроса:

1) Возможно ли разработать такой скрипт? Я думал использовать команду smbpasswd, но не уверен, что можно обойтись без ввода пароля через терминал.
2) Насколько это решение будет безопасным и адекватным в контексте защиты данных пользователей?
  • 29 ноября 2024 г. 17:23
Ответы на вопрос 3
Создание портала для изменения паролей пользователей Active Directory через PHP-скрипт, использующий Samba, — это вполне выполнимая задача, но она требует аккуратного подхода для обеспечения безопасности.

### 1. Реализация PHP-скрипта для смены пароля

Да, вы можете написать PHP-скрипт для смены пароля. Однако использование `smbpasswd` требует, чтобы пользователь, который выполняет этот скрипт, имел права на изменение паролей в AD, и вам всё равно нужно будет аутентифицировать пользователя, который меняет пароль.

Вместо того чтобы использовать `smbpasswd`, вы можете использовать библиотеки, которые поддерживают LDAP, например, `php-ldap`. Через LDAP вы сможете выполнять операции изменения пароля:

```php
<?php
$ldap_host = "ldap://your-ldap-server";
$ldap_dn = "cn=admin,dc=example,dc=com";
$ldap_password = "admin_password";

$ldap_conn = ldap_connect($ldap_host);
ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3);

if ($ldap_conn) {
    if (ldap_bind($ldap_conn, $ldap_dn, $ldap_password)) {
        $user_dn = "cn=user_name,cn=users,dc=example,dc=com"; // DN пользователя
        $new_password = 'new_password';

        // Создаем массив для изменения пароля
        $entry = [];
        $entry['userPassword'] = $new_password;

        if (ldap_mod_replace($ldap_conn, $user_dn, $entry)) {
            echo "Пароль успешно изменен";
        } else {
            echo "Ошибка: " . ldap_error($ldap_conn);
        }
    } else {
        echo "Ошибка аутентификации: " . ldap_error($ldap_conn);
    }
}
ldap_close($ldap_conn);
?>
```

Не забудьте заменить значения переменных на свои собственные.

### 2. Безопасность решения

Обеспечение безопасности такого решения — критически важный аспект:

- **Аутентификация**: Убедитесь, что пользователи аутентифицируются перед тем, как они смогут изменять свои пароли. Используйте безопасные методы аутентификации, такие как OAuth, JWT или даже простую форму логина на HTTPS.

- **Шифрование**: Используйте HTTPS, чтобы предотвратить перехват данных, когда пользователи вводят свои текущие и новые пароли.

- **Требования к паролям**: Реализуйте политику сложных паролей, чтобы уменьшить вероятность того, что пользователи выбирают пароли, которые легко поддаются взлому.

- **Лимиты по количеству попыток**: Введите ограничения на количество попыток входа, чтобы предотвратить атаки методом подбора.

- **Логи и аудирование**: Логируйте все действия, связанные с изменениями пароля, и обеспечьте доступ к этим логам для последующего аудита.

Используя подход с LDAP и уделяя должное внимание вопросам безопасности, вы можете создать функциональный и безопасный портал для изменения паролей пользователей Active Directory.
Всё уже придумано за вас: 
https://self-service-password.readthedocs.io/en/stable/
Ctrl+Alt+Del => Изменить пароль 
Меняет пароль пользователя который сейчас залогинен и без разницы доменный он или локальный. Конечно же если в AD в учетке пользователя не стоит отметка "запретить пользователю менять пароль."
Похожие вопросы