Участник:Petr-akhlamov/Test: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 20 промежуточных версий этого же участника)
Строка 2: Строка 2:
{{Note|Пожалуйста, обратите внимание, что страница в разработке. Информация может быть неполной и не достоверной.}}
{{Note|Пожалуйста, обратите внимание, что страница в разработке. Информация может быть неполной и не достоверной.}}
==Тестирование и диагностика Samba и ActiveDirectory==
==Тестирование и диагностика Samba и ActiveDirectory==
===Проверка постоянства имени хоста (Check hostname persistance)===
===Проверка постоянства имени компьютера (Check hostname persistance) + ===
Постоянство имени хоста - это сохранение имени компьютера после перезагрузки.
Постоянство имени компьютера - это сохранение имени компьютера после перезагрузки.
<pre>
 
check_hostnamectl() {
Настроить имя компьютера можно двумя способами. Так, чтобы оно оставалось до перезагрузки и так, чтобы оно сохранялось после него.
  local retval=0
  local static_host=
  local transient_host=
  transient_host="$(hostname)" || retval=1
  static_host="$(hostnamectl --static)" || retval=1
  _command hostnamectl || retval=1
  test "$static_host" = "$transient_host" || retval=1
  return $retval
}
</pre>


Если значение:
Следующая команда покажет временное (не сохраненное) имя:
*0, то постоянство не настроено
$ hostname
*1, то постоянство работает корректно
А данная постоянное:
$ hostnamectl --static
Если вывод команд различаются, то измененное имя не сохранится.


===Проверка имени хоста в FQDN [не короткое] (Test hostname is FQDN [not short])===
===Проверка имени хоста в FQDN [не короткое] (Test hostname is FQDN [not short])===
Строка 37: Строка 29:
*2, то ...
*2, то ...


===Метод аутентификации системы (System authentication method)===
===Метод аутентификации системы (System authentication method) +===
Проверить метод входа в систему можно тремя командами:
# /usr/sbin/control system-auth
# readlink -f /etc/pam.d/system-auth
# cat /etc/pam.d/system-auth
Первая команда отобразит:
*local - если у Вас локальные учетные записи
*sss - если у Вас доменные учетные записи через Samba
Вторая команда отобразит:
*/etc/pam.d/system-auth-local - если у Вас локальные учетные записи
*/etc/pam.d/system-auth-sss - если у Вас доменные учетные записи через Samba
Третья команда отобразит:
*политики со значениями system-auth-local-only и system-auth-common - если у Вас локальные учетные записи
*политики со значениями pam_permit.so, system-auth-sss-only, system-auth-local-only и system-auth-common - если у Вас доменные учетные записи через Samba
 
===Методы системных политик (System policy method) +===
Чтобы узнать, какие системные политики применяются, локальные или удаленные, нужно выполнить три команды:
<pre>
<pre>
check_system_auth()
/usr/sbin/control system-policy
{
readlink -f /etc/pam.d/system-policy
    local auth=
cat /etc/pam.d/system-policy
    auth=$(/usr/sbin/control system-auth)
    _command /usr/sbin/control system-auth
    _command readlink -f /etc/pam.d/system-auth
    _command -x cat /etc/pam.d/system-auth
    test -n "$auth" -a "$auth" != "unknown"
}
</pre>
</pre>
По результатам этих команд можно определить тип политик.


 
Если команды вывели:
===Включение аутентификации доменной системы (Domain system authentication enabled)===
*remote
*/etc/pam.d/system-policy-remote
*
<pre>
<pre>
test_domain_system_auth()
#%PAM-1.0
{
session required pam_mkhomedir.so silent
    test -n "$SYSTEM_AUTH" ||
        SYSTEM_AUTH=local
    _command /usr/sbin/control system-auth
    _command test "$SYSTEM_AUTH" != "local" || return 2
}
</pre>
</pre>
То, политики доменные.


===Метод системной политики (System policy method)===
Если команды вывели:
*local
*/etc/pam.d/system-policy-local
<pre>
<pre>
check_system_policy()
#%PAM-1.0
{
    local policy=
    policy=$(/usr/sbin/control system-policy)
    _command /usr/sbin/control system-policy
    _command readlink -f /etc/pam.d/system-policy
    _command -x cat /etc/pam.d/system-policy
    test -n "$policy" -a "$policy" != "unknown"
}
</pre>
</pre>
То, политики локальные.


===Включение системных групповых политик (System group policy enabled)===
===Включение системных групповых политик (System group policy enabled)===
Строка 136: Строка 132:
Если файл будет найден, кэш доменных учетных данных существует, если нет, то используются локальные учетные записи.
Если файл будет найден, кэш доменных учетных данных существует, если нет, то используются локальные учетные записи.


===Проверка списка учетных данных компьютера в keytab-файле (Check machine credentials list in keytab)===
===Проверка списка учетных данных компьютера в keytab-файле (Check machine credentials list in keytab) +===
<pre>
<pre>
klist -ke
# klist -ke
</pre>
</pre>


=== Проверка конфигурации преобразователя имен (Check nameserver resolver configuration)===
=== Проверка конфигурации преобразователя имен (Check nameserver resolver configuration) +===
Следующие команды проверят наличие конфигурационного файла преобразователя имен (resolv.conf) и выведут его содержимое.
<pre>
<pre>
 
