В конце рабочей недели настроил мониторинг MySQL на всех серверах, где он установлен.
🏠: работа
- Навёл порядок в серверной
- Ежемесячный отчёт по «домашним» каталогам пользователей
- Перевёл на русский язык интерфейс плагина Nextcloud Outlook Add-in
Навёл порядок в серверной
Красота.
Ежемесячный отчёт по «домашним» каталогам пользователей
В табличке выводятся: имя каталога, ФИО владельца (при наличии учётки в AD с одноимённым логином), размер каталога в мегабайтах, статус пользователя (ОК, disabled, no such user), самая новая дата изменения файла в каталоге, разница в днях с текущей датой. В письме, куда вкладывается таблица, подсчитывается количество каталогов активных пользователей, количество каталогов отсутствующих и отключённых пользователей, общее количество каталогов; также выводятся общие размеры каталогов по этим категориям в гигабайтах.
Научился подсчитывать время выполнения скрипта, очень удобно:
$timer = [system.diagnostics.stopwatch]::StartNew()
[math]::round(($timer.Elapsed.TotalSeconds),2)
Перевёл на русский язык интерфейс плагина Nextcloud Outlook Add-in
Перевёл и выслал перевод разработчикам, они обещали включить его в следующую версию.
Пока есть что-то новое и интересное помимо рутины, продолжаю.
- Доделал систему прав на каталоги
- Отчёт по почтовым ящикам — размеры и квоты
- Отчёт по антивирусу и антиспаму для пограничного почтового сервера
- Статистика количества отправленных и полученных извне писем
Доделал систему прав на каталоги
По файловой структуре, которую описывал в прошлый раз — оказалось, что раньше там были некоторые ошибки, и нужно было аккуратно поправить вложенность групп. Пользовался тем же тройным циклом, который модифицировал по ситуации, дочистил права, теперь всё в порядке, самое главное — у пользователей ничего не отвалилось. Есть у меня некие сомнения по поводу всей этой вложенности, наверняка есть более оптимальный способ как раздачи прав, так и строения файловой структуры в целом (может быть, плоская структура вместо иерархической), но пока на этот счёт я глубоко не задумывался, тем более, что я не один работаю и файловую структуру делали не с нуля, а на базе уже существующего куска.
Отчёт по почтовым ящикам — размеры и квоты
Оказалось, что со старых времён у многих ящиков стояли индивидуальные квоты всего в 100 и 200 МБ (запрет отправки), причём, это не имело значения, так как у ящиков стояло наследование от базы данных, а там-то всё выставлено нормально. Чтобы не путаться, убрал эти ничего не значащие квоты, сделал еженедельный отчёт.
Отчёт по антивирусу и антиспаму для пограничного почтового сервера
Примерно месяц назад я обновил Exchange Edge 2010 на самую новую версию, также там стоял Kaspersky for Exchange 9.0 MR2, причём Каспер умеет слать статистику почему-то только через протокол EWS, который в организации отключён. На днях я вычитал в справке по Касперу, что у него есть модуль для Powershell, который умеет выводить статистические данные в консоли, и, естественно, я сразу решил сделать отчёт именно через этот механизм. Оказалось, что в имеющейся версии MR2 команды, указанные в справке, не работают, но на сайте есть новая версия MR5, которую я вечерком из дома и установил, после чего всё пошло как по маслу — теперь имеется еженедельный отчёт по антивирусу и антиспаму на пограничном сервере. Заодно сделал в том же скрипте отдельное письмо, которое указывает на близкий срок окончания лицензии, т. к. одна из команд показывает статус самого сервера.
Статистика количества отправленных и полученных извне писем
В каждой конторе свои особенности, в данном случае иногда бывают запросы от начальства на количество писем от тех или иных сотрудников. Это бывает редко, но чтобы не возвращаться к этой теме в срочном режиме в будущем, сделал и этот отчёт — выполняется по первым числам за предыдущий месяц. Попутно пришлось придумать, как собирать местные адреса — ведь сервер Exchange Edge не в домене и ничего про внутренних пользователей не знает. В результате список адресов я брал из тех же трекинг-логов, сортируя их по наличию местного домена и уникальности. Заодно прокачал работу с датами — как получить 0:00:00 первого числа предыдущего месяца и 23:59:59 последнего дня предыдущего месяца, а в отчёте по антивирусу — то же самое, только с прошлой неделей.
Также, в связи с тем, что я закончил настройку системы управления проектами Redmine и она вошла в более-менее полноценный рабочий режим, теперь нужно записывать туда свою деятельность. Это ещё куда ни шло, но указывать также нужно и трудозатраты в часах, что, честно говоря, идея весьма сомнительная — как считать всю ту работу, которая сопутствует решению той или иной задачи? Практически всегда нужно много чего прочесть и изучить, прежде чем приниматься за непосредственное выполнение, так как систем много и все они разные.
Иногда мысли о решении приходят по дороге домой в вагоне метро, потому что я не могу выключить голову после выхода с работы, а продолжаю размышлять над задачей (может быть, у кого-то обнуляется буфер после пересечения входных ворот, но у меня нет). А порой приходишь домой и лезешь через VPN на работу, чтобы сразу проверить догадку, не упустить мысль. Это тоже включать в трудозатраты? Но тогда в день трудозатрат будет больше, чем рабочих часов. В общем, судя по всему, придётся писать что-то от фонаря, тем более, что я не сижу с таймером и не засекаю, сколько я потратил на задачу, и часто задач решаешь сразу несколько.
К тому же, само протоколирование своей деятельности занимает время, сегодня, например, я потратил около часа, так что же — вносить в трудозатраты «протоколирование трудозатрат»? Лучше уж заняться документированием в wiki, на мой вкус. Ладно, посмотрим.
Пишу, чтобы не забыть, что делал, потом может пригодиться.
- Скрипт, меняющий пароли локального администратора на рабочих станциях
- Логон-скрипт, собирающий статистику о локально подключенных почтовых архивах в формате .pst
- Автоматизация создания файловой структуры, генерации групп и раздачи прав
Скрипт, меняющий пароли локального администратора на рабочих станциях
Вещи типа Local Administrator Password Solution использовать в наших широтах не очень принято, поэтому приходится изобретать свой велосипед. Работа идёт через ADSI, так как Powershell v5, где есть удобные команды типа Get-LocalUser, установлен далеко не везде (почему — это отдельная тема, слабо связанная с технической стороной).
Скрипт берёт имена рабочих станций из AD, потом для каждой проверяет соединение. Если связь есть, лезет туда и получает список членов группы локальных администраторов. Если у учётки «Администратор» пароль старше 60 дней (он в секундах, надо его делить на 86400), генерит новый и задаёт его, затем снимает флаги «пароль не требуется», «пароль не может быть изменён», и «учётная запись отключена», ставит флаг «срок действия пароля неограничен» — ведь неизвестно, когда в следующий раз удастся поменять пароль. Если среди членов группы администраторов обнаружились пользователи с определёнными названиями (техподдержка при заливке машин давала такие имена) — удаляет эти учётные записи.
Результаты пишутся в файл CSV — имя компьютера, имя локального администратора, пароль, дата последней успешной смены пароля, дата последней попытки смены пароля. Отчёт о работе скрипта высылается на почту.
Логон-скрипт, собирающий статистику о локально подключенных почтовых архивах в формате .pst
При входе пользователя в систему идёт подключение к COM-объекту Outlook.Application
и выгружается список локальных объектов хранения, где встречается «.pst», также вычисляется размер этих файлов.
Результат пишется в общий каталог на сервере в формате CSV — версия Outlook, пути к файлам .pst, размеры в мегабайтах, пользователь, компьютер. Имя файла CSV также состоит из имён и пользователя, и компьютера, т. к. пользователь может заходить на несколько машин и везде иметь подключенные архивы.
Потом этот сценарий наверняка будет дорабатываться, так как изначальная идея заключается в том, чтобы хранить пользовательские архивы на сервере в их личных папках и делать оттуда резервные копии. Архивы эти можно отключить из Outlook скриптом прямо наживую, переместить их на сервер, а потом снова подключить. Это сэкономит много человеко-часов команде техподдержки — впрочем, как и любая автоматизация подобного рода.
Автоматизация создания файловой структуры, генерации групп и раздачи прав
На протяжении многих лет существования компании и смены разных команд айтишников, права на общие каталоги раздавались непонятно как и бессистемно, что закономерно привело к хаосу. Необходимо было сделать нормальную файловую структуру и раздать соответствующие права. Так как подразделений очень много, для каждого нужно создавать три ресурсные группы (листинг, чтение, запись), да ещё и с довольно сложной вложенностью (см. рис. 1), мысль о том, что всё это надо делать руками, приводила в уныние. К счастью, несколько дней размышлений и экспериментов прояснили метод решения задачи.
Сутью метода являются три вложенных друг в друга цикла, которые перебирают названия каталогов на всё большей глубине (само создание каталогов автоматизировать не удалось, т. к. единого подхода к сокращению названий подразделений нет, хотя я предлагал различные методы).
На первом этапе создаются ресурсные группы в AD (индекс вложенности в имени группы вычисляется интересно (сам быстро не додумался, пришлось гуглить) — путь к папке, например, \\server\share\department1\group2
, разбивается на массив символов, где подсчитываются наклонные черты минус 2).
$level = (($_.FullName).ToCharArray() |? {$_ -eq "\"} |measure).count - 2
Второй этап — вложенность групп. Тот же тройной цикл, но теперь ищутся группы в AD, соответствующие названию текущей папки (например, FS-2-$($_.name)-
). Далее делаются команды добавления членства в группах с выборками соответствующих имён согласно вышеприведённой схеме. Важно, что нужно задавать условие существования для добавления групп (if ($2groups -and $3groups)
), потому что не везде существуют группы 4-го или 3-го уровней; также, нужно обнулять содержимое переменных групп 3 и 4 уровней после окончания их цикла, потому что иначе, когда снова начнётся главный цикл, не сработают условия существования групп (переменные уже будут содержать данные из предыдущего цикла), и в результате, группы нижних уровней из прошлой итерации добавятся в группы из новой, что совершенно не нужно.
Третий этап — раздача прав на папки. Здесь было уже проще — из-за такой сложной вложенности групп права на папку даются только для тех групп, которые соответствуют её названию, а также группе локальных администраторов сервера и учётной записи «Система». В Powershell изначально нет нормального функционала работы с правами NTFS, но зато есть прекрасный модуль NTFSSecurity. Вот права, например, для 3-го этапа:
Set-NTFSInheritance -Path "$($_.FullName)" -AccessInheritanceEnabled:$false
Add-NTFSAccess -Path "$($_.FullName)" -Account 'BUILTIN\Администраторы', 'NT AUTHORITY\СИСТЕМА' -AccessRights FullControl
Add-NTFSAccess -Path "$($_.FullName)" -Account $($3groups.name -match "FS-.*-r$") -AccessRights ReadAndExecute
Add-NTFSAccess -Path "$($_.FullName)" -Account $($3groups.name -match "FS-.*-rw$") -AccessRights Modify
if ($3groups.name -match "FS-.*-l$") {
Add-NTFSAccess -Path "$($_.FullName)" -Account $($3groups.name -match "FS-.*-l$") -AccessRights ReadAndExecute -AppliesTo ThisFolderAndSubfolders
}
Наконец, для каждого каталога были убраны права для учётки «Создатель-владелец», которая портит всю картину с правами, так как стандартно каждый, кто создал что-либо в общей папке, имеет на это полный доступ, в результате через короткое время картина с правами опять превращается в хаос:
Remove-NTFSAccess -Path "$($_.FullName)" -Account "СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ" -AccessRights FullControl
Что сделал, из основного:
- Включил корзину AD, сбросил стандартные групповые политики (их бессистемно правили до этого, проанализировал, сравнил со стандартными значениями, задокументировал), затем перенёс некоторые их настройки в отдельные политики.
- Перенастроил неправильно настроенные интерфейсы некоторых виртуальных хостов, чтобы они смотрели в отдельно взятую подсеть только одним IP-адресом.
- Мигрировал старый файловый сервер (Windows 2003) на новый.
- Установил и настроил Dokuwiki, Zabbix, Redmine, Nextcloud, Request Tracker, тестовый стенд HAProxy + Keepalived, обновил Exchange Edge.
- Прошил на серверах все ILO и восстановил к ним доступ, включил в мониторинг Zabbix.
- Ввёл в эксплуатацию несколько железных серверов.
- Поднастроил Kaspersky Security Center, сделал разливку агента через GPO и автоустановку антивируса на рабочие станции.
- Настроил динамические группы рассылки в Exchange, с фильтрацией по должностям (например, все сотрудники минус генеральный и его замы).
Написал на Powershell:
- Парсер выгрузки штатного расписания из 1С.
- Отчёт о соответствии AD штатному расписанию, генерация соответствующих команд и отчёт в почту.
- Логон-скрипт — автоматическое прописывание в учётку пользователя в AD имени компьютера и времени входа, также ведение истории входов в CSV.
- Автоматическое прописывание extensionAttributes пользователям в соответствии со штатным расписанием + отчёт в почту.
- Автоматическое создание групп подразделений в AD в соответствии со штатным расписанием, со вложенностью по иерархии.
- Автоматическое добавление и удаление пользователей и компьютеров из групп подразделений, в соответствии с ExtensionAttributes и именем компьютера в учётке пользователя + отчёт в почту об изменениях.
- Автоматическое отключение компьютеров, не входивших в систему больше 90 дней + перемещение уже отключенных объектов в соответствующий контейнер + отчёт в почту.
- Генерация команд для выгрузки ящиков Exchange для отключенных учёток, не входивших в систему более 180 дней, отчёт в почту.
- Глобальная адресная книга Exchange — автоматическое удаление отключенных и добавление включенных пользователей.
- Дополнительно — генераторы паролей, логинов, инициалов, названий групп, транслитератор, отчёты о членстве в группах AD, о правах NTFS на общих каталогах, парсер отчёта AccessEnum, парсер отчёта Kaspersky Security Center.