
Восстановить доступ к 1С-Битрикс можно штатной формой, через другого администратора или локальным вызовом API. Выбор зависит от доступных каналов и причины отказа. Инструкция предназначена владельцу сайта и его уполномоченному администратору. Она не предполагает размещения публичного PHP-файла, создания скрытой учётной записи или изменения всех групп пользователя.
1. Установите причину отказа
Запишите точное сообщение формы входа, время, выбранный сайт и логин. Не путайте неправильный пароль с блокировкой учётной записи, требованием одноразового кода, неработающей почтой и отказом внешней авторизации. ID=1 часто встречается у первоначального администратора, но это не основание менять пароль именно ему: определять пользователя нужно по существующей учётной записи.
Проверьте, не включён ли вход через LDAP, SSO или иной внешний провайдер. Смена локального пароля не обязательно изменит пароль во внешней системе. Если сайт использует MFA, локальный пароль не отменяет второй фактор. Не отключайте защиту всей системы, пока не выяснили, какое звено не работает.
2. Начните со штатного восстановления
Используйте форму «Забыли пароль?» на вашем сайте или административной странице. Проверьте домен, HTTPS и адрес получателя. Если письмо не пришло, исследуйте почтовую очередь, журнал отправки и доставку, а также правильность адреса в учётной записи. Многократный запрос восстановления не исправляет ошибочную настройку SMTP.
При наличии второго персонального администратора восстановление можно выполнить в интерфейсе управления пользователями. Перед сохранением проверьте ID, логин, адрес, активность и группы; меняйте только согласованные поля. Передайте новый секрет через защищённый корпоративный канал, затем попросите владельца установить собственный пароль. Не отправляйте пароль вместе с логином в общедоступную заявку.
3. Подготовьте резервную копию и локальный доступ
Если штатные способы недоступны, потребуется доступ к серверу сайта и запуск PHP CLI с окружением, совместимым с установленной CMS. Сделайте резервную копию базы и файлов по действующей процедуре, убедитесь, что она пригодна для восстановления. Отдельно сохраните исходные сведения о пользователе без пароля и хеша: ID, логин, активность и группы.
php -v
php --ini
php -m
Версия PHP в консоли может отличаться от PHP-FPM. Проверьте необходимые расширения и доступ к базе, не выводя конфигурацию с секретами в публичный отчёт. Скрипт запускайте от согласованного служебного пользователя, которому достаточно доступа к файлам сайта и штатному окружению. Путь /srv/www/site/public далее условный: замените его фактическим document root.
Получите сведения о конкретном ID до изменения. В закрытом CLI-файле используйте bootstrap из следующего раздела, но вместо смены пароля выполните только чтение:
$id = (int)($argv[1] ?? 0);
$row = CUser::GetByID($id)->Fetch();
if (!$row) { fwrite(STDERR, "User not found\n"); exit(2); }
echo json_encode([
'ID' => (int)$row['ID'],
'LOGIN' => $row['LOGIN'],
'ACTIVE' => $row['ACTIVE'],
'EXTERNAL_AUTH_ID' => $row['EXTERNAL_AUTH_ID'],
'GROUPS' => array_map('intval', CUser::GetUserGroup($id)),
], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), "\n";
Этот фрагмент выполняется после загрузки CMS и только в том же CLI-контексте, а не как публичная страница. Ожидаются подтверждённый LOGIN, ACTIVE=Y и группа 1. EXTERNAL_AUTH_ID, отличный от пустого значения, требует восстановления у внешнего провайдера. ID=1 не выбирайте автоматически.
Для MySQL/MariaDB до изменения можно сделать согласованный экспорт базы следующей командой. В заранее созданном credential-файле права 0600, пароль в аргументах не передаётся. SITE_DB — условное имя базы.
umask 077
mysqldump --defaults-extra-file=/srv/site-maintenance/mysql-client.cnf \
--single-transaction --routines --triggers --events SITE_DB \
> /srv/site-maintenance/site-before-password.sql
sha256sum /srv/site-maintenance/site-before-password.sql
--defaults-extra-file ставится первым параметром. --single-transaction обеспечивает согласованный снимок транзакционных таблиц при соблюдении ограничений, но не заменяет согласованную процедуру для MyISAM и параллельных DDL. Пользователю backup нужны достаточные права; ошибку выгрузки нельзя считать успешным backup. Проверьте код завершения, размер и восстановление копии по процедуре компании. Формат параметров приведён в руководстве mysqldump.
4. Используйте API существующего пользователя
Создайте файл вне document root, например /srv/site-maintenance/reset-existing-user.php, с доступом только у оператора. Пример получает ID отдельным аргументом, а новый пароль — через стандартный ввод; пароль не попадает в список аргументов процесса. Скрипт проверяет CLI, существование пользователя, активность, локальный способ авторизации и группу администраторов. Он не создаёт пользователя и не меняет группы.
<?php
if (PHP_SAPI !== 'cli') { exit(1); }
$id = filter_var($argv[1] ?? '', FILTER_VALIDATE_INT);
if (!$id || $id < 1) { fwrite(STDERR, "Invalid ID\n"); exit(2); }
$_SERVER['DOCUMENT_ROOT'] = '/srv/www/site/public';
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
$user = CUser::GetByID($id)->Fetch();
if (!$user || $user['ACTIVE'] !== 'Y') {
fwrite(STDERR, "Missing or inactive user\n"); exit(3);
}
if (!empty($user['EXTERNAL_AUTH_ID'])) {
fwrite(STDERR, "External authentication: stop\n"); exit(4);
}
$before = array_map('intval', CUser::GetUserGroup($id));
if (!in_array(1, $before, true)) {
fwrite(STDERR, "Not an administrator\n"); exit(5);
}
$password = rtrim(stream_get_contents(STDIN), "\r\n");
if (strlen($password) < 16) {
fwrite(STDERR, "Use a long generated password\n"); exit(6);
}
$api = new CUser;
if (!$api->Update($id, [
'PASSWORD' => $password,
'CONFIRM_PASSWORD' => $password,
])) {
fwrite(STDERR, "Update rejected by API\n"); exit(7);
}
$after = array_map('intval', CUser::GetUserGroup($id));
sort($before); sort($after);
if ($before !== $after) {
fwrite(STDERR, "Unexpected group change: investigate\n"); exit(8);
}
fwrite(STDOUT, "Password updated; groups unchanged\n");
Поля и результат обновления описаны в документации CUser::Update. Требования установленной политики паролей и обработчики событий могут отклонить изменение; короткое сообщение выше намеренно не печатает внутренние данные. Полный текст ошибки исследуйте локально в защищённом сеансе, не публикуя его автоматически.
5. Проверьте скрипт и выполните один запуск
Сначала проверьте синтаксис: php -l не выполняет сам скрипт. Затем запустите его в приватной консоли Bash. В примере выбран ID 17; замените его подтверждённым ID. Введите секрет из корпоративного менеджера паролей. Перед запуском отключите трассировку команд.
php -l /srv/site-maintenance/reset-existing-user.php
set +x
IFS= read -r -s -p 'Новый пароль: ' new_password
printf '\n'
printf '%s' "$new_password" | php /srv/site-maintenance/reset-existing-user.php 17
result=$?
unset new_password
printf 'Код завершения: %s\n' "$result"
Код 0 подтверждает успешный ответ API и неизменность проверенного списка групп, но не успешный интерактивный вход. Любой другой код требует разбора; не повторяйте попытки вслепую. Переменная живёт только в текущей оболочке, однако безопасность оператора и хоста по-прежнему обязательна. Не включайте запись секретного ввода средствами терминала.