$ ls -l /etc/resolv.conf
$ cat /etc/resolv.conf
</pre>
</pre>


Строка 151: Строка 149:
</pre>
</pre>


===Проверка конфигурации Samba (Check Samba configuration)===
===Проверка конфигурации Samba (Check Samba configuration) +-===
<pre>
<pre>
 
ls -l /etc/samba/smb.conf
grep -v -e "'^\s*[#;]'" -e "'^\s*$'" /etc/samba/smb.conf
testparm -l -s
</pre>
</pre>


===Сравнение мировмира[http://smb-conf.ru/tag/realm [i]] Samba и krb5 (Compare Samba and krb5 realms)===
===Сравнение миров [http://smb-conf.ru/tag/realm [i]] Samba и krb5 (Compare Samba and krb5 realms)===
<pre>
<pre>


Строка 171: Строка 171:
</pre>
</pre>


===Проверка синхронизации времени (Check time synchronization)===
===Проверка статуса синхронизации времени (Check time synchronization) +===
<pre>
<pre>
 
$ timedatectl
</pre>
</pre>
Смотрим значение строки '''System clock synchronized'''.


===Включение синхронизации времени (Time synchronization enabled)===
===Проверка, включена ли синхронизация времени (Time synchronization enabled) +===
<pre>
<pre>
 
$ timedatectl show -p NTPSynchronized --value
</pre>
</pre>
Если результатом команды будет yes - синхронизация включена, если no - то выключена.


===Проверка доступности серверов имен (Check nameservers availability)===
===Проверка доступности серверов имен (Check nameservers availability)===
Строка 186: Строка 188:
</pre>
</pre>


===Проверка списка контроллеров домена (Check domain controllers list)===
===Вывод списка контроллеров домена (Check domain controllers list) +===
{{Note|В скрипте зависимость от другого скрипта и т.д}}
Следующая команда выведет список контроллеров в указанном домене (в примере domain.ru):
<pre>
<pre>
check_domain_controllers()
host -t srv _ldap._tcp.domain.ru | cut -d ' ' -f 8
{
    local retval=2
    local hostcmd="host -t srv _ldap._tcp.$DOMAIN_DOMAIN | cut -d ' ' -f 8"
    local resolv_msg=
    local controllers_names=
    __command_msg "$hostcmd"
    controllers_names=$(_command -q "$hostcmd" || retval=2)
    echo $controllers_names | sed 's/ /\n/g'
    echo
    for controller_name in $controllers_names; do
        resolv_msg="host $controller_name | sed 's/^.* //g'"
        _command "$resolv_msg"
    done
    for controller_name in $controllers_names; do
        # TODO: Add controller check by ip
        _check_domain_controller $controller_name && retval=0
    done
    test -z "$controllers_names" && retval=2
    ! is_system_auth_local && test $retval != 0 && retval=1
    return $retval
}
</pre>
</pre>


===Проверка Kerberos и записей LDAP SRV (Check Kerberos and LDAP SRV-records)===
===Проверка записей Kerberos и LDAP SRV (Check Kerberos and LDAP SRV-records)+===
<pre>
<pre>
check_kerberos_and_ldap_srv_records()
$ host -t srv "_kerberos._udp.domain.ru."
{
$ host -t srv "_ldap._tcp.domain.ru."
    test -n "$DOMAIN_DOMAIN" || return 1
    _command host -t srv "_kerberos._udp.$DOMAIN_DOMAIN"
    _command host -t srv "_ldap._tcp.$DOMAIN_DOMAIN"
}
</pre>
</pre>
Где domain.ru - Ваш домен.
Вы должны получить ответ со списком всех контроллеров домена в Вашей сети:
$ host -t srv "_kerberos._udp.domain.ru."
_kerberos._udp.domain.ru has SRV record 0 100 88 samba.domain.ru.
_kerberos._udp.domain.ru has SRV record 0 100 88 dc2.domain.ru.
_kerberos._udp.domain.ru has SRV record 0 100 88 ad-replice.domain.ru.
$ host -t srv "_ldap._tcp.domain.ru."
_ldap._tcp.domain.ru has SRV record 0 100 389 samba.domain.ru.
_ldap._tcp.domain.ru has SRV record 0 100 389 ad-replice.domain.ru.
_ldap._tcp.domain.ru.ru has SRV record 0 100 389 dc2.domain.ru.


===Сравнение имени NetBIOS и имени хоста (Compare NetBIOS name and hostname)===
===Сравнение имени NetBIOS и имени хоста (Compare NetBIOS name and hostname)===
Строка 264: Строка 253:


Если команда сработает, то у Вас используется Samba с WinBind.
Если команда сработает, то у Вас используется Samba с WinBind.
=Наработки=
<code>
#!/bin/bash
set -euo pipefail
. shell-terminfo
. shell-getopt
terminfo_init
PROG="domain-diag"
VERSION=0.2.2
verbose=
listcmd=
runcmd=run
logfile=/dev/null
force=
show_usage()
{
    echo "Active Directory domain environment diagnostic tool"
    echo ""
    echo "Usage: $PROG [options] [<check/test-function-name>]"
    echo ""
    echo "<check/test-function-name> must be a function name from the list of tests"
    echo ""
    echo "Options:"
    echo "  -h, --help This message"
    echo "  -V, --version Display version number"
    echo "  -v, --verbose Verbose output"
    echo "  -w, --logfile[=FILE] Write verbose output to file"
    echo "  -f, --force Force logging to existing file"
    echo "  -l, --list List of tests"
    echo ""
    exit 0;
}
print_version()
{
    echo "$VERSION"
    exit 0;
}
TEMP=$(getopt -n "$PROG" -o "v,V,w::,f,l,h" -l "verbose,version,logfile::,force,list,help" -- "$@") || show_usage
eval set -- "$TEMP"
while :; do
    case "$1" in
        -h|--help) show_usage
            ;;
        -v|--verbose) verbose=1
            ;;
        -w|--logfile) shift
            test -n "$1" && logfile="$1" || logfile="domain-diag.log"
            ;;
        -f|--force) force=1
            ;;
        -l|--list) listcmd=1
            ;;
        -V|--version) print_version "$PROG"
            ;;
        --) shift; break
            ;;
        *) fatal "Unrecognized option: $1"
            ;;
    esac
    shift
