• Ошибка — Cannot find key for kvno in keytab

    В один момент перестала работать Kerberos/SSO аутентификация на сайте размещённом на веб-сервере Apache, в логах значатся ошибки вида:

    ...
    [Mon Sep 04 11:04:58.724720 2023] [auth_kerb:error] [pid 19547] [client 10.51.90.61:58932] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, Cannot find key for HTTP/svc.web@JAKONDA.LOCAL kvno 4 in keytab)
    ...
    

     

    Проверяем текущее значение номера Key Version Number (KVNO) в keytab-файле:

    klist -k /etc/svc.web.keytab
    
    Keytab name: FILE:/etc/svc.web.keytab
    KVNO Principal
    ---- --------------------------------------------------------------------------
       2 HTTP/zabbix.jakonda.ru@JAKONDA.LOCAL
    

    Видим что номер Key Version Number (KVNO) учётной записи равен 2, в то время у учетной записи AD атрибут msDS-KeyVersionNumber равен 4.

    Такое может получится при внесении изменений в учетную запись, к примеру при смене пароля и т.д., в этом случае все keytab-файлы, которые генерировались ранее для этой учётной записи (где номер KVNO меньше текущего) становятся недействительными.

     

    В Windows можно посмотреть текущее значение KVNO для учетной записи в свойствах учётной записи — атрибут msDS-KeyVersionNumber

    Читать далее

  • Настройка Kerberos Single Sign-On (SSO) с GSSAPI на Debian 11 Bullseye.

    Рассмотрим как настроить Kerberos Single Sign-On (SSO) с GSSAPI в Apache веб-сервере на Debian 11 Bullseye.

    Исходные данные:

    • Windows домен — jakonda.local
    • Доменная служебная учетная запись — svc.web
    • Linux машина — Debian 11

     

    Сперва необходимо создать сервисную учетную запись (в моем случае это будет svc.web) и сгенерировать для нее KEYTAB-файл на домен контроллере Windows.

    Делается все это командой ниже, не забываем подставить свои данные вместо моих.

    ktpass -princ HTTP/web.jakonda.ru@JAKONDA.LOCAL -mapuser svc.web@JAKONDA.LOCAL -pass 3T2XgYCz2IFcBUo0altu -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out C:\Keytabs\svc.web.keytab
    ИНФОМАЦИЯ. где web.jakonda.ru — это имя веб-сервера на котором должна работать Kerberos SSO аутентификация, а JAKONDA.LOCAL это имя домена. Важно соблюдать регистр написания имени домена.

    Передаем сгенерированный KEYTAB-файл на Debian любым удобным способом и размещаем его в каталоге /etc, либо в любом другом безопасном месте месте.

     

    Назначим права и уровень доступа к файлу:

    chown root:www-data /etc/svc.web.keytab
    chmod 640 /etc/svc.web.keytab

     

    Устанавливаем пакеты веб-сервера apache, модуль аутентификации gssapi для него и kerberos.

    apt-get install apache2 apache2-utils libapache2-mod-auth-gssapi krb5-user

    Читать далее

  • Как отобразить реальный IP-адрес клиента в логах Apache 2.4, работающем за прокси в Nginx.

    В продакшене используется связка Nginx + Apache, где Nginx выступает в роли прокси-сервера для Apache. Рассмотрим как передавать реальный IP-адрес клиента в Apache с прокси Nginx, для отображения правильной информации в логах Apache, в противном случае в логах Apache будет по каждому запросу будет значится адрес прокси-сервера Nginx.

     

    Nginx

    В файле конфигурации вирутального хоста в секцию location необходимо добавить следующие параметры:

    location / {
         ...
         proxy_set_header Host            $host;
         proxy_set_header X-Real-IP       $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         ...
    }

     

    Apache

    В Apache 2.4 входит модуль mod_remoteip, который может перезаписывать удаленный IP-адрес. Настроим его чтобы он принимал проброс IP-адреса клиента с прокси-сервера Nginx.

     

    Создаем конфигурацию для модуля mod_remoteip. Выполняем команду:

    cat << EOF > /etc/apache2/conf-available/remoteip.conf
    <IfModule remoteip_module>
            RemoteIPHeader X-Forwarded-For
            RemoteIPTrustedProxy 127.0.0.1
            RemoteIPInternalProxy 127.0.0.1
    </IfModule>
    EOF
    ИНФОРМАЦИЯ. В случае если у вас проси-серве Nginx и Apache разнесены по разным серверам, то в параметре RemoteIPInternalProxy необходимо указать IP-адрес прокси-сервера.

    Читать далее

  • Bash скрипт автоматизации для быстрого перехода между нужными папками на Linux.

    Простой bash скрипт автоматизации для тех кому часто приходится метаться между нужными папками.

    Тестировалась работоспособность на deb-like Linux системах, думаю на rpm тоже будет работать.

     

    Скачиваем скрипт в любую директорию и распаковываем

    wget -O hzcd.zip https://sysos.ru/download/1711
    unzip hzcd.zip

    Выполняем установку

    ./hzcd.sh --install && . ~/.bashrc
    Установка выполнится в ~/.hzcd директорию. Будут внесены изменения в ~/.bashrc

    Команды консоли:

    • .-l — показать список замапленных директорий
    • .-a — добавить текущею
    • .-d — удалить текущею

    Любой алиас из списка перейти в указанную директорию. Для себя алиасы так-же назначаю через точку например .work

    Читать далее

  • Защита Nginx от атак HTTP 404 | 429 с помощью Fail2Ban на Debian.

    Рассмотрим как обрабатывать HTTP 404 в логах веб-сервера Nginx и блокировать злоумышленников которые пытаются найти уязвимости на опубликованных сайтах с помощью Fail2Ban.

    Пример подобной атаки злоумышленников на веб-сайт размещенный на Nginx:

    130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /aslogo.jpeg HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
    130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /dexter.txt HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
    130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /dexter.html HTTP/1.1" 404 235 "-" "gobuster/3.1.0"
    130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /5553.md HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
    130.255.15.40 - - [30/Aug/2023:17:00:13 +0300] "GET /admin HTTP/1.1" 429 162 "-" "Mozilla/5.0 (pc-x86_64-linux-gnu) Siege/4.0.7"
    130.255.15.40 - - [30/Aug/2023:17:00:13 +0300] "GET /admins HTTP/1.1" 429 162 "-" "Mozilla/5.0 (pc-x86_64-linux-gnu) Siege/4.0.7"

     

    # Устанавливаем пакет fail2ban, если он не установлен:

    apt-get install fail2ban

    # Создаем фильтр Fail2Ban для поиска запросов 404:

    cat << EOF > /etc/fail2ban/filter.d/nginx-4xx.conf
    [Definition]
    failregex = ^<HOST> - - \[.*\] "(GET|POST).*HTTP.* (404|429)
    ignoreregex =
    EOF

    # Настраиваем Fail2ban для блокировки 404 запросов. В конфигурационный файл -/etc/fail2ban/jail.local добавляем:

    [nginx-4xx]
    enabled  = true
    port     = http,https
    logpath  = /var/log/nginx/*access.log
    maxretry = 20
    findtime = 10
    bantime  = 10m
    ignoreip =

    Читать далее

  • Установка актуальной версии Ansible на Debian 11 Bullseye

    Опишу как выполнить установку последний версии Ansible из исходников на Debian 11 Bullseye.
    Официальный репозиторий Ansible — https://github.com/ansible/ansible

    Для работы последних версий Ansible  требуется версия Python 3.10 и старше. Как поставить последнюю версию Python на Debian можно по этой статье.

     

    Установка

    # Выполняем установку Ansible при помощи pip для всех пользователей системы:

    python3 -m pip install ansible

    # Проверить результат установки можно командой:

    ansible --version
    ansible [core 2.15.2]
      config file = None
      configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python3.11/site-packages/ansible
      ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
      executable location = /usr/bin/ansible
      python version = 3.11.4 (main, Aug  2 2023, 16:54:45) [GCC 10.2.1 20210110] (/usr/bin/python3)
      jinja version = 3.1.2
      libyaml = True
    

    Читать далее

  • Установка Python 3.11/3.10 из исходников в Debian 11 Bullseye

    Я ниже рассмотрю установку из исходников Python 3.11. В случае если необходима версия 3.10, то действия будут аналогичные приведенным ниже.

    Все действия ниже будут выполняться от root.

    Установка

    # Устанавливаем необходимые пакеты зависимостей.

    apt-get install build-essential pkg-config libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev -y

    # Скачиваем последнюю версию исходников Python и распаковываем их.

    cd /opt
    
    wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz
    tar -Jxf Python-3.11.4.tar.xz
    
    cd Python-3.11.4
    ИНФОРМАЦИЯ. Официальная страница загрузок Python — https://www.python.org/downloads/source/

    # Конфигурируем, собираем и устанавливаем пакет — Python

    ./configure --prefix=/usr --enable-optimizations
    make
    make altinstall
    cd ..

    Читать далее

  • Настраиваем Fail2ban, для защиты Postfix от попыток авторизации с использованием SASL метода аутентификации.

    Рассмотрим как защитить Postfix от попыток авторизации с использованием SASL метода аутентификации.

    Когда проверка подлинности завершается неудачей, в лог-файл /var/log/maill.log записываются записи вида:

    Oct 20 08:00:42 mail postfix/smtps/smtpd[23234]: warning: unknown[5.34.207.172]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
    Oct 20 08:00:42 mail postfix/smtps/smtpd[23234]: lost connection after AUTH from unknown[5.34.207.172]

    С помощью Fail2Ban будем отлавливать такие астоту таких неправильных попыток аутентификации. Для этого нам нужно настроить Fail2Ban для обновления правил брандмауэра, чтобы отклонять такие IP-адреса в течение определенного периода времени. В дополнение к этому, Fail2ban также позволяет создавать уведомления по электронной почте. И, когда происходит возможная атака, Fail2ban немедленно оповещает владельца сервера по электронной почте.

     

    # Создаем фильтр Fail2Ban для поиска сбоев аутентификации:

    cat << EOF > /etc/fail2ban/filter.d/postfix-sasl.conf
    [INCLUDES]
    before = common.conf
    [Definition]
    _daemon = postfix(-\w+)?/\w+(?:/smtp[ds])?
    failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
    ignoreregex =
    EOF
    

    Читать далее

  • Подключение к MS SQL Server через ODBC в Debian 11 Bullseye

    Рассмотрим как выполнить настройку подключения к MS SQL Server через ODBC в Debian 11 Bullseye.

    Установка Microsoft ODBC Driver for SQL Server

    # Добавляем публичный GnuPG-ключ репозитория Microsoft. Добавляем репозиторий Microsoft в список репозиториев и обновляем репозиторий:

    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
    
    apt-get update
    

    # Устанавливаем пакеты ODBC, драйвер ODBC Driver for SQL Server и пакет для возможности авторизации на основе проверки подлинности:

    apt-get install -y unixodbc-dev libgssapi-krb5-2
    
    ACCEPT_EULA=Y apt-get install -y msodbcsql18
    ACCEPT_EULA=Y apt-get install -y mssql-tools18
    
    echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
    source ~/.bashrc

     

    Посмотреть информацию о настройках ODBC и список подключенных драйверов, можно командами:

    odbcinst -j
    odbcinst -q -d

    Читать далее

  • Ошибка реорганизация индексов базы данных MS SQL «Невозможно реорганизовать индекс» на базах 1С Предприятие.

    После обновления платформы 8.3.20.1674, обратил внимание что не выполняется реиндексация баз данных относящихся к 1С, в логах значится ошибка — «Невозможно реорганизовать индекс «_Acc48_1» в таблице «_Acc48″, поскольку отключена блокировка на уровне страницы.»

    Как оказалось что начиная с версии платформы 8.3.22 необходимо выполнять дефрагментацию индексов по следующему алгоритму:

    • До дефрагментации индекса необходимо включить страничные блокировки. Пример команды: ALTER INDEX index_name ON table_name SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON);
    • Выполнить дефрагментацию.
    • Обратно выключить страничные блокировки. Пример команды: ALTER INDEX index_name ON table_name SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON);

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

    Скрипт работает по следующему принципу:

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

    Читать далее