Что сделал - 8

Ежемесячная автоматическая отсылка статистики правовой системы Консультант+

$t = get-date
$zip = "C:\Scripts\Consultant\Cons-Stat-$($t.ToShortDateString()).zip"
$consGuy = "email@mail.eu"

# compress the statistics folder and test archive (use Compress-Archive if possible)
& 'C:\Program Files\7-Zip\7z.exe' a "$zip" "K:\ADM\STS"
$test = & 'C:\Program Files\7-Zip\7z.exe' t "$zip"

# if archive succesfully created
if ($test -match "Everything is Ok") {
# send an email
$body = "<p>Добрый день!<br>
Высылаем статистику СПС Консультант по состоянию на $($t.ToLongDateString())</p>
<p><i>С уважением,<br>
Отдел ИТ<br>
АО "ЗАО"</i></p>
<p style=`"color:red;`">Это письмо создано автоматически, не отвечайте на него.</p>
"

Send-MailMessage -SmtpServer mail.domain.ru -From "robot@domain.ru" -To "$consGuy" -Cc "bulynkin@domain.ru" -Subject "АО ЗАО - Статистика СПС Консультант" -Body "$body" -Attachments "$zip" -Encoding UTF8 -bodyashtml

# wipe statistics folder
del K:\ADM\STS\* -Force -Confirm:$false
}

# if archive creation failed, send an alert
else {
Send-MailMessage -SmtpServer mail.domain.ru -From "robot@domain.ru" -To "bulynkin@domain.ru" -Subject "АО ЗАО - Статистика СПС Консультант" -Body "Ошибка отсылки статистики!" -Priority High -Encoding UTF8 -bodyashtml
}

Система видеоконференцсвязи Jitsi

Один центральный сервер + 5 серверов Jibri — это компонент для записи, пять штук нужно для пяти одновременных потоков. Дополнительно сделал автонастройку интерфейса через скрипт в кроне, чтобы после каждого обновления не прописывать заново название конторы, логотип и т. п. По уму, конечно, надо не плодить виртуальные машины, чтобы они пыхтели 24/7, а сделать какой-то оркестратор контейнеров, где работает только основной сервер и один Jibri, а при задействовании одного записывающего потока поднимался дополнительный контейнер с Jibri и так далее, т. е., система должна распухать и сдуваться динамически. Но это дело будущего, т. к. я пока не осилил контейнеризацию, а нахожусь в процессе освоения.

Все сервера Jibri пишут в свой локальный каталог. Чтобы не лазать по всем серверам в поисках записи — ведь неизвестно, какой именно будет писать ту или иную конференцию — я сделал автоматическое копирование с них на общую папку на Windows-сервере, и последующее автоудаление: с локальных серверов через 3 дня, а на Windows-сервере — через 2 недели.

Виртуализация старого веб-сервера на Ubuntu 8.04

Заодно разобрался, как обновлять старые системы Ubuntu. Оказалось, что для всех старых систем есть репозитории, а с версии на версию в общем случае можно переползать с помощью образа ISO со следующей версией.

Группы в AD на основании статуса сотрудника

«В декрете», «в отпуске», «в командировке» и т. д., и сделал механизм, по которому пользователи автоматически добавляются-удаляются из этих групп, и в почту присылается отчёт. Пока это ни для чего не нужно, но пригодиться может. Дополнительно, статус и отдел прописываются в описание пользователя для наглядности.

Отчёт по пользователям, подключающимся по VPN

Оказалось, что в Powershell (точнее, в .NET) есть механизм генерации графиков, и помимо самого списка пользователей, в письмо вставляется почасовой график количества подключений, очень красиво.

Критерий выгрузки почтовых ящиков из Exchange

Раньше было так — если сотрудник не заходил в систему больше 180 дней, то ящик выгружался. Теперь поступило указание выгружать ящики только через месяц после увольнения сотрудников. Когда сотрудник пропадает из штатного расписания, генерируется команда на заполнение атрибута comment, от чего можно потом оттолкнуться:

Set-ADUser "CN=Петрова Светлана Викторовна,OU=1_Users,DC=domain,DC=ru" -replace `
@{'comment'="Сотрудник уволен 16.10.2020"}

И, наконец, самое вкусное —

Прокси-сервер на базе Squid с прозрачной аутентификацией через Kerberos, с управлением уровнем доступа через группы в AD + статистика

Иными словами, доменные пользователи не должны ничего вводить для выхода в интернет — они проходят проверку автоматически. Для Linux-машин и находящимся вне домена предлагается набрать логин и пароль (basic-аутентификация). С этим делом пришлось повозиться, потому что в интернете все инструкции либо старые, либо являются сборниками копипасты без рассмотрения смысла или альтернатив того или иного действия, а порой и то, и другое.

Мой подход состоит в том, чтобы иметь самую минимальную конфигурацию, которая выполняет поставленные задачи; максимально оставлять настройки по умолчанию, чтобы все настройки были по возможности осмысленными, было известно, что они конкретно делают, и документировать их. Иначе получается очередной чёрный ящик, который непонятно как работает, и через пару лет к нему становится страшно прикоснуться, потому что если он повалится, то мало того, что никто не знает, как он устроен и как его чинить и восстанавливать — никто иногда даже не знает, что он конкретно делает. В общем, классика отечественных ИТ, да и не только ИТ. Оказалось, что Kerberos не так страшен и Linux-системы довольно легко вяжутся с доменом Windows, что многие пакеты, описанные в интернет-статьях, не требуется ставить (например, Samba), либо они устарели. Но лично мне это стало понятно после двух недель напряжённой работы по разбору этих авгиевых конюшен текста и бесчисленных проб и ошибок. Не сказать, чтобы я создал идеальную конфигурацию — кое-что перекочевало из старой «до востребования», но это во всяком случае более безопасная и структурированная настройка по сравнению с тем, что было раньше.

Статистику тоже хотелось сделать красиво, генерировать списки пользователей и отделы автоматически. На старом прокси-сервере стоял LightSquid, его я и взял для этой цели. Номера отделов для отчётов по группам я сначала просто задумал генерировать скриптом, а потом подумал, что лучше брать эти номера из того же штатного расписания, и попросил коллегу-программиста 1С добавить в ежедневную выгрузку и номер подразделения. Прописав всем пользователям на этой основе атрибут departmentNumber в AD, я написал следующий скрипт на bash:

#!/bin/bash

realnamecfgUTF8="/var/www/html/stat/realname.cfg.utf8";
realnamecfg="/var/www/html/stat/realname.cfg";
groupcfgUTF8="/var/www/html/stat/group.cfg.utf8";
groupcfg="/var/www/html/stat/group.cfg";
rm -f $realnamecfgUTF8 $realnamecfg $groupcfgUTF8 $groupcfg && touch $realnamecfgUTF8 $realnamecfg $groupcfgUTF8 $groupcfg

kinit HTTP/proxy.domain.ru -k

for i in `ldapsearch -H ldap://vmws-dc1.domain.ru -b dc=domain,dc=ru -LLLQ -o ldif-wrap=no "(&(objectclass=person)(primaryGroupID=513)(!(samaccountname=*mailbox*))(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))" sAMAccountName |grep 'sAMAccountName: ' |sed 's/sAMAccountName: //'`;
do
nameRaw=`ldapsearch -H ldap://vmws-dc1.domain.ru -b dc=domain,dc=ru -LLLQ -o ldif-wrap=no "(sAMAccountName=$i)" name |grep 'name:'`;
depRaw=`ldapsearch -H ldap://vmws-dc1.domain.ru -b dc=domain,dc=ru -LLLQ -o ldif-wrap=no "(sAMAccountName=$i)" department |grep 'department:'`;
depNum=`ldapsearch -H ldap://vmws-dc1.domain.ru -b dc=domain,dc=ru -LLLQ -o ldif-wrap=no "(sAMAccountName=$i)" departmentNumber |grep 'departmentNumber:' |sed "s/departmentNumber: //"`;

if [[ $nameRaw =~ '::' ]]
then
name=`echo $nameRaw |sed "s/name:: //" |base64 -d`
else
name=`echo $nameRaw |sed "s/name: //"`
fi

if [[ $depRaw =~ '::' ]]
then
dep=`echo $depRaw |sed "s/department:: //" |base64 -d`
else
dep=`echo $depRaw |sed "s/department: //"`
fi

loginLow=`echo $i |tr "[:upper:]" "[:lower:]"`
if [[ $depNum =~ [0-9] ]]
then
login=`echo "$loginLow@domain.ru"`
echo -e "$login\t$depNum\t$dep" >> $groupcfgUTF8
else
login=`echo "$loginLow"`
fi

#echo -e "$loginRaw\t$nameRaw\t$depRaw"
#echo -e "$login\t$name\t$dep"
#echo -e "$login\t$name\t$depNum\t$dep"

echo -e "$login\t$name" >> $realnamecfgUTF8

done

iconv -f utf-8 -t cp1251 -o $realnamecfg $realnamecfgUTF8
iconv -f utf-8 -t cp1251 -o $groupcfg $groupcfgUTF8

Перекодировка в cp1251 нужна для корректного отображения в браузере. Примерный вид статистики:

Доступ к статистике нужно было тоже ограничить, и это было сделано на той же самой базе Kerberos и basic-аутентификации + LDAP-авторизация. Для Apache2 существует два модуля аутентификации Kerberos — старый mod_auth_kerb, который описан во всех статьях, и новый mod_auth_gssapi. Конечно, хотелось пользоваться новым. В процессе настройки я немножко не разобрался и задал вопрос не в тему автору модуля, но в результате всё получилось. Теперь доступ к статистике имеют только те, кто входит в определённую группу в AD, и это очень удобно. Осталось только подать нагрузку на этот новый прокси-сервер, но это не вполне от меня зависит.