done
customcmd="$*"
msg_non_root()
{
    echo -n "$*: ["
    color_text "SKIP" blue
    echo "]"
}
msg_fail()
{
    echo -n "$*: ["
    color_text "FAIL" red
    echo "]"
}
msg_warn()
{
    echo -n "$*: ["
    color_text "WARN" yellow
    echo "]"
}
msg_done()
{
    echo -n "$*: ["
    color_text "DONE" green
    echo "]"
}
__command_msg()
{
    local p='$'
    if test "$1" = '-r'; then
        shift
        p='#'
    fi
    color_message "$p $*" bold
}
_command()
{
    local retval=0
    local x=
    local q=
    local r=
    if test "$1" = '-q'; then
        shift
        q=1
    fi
    if test "$1" = '-r'; then
        shift
        r=1
    fi
    if test "$1" = '-x'; then
        shift
        x=1
    fi
    test -z "$q" && test -z "$r" && __command_msg "$*"
    test -z "$q" && test -n "$r" && __command_msg -r "$*"
    test -z "$x" || echo <nowiki>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</nowiki>
    eval "$*" || retval=$?
    test -z "$x" || echo <nowiki>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</nowiki>
    echo
    return $retval
}
__header()
{
    color_message "===============================================================================" bold white
}
__footer()
{
    color_message "===============================================================================" bold white
}
__short_msg()
{
    case "$1" in
        0) msg_done  "$2" ;;
        2) msg_warn  "$2" ;;
        102) msg_non_root  "$2" ;;
        *) msg_fail "$2" ;;
    esac
}
__delimiter()
{
    echo "-------------------------------------------------------------------------------"
}
__check_title()
{
    color_message "$1" bold white
}
__newline()
{
    echo
}
__log()
{
    test -z $verbose && tee -a "$logfile" 1>/dev/null 2>&1 ||
        tee -a "$logfile"
}
__log_force_print()
{
    tee -a "$logfile"
}
print_head()
{
    __header | __log
    __check_title "| Samba environment diagnostic tool |" | __log
    __delimiter | __log
    echo "Version: $VERSION" | __log
    echo "Date: $(date)" | __log
    __delimiter | __log
    echo "System information" | __log
    echo "Kernel: $(uname -r)" | __log
    echo "Branch: $(apt-repo list | cut -d ' ' -f 2 | grep -e '^\[.*\]$' | tail -1 | sed -E 's/\[(.*)\]/\1/')" | __log
    __footer | __log
    __newline | __log
}
is_root()
{
    if test "$(id -u)" != 0; then
        return 1
    fi
    return 0
}
__not_root_skip()
{
    local msg=
    if test -n "${1+x}" && test "$1" = "-m"; then
        shift
        msg="$1"
    fi
    echo -n "Running not by root, SKIP: $msg"
    echo
    echo
}
run()
{
    local retval=126
    local func="$1"
    local msg
    msg=$(printf "| %s |" "$func")
    __header | __log
    __check_title "$msg" | __log
    __delimiter | __log
    __newline | __log
    $func 2>&1 | __log && retval=0 || retval=$?
    __delimiter | __log
    __short_msg $retval "$2" | __log_force_print
    __footer | __log
    __newline | __log
}
check_hostnamectl()
{
    local retval=0
    local static_host=
    local transient_host=
    transient_host="$(hostname)" || retval=1
    static_host="$(hostnamectl --static)" || retval=1
    _command hostnamectl || retval=1
    test "$static_host" = "$transient_host" || retval=1
    return $retval
}
test_hostname()
{
    local host="$HOSTNAME_COMMON"
    echo $host
    echo
    test "$host" != "${host/.}" || return 2
}
check_system_auth()
{
    local auth=
    auth=$(/usr/sbin/control system-auth)
    _command /usr/sbin/control system-auth
    _command readlink -f /etc/pam.d/system-auth
    _command -x cat /etc/pam.d/system-auth
    test -n "$auth" -a "$auth" != "unknown"
}
test_domain_system_auth()
{
    test -n "$SYSTEM_AUTH" ||
        SYSTEM_AUTH=local
    _command /usr/sbin/control system-auth
    _command test "$SYSTEM_AUTH" != "local" || return 2
}
is_system_auth_local()
{
    test "$SYSTEM_AUTH" = "local"
}
check_system_policy()
{
    local policy=
    policy=$(/usr/sbin/control system-policy)
    _command /usr/sbin/control system-policy
    _command readlink -f /etc/pam.d/system-policy
    _command -x cat /etc/pam.d/system-policy
    test -n "$policy" -a "$policy" != "unknown"
}
test_gpupdate_system_policy()
{
    test -n "$SYSTEM_POLICY" ||
        SYSTEM_POLICY=local
    _command /usr/sbin/control system-policy
    _command test "$SYSTEM_POLICY" == "gpupdate" || return 2
}
check_krb5_conf_exists()
{
    local retval=0
    _command ls -l /etc/krb5.conf
    if ! test -e /etc/krb5.conf; then
        is_system_auth_local && retval=2 || retval=1
    else
        _command -x cat /etc/krb5.conf
    fi
    return $retval
}
check_krb5_conf_ccache()
{
    local ccache=
    ccache=$(/usr/sbin/control krb5-conf-ccache)
    _command /usr/sbin/control krb5-conf-ccache
    test -n "$ccache" -a "$ccache" != "unknown"
}
test_keyring_krb5_conf_ccache()
{
    local ccache=
    ccache=$(/usr/sbin/control krb5-conf-ccache)
    _command /usr/sbin/control krb5-conf-ccache
    _command test -n "$ccache" -a "$ccache" == "keyring" || return 2
}
check_krb5_conf_kdc_lookup()
{
    local retval=0
    echo -n "/etc/krb5.conf: dns_lookup_kdc "
    if grep -q '^\s*dns_lookup_kdc\s*=\s*\([Tt][Rr][Uu][Ee]\|1\|[Yy][Ee][Ss]\)\s*$' /etc/krb5.conf; then
        echo "is enabled"
    else
        if grep -q '^\s*dns_lookup_kdc\s*=' /etc/krb5.conf; then
            echo "is disabled"
            retval=1
        else
            echo "is enabled by default"
            retval=2
        fi
    fi
    echo
    return $retval
}
check_krb5_keytab_exists()
{
    local retval=0
    _command ls -l /etc/krb5.keytab
    if ! test -e /etc/krb5.keytab; then
        is_system_auth_local && retval=2 || retval=1
    fi
    return $retval
}
check_keytab_credential_list()
{
    local retval=0
    if ! is_root; then
        __not_root_skip && return 102
    fi
    if ! _command -r klist -ke; then
        is_system_auth_local && retval=2 || retval=1
    fi
    return $retval
}
check_resolv_conf()
{
    local retval=0
    _command ls -l /etc/resolv.conf
    _command -x cat /etc/resolv.conf
}
compare_resolv_conf_with_default_realm()
{
    echo "SEARCH_DOMAIN = '$SEARCH_DOMAIN'"
    echo "KRB5_DEFAULT_REALM = '$KRB5_DEFAULT_REALM'"
    echo
    local domain=
    local realm=
    domain=$(echo "$SEARCH_DOMAIN" | tr '[:upper:]' '[:lower:]')
    realm=$(echo "$KRB5_DEFAULT_REALM" | tr '[:upper:]' '[:lower:]')
    if test -z "$realm"; then
        return 2
    fi
    test -n "$domain" || return 2
    test "$domain" = "$realm" || return 2
}
check_smb_conf()
{
    local retval=0
    _command ls -l /etc/samba/smb.conf
    _command -x grep -v -e "'^\s*[#;]'" -e "'^\s*$'" /etc/samba/smb.conf
    _command -x testparm -l -s
}
compare_smb_realm_with_krb5_default_realm()
{
    echo "SMB_REALM = '$SMB_REALM'"
    echo "KRB5_DEFAULT_REALM = '$KRB5_DEFAULT_REALM'"
    echo
    test -n "$SMB_REALM" || return 2
    test -n "$KRB5_DEFAULT_REALM" || return 2
    test "$KRB5_DEFAULT_REALM" = "$SMB_REALM" || return 2
}
test_smb_realm()
{
    local retval=0
    DOMAIN_REALM="$KRB5_DEFAULT_REALM"
    if test -n "$SMB_REALM"; then
        DOMAIN_REALM="$SMB_REALM"
        DOMAIN_DOMAIN="$(echo "$SMB_REALM" | tr '[:upper:]' '[:lower:]')"
    else
        test -z "$DOMAIN_REALM" ||
            DOMAIN_DOMAIN="$(echo "$DOMAIN_REALM" | tr '[:upper:]' '[:lower:]')"
        test -n "$DOMAIN_REALM" ||
            DOMAIN_REALM="$(echo "$DOMAIN_DOMAIN" | tr '[:lower:]' '[:upper:]')"
        is_system_auth_local && retval=2 || retval=1
    fi
    echo "DOMAIN_REALM = '$DOMAIN_REALM'"
    echo "DOMAIN_DOMAIN = '$DOMAIN_DOMAIN'"
    echo
    return $retval
}
test_domainname()
{
    HOSTNAME_DOMAIN=$(hostname -d)
    if test "$HOSTNAME_DOMAIN" = "$HOSTNAME_SHORT" ||
            test "$HOSTNAME_DOMAIN" = '(none)' ||
            test -z "$HOSTNAME_DOMAIN"; then
        HOSTNAME_DOMAIN=
        echo "HOSTNAME_DOMAIN = '$HOSTNAME_DOMAIN'"
        echo
        return 2
    fi
    if test -z "$DOMAIN_DOMAIN"; then
        DOMAIN_DOMAIN="$HOSTNAME_DOMAIN"
        test -n "$DOMAIN_REALM" ||
            DOMAIN_REALM="$(echo "$DOMAIN_DOMAIN" | tr '[:lower:]' '[:upper:]')"
        echo "HOSTNAME_DOMAIN = '$HOSTNAME_DOMAIN'"
        echo "Update realm and domain from HOSTNAME_DOMAIN:"
        echo " DOMAIN_REALM = '$DOMAIN_REALM'"
        echo " DOMAIN_DOMAIN = '$DOMAIN_DOMAIN'"
        echo
        return 2
    fi
    echo "HOSTNAME_DOMAIN = '$HOSTNAME_DOMAIN'"
    echo
    test "$HOSTNAME_DOMAIN" = "$DOMAIN_DOMAIN" || return 1
}
check_time_synchronization()
{
    local retval=0
    _command timedatectl || return 1
}
test_time_synchronization()
{
    local retval=0
    local func="test \$(timedatectl show -p NTPSynchronized --value) == \"yes\""
    __command_msg "$func"
    _command -q "$func" || retval=2
    return $retval
}
_check_nameserver()
{
    local ns="$1"
    if _command ping -c 2 -i2 "$ns"; then
        test -z "$DOMAIN_DOMAIN" || _command host "$DOMAIN_DOMAIN" "$ns"
    else
        return 1
    fi
}
check_nameservers()
{
    retval1=0
    retval2=0
    retval3=0
    if [ -n "$NAMESERVER1" ]; then
        _check_nameserver "$NAMESERVER1" || retval1=1
    fi
    if [ -n "$NAMESERVER2" ]; then
        _check_nameserver "$NAMESERVER2" || retval2=1
    fi
    if [ -n "$NAMESERVER3" ]; then
        _check_nameserver "$NAMESERVER3" || retval3=1
    fi
    if test "$retval1" = 0 -a "$retval2" = 0 -a "$retval3" = 0; then
        return 0;
    fi
    if test "$retval1" = 1 -a "$retval2" = 1 -a "$retval3" = 1; then
        return 1;
    fi
    return 2
}
_ldap_get_computer()
{
    local retval=0
    local dc="$1"
    local computer="$2"
    local filter=""
    local domain_dn=
    if test -n "${3+x}"; then
        filter="$3"
    fi
    domain_dn=$(echo $DOMAIN_DOMAIN | sed 's/\./,dc=/g' | sed 's/^/dc=/')
    local searchcmd="ldapsearch -o nettimeout=30 -Y GSSAPI -N -h $dc -b $domain_dn"
    searchcmd="$searchcmd \"(&(ObjectClass=computer)(objectCategory=Computer)(name=$computer))\""
    __command_msg "$searchcmd $filter"
    _command -q "$searchcmd" "$filter" || retval=2
    return $retval
}
_check_domain_controller()
{
    local retval=0
    local dc="$1"
    local computer=
    local ldap_computer=
    local computer=
    local hostname_upper=
    hostname_upper=$(echo $HOSTNAME_SHORT | tr '[:lower:]' '[:upper:]')
    local domain_upper=
    domain_upper=$(echo $DOMAIN_DOMAIN | tr '[:lower:]' '[:upper:]')
    local kinit_realm="$hostname_upper\$\@$domain_upper"
    if is_root; then
        KRB5CCNAME="FILE:/tmp/domain-diag_krb5cc_%{uid}"
        _command kinit -k "$kinit_realm" || retval=2
        if test "$retval" != "0"; then
            is_system_auth_local && return 2 || return 1
        fi
    fi
   
    computer="$(echo $1 | sed 's/\..*$//')"
    _ldap_get_computer "$dc" "$computer" "| grep 'operating\|name:' | cut -d ' ' -f 2 | tr '\n' ' '" || retval=2
   
    __newline
    _command kdestroy -A
    return $retval
}
check_domain_controllers()
{
    local retval=2
    local hostcmd="host -t srv _ldap._tcp.$DOMAIN_DOMAIN | cut -d ' ' -f 8"
    local resolv_msg=
    local controllers_names=
    __command_msg "$hostcmd"
    controllers_names=$(_command -q "$hostcmd" || retval=2)
    echo $controllers_names | sed 's/ /\n/g'
    echo
    for controller_name in $controllers_names; do
        resolv_msg="host $controller_name | sed 's/^.* //g'"
        _command "$resolv_msg"
    done
    for controller_name in $controllers_names; do
        # TODO: Add controller check by ip
        _check_domain_controller $controller_name && retval=0
    done
    test -z "$controllers_names" && retval=2
    ! is_system_auth_local && test $retval != 0 && retval=1
    return $retval
}
check_kerberos_and_ldap_srv_records()
{
    test -n "$DOMAIN_DOMAIN" || return 1
    _command host -t srv "_kerberos._udp.$DOMAIN_DOMAIN"
    _command host -t srv "_ldap._tcp.$DOMAIN_DOMAIN"
}
compare_netbios_name()
{
    local netbios=
    local host=
    netbios=$(echo "$SMB_NETBIOS_NAME" | tr '[:upper:]' '[:lower:]')
    host=$(echo "$HOSTNAME_SHORT" | tr '[:upper:]' '[:lower:]')
    echo "SMB_NETBIOS_NAME = '$SMB_NETBIOS_NAME'"
    echo "HOSTNAME_SHORT = '$HOSTNAME_SHORT'"
    echo
    test "$netbios" = "$host" || return 1
}
check_common_packages()
{
    local retval=0
    _command rpm -q alterator-auth || retval=1
    _command rpm -q libnss-role || retval=1
    _command rpm -q libkrb5 || retval=1
    _command rpm -q libsmbclient || retval=1
    return $retval
}
check_group_policy_packages()
{
    local retval=0
    _command rpm -q local-policy || retval=1
    _command rpm -q gpupdate || retval=1
    return $retval
}
check_sssd_ad_packages()
{
    local retval=0
    _command rpm -q task-auth-ad-sssd || retval=1
    return $retval
}
check_sssd_winbind_packages()
{
    local retval=0
    _command rpm -q task-auth-ad-winbind || retval=2
    return $retval
}
list_run()
{
    test -z $verbose &&
        echo "$1" ||
        echo "$1: $2"
}
custom_run()
{
    if echo "$customcmd"  | tr ' ' '\n' | grep -q "^$1\$"; then
        run "$1" "$2"
    fi
}
init_log()
{
    local log_index
    if test -e "$logfile" && test "$logfile" != "/dev/null" && test -z "$force"; then
        log_index=$(find . -maxdepth 1 -name "$logfile.*" 2>/dev/null | sort -V | tail -1 | sed -E 's/^.*\.([^.]*)$/\1/' || true)
        logfile="$logfile".$(($log_index + 1))
    fi
    if test "$logfile" != "/dev/null"; then
        echo -n > "$logfile"
    fi
}
init_vars()
{
    local host=
    host=$(hostname)
    local domain realm
    HOSTNAME_COMMON="$host"
    HOSTNAME_SHORT=$(hostname -s)
    HOSTNAME_FQDN=$(hostname -f)
    NAMESERVER1=$(grep "^nameserver\s\+" /etc/resolv.conf | sed -e 's/^nameserver\s\+//' -e 's/\s/\n/' | head -1)
    NAMESERVER2=$(grep "^nameserver\s\+" /etc/resolv.conf | sed -e 's/^nameserver\s\+//' -e 's/\s/\n/' | head -2 | tail -1)
    NAMESERVER3=$(grep "^nameserver\s\+" /etc/resolv.conf | sed -e 's/^nameserver\s\+//' -e 's/\s/\n/' | head -3 | tail -1)
    SMB_REALM=
    SMB_NETBIOS_NAME=
    if which testparm >/dev/null 2>&1; then
        SMB_REALM=$(testparm -l -v -s 2>/dev/null | grep "^\s*realm\s*=" | sed -e 's/^\s*realm\s*=\s*//' -e 's/\s*$//')
        SMB_NETBIOS_NAME=$(testparm -l -v -s 2>/dev/null | grep "^\s*netbios name\s*=" | sed -e 's/^\s*netbios name\s*=\s*//' -e 's/\s*$//')
    fi
    SEARCH_DOMAIN=
    if test -f /etc/resolv.conf; then
        SEARCH_DOMAIN=$(grep "^search\s\+" /etc/resolv.conf || true | sed -e 's/^search\s\+//' -e 's/\s/\n/' | head -1 )
    fi
    KRB5_DEFAULT_REALM=
    if test -e /etc/krb5.conf; then
        KRB5_DEFAULT_REALM=$(grep "^\s*default_realm\s\+" /etc/krb5.conf | sed -e 's/^\s*default_realm\s*=\s*//' -e 's/\s*$//')
    fi
    domain=$(echo "$SEARCH_DOMAIN" | tr '[:upper:]' '[:lower:]')
    realm=$(echo "$KRB5_DEFAULT_REALM" | tr '[:upper:]' '[:lower:]')
    DOMAIN_DOMAIN="$domain"
    if test -n "$realm"; then
        DOMAIN_DOMAIN="$realm"
    fi
    SYSTEM_AUTH="$(/usr/sbin/control system-auth)"
    SYSTEM_POLICY="$(/usr/sbin/control system-policy)"
}
test -z $listcmd || runcmd=list_run
init_log
print_head
init_vars
test -z "$customcmd" || runcmd=custom_run
$runcmd check_hostnamectl "Check hostname persistance"
$runcmd test_hostname "Test hostname is FQDN (not short)"
$runcmd check_system_auth "System authentication method"
$runcmd test_domain_system_auth "Domain system authentication enabled"
$runcmd check_system_policy "System policy method"
$runcmd test_gpupdate_system_policy "System group policy enabled"
$runcmd check_krb5_conf_exists "Check Kerberos configuration exists"
$runcmd check_krb5_conf_ccache "Kerberos credential cache status"
$runcmd test_keyring_krb5_conf_ccache "Using keyring as kerberos credential cache"
$runcmd check_krb5_conf_kdc_lookup "Check DNS lookup kerberos KDC status"
$runcmd check_krb5_keytab_exists "Check machine crendetial cache is exists"
$runcmd check_keytab_credential_list "Check machine credentials list in keytab"
$runcmd check_resolv_conf "Check nameserver resolver configuration"
$runcmd compare_resolv_conf_with_default_realm "Compare krb5 realm and first search domain"
$runcmd check_smb_conf "Check Samba configuration"
$runcmd compare_smb_realm_with_krb5_default_realm "Compare samba and krb5 realms"
$runcmd test_smb_realm "Check Samba domain realm"
$runcmd test_domainname "Check hostname FQDN domainname"
$runcmd check_time_synchronization "Check time synchronization"
$runcmd test_time_synchronization "Time synchronization enabled"
$runcmd check_nameservers "Check nameservers availability"
$runcmd check_domain_controllers "Check domain controllers list"
$runcmd check_kerberos_and_ldap_srv_records "Check Kerberos and LDAP SRV-records"
$runcmd compare_netbios_name "Compare NetBIOS name and hostname"
$runcmd check_common_packages "Check common packages"
$runcmd check_group_policy_packages "Check group policy packages"
$runcmd check_sssd_ad_packages "Check SSSD AD packages"
$runcmd check_sssd_winbind_packages "Check SSSD Winbind packages"
test -f "$logfile" && test -w "$logfile" &&
        sed -i 's/\x1b\[[0-9;]*[mGKH]//g' $logfile
