Как определить, вошел ли пользователь в домен или локальный хост в скрипте оболочки Linux?

Вопрос или проблема

По умолчанию 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"

Пояснение к скрипту:

  1. Получение текущего пользователя: Используем команду whoami, чтобы получить имя текущего пользователя.

  2. Получение информации о пользователе: Команда getent passwd "$currentUser" позволяет получить полную информацию о пользователе, включая его местоположение в системе (локальное или доменное).

  3. Проверка доменной учетной записи: С помощью регулярного выражения проверяем, содержит ли имя пользователя разделитель \ или @, указывающий на домен.

  4. Обработка вывода: Если имя пользователя содержит доменные характеристики, мы извлекаем название домена. В противном случае сообщаем, что пользователь вошел в систему локально и выводим имя хоста.

  5. Отправка информации на удаленный сервер: Используется curl для отправки данных о пользователе и домене/хосте на удаленный сервер мониторинга с помощью POST-запроса.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...