Установите закрытые права на инструмент и проверьте, что он расположен вне document root. Команда readlink должна вернуть согласованный каталог, а не ссылку внутрь публичного сайта:
readlink -f /srv/site-maintenance/reset-existing-user.php
chmod 600 /srv/site-maintenance/reset-existing-user.php
stat -c '%U %G %a %n' /srv/site-maintenance/reset-existing-user.php
0600 подходит, если файл принадлежит запускающему оператору; не меняйте владельца всего сайта ради чтения одного файла. При root-запуске помните, что bootstrap приложения исполняет его код с правами процесса — на скомпрометированном сайте сначала расследуйте инцидент и восстановите доверенный экземпляр.
6. Подтвердите вход и реальные права
В отдельном чистом окне браузера войдите под восстановленной учётной записью. Проверьте административный раздел, доступ к нужному сайту и наличие ожидаемых функций. Успешная смена пароля может не помочь при неправильном логине, другом домене, блокировке по IP или внешней авторизации.
Сверьте активность, группы, адрес восстановления и настройки MFA с исходной записью. Если вводится одноразовый код, используйте согласованный способ восстановления второго фактора; не выдавайте пароль за универсальный обход MFA. Оператору следует записать результат проверки без самого пароля, хеша, cookie и резервных кодов.
7. Обработайте прежние сессии и интеграции
Смена пароля и отзыв всех существующих сеансов — разные операции. Проверьте штатные средства управления сессиями, сохранёнными авторизациями и приложениями, доступные в вашей редакции и конфигурации. Не считайте, что все активные сеансы завершились только потому, что API вернул успех.
Если пароль использовался в интеграции, сначала выясните её назначение и владельца. Персональный администратор не должен служить общей сервисной учётной записью. Перевод интеграции на ограниченные права выполняется отдельным изменением с проверкой её работы; массовый отзыв всех ключей без инвентаризации может остановить обмен данными.
8. Разберите нестандартные ошибки
Ошибка подключения к базе часто означает другое окружение CLI, неправильный document root или недостаточный доступ к конфигурации. HTTP 403 в браузере может возникнуть до приложения: проверьте reverse proxy, WAF и IP-ограничения. Ошибка одноразового кода требует контроля времени и процедуры второго фактора.
Если после смены пароль отвергается, проверьте, что изменён тот же пользователь в той же базе. У нескольких сайтов или окружений могут быть одинаковые логины. Не исправляйте ситуацию прямым SQL с MD5: схема хранения пароля, дополнительные проверки и обработчики зависят от установленной версии. Операция через API сохраняет согласованность лучше, чем ручная подмена одного поля.
Разделите web-отказ и отказ приложения. С разрешённого операторского узла проверьте только HTTP-ответ административной формы:
curl --silent --show-error --output /dev/null \
--write-out '%{http_code} %{remote_ip}\n' https://site.example/bitrix/admin/
301/302 требует проверки конечного домена и HTTPS; 403 до формы — правил proxy/WAF/Apache; 502/504 — доступности upstream/FPM. Эта команда не проверяет пароль и не должна передавать его в URL. При HTTP 200 и неудачном входе сравните LOGIN/ID/EXTERNAL_AUTH_ID, MFA, часы сервера и журнал авторизации CMS. Проверьте FPM-журнал за время попытки через journalctl -u php8.3-fpm --since '10 minutes ago', заменив имя службы своей версией. Не выгружайте cookie, POST тела и внутреннюю конфигурацию в общедоступный отчёт.
9. Уберите инструмент восстановления
После подтверждения доступа удалите только созданный файл обслуживания либо перенесите его в закрытый утверждённый репозиторий с изменённым назначением. Проверьте, что он никогда не находился в публичном каталоге и не был доступен по HTTP. Не оставляйте endpoint «на всякий случай».
Если в старой инфраструктуре уже размещали файлы pass.php, reset.php или аналогичные, исследуйте их происхождение и журналы обращений. Не удаляйте неизвестный подозрительный файл до сохранения материалов, если есть признаки инцидента. Установка нового пароля без устранения канала повторного захвата не завершает восстановление.
10. Зафиксируйте результат и предотвращение повторения
Сохраните номер заявки, подтверждённый ID, причину отказа, выбранный способ, время и проверку входа. Укажите, где находится резервная копия и кто отвечает за MFA, почту восстановления и персональные администраторские учётные записи. Регулярно проверяйте возможность восстановить доступ без публичных скриптов.
Возврат прежнего пароля обычно невозможен без знания старого секрета и не нужен при подозрении на компрометацию. При ошибочном новом пароле выполните согласованную повторную установку нового секрета штатным способом. Восстановление всей базы из резервной копии — отдельная аварийная операция: оно откатывает другие данные сайта и не должно использоваться как обычная кнопка отмены смены пароля.
Связанные инструкции: защита администратора ID=1, проверка PHP-сайта на взлом.
Минимальная приёмка выполняется в двух отдельных сеансах: новый пароль открывает нужный административный раздел; неправильный пароль отвергается; второй фактор по-прежнему обязателен; перечень групп совпадает с исходным; старые способы доступа обработаны по отдельной процедуре. Для каждого пункта сохраните время и результат. Ответ API без этих тестов подтверждает только изменение записи, а не восстановленный безопасный доступ.