</code>

Текущая версия от 17:51, 17 апреля 2023

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.
Примечание: Пожалуйста, обратите внимание, что страница в разработке. Информация может быть неполной и не достоверной.

Тестирование и диагностика Samba и ActiveDirectory

Проверка постоянства имени компьютера (Check hostname persistance) +

Постоянство имени компьютера - это сохранение имени компьютера после перезагрузки.

Настроить имя компьютера можно двумя способами. Так, чтобы оно оставалось до перезагрузки и так, чтобы оно сохранялось после него.

Следующая команда покажет временное (не сохраненное) имя:

$ hostname

А данная постоянное:

$ hostnamectl --static

Если вывод команд различаются, то измененное имя не сохранится.

Проверка имени хоста в FQDN [не короткое] (Test hostname is FQDN [not short])

FQDN (от англ. Fully Qualified Domain Name — «полностью определённое имя домена», иногда сокращается до «полное имя домена») — имя домена, не имеющее неоднозначностей в определении.

test_hostname()
{
    local host="$HOSTNAME_COMMON"
    echo $host
    echo
    test "$host" != "${host/.}" || return 2
}

Если значение:

  • 0, то ...
  • 2, то ...

Метод аутентификации системы (System authentication method) +

Проверить метод входа в систему можно тремя командами:

# /usr/sbin/control system-auth
# readlink -f /etc/pam.d/system-auth
# cat /etc/pam.d/system-auth

Первая команда отобразит:

  • local - если у Вас локальные учетные записи
  • sss - если у Вас доменные учетные записи через Samba

Вторая команда отобразит:

  • /etc/pam.d/system-auth-local - если у Вас локальные учетные записи
  • /etc/pam.d/system-auth-sss - если у Вас доменные учетные записи через Samba

Третья команда отобразит:

  • политики со значениями system-auth-local-only и system-auth-common - если у Вас локальные учетные записи
  • политики со значениями pam_permit.so, system-auth-sss-only, system-auth-local-only и system-auth-common - если у Вас доменные учетные записи через Samba

Методы системных политик (System policy method) +

Чтобы узнать, какие системные политики применяются, локальные или удаленные, нужно выполнить три команды:

/usr/sbin/control system-policy
readlink -f /etc/pam.d/system-policy
cat /etc/pam.d/system-policy

По результатам этих команд можно определить тип политик.

Если команды вывели:

  • remote
  • /etc/pam.d/system-policy-remote
#%PAM-1.0
session required pam_mkhomedir.so silent

То, политики доменные.

Если команды вывели:

  • local
  • /etc/pam.d/system-policy-local
