Вопрос или проблема
По умолчанию Linux не поддерживает домены. Однако пользователь может присоединиться к домену с помощью приложений, таких как: Likewise, Winbind и так далее.
В рамках моего проекта все клиенты являются членами предприятий. Из-за проблем с безопасностью большинство Linux-хостов клиентов будут присоединены к домену.
К сожалению, клиент может войти в локальный хост, даже если Linux-хост был присоединен к домену. Например:
(1) На Linux-хосте есть две учетные записи:
доменная учетная запись: dev.com\john (домен developer.com)
локальная учетная запись: tom
(2) Клиент может свободно войти с доменной учетной записи (dev.com\john) или локальной учетной записи (tom).
Моя задача состоит в том, чтобы написать скрипт shell, который будет выполняться при входе пользователя. В скрипте необходимо проверить, вошел ли пользователь с доменной или локальной учетной записью.
Если пользователь вошел с доменной учетной записью, мне нужно получить имя домена; в противном случае необходимо получить имя хоста. Затем сообщить имя домена (или хоста) и имя пользователя на удаленный сервер мониторинга.
Я попробовал следующий код:
hostName=$(hostname)
hostFQDN=$(hostname -f)
if [ "$hostName" = "$hostFQDN" ]; then
# Пользователь не вошел в домен.
hostInfo="$hostName"
else
# Пользователь вошел в домен.
hostInfo=$(hostname -d)
fi
В приведенном выше коде я проверяю, равен ли FQDN хоста имени хоста или нет. Если да, я полагаю, что клиент вошел с доменной учетной записью; в противном случае — с локальной учетной записью.
К сожалению, это не всегда работает. Причина в том, что FQDN хоста не всегда равен имени хоста, если Linux-хост присоединен к домену, даже если клиент вошел с локальной учетной записью. Например:
(1) Linux-хост присоединен к домену “dev.com”;
(2) FQDN хоста всегда будет “yw-host.dev.com” (“yw-host” — это имя хоста), независимо от того, вошел ли клиент с доменной учетной записью или нет.
Кто-нибудь может предложить решение, пожалуйста? Поскольку мой клиент может присоединяться к домену с помощью нескольких доменных приложений (таких как: Likewise, Winbind и так далее), было бы лучше, если бы решение не зависело от специфического доменного приложения.
Большое спасибо.
Полные детали входа пользователя должны быть в вашем защищенном или аудиторском журнале в зависимости от того, какой дистрибутив вы используете.
Это простое быстрое решение — проверить, существуют ли они в /etc/passwd, но у вас могут возникнуть проблемы с дублирующимися именами пользователей.
Ответ или решение
Для определения, вошел ли пользователь в систему с доменной учетной записью или локальной, можно воспользоваться различными способами. Ваша ситуация требует проверки учетных записей как с использованием доменов, так и локальных учетных записей. Рассмотрим, как это можно сделать с помощью оболочки (shell script) в Linux.
Пример скрипта для проверки учетной записи
#!/bin/bash
# Получаем имя текущего пользователя
currentUser=$(whoami)
# Получаем информацию о пользователе
userInfo=$(getent passwd "$currentUser")
# Проверяем, существует ли пользователь
if [ -z "$userInfo" ]; then
echo "Пользователь $currentUser не найден."
exit 1
fi
# Получаем поле с учетными данными, которое содержит имя пользователя
IFS=':' read -r username password uid gid gecos home shell <<< "$userInfo"
# Проверяем, находимся ли мы в домене
domainInfo=$(echo $username | grep -E '\\|@')
if [ ! -z "$domainInfo" ]; then
# Пользователь залогинен через доменную учетную запись
# Извлекаем доменное имя
domainName=$(echo $username | sed 's/.*[\\@]\(.*\)/\1/')
echo "Пользователь $username вошел в систему через домен: $domainName"
else
# Пользователь залогинен через локальную учетную запись
hostName=$(hostname)
echo "Пользователь $username вошел в систему локально на хосте: $hostName"
fi
# Отправляем информацию на удаленный сервер мониторинга
remoteServer="monitor.example.com"
curl -X POST -d "username=$username" -d "host=$(hostname)" -d "domain=${domainName:-$hostName}" "$remoteServer/report"
Пояснение к скрипту:
-
Получение текущего пользователя: Используем команду
whoami
, чтобы получить имя текущего пользователя. -
Получение информации о пользователе: Команда
getent passwd "$currentUser"
позволяет получить полную информацию о пользователе, включая его местоположение в системе (локальное или доменное). -
Проверка доменной учетной записи: С помощью регулярного выражения проверяем, содержит ли имя пользователя разделитель
\
или@
, указывающий на домен. -
Обработка вывода: Если имя пользователя содержит доменные характеристики, мы извлекаем название домена. В противном случае сообщаем, что пользователь вошел в систему локально и выводим имя хоста.
-
Отправка информации на удаленный сервер: Используется
curl
для отправки данных о пользователе и домене/хосте на удаленный сервер мониторинга с помощью POST-запроса.
Заключение
Данный скрипт обеспечивает функциональность, необходимую для обнаружения способа входа пользователя в систему — через домен или локально. Он автоматически обрабатывает различные сценарии, связанные с доменной интеграцией и локальными учетными записями, что позволит вам отслеживать учетные записи с безопасность точки зрения. Всегда стоит тестировать скрипт в безопасной среде перед размещением на производственных серверах.