From 468b47ff29b0ad61eec05244aa77e48aaa668bb8 Mon Sep 17 00:00:00 2001 From: asmeron Date: Tue, 23 Apr 2024 13:41:16 +0600 Subject: [PATCH] Fix --- ublinux/functions | 19 +++---- ublinux/rc.preinit.d/23-realmd | 65 +++++++++++++++++++++++- ublinux/rc.preinit.d/30-network-hostname | 32 +++++++----- ublinux/templates/ublinux-data.ini | 32 ++++++++---- 4 files changed, 112 insertions(+), 36 deletions(-) diff --git a/ublinux/functions b/ublinux/functions index 072e29c..1cd7c8a 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -912,14 +912,11 @@ ubconfig_exec_system(){ ;; "[${SYSCONF}/network]"|"[network]") case "${NAME_VAR}" in - DOMAIN) export PARENT="${PKGNAME}" - if [[ "${COMMAND_MODE_VAR}" =~ 'set' ]]; then - ${ROOTFS}/usr/bin/ubdomain-client -q configure - elif [[ "${COMMAND_MODE_VAR}" =~ 'remove' ]]; then - ${ROOTFS}/usr/bin/ubdomain-client -q unconfigure - fi - ;; - 'DOMAIN[server]') true ;; + DOMAIN) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/23-realmd domain_live "${COMMAND_MODE_VAR}" ;; + DOMAIN\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/23-realmd domain_configure_live "${COMMAND_MODE_VAR}" ;; + REALM_SSSD\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/23-realmd domain_configure_live "${COMMAND_MODE_VAR}" ;; + REALM_PERMIT_USER) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/23-realmd domain_configure_live "${COMMAND_MODE_VAR}" ;; + REALM_PERMIT_GROUP) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/23-realmd domain_configure_live "${COMMAND_MODE_VAR}" ;; NTPSERVERS) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/21-ntp "${COMMAND_MODE_VAR}" ;; PROXY_SYSTEM\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/31-network-proxy-system ;; *) NO_FIND_EXCUTE=1 ;; @@ -943,9 +940,9 @@ ubconfig_exec_system(){ ;; "[${SYSCONF}/kiosk]"|"[kiosk]") case "${NAME_VAR}" in - XFCE4_KIOSK\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/8-kiosk-xfce4-kioskrc ;; - XFCE4_KIOSK_USER_LOCKED) ${ROOTFS}/usr/lib/ublinux/rc.post.d/8-kiosk-xfce4-kioskrc ;; - XFCE4_KIOSK_USER_UNLOCKED) ${ROOTFS}/usr/lib/ublinux/rc.post.d/8-kiosk-xfce4-kioskrc ;; + XFCE4_KIOSK\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/18-kiosk-xfce4-kioskrc ;; + XFCE4_KIOSK_USER_LOCKED) ${ROOTFS}/usr/lib/ublinux/rc.post.d/18-kiosk-xfce4-kioskrc ;; + XFCE4_KIOSK_USER_UNLOCKED) ${ROOTFS}/usr/lib/ublinux/rc.post.d/18-kiosk-xfce4-kioskrc ;; *) NO_FIND_EXCUTE=1 ;; esac ;; diff --git a/ublinux/rc.preinit.d/23-realmd b/ublinux/rc.preinit.d/23-realmd index ff8eafa..f61087d 100755 --- a/ublinux/rc.preinit.d/23-realmd +++ b/ublinux/rc.preinit.d/23-realmd @@ -33,14 +33,75 @@ SOURCE=${SYSCONF}/network; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null # sed -i '/\[global\]/ s/$/'"\n realm = ${KERBEROS_REALM}\n security = ADS\n password server = ${ADSERVER}"/ etc/samba/smb.conf # # - #if [[ -n "${SAMBADOMAIN}" ]]; then # sed -i s/"workgroup = .*"/"workgroup = ${SAMBADOMAIN}"/ etc/samba/smb.conf # sed -i s/"^NT_DOMAIN=.*"/"NT_DOMAIN=${SAMBADOMAIN}"/ etc/ntlmaps.cfg #fi + +exec_domain(){ if [[ -n ${DOMAIN} && ${DOMAIN[client]} == "realmd_sssd" ]]; then + ${CMD_CHROOT} /usr/bin/ubdomain-client --quiet configure if [[ -f ${ROOTFS}/etc/krb5.keytab ]]; then - [[ -f ${ROOTFS}/etc/krb5.conf && -f ${ROOTFS}/etc/sssd/sssd.conf ]] || ${CMD_CHROOT} /usr/bin/ubdomain-client -q configure 2>/dev/null + #[[ -f ${ROOTFS}/etc/krb5.conf && -f ${ROOTFS}/etc/sssd/sssd.conf ]] || ${CMD_CHROOT} /usr/bin/ubdomain-client --quite configure 2>/dev/null [[ -f ${ROOTFS}/usr/lib/systemd/system/sssd.service ]] && ln -sf /usr/lib/systemd/system/sssd.service ${ROOTFS}/etc/systemd/system/multi-user.target.wants/sssd.service fi + elif [[ -n ${DOMAIN} && ${DOMAIN[client]} == "realmd_winbind" ]]; then + true + elif [[ -n ${DOMAIN} && ${DOMAIN[client]} == "samba" ]]; then + true + fi +} + +domain_live(){ +# Если выполнение в initrd, то выход + [[ -z ${ROOTFS} ]] || return 0 + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift + [[ -n ${COMMAND} ]] || COMMAND="set=" + local PARAM="$@" + if [[ -n ${PARAM} ]]; then + unset DOMAIN + declare -A DOMAIN + [[ ${PARAM%%=*} =~ [!\$%\&()*+,./:\;\<\=\>?\@\^\{|\}~-] ]] || eval "${PARAM%%=*}=\${PARAM#*=}" + fi + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then + [[ -z ${DOMAIN} ]] && return 0 + ${ROOTFS}/usr/bin/ubdomain-client configure + elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then + ${ROOTFS}/usr/bin/ubdomain-client unconfigure + fi +} + +domain_configure_live(){ +# Если выполнение в initrd, то выход + [[ -z ${ROOTFS} ]] || return 0 + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift + [[ -n ${COMMAND} ]] || COMMAND="set=" + local PARAM="$@" + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then + [[ -z ${DOMAIN} ]] && return 0 + ${ROOTFS}/usr/bin/ubdomain-client configure + elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then + [[ -z ${DOMAIN} ]] && return 0 + ${ROOTFS}/usr/bin/ubdomain-client configure + fi +} + + +################ +##### MAIN ##### +################ + + # Если файл подключен как ресурс с функциями, то выйти + return 0 2>/dev/null && return 0 + if [[ -z $@ ]]; then + while read -r FUNCTION; do + $"${FUNCTION##* }" + done < <(declare -F | grep "declare -f exec_") + else + FUNCTION= + while [[ $# -gt 0 ]]; do + [[ -z ${1} ]] || { declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; } + shift + done + eval ${FUNCTION#*; } fi diff --git a/ublinux/rc.preinit.d/30-network-hostname b/ublinux/rc.preinit.d/30-network-hostname index bcf8703..4e173ed 100755 --- a/ublinux/rc.preinit.d/30-network-hostname +++ b/ublinux/rc.preinit.d/30-network-hostname @@ -25,6 +25,7 @@ SOURCE=${SYSCONF}/network; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null set_hostname(){ local SET_HOSTNAME=$1 + local SET_DOMAIN=$2 # Удалить предыдущее имя хоста OLD_HOSTNAME=$(tail -1 ${ROOTFS}/etc/hostname); OLD_HOSTNAME=${OLD_HOSTNAME%%.*} sed -E -e "s/\s${OLD_HOSTNAME}(\s|$)/ /g" -e "s/\s${OLD_HOSTNAME}(\s|$)/ /g" -e "s/\s${OLD_HOSTNAME}\.[-0-9a-zA-Z.]*(\s|$)/ /g" -e "/^\s*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s*$/d" -i ${ROOTFS}/etc/hosts @@ -39,7 +40,7 @@ set_hostname(){ echo "${SET_HOSTNAME}" > ${ROOTFS}/etc/hostname - if [[ -n ${DOMAIN} ]]; then + if [[ -n ${SET_DOMAIN} ]]; then HOSTS_3="127.0.0.1 ${SET_HOSTNAME}" grep -q "^\s*${HOSTS_3}\s*$" ${ROOTFS}/etc/hosts || echo "${HOSTS_3}" >> ${ROOTFS}/etc/hosts @@ -47,8 +48,8 @@ set_hostname(){ ls -d ${ROOTFS}/home/*@*/ 2>/dev/null | xargs -ri basename {} | xargs -ri touch ${ROOTFS}/var/lib/AccountsService/users/{} ## Домен для сервера dhcpd if [[ -f ${ROOTFS}/etc/dhcpd.conf ]]; then - sed s/"option domain-name .*"/"option domain-name \"${DOMAIN}\";"/g -i ${ROOTFS}/etc/dhcpd.conf - sed s/"option nis-domain .*"/"option nis-domain \"${DOMAIN}\";"/g -i ${ROOTFS}/etc/dhcpd.conf + sed s/"option domain-name .*"/"option domain-name \"${SET_DOMAIN}\";"/g -i ${ROOTFS}/etc/dhcpd.conf + sed s/"option nis-domain .*"/"option nis-domain \"${SET_DOMAIN}\";"/g -i ${ROOTFS}/etc/dhcpd.conf fi ## Имя хоста записать в конфиг с суфиксом домена [[ -f ${ROOTFS}/etc/ublinux/system ]] && { grep -q "^\s*HOSTNAME=${SET_HOSTNAME}\s*$" ${ROOTFS}/etc/ublinux/system || sed "s/^\s*HOSTNAME=.*/HOSTNAME=${SET_HOSTNAME}/g" -i ${ROOTFS}/etc/ublinux/system; } @@ -57,15 +58,16 @@ set_hostname(){ set_hostname_live(){ local SET_HOSTNAME=$1 - hostnamectl set-hostname ${SET_HOSTNAME} + local SET_DOMAIN=$2 + hostname "${SET_HOSTNAME}" + hostnamectl set-hostname "${SET_HOSTNAME}" ## Если меняется имя хоста в запущенных X, то новое имя добавляем в xauth who | grep "(:[0-9.]*)$" | cut -d' ' -f1 | xargs -ri su {} -c "xauth list | sed 's|^.*/|su {} -c \\\\\"xauth add ${SET_HOSTNAME}/|;s|$|\\\\\"|'" | xargs -ri sh -c '{}' - # Если указан домен, то задаём переменную DOMAIN= - # Примечание: Имя сервера контроллера домена включает постфикс домена, но в домен не входит - # Примечание: Невозможно определить, какой уровень именно домен, следовательно отключаю - #[[ ${SET_HOSTNAME} != ${SET_HOSTNAME#*.} ]] && DOMAIN="${SET_HOSTNAME#*.}" - #[[ ${DOMAIN} != "" ]] && ubconfig -q set network DOMAIN="${DOMAIN}" + # Если указан задан домен в имени хоста и не соответствует DOMAIN, то задаём переменную DOMAIN= + [[ ${DOMAIN} != ${SET_DOMAIN} ]] && ubconfig set network DOMAIN="${SET_DOMAIN}" + # При условии, что в имене хоста домен указан отличный от DOMAIN + [[ ${HOSTNAME} != ${SET_HOSTNAME} ]] && ubconfig --target global [system] HOSTNAME="${SET_HOSTNAME}" } exec_hostname(){ @@ -74,14 +76,16 @@ exec_hostname(){ [[ ${KERNEL_HOSTNAME} == "" ]] || HOSTNAME=${KERNEL_HOSTNAME} [[ -z ${HOSTNAME} ]] && HOSTNAME="${DEFAULT_HOSTNAME}" if [[ -n ${DOMAIN} ]]; then - HOSTNAME="${HOSTNAME%%.*}.${DOMAIN}" + SET_HOSTNAME="${HOSTNAME%%.*}.${DOMAIN}" + SET_DOMAIN=${DOMAIN} else - # Если в имени хоста - [[ ${SET_HOSTNAME} != ${SET_HOSTNAME#*.} ]] && DOMAIN="${SET_HOSTNAME#*.}" + SET_HOSTNAME=${HOSTNAME} + # Если в имени хоста указан домен, то зададим на сеанс DOMAIN + [[ ${HOSTNAME} != ${HOSTNAME#*.} ]] && SET_DOMAIN="${HOSTNAME#*.}" fi - set_hostname ${HOSTNAME} + set_hostname "${SET_HOSTNAME}" "${SET_DOMAIN}" # Если выполнение в initrd, то пропустить - [[ -n ${ROOTFS} ]] || set_hostname_live ${HOSTNAME} + [[ -n ${ROOTFS} ]] || set_hostname_live "${SET_HOSTNAME}" "${SET_DOMAIN}" } ################ diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index bafa11a..329afdf 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -744,7 +744,7 @@ GRUB_BOOT_SILENT="splash" ## Отключить автопоиск сервера контроллера домена/kerberos и задать статический ## DOMAIN[server]= ## # DNS имя сервера домена -## DOMAIN[server]=pdc.ublinux.ru +## DOMAIN[server]=pdc.ubdc.ru ## Клиент для подключения к домену ## DOMAIN[client]= @@ -762,23 +762,27 @@ GRUB_BOOT_SILENT="splash" ## DOMAIN[admanger]=:' ## DOMAIN[admanger]=Администратор:0J3QvtCy0YvQuV/QlNC10L3RjCEK -## Группа на контроллере домена, пользователи которой будут иметь права для sudo -## DOMAIN[group:sudoers]=sudoers@ublinux.ru +## TODO: Группа на контроллере домена, пользователи которой будут иметь права для sudo +## DOMAIN[group:sudoers]=sudoers@ubdc.ru -## Группа на контроллере домена, пользователи которой будут иметь права для доступа по ssh -## DOMAIN[group:ssh]=sudoers@ublinux.ru +## TODO: Группа на контроллере домена, пользователи которой будут иметь права для доступа по ssh +## DOMAIN[group:ssh]=sudoers@ubdc.ru -## Ограничить пользователей, которым разрешён вход в домен -## REALM_PERMIT[user]=user-1@ublinux.ru,user-2@ublinux.ru,ublinux.ru\\user-3 -## REALM_PERMIT[group]=ublinux_group@ublinux.ru -## REALM_PERMIT[user]=user-1@ublinux.ru +## Ограничить пользователей.групп, которым разрешён вход в домен. Всем остальным запрещён. Только access_provider=simple +## REALM_PERMIT_USER=user-1@ubdc.ru,user-2@ubdc.ru +## REALM_PERMIT_GROUP="пользователи домена@ubdc.ru" +## https://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/krb5_conf.html +## https://jhrozek.fedorapeople.org/sssd/2.2.0/man/ ## При методе подключения DOMAIN_CLIENT=realmd_sssd. Задать параметры в /etc/sssd/sssd.conf для домена ## REALM_SSSD[параметр:имя_секции]=значение ## Если "имя_секции" не указан, то по умолчанию используется секция текущего домена = domain/${DOMAIN} ## REALM_SSSD[services:sssd]=nss,pam,pac,ssh ## REALM_SSSD[default_shell:nss]=/bib/bash ## REALM_SSSD[ad_hostname:domain/mydomain.ru]=hostname.mydomain.ru +## +## Пользователи могут проходить аутентификацию в автономном режиме в течение 3 дней с момента последнего успешного входа в систему +## REALM_SSSD[offline_credentials_expiration:pam]=3 ## Короткие имена пользователей домена "user" | полные "user@domain.ru" [False|*True] ## REALM_SSSD[use_fully_qualified_names]=False ## Строить карту всех пользователей домена на локальном ПК [False|*True] @@ -791,6 +795,16 @@ GRUB_BOOT_SILENT="splash" ## REALM_SSSD[ad_update_samba_machine_account_password]=True ## Формат файла Kerberos .keytab пользователя /tmp/krb5cc_123456879 ## REALM_SSSD[krb5_ccname_template]=FILE:%d/krb5cc_%U +## Игнорировать контейнеры и политики, если их атрибуты в контейнерах групповой политики недоступны для чтения [*False|True] +## REALM_SSSD[ad_gpo_ignore_unreadable]=True +## Правила контроля доступа на основе объектов групповой политики оцениваются, но не применяются [*permissive|enforcing|disabled] +## REALM_SSSD[ad_gpo_access_control]=permissive +## Разрешить доступ без проверок сроков [*permit|deny|ldap|ipa|ad|simple|krb5|proxy] +## REALM_SSSD[access_provider]=permit +## Разрешить или запретить доступ на основе списка имен пользователей или групп +## REALM_SSSD[access_provider]=simple +## REALM_SSSD[simple_allow_users]="user1, user2" +## REALM_SSSD[simple_allow_groups]="group1" ## Рабочая группа samba #SAMBADOMAIN=SMBGROUP