#%PAM-1.0

То, политики локальные.

Включение системных групповых политик (System group policy enabled)

test -n "$SYSTEM_POLICY" ||
       SYSTEM_POLICY=local
   _command /usr/sbin/control system-policy
   _command test "$SYSTEM_POLICY" == "gpupdate" || return 2

Проверка существующих настроек Kerberos (Check Kerberos configuration exists)

   local retval=0
   _command ls -l /etc/krb5.conf
   if ! test -e /etc/krb5.conf; then
       is_system_auth_local && retval=2 || retval=1
   else
       _command -x cat /etc/krb5.conf
   fi
   return $retval

Статус кеша учетных данных Kerberos (Kerberos credential cache status)

local ccache=
   ccache=$(/usr/sbin/control krb5-conf-ccache)
   _command /usr/sbin/control krb5-conf-ccache
   test -n "$ccache" -a "$ccache" != "unknown"

Использование связки ключей в качестве кеша учетных данных Kerberos (Using keyring as kerberos credential cache)

 local ccache=
   ccache=$(/usr/sbin/control krb5-conf-ccache)
   _command /usr/sbin/control krb5-conf-ccache
   _command test -n "$ccache" -a "$ccache" == "keyring" || return 2

Проверка состояния поиска DNS kerberos KDC (Check DNS lookup kerberos KDC status)

