|
|
#!/usr/bin/bash
|
|
|
export LANG=C.UTF-8
|
|
|
|
|
|
f_version() {
|
|
|
echo -e '
|
|
|
Сценарий ввода РЕД ОС в домен Windows/SAMBA, FreeIPA
|
|
|
Версия: 0.6.7
|
|
|
Последнее обновление: 14.03.2024
|
|
|
|
|
|
(c) РЕД СОФТ
|
|
|
'
|
|
|
}
|
|
|
join_check=`/bin/mktemp /tmp/join_check.XXXXXX`
|
|
|
|
|
|
# Считываем входные параметры в переменные
|
|
|
while [ -n "$1" ]; do
|
|
|
case "$1" in
|
|
|
-d)
|
|
|
v_domain=$2 # Имя домена
|
|
|
;;
|
|
|
-n)
|
|
|
v_name_pc=$2 # Имя ПК
|
|
|
;;
|
|
|
-u)
|
|
|
v_admin=$2 # Имя администратора домена
|
|
|
;;
|
|
|
-p)
|
|
|
v_pass_admin=$2 # Пароль администратора домена
|
|
|
;;
|
|
|
--ou)
|
|
|
v_ou=$2 # Имя подразделения
|
|
|
;;
|
|
|
--dc)
|
|
|
v_kdc=$2 # Имя(FQDN) контроллера домена
|
|
|
;;
|
|
|
--wg)
|
|
|
wg=$2 # Имя домена (пред-Windows 2000)
|
|
|
;;
|
|
|
-w)
|
|
|
winbind=$@
|
|
|
;;
|
|
|
-y)
|
|
|
yes=$@ # Подтверждение
|
|
|
;;
|
|
|
-f|--force)
|
|
|
force=$@ # Ввод в домен под своим прежним именем ПК
|
|
|
;;
|
|
|
--delete-computer)
|
|
|
del_pc=$@
|
|
|
;;
|
|
|
--lower-case)
|
|
|
lower_case=$@ # Имя пользователя в нижнем регистре
|
|
|
;;
|
|
|
--save-case)
|
|
|
save_case=$@ # Имя пользователя с сохранением регистра, как в AD
|
|
|
;;
|
|
|
--rc)
|
|
|
remove_cache=$@ # Удалить кэш sssd
|
|
|
;;
|
|
|
--dns-auth-none)
|
|
|
dns_auth_none=$@ # Параметр определяет, что при динамической регистрации DNS адреса не требуется аутентификация на сервере.
|
|
|
;;
|
|
|
--sg)
|
|
|
sg_domain_admins_sudo=$2 # Предоставить права доменной группе пользователей использовать "sudo" для выполнения команд с привилегиями суперпользователя.
|
|
|
;;
|
|
|
--sk)
|
|
|
ssh_krb5=$@ # Включить на SSH-сервере поддержку аутентификации пользователей домена с использованием kerberos.
|
|
|
;;
|
|
|
-g|--gui)
|
|
|
gui=$@
|
|
|
;;
|
|
|
-h|--help)
|
|
|
help=$@
|
|
|
;;
|
|
|
-v|--version)
|
|
|
version=$@
|
|
|
;;
|
|
|
esac
|
|
|
shift
|
|
|
done
|
|
|
|
|
|
RED='\033[1;31m'
|
|
|
YEL='\033[1;33m'
|
|
|
BLU='\033[1;34m'
|
|
|
GREEN='\033[0;32m'
|
|
|
NC='\033[0m' # No Color
|
|
|
|
|
|
f_help() {
|
|
|
echo -e '
|
|
|
Скрипт позволяет ввести копмьютер в домен Windows(2008/2012/2016/2019/2022), SAMBA или домен IPA.
|
|
|
Скрипт необходимо запускать с правами пользователя root.
|
|
|
Параметры:
|
|
|
-d Имя домена
|
|
|
-n Имя компьютера
|
|
|
-u Имя администратора домена
|
|
|
-p Пароль администратора домена
|
|
|
--ou Имя подразделения компьютера (OU), формат ввода "OU=МоиПК,OU=ОтделIT". Порядок указания OU снизу вверх
|
|
|
--dc Имя контроллера домена
|
|
|
-w Позволяет ввести в домен, используя Winbind (по умолчанию применяется SSSD)
|
|
|
-y Автоматическое подтверждение запросов на выполнение действий при работе скрипта с параметрами
|
|
|
-f, --force Принудительный ввод в домен (вывод из домена) под своим прежним именем ПК
|
|
|
(игнорируется существующая учетная запись ПК в домене)
|
|
|
--lower-case Имя пользователя в нижнем регистре
|
|
|
--save-case Имя пользователя с сохранением регистра, как в AD
|
|
|
--rc Удалить кэш sssd
|
|
|
--dns-auth-none Параметр определяет, что при динамической регистрации DNS адреса не требуется аутентификация на сервере DNS
|
|
|
--wg Указать "Имя домена (пред-Windows 2000)", необязательный ключ
|
|
|
--sg Предоставить права доменной группе пользователей использовать "sudo" для выполнения команд с привилегиями суперпользователя.
|
|
|
--sk Включить на SSH-сервере поддержку аутентификации пользователей домена с использованием kerberos.
|
|
|
--delete-computer Удалить учётную запись ПК из домена (не выводит сам ПК из домена), см. пример №3
|
|
|
-g, --gui Запустить скрипт с графическим интерфейсом
|
|
|
-h, --help Показать справку
|
|
|
-v, --version Показать версию
|
|
|
|
|
|
Пример №1 - запуск с параметрами (для Windows/SAMBA):
|
|
|
join-to-domain.sh -d <domain_name> -n <pc_name> -u <admin_login> -p <password> -y
|
|
|
join-to-domain.sh -d <domain_name> -n <pc_name> -u <admin_login> --dc <domain_controller> -y
|
|
|
|
|
|
Пример №2 - ввод в домен с добавлением ПК в OU:
|
|
|
join-to-domain.sh -d <domain_name> -n <pc_name> -u <admin_login> -p <password> --ou "OU=МоиПК,OU=ОтделIT" -y
|
|
|
|
|
|
Пример №3 - ввод в домен и предоставление прав доменной группе пользователей использовать "sudo":
|
|
|
join-to-domain.sh -d <domain_name> -n <pc_name> -u <admin_login> -p <password> --sg "Администраторы домена" -y
|
|
|
|
|
|
Пример №4 - удаление учетной записи ПК с подключением к определенному контроллеру:
|
|
|
join-to-domain.sh --delete-computer -u <admin_login> -d <domain_name> --dc <domain_controller> -n <pc_name>
|
|
|
|
|
|
Журнал событий: /var/log/join-to-domain.log
|
|
|
|
|
|
'
|
|
|
}
|
|
|
|
|
|
if [ -n "$help" ]
|
|
|
then f_help
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
if [ -n "$version" ]
|
|
|
then f_version
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
# Проверка запуска скрипта от root
|
|
|
if [ "$(id -u)" != "0" ]; then
|
|
|
echo
|
|
|
echo -e " Ввод компьютера в домен Windows (2008/2012/2016/2019/2022), SAMBA и домен IPA
|
|
|
Запустите скрипт с правами пользователя root."
|
|
|
echo
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
# Удаление кэша sssd
|
|
|
if [ -n "$remove_cache" ]; then
|
|
|
echo " Удаление кэша sssd ..."
|
|
|
systemctl stop sssd ; rm -rf /var/lib/sss/{db,mc}/* ; systemctl start sssd
|
|
|
rm -rf /tmp/krb5cc_*
|
|
|
echo " Выполнено! Завершите сеанс текущего доменного пользователя."
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
|
|
|
v_admin=${v_admin%%@*} # обрезаем все, что идет после @
|
|
|
|
|
|
# Если ключ --delete-computer, то удаляем УЗ ПК из домена
|
|
|
if [ -n "$del_pc" ]
|
|
|
then
|
|
|
if [[ -z "$v_admin" ]]
|
|
|
then echo -e " ${RED}Ошибка. Введите имя администратора домена. Используйте параметр -u${NC}"
|
|
|
exit 1;
|
|
|
elif [[ -z "$v_name_pc" ]]
|
|
|
then echo -e " ${RED}Ошибка. Введите имя ПК. Используйте параметр -n${NC}"
|
|
|
exit 1;
|
|
|
elif [[ -z "$v_domain" ]]
|
|
|
then echo -e " ${RED}Ошибка. Введите имя домена. Используйте параметр -d${NC}"
|
|
|
exit 1;
|
|
|
fi
|
|
|
echo -e "" &>> /var/log/join-to-domain.log
|
|
|
echo -e 'Deleting a PC account' &>> /var/log/join-to-domain.log
|
|
|
if [ -n "$v_kdc" ]
|
|
|
then
|
|
|
adcli delete-computer -U $v_admin -S $v_kdc --domain=$v_domain $v_name_pc
|
|
|
echo -e 'End Deleting PC' &>> /var/log/join-to-domain.log
|
|
|
echo -e "" &>> /var/log/join-to-domain.log
|
|
|
else
|
|
|
adcli delete-computer -U $v_admin --domain=$v_domain $v_name_pc
|
|
|
echo -e 'End Deleting PC' &>> /var/log/join-to-domain.log
|
|
|
echo -e "" &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
v_date_time=$(date '+%d-%m-%y_%H:%M:%S')
|
|
|
echo -e "\n * * * * * * * * * * *\n Время запуска скрипта: $v_date_time" &>> /var/log/join-to-domain.log
|
|
|
f_version &>> /var/log/join-to-domain.log
|
|
|
uname -a &>> /var/log/join-to-domain.log
|
|
|
lsb_release -a &>> /var/log/join-to-domain.log
|
|
|
echo " " &>> /var/log/join-to-domain.log
|
|
|
|
|
|
if [ -n "$gui" ]; then
|
|
|
if [ ! -f /usr/bin/yad ]; then
|
|
|
zenity --error --text "Для работы приложения в графическом режиме\nтребуется YAD(display GTK+ dialogs in shell scripts).\nУстановка:\ndnf install yad" --no-wrap &> /dev/null
|
|
|
exit
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
|
|
|
# Функция вызова вопроса о продолжении выполнения сценария
|
|
|
myAsk() {
|
|
|
local prompt=" Продолжить выполнение (y/n)? "
|
|
|
if [ -n "$gui" ] || [ -n "$yes" ]; then
|
|
|
return 0
|
|
|
fi
|
|
|
|
|
|
while true; do
|
|
|
read -p "$prompt" answer
|
|
|
case "$answer" in
|
|
|
[Yy]* )
|
|
|
return 0
|
|
|
;;
|
|
|
[Nn]* )
|
|
|
exit
|
|
|
;;
|
|
|
* )
|
|
|
echo " Ответьте yes или no"
|
|
|
;;
|
|
|
esac
|
|
|
done
|
|
|
}
|
|
|
|
|
|
# Синхронизация времени с контроллером домена
|
|
|
chrony_conf()
|
|
|
{
|
|
|
systemctl is-active --quiet systemd-timesyncd && systemctl disable systemd-timesyncd --now &> /dev/null
|
|
|
v_date_time=$(date '+%d-%m-%y_%H-%M-%S')
|
|
|
cp /etc/chrony.conf /etc/chrony.conf.$v_date_time
|
|
|
sed -i '/server/d' /etc/chrony.conf
|
|
|
sed -i '/pool/d' /etc/chrony.conf
|
|
|
sed -i '/maxdistance/d' /etc/chrony.conf
|
|
|
echo 'pool '$v_domain' iburst prefer' >> /etc/chrony.conf
|
|
|
#echo 'server '$dc' iburst' >> /etc/chrony.conf
|
|
|
#echo 'maxdistance 16.0' >> /etc/chrony.conf
|
|
|
systemctl restart chronyd
|
|
|
}
|
|
|
|
|
|
f_choce_pill() {
|
|
|
while true; do
|
|
|
# Если запущено с gui, то не спрашивать...выполнить break
|
|
|
if [ -n "$gui" ]; then
|
|
|
break
|
|
|
fi
|
|
|
if [ -n "$yes" ]; then
|
|
|
choce_domain=1
|
|
|
break
|
|
|
fi
|
|
|
echo -e "\n Выберите тип домена:"
|
|
|
echo " 1. Ввод компьютера в домен Windows/SAMBA"
|
|
|
echo " 2. Ввод компьютера в домен IPA"
|
|
|
read -p " Укажите (1 или 2): " choce_domain
|
|
|
case $choce_domain in
|
|
|
[1]* ) return $choce_domain; break;;
|
|
|
[2]* ) return $choce_domain; break;;
|
|
|
[Nn]* ) exit;;
|
|
|
* )
|
|
|
printf "%s\n" "Ошибка: введено некорректное значение."
|
|
|
continue;;
|
|
|
esac
|
|
|
done
|
|
|
}
|
|
|
|
|
|
|
|
|
# Проверка доступности домена
|
|
|
f_realm_discover()
|
|
|
{
|
|
|
realm discover $v_domain &> /dev/null
|
|
|
if [ $? -ne 0 ]; then
|
|
|
echo -e ${RED}'\n Домен '${NC}${GREEN}$v_domain${NC}${RED}' недоступен! Проверьте настройки сети.'${NC}
|
|
|
echo -e ' Домен '$v_domain' недоступен! Проверьте настройки сети.' &>> /var/log/join-to-domain.log
|
|
|
exit 1
|
|
|
else
|
|
|
echo -e ' Домен '${GREEN}$v_domain${NC}' доступен!'
|
|
|
echo -e ' Домен '$v_domain' доступен!' &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
# Функция проверки имени ПК
|
|
|
checkname()
|
|
|
{
|
|
|
if [[ $(grep -P '(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,14}[a-zA-Z0-9\-])+[a-zA-Z0-9])$)' <<< $v_name_pc) && ${#v_name_pc} -le 15 ]]
|
|
|
then
|
|
|
check_name="true"
|
|
|
fi
|
|
|
if [ "$v_name_pc" != "$1" ] && [ "$check_name" = "true" ];
|
|
|
then true
|
|
|
else echo -e "\n ${RED}Ошибка! Недопустимое имя ПК!${NC}"
|
|
|
echo -e " Разрешены символы латинского алфавита(A-Z,a-z), цифры(0-9) и дефис(-). Имя не должно превышать более 15 символов."
|
|
|
echo -e " Ошибка! Недопустимое имя ПК!" &>> /var/log/join-to-domain.log
|
|
|
exit 1
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
# Функция проверки прохождения аутентификации и существования ПК в домене
|
|
|
check_domain_name()
|
|
|
{
|
|
|
#$1 - v_admin
|
|
|
#$2 - v_domain
|
|
|
#$3 - v_name_pc
|
|
|
#$4 - v_pass_admin
|
|
|
rm -f $join_check
|
|
|
check=$(adcli show-computer -U $1 --domain=$2 $3 --stdin-password <<< $4 &> $join_check)
|
|
|
v_check=$(cat $join_check)
|
|
|
echo " Проверка аутентификации в домене:" &>> /var/log/join-to-domain.log
|
|
|
cat $join_check &>> /var/log/join-to-domain.log
|
|
|
if grep -Pq "sAMAccountName" <<< "$v_check";
|
|
|
then
|
|
|
if [[ -n "$force" ]]; then
|
|
|
echo -e ${YEL}"\n В домене уже существует компьютер "${NC}${GREEN}$3${NC}
|
|
|
echo -e " Предупреждение! В домене уже существует компьютер "$3 &>> /var/log/join-to-domain.log
|
|
|
if [[ -n "$v_ou" ]]; then
|
|
|
unset v_ou
|
|
|
fi
|
|
|
elif [[ -n "$v_pass_admin_gui" ]]; then
|
|
|
zenity --warning --text 'В домене уже существует компьютер '$v_name_pc' \nудалите данную учетную запись компьютера в домене или укажите иное имя ПК.' \
|
|
|
--no-wrap &> /dev/null
|
|
|
echo -e " Ошибка! В домене уже существует компьютер "$v_name_pc &>> /var/log/join-to-domain.log
|
|
|
#f_create_form &> /dev/null
|
|
|
else
|
|
|
echo -e ${RED}"\n В домене уже существует компьютер "${NC}${GREEN}$3${NC}
|
|
|
echo -e " Ошибка! В домене уже существует компьютер "$3 &>> /var/log/join-to-domain.log
|
|
|
echo -e ${RED}" Удалите данную учетную запись компьютера в домене или укажите иное имя ПК."${NC}
|
|
|
echo -e " Удалите данную учетную запись компьютера в домене или укажите иное имя ПК." &>> /var/log/join-to-domain.log
|
|
|
echo
|
|
|
exit 1;
|
|
|
fi
|
|
|
fi
|
|
|
if grep -Pq "Couldn't authenticate" <<< "$v_check";
|
|
|
then
|
|
|
if [[ -n "$v_pass_admin_gui" ]];
|
|
|
then
|
|
|
zenity --warning --text 'Неверное имя администратора домена или пароль!' --no-wrap &> /dev/null
|
|
|
echo -e " Ошибка! Неверное имя администратора домена или пароль! " &>> /var/log/join-to-domain.log
|
|
|
#f_create_form &> /dev/null
|
|
|
else
|
|
|
echo -e ${RED}"\n Неверное имя администратора домена или пароль! "${NC}
|
|
|
echo -e " Ошибка! Неверное имя администратора домена или пароль! " &>> /var/log/join-to-domain.log
|
|
|
echo
|
|
|
exit 1;
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
# Настройка /etc/security/pam_winbind.conf
|
|
|
settings_pam_winbind()
|
|
|
{
|
|
|
sed -i -e 's\;cached_login\cached_login\g' /etc/security/pam_winbind.conf &>> /var/log/join-to-domain.log
|
|
|
sed -i -e '/^cached_login/s/no/yes/g' /etc/security/pam_winbind.conf &>> /var/log/join-to-domain.log
|
|
|
sed -i -e 's\;krb5_ccache_type =\krb5_ccache_type = FILE\g' /etc/security/pam_winbind.conf &>> /var/log/join-to-domain.log
|
|
|
sed -i -e 's\;warn_pwd_expire\warn_pwd_expire\g' /etc/security/pam_winbind.conf &>> /var/log/join-to-domain.log
|
|
|
sed -i -e 's\;krb5_auth\krb5_auth\g' /etc/security/pam_winbind.conf &>> /var/log/join-to-domain.log
|
|
|
sed -i -e '/^krb5_auth/s/no/yes/g' /etc/security/pam_winbind.conf &>> /var/log/join-to-domain.log
|
|
|
}
|
|
|
|
|
|
f_create_form_choce_pill () {
|
|
|
data=( $(zenity --list --radiolist --title="Ввод в домен" \
|
|
|
--text="Выберите в какой домен добавить ПК" \
|
|
|
--column="" \
|
|
|
--column="Домен" TRUE "Домен Windows/Samba" FALSE "Домен IPA" ))
|
|
|
|
|
|
# Если zenity NO, то выход из скрипта
|
|
|
if [ $? -eq 1 ]; then
|
|
|
exit
|
|
|
fi
|
|
|
v_0=${data[0]}
|
|
|
v_1=${data[1]}
|
|
|
|
|
|
# Если samba
|
|
|
if [ "$v_1" = "Windows/Samba" ]; then
|
|
|
select_pill='SAMBA'
|
|
|
fi
|
|
|
# Если IPA
|
|
|
if [ "$v_1" = "IPA" ]; then
|
|
|
select_pill='IPA'
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
# Функция создания формы ввода в домен IPA
|
|
|
f_create_form_IPA () {
|
|
|
data_ipa=( $(zenity --forms --separator=" " \
|
|
|
--title="Ввод в домен FreeIPA" \
|
|
|
--text="Ввод компьютера в домен IPA" \
|
|
|
--add-entry="Имя домена:" \
|
|
|
--add-entry="Имя компьютера:" \
|
|
|
--add-entry="Имя администратора домена:" \
|
|
|
--add-password="Пароль администратора:" \
|
|
|
--ok-label="Да" \
|
|
|
--cancel-label="Отмена") )
|
|
|
|
|
|
# Если zenity NO, то выход из скрипта
|
|
|
if [ $? -eq 1 ]; then
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
v_domain=${data_ipa[0]}
|
|
|
v_name_pc=${data_ipa[1]}
|
|
|
v_admin_ipa=${data_ipa[2]}
|
|
|
v_pass_admin_ipa=${data_ipa[3]}
|
|
|
|
|
|
# Проверка доступности домена
|
|
|
realm discover $v_domain &> /dev/null
|
|
|
if [ $? -ne 0 ];
|
|
|
then zenity --warning --text 'Домен '$v_domain' недоступен! Проверьте настройки сети.' --no-wrap &> /dev/null
|
|
|
f_create_form_IPA &> /dev/null
|
|
|
fi
|
|
|
|
|
|
# Проверка имени компьютера
|
|
|
if [[ $(grep -P '(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,14}[a-zA-Z0-9\-])+[a-zA-Z0-9])$)' <<< $v_name_pc) && ${#v_name_pc} -le 15 ]]
|
|
|
then
|
|
|
echo " Имя ПК: $v_name_pc"
|
|
|
else
|
|
|
zenity --warning --text "Ошибка! Недопустимое имя ПК!" --no-wrap &> /dev/null
|
|
|
f_create_form_IPA &> /dev/null
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
|
|
|
# Функция создания файла krb5.conf, определение имени домена и контроллера
|
|
|
f_create_krb5()
|
|
|
{
|
|
|
|
|
|
dc=$(adcli info $v_domain|grep "domain-controller ="| awk '{print $3}')
|
|
|
# Короткое имя домена
|
|
|
v_short_domen=$(cut -d'.' -f2 <<< "$dc")
|
|
|
v_short_dc=$(cut -d'.' -f1 <<< "$dc") # Короткое имя контроллера домена
|
|
|
# Короткое имя домена в верхнем регистре
|
|
|
#v_BIG_SHORT_DOMEN=$(tr [:lower:] [:upper:] <<< "$v_short_domen")
|
|
|
v_BIG_SHORT_DOMEN=$(adcli info "$v_domain" | awk -F ' = ' '/domain-short/ {print $2}')
|
|
|
# Полное имя домена в верхнем регистре
|
|
|
#v_BIG_DOMAIN=$(tr [:lower:] [:upper:] <<< "$v_domain")
|
|
|
v_BIG_DOMAIN=${v_domain^^}
|
|
|
domainname=$(domainname -d)
|
|
|
cp /etc/krb5.conf /etc/krb5.conf.$v_date_time
|
|
|
echo -e ' ' >> /var/log/join-to-domain.log
|
|
|
echo -e 'Информация о домене:' >> /var/log/join-to-domain.log
|
|
|
adcli info $v_domain &>> /var/log/join-to-domain.log
|
|
|
echo -e ' ' >> /var/log/join-to-domain.log
|
|
|
|
|
|
if [[ -z "$v_kdc" ]]; then
|
|
|
str_pdc=" pdc " # Основной DC
|
|
|
str_closest=" closest " # Ближайший DC
|
|
|
str_writable=" writable "
|
|
|
string=$(adcli info $v_domain | grep "domain-controllers =" | sed s'/domain-controllers =//g')
|
|
|
IFS=' ' read -r -a array <<< "$string"
|
|
|
for i in "${array[@]}"
|
|
|
do
|
|
|
full_str=$(adcli info --domain-controller=$i | grep "domain-controller-flags =")
|
|
|
if [[ "$full_str" == *"$str_pdc"* ]]; then
|
|
|
krb5_kdc1="kdc = $i"
|
|
|
kdc1=$i
|
|
|
fi
|
|
|
if [[ "$full_str" == *"$str_closest"* ]] && [[ "$full_str" != *"$str_pdc"* ]]; then
|
|
|
krb5_kdc2="kdc = $i"
|
|
|
kdc2=", $i, _srv_"
|
|
|
fi
|
|
|
done
|
|
|
else
|
|
|
kdc1=$v_kdc
|
|
|
krb5_kdc1="kdc = $v_kdc"
|
|
|
fi
|
|
|
|
|
|
# Добавление поддержки rc4-hmac
|
|
|
echo -e '[libdefaults]
|
|
|
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 RC4-HMAC DES-CBC-CRC DES3-CBC-SHA1 DES-CBC-MD5
|
|
|
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 RC4-HMAC DES-CBC-CRC DES3-CBC-SHA1 DES-CBC-MD5
|
|
|
preferred_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 RC4-HMAC DES-CBC-CRC DES3-CBC-SHA1 DES-CBC-MD5
|
|
|
' > /etc/krb5.conf.d/crypto-policies
|
|
|
|
|
|
echo -e 'includedir /etc/krb5.conf.d/
|
|
|
|
|
|
[logging]
|
|
|
default = FILE:/var/log/krb5libs.log
|
|
|
kdc = FILE:/var/log/krb5kdc.log
|
|
|
admin_server = FILE:/var/log/kadmind.log
|
|
|
|
|
|
[libdefaults]
|
|
|
default_realm = '$v_BIG_DOMAIN'
|
|
|
# Отключить поиск kerberos-имени домена через DNS
|
|
|
dns_lookup_realm = false
|
|
|
# Включить поиск kerberos-настроек домена через DNS
|
|
|
dns_lookup_kdc = true
|
|
|
ticket_lifetime = 24h
|
|
|
renew_lifetime = 7d
|
|
|
forwardable = true
|
|
|
rdns = false
|
|
|
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
|
|
|
spake_preauth_groups = edwards25519
|
|
|
# Файл кэша билетов (credential cache) для системы Kerberos
|
|
|
default_ccache_name = FILE:/tmp/krb5cc_%{uid}
|
|
|
|
|
|
|
|
|
# Список предпочтительных методов шифрования (encryption types), которые будут использоваться для билетов, запрашиваемых у Ticket Granting Server (TGS).
|
|
|
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 RC4-HMAC DES-CBC-CRC DES3-CBC-SHA1 DES-CBC-MD5
|
|
|
# Список предпочтительных методов шифрования для TGT (Ticket Granting Ticket), который получается при аутентификации.
|
|
|
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 RC4-HMAC DES-CBC-CRC DES3-CBC-SHA1 DES-CBC-MD5
|
|
|
# Список предпочтительных методов шифрования, которые система Kerberos будет предпочитать при установке защищенных соединений и при обмене билетами.
|
|
|
preferred_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 RC4-HMAC DES-CBC-CRC DES3-CBC-SHA1 DES-CBC-MD5
|
|
|
|
|
|
[realms]
|
|
|
'$v_BIG_DOMAIN' = {
|
|
|
# Key Distribution Center (KDC)
|
|
|
'$krb5_kdc1'
|
|
|
'$krb5_kdc2'
|
|
|
# Сервер администрирования. Обычно это главный сервер Kerberos.
|
|
|
admin_server = '$kdc1'
|
|
|
# Имя домена
|
|
|
default_domain = '$v_domain'
|
|
|
}
|
|
|
|
|
|
[domain_realm]
|
|
|
.'$v_domain' = '$v_BIG_DOMAIN'
|
|
|
'$v_domain' = '$v_BIG_DOMAIN'
|
|
|
' > /etc/krb5.conf
|
|
|
|
|
|
}
|
|
|
|
|
|
# Основная форма окна на PyQt
|
|
|
f_create_form_qt () {
|
|
|
result=$(python3 /usr/share/join-to-domain/form-join-to-domain.py)
|
|
|
# Разбиение строки на переменные
|
|
|
IFS=',' read -ra values <<< "$result"
|
|
|
v_domain=${values[0]}
|
|
|
v_name_pc=${values[1]}
|
|
|
v_admin=${values[2]}
|
|
|
v_pass_admin_gui=${values[3]}
|
|
|
# Дополнительные параметры для sssd.conf
|
|
|
param1=${values[4]}
|
|
|
param2=${values[5]}
|
|
|
param3=${values[6]}
|
|
|
}
|
|
|
|
|
|
# Функция создания формы ввода в домен Windows/Samba
|
|
|
f_create_form () {
|
|
|
v_domain=`cat /etc/resolv.conf |grep -i '^search'|head -n1|cut -d ' ' -f2`
|
|
|
if [[ -z $v_name_pc ]]; then
|
|
|
if [[ `hostname -s` = "localhost" ]]; then
|
|
|
v_name_pc=" "
|
|
|
else v_name_pc=`hostname -s`
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
data=( $(yad --on-top --width=420 --title="Ввод в домен" --text="<b>Ввод компьютера в домен:</b>" \
|
|
|
--form --separator=" " --item-separator="," \
|
|
|
--field="Имя домена:" "$v_domain" \
|
|
|
--field="Имя компьютера:" "$v_name_pc" \
|
|
|
--field="Имя администратора:" "$v_admin" \
|
|
|
--field="Пароль администратора:":H "$v_pass_admin_gui" \
|
|
|
--button="Отмена:1" --button="ОК:0"
|
|
|
) )
|
|
|
exit_code=$?
|
|
|
# Выход
|
|
|
if [[ $exit_code -eq 1 ]]; then
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
v_domain=${data[0]}
|
|
|
v_name_pc=${data[1]}
|
|
|
v_admin=${data[2]%%@*} # обрезаем все, что идет после @
|
|
|
v_pass_admin_gui=${data[3]}
|
|
|
|
|
|
# Проверка полей
|
|
|
if [[ -z "$v_name_pc" || -z "$v_admin" || -z "$v_pass_admin_gui" || -z "$v_domain" ]]; then
|
|
|
zenity --warning --text "Заполните все поля формы ввода в домен." --no-wrap &> /dev/null
|
|
|
f_create_form &> /dev/null
|
|
|
fi
|
|
|
|
|
|
|
|
|
# Проверка имени компьютера
|
|
|
if [[ $(grep -P '(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,14}[a-zA-Z0-9\-])+[a-zA-Z0-9])$)' <<< $v_name_pc) && ${#v_name_pc} -le 15 ]]
|
|
|
then
|
|
|
echo " Имя ПК: $v_name_pc"
|
|
|
else
|
|
|
zenity --warning --text " Ошибка! Недопустимое имя ПК! \n Разрешены символы латинского алфавита(A-Z,a-z), цифры(0-9) и дефис(-).\n Имя не должно превышать более 15 символов." --no-wrap
|
|
|
echo " Ошибка! Недопустимое имя ПК!" &>> /var/log/join-to-domain.log
|
|
|
f_create_form &> /dev/null
|
|
|
fi
|
|
|
echo " Имя ПК: $v_name_pc"
|
|
|
|
|
|
# Проверка доступности домена
|
|
|
realm discover $v_domain &> /dev/null
|
|
|
if [ $? -ne 0 ];
|
|
|
then zenity --warning --text "Домен $v_domain недоступен! Проверьте настройки сети." --no-wrap &> /dev/null
|
|
|
f_create_form &> /dev/null
|
|
|
fi
|
|
|
|
|
|
# Вызов функции формирования krb5.conf
|
|
|
f_create_krb5
|
|
|
|
|
|
if [ "$v_name_pc" != "$v_short_dc" ];
|
|
|
then
|
|
|
echo " Имя ПК: $v_name_pc"
|
|
|
else
|
|
|
zenity --warning --text "Ошибка! Имя ПК '$v_name_pc' не должно совпадать с именем контроллера домена!" --no-wrap &> /dev/null
|
|
|
echo -e " Ошибка! Имя ПК ('$v_name_pc') не должно совпадать с именем контроллера домена!" &>> /var/log/join-to-domain.log
|
|
|
f_create_form &> /dev/null
|
|
|
fi
|
|
|
|
|
|
# ----- Проверка существования ПК в домене и проверка аутентификации -----
|
|
|
check_domain_name $v_admin $v_domain $v_name_pc $v_pass_admin_gui
|
|
|
}
|
|
|
|
|
|
|
|
|
f_msg_exit_domian()
|
|
|
{
|
|
|
if [ -n "$gui" ]; then
|
|
|
zenity --info --title="Вывод из домена" --text="Компьютер выведен из домена! \nПерезагрузите ПК!" --no-wrap &> /dev/null
|
|
|
fi
|
|
|
exit;
|
|
|
}
|
|
|
|
|
|
# Down the Rabbit Hole
|
|
|
f_join_free_ipa()
|
|
|
{
|
|
|
dc=$(adcli info $v_domain|grep "domain-controller ="| awk '{print $3}')
|
|
|
chrony_conf # настройка chrony
|
|
|
hostname_ipa=$v_name_pc.$v_domain
|
|
|
hostnamectl set-hostname $hostname_ipa
|
|
|
ipa-client-install --mkhomedir --enable-dns-updates --domain=$v_domain --hostname $hostname_ipa --ntp-server=$dc -p $v_admin_ipa -w $v_pass_admin_ipa -U | tee -a /var/log/join-to-domain.log
|
|
|
sed -i 's;default_ccache_name = KEYRING:persistent:%{uid};default_ccache_name = FILE:/tmp/krb5cc_%{uid};g' /etc/krb5.conf
|
|
|
}
|
|
|
|
|
|
|
|
|
# Функция вывода из домена
|
|
|
freedom()
|
|
|
{
|
|
|
find_ipa=$(realm list | grep server-software | awk '{ print $NF }')
|
|
|
if [ "$find_ipa" = "ipa" ]
|
|
|
then
|
|
|
echo ' Компьютер введен в домен '`domainname -d`.' Вывести компьютер из домена?' | tee -a /var/log/join-to-domain.log
|
|
|
myAsk
|
|
|
ipa-client-install --uninstall -U | tee -a /var/log/join-to-domain.log
|
|
|
successful_out_ipa=$(tail -n1 /var/log/ipaclient-uninstall.log | awk '{ print $NF }')
|
|
|
successful_out_ipa2=$(grep 'Client uninstall complete' /var/log/ipaclient-uninstall.log | awk '{ print $NF }')
|
|
|
if [[ "$successful_out_ipa" = "successful" || "$successful_out_ipa2" = "complete." ]]
|
|
|
then
|
|
|
echo ' Компьютер выведен из домена IPA. Перезагрузите ОС!' | tee -a /var/log/join-to-domain.log
|
|
|
f_msg_exit_domian
|
|
|
else
|
|
|
echo "Ошибка вывода из домена IPA, см. /var/log/ipaclient-uninstall.log" | tee -a /var/log/join-to-domain.log
|
|
|
if [ -n "$gui" ]
|
|
|
then
|
|
|
zenity --error \
|
|
|
--title="Вывод из домена IPA" \
|
|
|
--text="Ошибка вывода из домена IPA, см. /var/log/ipaclient-uninstall.log" \
|
|
|
--no-wrap &> /dev/null
|
|
|
fi
|
|
|
exit;
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo ' Компьютер введен в домен '`domainname -d`.' Вывести компьютер из домена?' | tee -a /var/log/join-to-domain.log
|
|
|
if [[ -n "$force" ]]; then
|
|
|
echo ' Применен ключ -f, учетная запись ПК не будет удалена с контроллера домена!'
|
|
|
fi
|
|
|
myAsk
|
|
|
v_delete_host=`hostname -s`
|
|
|
v_domain=`hostname -d`
|
|
|
dns=`nmcli dev show | awk '/DNS/{print $2}' | head -n1`
|
|
|
host=`hostname -s`
|
|
|
ip=`hostname -I | awk '{print $1}'`
|
|
|
|
|
|
if [ -n "$gui" ]
|
|
|
then
|
|
|
data_exit=( $(zenity --forms --separator=" " \
|
|
|
--title="Вывод из домена" \
|
|
|
--text="Удаление учетной записи ПК из домена." \
|
|
|
--add-entry="Имя администратора домена:" \
|
|
|
--add-password="Пароль администратора:" \
|
|
|
--ok-label="OK" \
|
|
|
) )
|
|
|
|
|
|
# Если zenity NO, то выход из скрипта
|
|
|
if [ $? -eq 1 ]; then
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
v_leave_admin=${data_exit[0]%%@*}
|
|
|
v_pass_admin_gui=${data_exit[1]}
|
|
|
v_pass_dns=$v_pass_admin_gui
|
|
|
# Удаление ПК из домена
|
|
|
echo -e " " &>> /var/log/join-to-domain.log
|
|
|
echo -e " ***Выполнение <adcli delete-computer>***" &>> /var/log/join-to-domain.log
|
|
|
adcli delete-computer -vvv -U $v_leave_admin --domain=$v_domain $v_delete_host --stdin-password <<< $v_pass_admin_gui &>> /var/log/join-to-domain.log
|
|
|
err_adcli=$?
|
|
|
err_str_adcli=`cat /var/log/join-to-domain.log | tail -n 1`
|
|
|
if [ $err_adcli -ne 0 ]; then
|
|
|
if echo "$err_str_adcli" | grep -q "No computer account for"; then
|
|
|
echo " Учетная запись "`hostname -s`" отсутствовала в домене"
|
|
|
else
|
|
|
zenity --error \
|
|
|
--title="Вывод из домен Windows/Samba" \
|
|
|
--text="Ошибка удаления учётной записи ПК из домена. \nВозможно логин или пароль введен неверно.\nсм. /var/log/join-to-domain.log" \
|
|
|
--no-wrap &> /dev/null
|
|
|
exit 1;
|
|
|
fi
|
|
|
fi
|
|
|
else
|
|
|
echo ""
|
|
|
if [[ -z "$force" ]]; then
|
|
|
echo ' Удаление учетной записи ПК из домена.'
|
|
|
read -p ' Введите имя контроллера домена или для продолжения нажмите ENTER: ' v_kdc
|
|
|
read -p ' Введите имя администратора домена: ' v_leave_admin
|
|
|
read -sp " Введите пароль администратора домена: " v_pass_admin && echo
|
|
|
v_pass_dns=$v_pass_admin
|
|
|
v_leave_admin=${v_leave_admin%%@*}
|
|
|
if [ -n "$v_kdc" ]
|
|
|
then
|
|
|
# Удаление ПК из домена
|
|
|
echo -e " " &>> /var/log/join-to-domain.log
|
|
|
echo -e " ***Выполнение <adcli delete-computer -S $v_kdc>***" &>> /var/log/join-to-domain.log
|
|
|
adcli delete-computer -vvv -U $v_leave_admin --domain=$v_domain $v_delete_host -S $v_kdc --stdin-password <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
err_adcli=$?
|
|
|
err_str_adcli=`cat /var/log/join-to-domain.log | tail -n 1`
|
|
|
else
|
|
|
# Удаление ПК из домена
|
|
|
echo -e " " &>> /var/log/join-to-domain.log
|
|
|
echo -e " ***Выполнение <adcli delete-computer>***" &>> /var/log/join-to-domain.log
|
|
|
adcli delete-computer -vvv -U $v_leave_admin --domain=$v_domain $v_delete_host --stdin-password <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
err_adcli=$?
|
|
|
err_str_adcli=`cat /var/log/join-to-domain.log | tail -n 1`
|
|
|
fi
|
|
|
if [ $err_adcli -ne 0 ]; then
|
|
|
if echo "$err_str_adcli" | grep -q "No computer account for"; then
|
|
|
echo " Учетная запись "`hostname -s`" отсутствовала в домене"
|
|
|
else
|
|
|
echo -e " ${RED}Ошибка вывода из домена, см. /var/log/join-to-domain.log${NC}"
|
|
|
echo -e " ${RED}Возможно логин или пароль введен неверно.${NC}"
|
|
|
echo -e " Ошибка вывода из домена, см. /var/log/join-to-domain.log" &>> /var/log/join-to-domain.log
|
|
|
exit 1;
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
echo -e " " &>> /var/log/join-to-domain.log
|
|
|
echo -e "dns:" $dns &>> /var/log/join-to-domain.log
|
|
|
echo -e "v_domain:" $v_domain &>> /var/log/join-to-domain.log
|
|
|
echo -e "ip:" $ip &>> /var/log/join-to-domain.log
|
|
|
echo -e "v_leave_admin:" $v_leave_admin &>> /var/log/join-to-domain.log
|
|
|
# Удаление DNS записи
|
|
|
echo -e " ***Выполнение <samba-tool dns delete>***" &>> /var/log/join-to-domain.log
|
|
|
HOSTNAME=$(hostname)
|
|
|
SHORT_NAME=$(echo $HOSTNAME | cut -d. -f2)
|
|
|
#UPPER_SHORT_NAME=$(echo $SHORT_NAME | tr '[:lower:]' '[:upper:]')
|
|
|
UPPER_SHORT_NAME=${SHORT_NAME^^}
|
|
|
samba-tool dns delete "$dns" "$v_domain" "$host" A "$ip" -U "$UPPER_SHORT_NAME\\$v_leave_admin"%"$v_pass_dns" -d 3 &>> /var/log/join-to-domain.log
|
|
|
#
|
|
|
cp /etc/samba/smb.conf /etc/samba/smb.conf.$v_date_time
|
|
|
realm leave -v --client-software=sssd &>> /var/log/join-to-domain.log
|
|
|
realm leave -v --client-software=winbind &>> /var/log/join-to-domain.log
|
|
|
sss_cache -E &>> /var/log/join-to-domain.log
|
|
|
kdestroy -A &>> /var/log/join-to-domain.log
|
|
|
rm -rf /tmp/krb5cc* /var/lib/sss/db/*
|
|
|
rm -f /etc/sudoers.d/domain_admins_sudo
|
|
|
echo -e '
|
|
|
[global]
|
|
|
workgroup = SAMBA
|
|
|
security = user
|
|
|
|
|
|
passdb backend = tdbsam
|
|
|
|
|
|
printing = cups
|
|
|
printcap name = cups
|
|
|
load printers = yes
|
|
|
cups options = raw
|
|
|
|
|
|
[homes]
|
|
|
comment = Home Directories
|
|
|
valid users = %S, %D%w%S
|
|
|
browseable = No
|
|
|
read only = No
|
|
|
inherit acls = Yes
|
|
|
|
|
|
[printers]
|
|
|
comment = All Printers
|
|
|
path = /var/tmp
|
|
|
printable = Yes
|
|
|
create mask = 0600
|
|
|
browseable = No
|
|
|
|
|
|
[print$]
|
|
|
comment = Printer Drivers
|
|
|
path = /var/lib/samba/drivers
|
|
|
write list = @printadmin root
|
|
|
force group = @printadmin
|
|
|
create mask = 0664
|
|
|
directory mask = 0775
|
|
|
' > /etc/samba/smb.conf
|
|
|
echo
|
|
|
echo ' Компьютер '`hostname -s`' выведен из домена.' | tee -a /var/log/join-to-domain.log
|
|
|
f_msg_exit_domian
|
|
|
}
|
|
|
|
|
|
|
|
|
# Проверка на realm list
|
|
|
result_realm=$(realm list)
|
|
|
if [ -z "$result_realm" ]
|
|
|
then echo -e '\n Ввод компьютера в домен Windows(2008/2012/2016/2019/2022), SAMBA, IPA \n'
|
|
|
echo ' Этот компьютер не в домене!' | tee -a /var/log/join-to-domain.log
|
|
|
myAsk
|
|
|
f_choce_pill
|
|
|
elif [ -n "$gui" ]
|
|
|
then (
|
|
|
zenity --question --title="Компьютер в домене!" \
|
|
|
--text="Компьютер в домене! \nВывести компьютер из домена?" \
|
|
|
--ok-label="Да" \
|
|
|
--cancel-label="Отмена" \
|
|
|
--no-wrap &> /dev/null
|
|
|
)
|
|
|
# Сохраняем значение кода возврата Zenity в переменную
|
|
|
zenity_exit=$?
|
|
|
|
|
|
# Если zenity NO, то выход из скрипта
|
|
|
if [ $zenity_exit -eq 1 ]; then
|
|
|
exit
|
|
|
fi
|
|
|
|
|
|
# Если zenity Yes, то вывод из домена
|
|
|
if [ $zenity_exit -eq 0 ]; then
|
|
|
freedom
|
|
|
fi
|
|
|
else echo
|
|
|
freedom
|
|
|
|
|
|
fi
|
|
|
|
|
|
# You have two choices
|
|
|
if [ -n "$gui" ]
|
|
|
then
|
|
|
# red pill or blue pill
|
|
|
f_create_form_choce_pill &> /dev/null
|
|
|
if [ "$select_pill" = "SAMBA" ]
|
|
|
then
|
|
|
#f_create_form &> /dev/null
|
|
|
f_create_form_qt
|
|
|
fi
|
|
|
|
|
|
if [ "$select_pill" = "IPA" ]
|
|
|
then
|
|
|
f_create_form_IPA &> /dev/null
|
|
|
(f_join_free_ipa) |
|
|
|
zenity --title="Ввод в домен!" \
|
|
|
--text="Выполняю ввод в домен IPA ..." \
|
|
|
--width=300 --height=140 --progress --pulsate --auto-close --auto-kill &> /dev/null
|
|
|
successful_in_ipa=$(tail -n1 /var/log/ipaclient-install.log | awk '{ print $NF }')
|
|
|
if [ "$successful_in_ipa" = "successful" ]
|
|
|
then
|
|
|
zenity --info \
|
|
|
--title="Ввод в домен IPA" \
|
|
|
--text="Компьютер успешно введен в домен IPA! Перезагрузите ОС" \
|
|
|
--no-wrap &> /dev/null
|
|
|
exit;
|
|
|
else
|
|
|
zenity --error \
|
|
|
--title="Ввод в домен IPA" \
|
|
|
--text="Ошибка ввода в домен IPA, см. /var/log/ipaclient-install.log" \
|
|
|
--no-wrap &> /dev/null
|
|
|
exit 1;
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
# Ввод в домен IPA (терминальный)
|
|
|
# Follow the white rabbit
|
|
|
if [ "$choce_domain" = "2" ]
|
|
|
then
|
|
|
echo -e '\n Для ввода компьютера в домен IPA, введите имя домена.\n Пример: example.com\n'
|
|
|
read -p ' Имя домена: ' v_domain
|
|
|
echo ' Введите имя ПК. Пример: client1'
|
|
|
|
|
|
while true; do
|
|
|
read -p ' Имя ПК: ' v_name_pc
|
|
|
if grep -Pq '(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,61}[a-zA-Z0-9\-])?)+[a-zA-Z0-9]$)' <<< $v_name_pc
|
|
|
then break;
|
|
|
else echo -e '\n Ошибка! Недопустимое имя ПК!'
|
|
|
echo -e " Разрешены символы латинского алфавита(A-Z,a-z), цифры(0-9) и дефис(-). Имя не должно превышать более 15 символов."
|
|
|
fi
|
|
|
done
|
|
|
|
|
|
read -p ' Имя администратора домена: ' v_admin_ipa
|
|
|
f_realm_discover
|
|
|
read -sp " Введите пароль администратора домена IPA: " v_pass_admin_ipa && echo
|
|
|
myAsk
|
|
|
f_join_free_ipa
|
|
|
successful_in_ipa=$(tail -n1 /var/log/ipaclient-install.log | awk '{ print $NF }')
|
|
|
if [ "$successful_in_ipa" = "successful" ]
|
|
|
then
|
|
|
echo
|
|
|
echo " Компьютер успешно введён в домен IPA! Перезагрузите ОС."
|
|
|
else echo -e '\n Ошибка ввода в домен IPA, см. /var/log/ipaclient-install.log'
|
|
|
fi
|
|
|
exit;
|
|
|
fi
|
|
|
|
|
|
|
|
|
# ---------- Ввод данных в терминале ----------
|
|
|
# Если отсутствуют входные параметры скрипта
|
|
|
if [[ -z "$v_domain" && -z "$v_name_pc" && -z "$v_admin" && -z "$gui" && -z "$v_ou" ]]; then
|
|
|
v_search_domain=$(cat /etc/resolv.conf | awk '/^search/ && !/^#/{print $2}')
|
|
|
if [[ -z "$v_search_domain" ]]; then
|
|
|
echo -e ' Для ввода компьютера в домен Windows/SAMBA, введите имя домена.\n Пример: example.com\n'
|
|
|
read -p ' Имя вашего домена: ' v_domain
|
|
|
else
|
|
|
echo
|
|
|
echo -e ' Имя домена ['${GREEN}$v_search_domain${NC}']';
|
|
|
read -p ' Для подтверждения нажмите ENTER или введите имя домена вручную: ' v_domain
|
|
|
echo
|
|
|
if [[ -z "$v_domain" ]]; then
|
|
|
v_domain=$v_search_domain
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
echo ' Введите имя ПК. Пример: client1'
|
|
|
dc=$(adcli info $v_domain 2>/dev/null | grep "domain-controller ="| awk '{print $3}')
|
|
|
v_short_dc=$(cut -d'.' -f1 <<< "$dc") # Короткое имя контроллера
|
|
|
while true; do
|
|
|
read -p ' Имя ПК: ' v_name_pc
|
|
|
if [[ $(grep -P '(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,14}[a-zA-Z0-9\-])+[a-zA-Z0-9])$)' <<< $v_name_pc) && ${#v_name_pc} -le 15 ]]
|
|
|
then
|
|
|
check_name="true";
|
|
|
fi
|
|
|
if [ "$v_name_pc" != "$v_short_dc" ] && [ "$check_name" = "true" ];
|
|
|
then break;
|
|
|
else echo -e "\n ${RED}Ошибка! Недопустимое имя ПК!${NC}"
|
|
|
echo -e " Разрешены символы латинского алфавита(A-Z,a-z), цифры(0-9) и дефис(-). Имя не должно превышать более 15 символов."
|
|
|
echo -e " Ошибка! Недопустимое имя ПК!" &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
done
|
|
|
|
|
|
read -p ' Имя администратора домена: ' v_admin
|
|
|
read -p ' Имя подразделения ПК(OU=MyComputers) без кавычек или для продолжения нажмите ENTER:' v_ou
|
|
|
v_admin=${v_admin%%@*} # обрезаем все, что идет после @
|
|
|
# Проверка вводимых данных
|
|
|
if [[ -z "$v_admin" ]]
|
|
|
then echo -e " ${RED}Ошибка! Введите имя администратора домена.${NC}"
|
|
|
echo -e " Ошибка. Введите имя администратора домена." &>> /var/log/join-to-domain.log
|
|
|
exit 1;
|
|
|
fi
|
|
|
# Если имеются входные параметры:
|
|
|
else
|
|
|
if [[ -z "$v_admin" ]]
|
|
|
then echo -e " ${RED}Ошибка! Введите имя администратора домена. Используйте параметр -u${NC}"
|
|
|
exit 1;
|
|
|
fi
|
|
|
if [[ -z "$v_name_pc" ]]
|
|
|
then echo -e " ${RED}Ошибка! Введите имя ПК. Используйте параметр -n${NC}"
|
|
|
exit 1;
|
|
|
fi
|
|
|
if [[ -z "$v_domain" ]]
|
|
|
then echo -e " ${RED}Ошибка! Введите имя домена. Используйте параметр -d${NC}"
|
|
|
exit 1;
|
|
|
fi
|
|
|
dc=$(adcli info $v_domain|grep "domain-controller ="| awk '{print $3}')
|
|
|
v_short_dc=$(cut -d'.' -f1 <<< "$dc") # Короткое имя контроллера
|
|
|
checkname "$v_short_dc" || exit;
|
|
|
fi
|
|
|
|
|
|
# Параметр для добавления ПК в определенную организационную единицу (подразделение)
|
|
|
if [[ ! -z "$v_ou" ]];
|
|
|
then
|
|
|
IFS='. ' read -r -a array <<< $v_domain
|
|
|
for el in "${array[@]}"; do
|
|
|
as+=",DC=""$el"
|
|
|
done
|
|
|
v_ou_net_ads='createcomputer='$v_ou$as
|
|
|
v_ou_realm_join='--computer-ou='$v_ou$as
|
|
|
fi
|
|
|
|
|
|
# Настройка nsswitch.conf
|
|
|
v_date_time=$(date '+%d-%m-%y_%H:%M:%S')
|
|
|
|
|
|
installed_version=$(rpm -q --queryformat '%{VERSION}' authselect)
|
|
|
new_version="1.5.0"
|
|
|
|
|
|
installed_version_no_dot=${installed_version//./}
|
|
|
new_version_no_dot=${new_version//./}
|
|
|
|
|
|
# Сравниваем числа без точек (если версии authselect равны)
|
|
|
if [ "$installed_version_no_dot" -ge "$new_version_no_dot" ]; then
|
|
|
echo "" &>> /var/log/join-to-domain.log
|
|
|
echo " Новая версия authselect ${installed_version}" &>> /var/log/join-to-domain.log
|
|
|
directory_authselect="/etc/authselect/custom/sssd_domain/"
|
|
|
if [ -d "$directory_authselect" ]; then
|
|
|
rm -rf "$directory_authselect"
|
|
|
fi
|
|
|
# Создаем новый профиль sssd_domain
|
|
|
authselect create-profile sssd_domain -b sssd &>> /var/log/join-to-domain.log
|
|
|
# Изменяем nsswitch.conf
|
|
|
sed -i 's/\bhosts:.*/hosts: files myhostname resolve dns mdns4_minimal [!UNAVAIL=return]/g' /etc/authselect/custom/sssd_domain/nsswitch.conf &>> /var/log/join-to-domain.log
|
|
|
authselect select custom/sssd_domain with-faillock with-fingerprint with-smartcard with-mkhomedir --force &>> /var/log/join-to-domain.log
|
|
|
else
|
|
|
# Старая версия authselect
|
|
|
cp /etc/authselect/user-nsswitch.conf /etc/authselect/user-nsswitch.conf.$v_date_time &>> /var/log/join-to-domain.log
|
|
|
authselect select sssd with-fingerprint with-gssapi with-mkhomedir with-smartcard --force &> /dev/null
|
|
|
sed -i 's/\bhosts:.*/hosts: files dns resolve [!UNAVAIL=return] myhostname mdns4_minimal/g' /etc/authselect/user-nsswitch.conf &>> /var/log/join-to-domain.log
|
|
|
authselect apply-changes &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Проверка доступности домена
|
|
|
f_realm_discover
|
|
|
|
|
|
# Вызов функции формирования krb5.conf
|
|
|
f_create_krb5
|
|
|
|
|
|
#if [[ -z "$v_pass_admin_gui" ]];
|
|
|
#then
|
|
|
# f_create_krb5
|
|
|
#fi
|
|
|
|
|
|
# realm join console
|
|
|
if [[ -z "$v_pass_admin_gui" && -z "$v_pass_admin" ]];
|
|
|
then
|
|
|
read -sp " Введите пароль администратора домена: " v_pass_admin && echo
|
|
|
# Проверка существования имени ПК в домене
|
|
|
check_domain_name $v_admin $v_domain $v_name_pc $v_pass_admin
|
|
|
fi
|
|
|
|
|
|
if [[ -n "$v_pass_admin" ]];
|
|
|
then
|
|
|
check_domain_name $v_admin $v_domain $v_name_pc $v_pass_admin
|
|
|
fi
|
|
|
|
|
|
# Вызов функции диалога
|
|
|
if [[ -z "$yes" ]]
|
|
|
then
|
|
|
myAsk
|
|
|
fi
|
|
|
|
|
|
|
|
|
echo -e '' >> /var/log/join-to-domain.log
|
|
|
echo -e ' 1) Изменение имени ПК' | tee -a /var/log/join-to-domain.log
|
|
|
|
|
|
hostnamectl set-hostname $v_name_pc.$v_domain
|
|
|
|
|
|
echo -e ' Новое имя ПК: '`hostname` | tee -a /var/log/join-to-domain.log
|
|
|
v_date_time=$(date '+%d-%m-%y_%H:%M:%S')
|
|
|
|
|
|
# Настройка chronyd
|
|
|
echo -e ' 2) Настройка chronyd' | tee -a /var/log/join-to-domain.log
|
|
|
chrony_conf
|
|
|
|
|
|
# Настройка hosts
|
|
|
echo -e ' 3) Настройка hosts' | tee -a /var/log/join-to-domain.log
|
|
|
cp /etc/hosts /etc/hosts.$v_date_time
|
|
|
echo -e '127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4' > /etc/hosts
|
|
|
echo -e '::1 localhost localhost.localdomain localhost6 localhost6.localdomain6' >> /etc/hosts
|
|
|
echo -e '127.0.0.1 '$(hostname -f)' '$(hostname -s)'' >> /etc/hosts
|
|
|
|
|
|
os_name=`cat /etc/os-release | grep ^"NAME=" | awk -F= '{print $2}' | sed 's/\"//g'`
|
|
|
os_version=`cat /etc/os-release | grep ^"VERSION_ID=" | awk -F= '{print $2}' | sed 's/\"//g'`
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
# Ввод в домен с использованием winbind (консольно, через передачу параметров) #
|
|
|
#------------------------------------------------------------------------------#
|
|
|
# Выполняется если указан ключ -w
|
|
|
if [ -n "$winbind" ]
|
|
|
then
|
|
|
if [ -n "$wg" ] ; then
|
|
|
v_domain=$wg
|
|
|
fi
|
|
|
sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
|
|
|
setenforce 0
|
|
|
systemctl disable sssd
|
|
|
systemctl stop sssd
|
|
|
echo -e ' 4) Ввод в домен (winbind) ...' | tee -a /var/log/join-to-domain.log
|
|
|
realm join -vvv -U "$v_admin" --client-software=winbind "$v_domain" --os-name="$os_name" --os-version="$os_version" $v_ou_realm_join <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
if [ $? -ne 0 ];
|
|
|
then echo -e " ${RED}Ошибка ввода в домен, см. /var/log/join-to-domain.log${NC}"
|
|
|
echo -e " Ошибка ввода в домен, см. /var/log/join-to-domain.log" &>> /var/log/join-to-domain.log
|
|
|
exit 1;
|
|
|
fi
|
|
|
|
|
|
echo -e ' 5) Выполняется authselect' | tee -a /var/log/join-to-domain.log
|
|
|
|
|
|
if [ "$installed_version_no_dot" -ge "$new_version_no_dot" ]; then
|
|
|
dir_winbind_authselect="/etc/authselect/custom/winbind_domain/"
|
|
|
if [ -d "$dir_winbind_authselect" ]; then
|
|
|
rm -rf "$dir_winbind_authselect"
|
|
|
fi
|
|
|
# Создаем новый профиль sssd_domain
|
|
|
authselect create-profile winbind_domain -b winbind &>> /var/log/join-to-domain.log
|
|
|
# Изменяем nsswitch.conf
|
|
|
sed -i 's/\bhosts:.*/hosts: files myhostname resolve dns mdns4_minimal [!UNAVAIL=return]/g' /etc/authselect/custom/winbind_domain/nsswitch.conf &>> /var/log/join-to-domain.log
|
|
|
authselect select custom/winbind_domain with-krb5 with-faillock with-fingerprint with-mkhomedir --force &>> /var/log/join-to-domain.log
|
|
|
else
|
|
|
# Старая версия authselect
|
|
|
authselect select winbind with-mkhomedir with-krb5 --force &>> /var/log/join-to-domain.log
|
|
|
authselect enable-feature with-mkhomedir &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
|
|
|
# samba config log
|
|
|
echo -e ' 6) Настройка samba' | tee -a /var/log/join-to-domain.log
|
|
|
|
|
|
# backup smb.conf
|
|
|
cp /etc/samba/smb.conf /etc/samba/smb.conf.$v_date_time
|
|
|
|
|
|
# Настройка smb.conf
|
|
|
mkdir -p /var/lib/domain/
|
|
|
mkdir -p /var/lib/domain/run
|
|
|
echo -e '[global]
|
|
|
workgroup = '$v_BIG_SHORT_DOMEN'
|
|
|
realm = '$v_BIG_DOMAIN'
|
|
|
security = ADS
|
|
|
|
|
|
winbind enum groups = Yes
|
|
|
winbind enum users = Yes
|
|
|
winbind offline logon = Yes
|
|
|
|
|
|
# Формат логина: domain\username
|
|
|
winbind use default domain = no
|
|
|
|
|
|
winbind refresh tickets = Yes
|
|
|
winbind cache time = 300
|
|
|
wins support = no
|
|
|
|
|
|
idmap cache time = 900
|
|
|
idmap config '$v_BIG_SHORT_DOMEN' : backend = sss
|
|
|
idmap config * : range = 200000-2147483647
|
|
|
|
|
|
client min protocol = NT1
|
|
|
client max protocol = SMB3
|
|
|
|
|
|
kerberos method = secrets and keytab
|
|
|
|
|
|
# Домашний каталог пользователя: template homedir = /home/%D/%U
|
|
|
template homedir = /home/%U@%D
|
|
|
|
|
|
template shell = /bin/bash
|
|
|
nt pipe support = no
|
|
|
machine password timeout = 0
|
|
|
vfs objects = acl_xattr
|
|
|
map acl inherit = yes
|
|
|
store dos attributes = yes
|
|
|
|
|
|
printing = cups
|
|
|
printcap name = cups
|
|
|
load printers = yes
|
|
|
cups options = raw
|
|
|
|
|
|
[homes]
|
|
|
comment = Home Directories
|
|
|
valid users = %S, %D%w%S
|
|
|
browseable = No
|
|
|
read only = No
|
|
|
inherit acls = Yes
|
|
|
|
|
|
[printers]
|
|
|
comment = All Printers
|
|
|
path = /var/tmp
|
|
|
printable = Yes
|
|
|
create mask = 0600
|
|
|
browseable = No
|
|
|
|
|
|
[print$]
|
|
|
comment = Printer Drivers
|
|
|
path = /var/lib/samba/drivers
|
|
|
write list = @printadmin root
|
|
|
force group = @printadmin
|
|
|
create mask = 0664
|
|
|
directory mask = 0775' > /etc/samba/smb.conf
|
|
|
|
|
|
echo -e ' 7) Тест конфигурации samba' | tee -a /var/log/join-to-domain.log
|
|
|
echo -e "\n" | testparm &>> /var/log/join-to-domain.log
|
|
|
|
|
|
# Настройка limits
|
|
|
cp /etc/security/limits.conf /etc/security/limits.conf.$v_date_time
|
|
|
echo -e '* - nofile 16384
|
|
|
root - nofile 16384' > /etc/security/limits.conf
|
|
|
|
|
|
# join to domain
|
|
|
join_to_domain() {
|
|
|
if [[ $wg == "" ]] ; then
|
|
|
echo -e ' 8) Выполняю net ads join' | tee -a /var/log/join-to-domain.log
|
|
|
net ads join -S "${kdc1}" -U "${v_admin}%${v_pass_admin}" &>> /var/log/join-to-domain.log
|
|
|
else
|
|
|
echo -e ' 8) Выполняю net ads join' | tee -a /var/log/join-to-domain.log
|
|
|
net ads join -S "${kdc1}" -U "${v_admin}%${v_pass_admin}" -W "$wg" &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
|
|
|
if [[ $? != 0 ]]; then
|
|
|
return 1
|
|
|
fi
|
|
|
}
|
|
|
join_to_domain
|
|
|
|
|
|
# Запуск сервисов
|
|
|
echo -e ' 9) Запуск сервиса winbind' | tee -a /var/log/join-to-domain.log
|
|
|
systemctl enable winbind --now &>> /var/log/join-to-domain.log
|
|
|
echo -e ' 10) Запуск сервиса smb' | tee -a /var/log/join-to-domain.log
|
|
|
systemctl enable smb --now &>> /var/log/join-to-domain.log
|
|
|
|
|
|
# Настройка /etc/security/pam_winbind.conf
|
|
|
settings_pam_winbind
|
|
|
echo -e ' Внимание! Для вступления изменений в силу требуется перезагрузка компьютера!' | tee -a /var/log/join-to-domain.log
|
|
|
exit;
|
|
|
fi
|
|
|
|
|
|
#---------------------------End winbind----------------------------------------------#
|
|
|
|
|
|
|
|
|
srv_dc="$kdc1"
|
|
|
# ***** realm join in GUI *****
|
|
|
if [[ -n "$v_pass_admin_gui" ]];
|
|
|
then
|
|
|
# Удаление DNS записи
|
|
|
echo -e " ***Выполнение <samba-tool dns delete>***" &>> /var/log/join-to-domain.log
|
|
|
host_ip=$(nslookup `hostname -s` | awk '/^Address: / {print $2}')
|
|
|
if [ -n "$host_ip" ]; then
|
|
|
dns=`nmcli dev show | awk '/DNS/{print $2}' | head -n1`
|
|
|
host=`hostname -s`
|
|
|
echo "dns:"$dns &>> /var/log/join-to-domain.log
|
|
|
echo "host:"$host &>> /var/log/join-to-domain.log
|
|
|
echo "host_ip:"$host_ip &>> /var/log/join-to-domain.log
|
|
|
echo "v_admin:"$v_admin &>> /var/log/join-to-domain.log
|
|
|
echo "v_domain:"$v_domain &>> /var/log/join-to-domain.log
|
|
|
samba-tool dns delete "$dns" "$v_domain" "$host" A "$host_ip" -U "$v_BIG_SHORT_DOMEN\\$v_admin"%"$v_pass_admin_gui" -d 3 &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
|
|
|
echo -e ' 4) Ввод в домен (GUI)...' | tee -a /var/log/join-to-domain.log
|
|
|
(
|
|
|
join_count=1
|
|
|
realm join -vvv -U "$v_admin" "$srv_dc" --os-name="$os_name" --os-version="$os_version" <<< $v_pass_admin_gui &>> /var/log/join-to-domain.log
|
|
|
code_err=$?
|
|
|
while [ $code_err -ne 0 ]; do
|
|
|
join_count=$((join_count+1))
|
|
|
echo -e ' Ввод в домен. Попытка №'$join_count | tee -a /var/log/join-to-domain.log
|
|
|
realm join -vvv -U "$v_admin" "$srv_dc" --os-name="$os_name" --os-version="$os_version" <<< $v_pass_admin_gui &>> /var/log/join-to-domain.log
|
|
|
code_err=$?
|
|
|
if [ $code_err -ne 0 ]; then
|
|
|
srv_dc="$v_domain"
|
|
|
fi
|
|
|
if [ "$join_count" -gt 3 ]; then
|
|
|
touch /tmp/realm-join-error
|
|
|
break
|
|
|
fi
|
|
|
done
|
|
|
) |
|
|
|
zenity --title="Ввод в домен!" --text="Выполняю ввод в домен..." --width=300 --height=140 --progress --pulsate --auto-close --auto-kill &> /dev/null
|
|
|
fi
|
|
|
|
|
|
# Если файл ошибки(realm join...) существует, то выводим ошибку и выходим из сценария.
|
|
|
if [ -f "/tmp/realm-join-error" ]
|
|
|
then
|
|
|
zenity --error --title="Ввод в домен" --text="Ошибка ввода в домен, см. /var/log/join-to-domain.log" --no-wrap &> /dev/null
|
|
|
rm -rf /tmp/realm-join-error
|
|
|
exit 1;
|
|
|
fi
|
|
|
|
|
|
# ***** realm join in console *****
|
|
|
if [[ -z "$v_pass_admin_gui" ]]
|
|
|
then
|
|
|
# Удаление DNS записи
|
|
|
echo -e " ***Выполнение <samba-tool dns delete>***" &>> /var/log/join-to-domain.log
|
|
|
host_ip=$(nslookup `hostname -s` | awk '/^Address: / {print $2}')
|
|
|
if [ -n "$host_ip" ]; then
|
|
|
dns=`nmcli dev show | awk '/DNS/{print $2}' | head -n1`
|
|
|
host=`hostname -s`
|
|
|
echo "dns:"$dns &>> /var/log/join-to-domain.log
|
|
|
echo "host:"$host &>> /var/log/join-to-domain.log
|
|
|
echo "host_ip:"$host_ip &>> /var/log/join-to-domain.log
|
|
|
echo "v_admin:"$v_admin &>> /var/log/join-to-domain.log
|
|
|
echo "v_domain:"$v_domain &>> /var/log/join-to-domain.log
|
|
|
samba-tool dns delete "$dns" "$v_domain" "$host" A "$host_ip" -U "$v_BIG_SHORT_DOMEN\\$v_admin"%"$v_pass_admin" -d 3 &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
|
|
|
join_count=1
|
|
|
echo -e ' 4) Ввод в домен ... ' | tee -a /var/log/join-to-domain.log
|
|
|
if [[ ! -z "$v_ou" ]]; then
|
|
|
realm join -vvv -U "$v_admin" "$srv_dc" "$v_ou_realm_join" --os-name="$os_name" --os-version="$os_version" <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
else realm join -vvv -U "$v_admin" "$srv_dc" --os-name="$os_name" --os-version="$os_version" <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
code_err=$?
|
|
|
while [ $code_err -ne 0 ]; do
|
|
|
join_count=$((join_count+1))
|
|
|
echo ' Ввод в домен. Попытка №'$join_count &>> /var/log/join-to-domain.log
|
|
|
if [[ ! -z "$v_ou" ]]; then
|
|
|
realm join -vvv -U "$v_admin" "$srv_dc" "$v_ou_realm_join" --os-name="$os_name" --os-version="$os_version" <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
else realm join -vvv -U "$v_admin" "$srv_dc" --os-name="$os_name" --os-version="$os_version" <<< $v_pass_admin &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
code_err=$?
|
|
|
if [ $code_err -ne 0 ]; then
|
|
|
srv_dc="$v_domain"
|
|
|
fi
|
|
|
if [ "$join_count" -gt 3 ]; then
|
|
|
echo -e ${RED}' Ошибка ввода в домен, см. /var/log/join-to-domain.log'${NC}
|
|
|
echo -e ' Ошибка ввода в домен, см. /var/log/join-to-domain.log' &>> /var/log/join-to-domain.log
|
|
|
exit 1;
|
|
|
fi
|
|
|
done
|
|
|
|
|
|
fi
|
|
|
|
|
|
if [[ -n "$save_case" ]]; then
|
|
|
login_case="Preserving"
|
|
|
elif [[ -n "$lower_case" ]]; then
|
|
|
login_case="False"
|
|
|
elif [[ -z $save_case || -z $lower_case ]]; then
|
|
|
login_case="False"
|
|
|
fi
|
|
|
|
|
|
if [[ -n "$dns_auth_none" ]]; then
|
|
|
dns_auth_none="none"
|
|
|
else dns_auth_none="GSS-TSIG"
|
|
|
fi
|
|
|
|
|
|
# Перезапись профиля sssd_domain
|
|
|
if [ "$installed_version_no_dot" -ge "$new_version_no_dot" ]; then
|
|
|
authselect select custom/sssd_domain with-faillock with-fingerprint with-smartcard with-mkhomedir --force &>> /var/log/join-to-domain.log
|
|
|
fi
|
|
|
# Настройка sssd.conf
|
|
|
echo -e ' 5) Настройка sssd' | tee -a /var/log/join-to-domain.log
|
|
|
cp /etc/sssd/sssd.conf /etc/sssd/sssd.conf.$v_date_time &>> /var/log/join-to-domain.log
|
|
|
|
|
|
echo -e '[sssd]
|
|
|
domains = '$(domainname -d)'
|
|
|
config_file_version = 2
|
|
|
services = nss, pam
|
|
|
|
|
|
# Фильтр re_expression
|
|
|
# Должен использоваться совместно с параметром case_sensitive = False
|
|
|
# Разрешены только символы нижнего регистра, цифры, точка "." и дефис "-". ps: при входе с @ утилита loginctl не определяет login.
|
|
|
# re_expression = (?P<name>[a-z0-9._-]+)
|
|
|
# Разрешены только символы нижнего регистра, цифры, точка "." и дефис "-", но запрещен символом "@" , т.е. формат username@domain
|
|
|
# re_expression = (?P<name>[a-z0-9._-]+(?![@]))
|
|
|
#
|
|
|
|
|
|
|
|
|
[domain/'$(domainname -d)']
|
|
|
ad_domain = '$(domainname -d)'
|
|
|
ad_server = '$kdc1''$kdc2'
|
|
|
krb5_realm = '$v_BIG_DOMAIN'
|
|
|
case_sensitive = '$login_case'
|
|
|
realmd_tags = manages-system joined-with-samba
|
|
|
|
|
|
# Параметр применяется, когда субъекты поддомена используются с upnSuffixes(UPN-суффиксы), которые неизвестны в KDC родительского домена.
|
|
|
# SSSD попытается отправить запрос непосредственно в KDC доверенного домена.
|
|
|
#krb5_use_subdomain_realm=True
|
|
|
|
|
|
# Кэширование аутентификационных данных, необходимо при недоступности домена
|
|
|
cache_credentials = True
|
|
|
|
|
|
# Параметр указывает, что SSSD будет автоматически обновлять пароль учетной записи машины в Active Directory.
|
|
|
ad_update_samba_machine_account_password = true
|
|
|
|
|
|
id_provider = ad
|
|
|
access_provider = ad
|
|
|
krb5_store_password_if_offline = True
|
|
|
default_shell = /bin/bash
|
|
|
ldap_id_mapping = True
|
|
|
ad_gpo_access_control = disabled
|
|
|
dns_resolver_timeout = 10
|
|
|
|
|
|
# Включает/Отключает режим полных имён пользователей при входе
|
|
|
use_fully_qualified_names = False
|
|
|
|
|
|
# Определение домашнего каталога для доменных пользователей
|
|
|
fallback_homedir = /home/%u@%d
|
|
|
|
|
|
# Параметр access_provider = simple Определяет список доступа на основе имен пользователей или групп.
|
|
|
#access_provider = simple
|
|
|
#simple_allow_users = user1@example.com, user2@example.com
|
|
|
#simple_allow_groups = group@example.com
|
|
|
|
|
|
# Включает/Отключает перечисление всех записей домена, операция(id или getent) может занимать длительное время при enumerate = true в больших инфраструктурах
|
|
|
enumerate = false
|
|
|
|
|
|
# Параметр ignore_group_members может ускорить авторизацию в домене если домен имеет большое количество пользователей, групп и вложенных OU
|
|
|
# Если установлено значение TRUE, то атрибут членства в группе не запрашивается с сервера ldap и не обрабатывается вызовов поиска группы.
|
|
|
# ignore_group_members = True
|
|
|
|
|
|
# Поиск ссылок может привести к снижению производительности в средах, которые их интенсивно используют.
|
|
|
# true - не рекомендуется для больших инфраструктур. Отключаем этот поиск.
|
|
|
ldap_referrals = false
|
|
|
|
|
|
# Включает/Отключает динамические обновления DNS, если в статусе sssd ошибка "TSIG error with server: tsig verify failure", то установите dyndns_update = false
|
|
|
dyndns_update = true
|
|
|
dyndns_refresh_interval = 43200
|
|
|
dyndns_update_ptr = true
|
|
|
dyndns_ttl = 3600
|
|
|
|
|
|
# Описание dyndns_auth
|
|
|
# dyndns_auth = GSS-TSIG - при динамической регистрации DNS адреса требуется аутентификация на сервере DNS.
|
|
|
# dyndns_auth = none - при динамической регистрации DNS адреса не требуется аутентификация на сервере DNS (На DNS-сервере установлена политика "Nonsecure and secure")
|
|
|
dyndns_auth = '$dns_auth_none'
|
|
|
|
|
|
# Срок действия билета истекает каждые 24ч и его можно непрерывно продлевать в течение 7 дней
|
|
|
krb5_lifetime = 24h
|
|
|
|
|
|
# Самопродление тикета, значение определяет максимальное время жизни тикета
|
|
|
# Эти параметры позволят SSSD запрашивать возобновляемые билеты (с максимальным сроком действия 7 дней) при входе в систему
|
|
|
# и периодически просматривать список билетов для продления возобновляемых билетов каждые 300 секунд.
|
|
|
krb5_renewable_lifetime = 7d
|
|
|
krb5_renew_interval = 300s
|
|
|
|
|
|
[nss]
|
|
|
# Сколько секунд nss_sss должен кэшировать перечисления (запросы информации обо всех пользователях) Default: 120
|
|
|
#entry_cache_timeout = 15
|
|
|
# Задает время в секундах, в течение которого список поддоменов будет считаться действительным. Default: 60
|
|
|
#get_domains_timeout = 10
|
|
|
' > /etc/sssd/sssd.conf
|
|
|
|
|
|
|
|
|
#if [[ -n "$v_pass_admin_gui" ]];
|
|
|
#then
|
|
|
#(
|
|
|
# authconfig --enablemkhomedir --enablesssdauth --updateall &>> /var/log/join-to-domain.log; sleep 2
|
|
|
#) |
|
|
|
# zenity --width=300 --height=140 --progress --title="Ввод в домен" --text="Настройка сервиса sssd..." --pulsate --auto-close &> /dev/null
|
|
|
#fi
|
|
|
|
|
|
|
|
|
#if [[ -z "$v_pass_admin_gui" ]];
|
|
|
#then
|
|
|
# authconfig --enablemkhomedir --enablesssdauth --updateall &>> /var/log/join-to-domain.log
|
|
|
#fi
|
|
|
|
|
|
# Настройка limits
|
|
|
echo -e ' 6) Настройка limits' | tee -a /var/log/join-to-domain.log
|
|
|
cp /etc/security/limits.conf /etc/security/limits.conf.$v_date_time
|
|
|
echo -e '* - nofile 16384
|
|
|
root - nofile 16384' > /etc/security/limits.conf
|
|
|
|
|
|
|
|
|
# samba config log
|
|
|
echo -e ' 7) Настройка samba' | tee -a /var/log/join-to-domain.log
|
|
|
|
|
|
# backup smb.conf
|
|
|
cp /etc/samba/smb.conf /etc/samba/smb.conf.$v_date_time
|
|
|
|
|
|
# Настройка smb.conf
|
|
|
echo -e '[global]
|
|
|
workgroup = '$v_BIG_SHORT_DOMEN'
|
|
|
realm = '$v_BIG_DOMAIN'
|
|
|
security = ADS
|
|
|
passdb backend = tdbsam
|
|
|
|
|
|
winbind enum groups = Yes
|
|
|
winbind enum users = Yes
|
|
|
winbind offline logon = Yes
|
|
|
winbind use default domain = No
|
|
|
winbind refresh tickets = Yes
|
|
|
|
|
|
idmap cache time = 900
|
|
|
idmap config * : backend = tdb
|
|
|
idmap config * : range = 10000-99999
|
|
|
idmap config '$v_BIG_SHORT_DOMEN' : backend = rid
|
|
|
idmap config '$v_BIG_SHORT_DOMEN' : range = 100000-999999
|
|
|
|
|
|
client min protocol = NT1
|
|
|
client max protocol = SMB3
|
|
|
|
|
|
dedicated keytab file = /etc/krb5.keytab
|
|
|
kerberos method = secrets and keytab
|
|
|
|
|
|
machine password timeout = 60
|
|
|
vfs objects = acl_xattr
|
|
|
map acl inherit = yes
|
|
|
store dos attributes = yes
|
|
|
|
|
|
printing = cups
|
|
|
printcap name = cups
|
|
|
load printers = yes
|
|
|
cups options = raw
|
|
|
|
|
|
[homes]
|
|
|
comment = Home Directories
|
|
|
valid users = %S, %D%w%S
|
|
|
browseable = No
|
|
|
read only = No
|
|
|
inherit acls = Yes
|
|
|
|
|
|
[printers]
|
|
|
comment = All Printers
|
|
|
path = /var/tmp
|
|
|
printable = Yes
|
|
|
create mask = 0600
|
|
|
browseable = No
|
|
|
|
|
|
[print$]
|
|
|
comment = Printer Drivers
|
|
|
path = /var/lib/samba/drivers
|
|
|
write list = @printadmin root
|
|
|
force group = @printadmin
|
|
|
create mask = 0664
|
|
|
directory mask = 0775' > /etc/samba/smb.conf
|
|
|
|
|
|
# Настройка /etc/security/pam_winbind.conf
|
|
|
settings_pam_winbind
|
|
|
|
|
|
# net ads dns in GUI
|
|
|
if [[ -n "$v_pass_admin_gui" ]];
|
|
|
then
|
|
|
echo -e ' 8) Ввод samba в домен и регистрация DNS записи (GUI)...' | tee -a /var/log/join-to-domain.log
|
|
|
(
|
|
|
net ads join -S "$kdc1" -U $v_admin%$v_pass_admin_gui -D $v_domain -d 2 &>> /var/log/join-to-domain.log
|
|
|
if [ $? -ne 0 ]; then
|
|
|
touch /tmp/net-ads-join-error
|
|
|
fi
|
|
|
sleep 2
|
|
|
) |
|
|
|
zenity --title="Ввод в домен!" \
|
|
|
--text="Ввод samba в домен и регистрация DNS записи" \
|
|
|
--width=300 --height=140 --progress --pulsate --auto-close --auto-kill &> /dev/null
|
|
|
|
|
|
if [ -f "/tmp/net-ads-join-error" ]
|
|
|
then
|
|
|
zenity --error \
|
|
|
--title="Ввод в домен" \
|
|
|
--text="Ошибка выполнения команды net ads join, см. /var/log/join-to-domain.log" \
|
|
|
--no-wrap &> /dev/null
|
|
|
rm -rf /tmp/net-ads-join-error
|
|
|
exit 1;
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
# net ads dns in console
|
|
|
if [[ -z "$v_pass_admin_gui" ]]; then
|
|
|
echo -e ' 8) Ввод samba в домен и регистрация DNS записи' | tee -a /var/log/join-to-domain.log
|
|
|
output=$(net ads join -S "$kdc1" -U $v_admin%$v_pass_admin -D $v_domain -d 2 &>> /var/log/join-to-domain.log)
|
|
|
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
|
|
|
echo " Ошибка выполнения команды net ads join, см. /var/log/join-to-domain.log" | tee -a /var/log/join-to-domain.log
|
|
|
if tail -n 4 /var/log/join-to-domain.log | grep -q "Failed to join domain"; then
|
|
|
echo "Компьютер введен в домен, но произошла ошибка при выполнении команды net ads join, см. /var/log/join-to-domain.log" | tee -a /var/log/join-to-domain.log
|
|
|
fi
|
|
|
exit 1;
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
if [ -n "$sg_domain_admins_sudo" ]; then
|
|
|
# Преобразование пробела в экранированный пробел
|
|
|
sg_domain_admins_sudo=$(echo "$sg_domain_admins_sudo" | sed 's/ /\\ /g')
|
|
|
echo "%$sg_domain_admins_sudo ALL=(ALL:ALL) ALL" > /etc/sudoers.d/domain_admins_sudo
|
|
|
fi
|
|
|
|
|
|
if [ -n "$ssh_krb5" ]; then
|
|
|
# Настройка сервера ssh:
|
|
|
sed -i 's/^#KerberosAuthentication .*/KerberosAuthentication yes/' /etc/ssh/sshd_config
|
|
|
sed -i 's/^#KerberosTicketCleanup .*/KerberosTicketCleanup yes/' /etc/ssh/sshd_config
|
|
|
sed -i 's/^#GSSAPIAuthentication .*/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
|
|
|
sed -i 's/^#GSSAPICleanupCredentials .*/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
|
|
|
#sed -i 's/^#UseDNS .*/UseDNS yes/' /etc/ssh/sshd_config
|
|
|
|
|
|
# Настройка клиентской части:
|
|
|
sed -i 's/^#.*GSSAPIAuthentication .*/GSSAPIAuthentication yes/' /etc/ssh/ssh_config
|
|
|
sed -i 's/^#.*GSSAPIDelegateCredentials .*/GSSAPIDelegateCredentials yes/' /etc/ssh/ssh_config
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo ' Лог установки: /var/log/join-to-domain.log'
|
|
|
echo
|
|
|
echo ' Выполнено. Компьютер успешно введен в домен! Перезагрузите ОС.' | tee -a /var/log/join-to-domain.log
|
|
|
if [ -n "$gui" ]
|
|
|
then
|
|
|
zenity --info \
|
|
|
--title="Ввод в домен" \
|
|
|
--text="Компьютер успешно введен в домен! Перезагрузите ОС." \
|
|
|
--no-wrap &> /dev/null
|
|
|
fi
|
|
|
|
|
|
exit;
|