local retval=0
   echo -n "/etc/krb5.conf: dns_lookup_kdc "
   if grep -q '^\s*dns_lookup_kdc\s*=\s*\([Tt][Rr][Uu][Ee]\|1\|[Yy][Ee][Ss]\)\s*$' /etc/krb5.conf; then
       echo "is enabled"
   else
       if grep -q '^\s*dns_lookup_kdc\s*=' /etc/krb5.conf; then
           echo "is disabled"
           retval=1
       else
           echo "is enabled by default"
           retval=2
       fi
   fi
   echo
   return $retval

Проверка существования кэша учетных данных компьютера (Check machine crendetial cache is exists) +

ls -l /etc/krb5.keytab

Если файл будет найден, кэш доменных учетных данных существует, если нет, то используются локальные учетные записи.

Проверка списка учетных данных компьютера в keytab-файле (Check machine credentials list in keytab) +

# klist -ke

Проверка конфигурации преобразователя имен (Check nameserver resolver configuration) +

Следующие команды проверят наличие конфигурационного файла преобразователя имен (resolv.conf) и выведут его содержимое.

$ ls -l /etc/resolv.conf
$ cat /etc/resolv.conf

Сравнение мира[i] krb5 и первого поискового домена (Compare krb5 realm and first search domain)


Проверка конфигурации Samba (Check Samba configuration) +-

ls -l /etc/samba/smb.conf
grep -v -e "'^\s*[#;]'" -e "'^\s*$'" /etc/samba/smb.conf
testparm -l -s

Сравнение миров [i] Samba и krb5 (Compare Samba and krb5 realms)


Проверка мира[i] домена Samba (Check Samba domain realm)


Проверка хост-имени доменного имени FQDN (Check hostname FQDN domainname)


Проверка статуса синхронизации времени (Check time synchronization) +

$ timedatectl

Смотрим значение строки System clock synchronized.

Проверка, включена ли синхронизация времени (Time synchronization enabled) +

$ timedatectl show -p NTPSynchronized --value

Если результатом команды будет yes - синхронизация включена, если no - то выключена.

Проверка доступности серверов имен (Check nameservers availability)


Вывод списка контроллеров домена (Check domain controllers list) +

Следующая команда выведет список контроллеров в указанном домене (в примере domain.ru):

host -t srv _ldap._tcp.domain.ru | cut -d ' ' -f 8

Проверка записей Kerberos и LDAP SRV (Check Kerberos and LDAP SRV-records)+

$ host -t srv "_kerberos._udp.domain.ru."
$ host -t srv "_ldap._tcp.domain.ru."

Где domain.ru - Ваш домен.

Вы должны получить ответ со списком всех контроллеров домена в Вашей сети:

$ host -t srv "_kerberos._udp.domain.ru."
_kerberos._udp.domain.ru has SRV record 0 100 88 samba.domain.ru.
_kerberos._udp.domain.ru has SRV record 0 100 88 dc2.domain.ru.
_kerberos._udp.domain.ru has SRV record 0 100 88 ad-replice.domain.ru.
$ host -t srv "_ldap._tcp.domain.ru."
_ldap._tcp.domain.ru has SRV record 0 100 389 samba.domain.ru.
_ldap._tcp.domain.ru has SRV record 0 100 389 ad-replice.domain.ru.
_ldap._tcp.domain.ru.ru has SRV record 0 100 389 dc2.domain.ru.

Сравнение имени NetBIOS и имени хоста (Compare NetBIOS name and hostname)

compare_netbios_name()
{
    local netbios=
    local host=
    netbios=$(echo "$SMB_NETBIOS_NAME" | tr '[:upper:]' '[:lower:]')
    host=$(echo "$HOSTNAME_SHORT" | tr '[:upper:]' '[:lower:]')

    echo "SMB_NETBIOS_NAME = '$SMB_NETBIOS_NAME'"
    echo "HOSTNAME_SHORT = '$HOSTNAME_SHORT'"
    echo
    test "$netbios" = "$host" || return 1
}

Проверка общих пакетов (Check common packages) +

Чтобы проверить, что у Вас установлены все общие пакеты, выполните следующие команды:

# rpm -q alterator-auth
# rpm -q libnss-role
# rpm -q libkrb5
# rpm -q libsmbclient

Все вышеуказанные пакеты должны быть установлены.

Проверка пакетов групповых политик (Check group policy packages) +

 # rpm -q local-policy
 # rpm -q gpupdate

Если обе команды сработают, то у Вас установлены пакеты для групповых политик.

Проверка пакетов SSSD AD (Check SSSD AD packages) +

# rpm -q task-auth-ad-sssd

Если команда сработает, то у Вас используется Samba с AD-SSSD.

Проверка пакетов SSD Winbind (Check SSSD Winbind packages) +

# rpm -q task-auth-ad-winbind

Если команда сработает, то у Вас используется Samba с WinBind.