🏠: работа

Сходил поучился

Zabbix-certificate-exam.jpg
Zabbix-certificate-training.jpg

В конце рабочей недели настроил мониторинг MySQL на всех серверах, где он установлен.

Что сделал - 3

Навёл порядок в серверной

Красота.

Ежемесячный отчёт по «домашним» каталогам пользователей

В табличке выводятся: имя каталога, ФИО владельца (при наличии учётки в AD с одноимённым логином), размер каталога в мегабайтах, статус пользователя (ОК, disabled, no such user), самая новая дата изменения файла в каталоге, разница в днях с текущей датой. В письме, куда вкладывается таблица, подсчитывается количество каталогов активных пользователей, количество каталогов отсутствующих и отключённых пользователей, общее количество каталогов; также выводятся общие размеры каталогов по этим категориям в гигабайтах.

Научился подсчитывать время выполнения скрипта, очень удобно:

$timer = [system.diagnostics.stopwatch]::StartNew()
[math]::round(($timer.Elapsed.TotalSeconds),2)

Перевёл на русский язык интерфейс плагина Nextcloud Outlook Add-in

Перевёл и выслал перевод разработчикам, они обещали включить его в следующую версию.

Что сделал на этой неделе - 2

Пока есть что-то новое и интересное помимо рутины, продолжаю.

Доделал систему прав на каталоги

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

Отчёт по почтовым ящикам — размеры и квоты

Оказалось, что со старых времён у многих ящиков стояли индивидуальные квоты всего в 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, на мой вкус. Ладно, посмотрим.

Что сделал на этой неделе

Пишу, чтобы не забыть, что делал, потом может пригодиться.

Скрипт, меняющий пароли локального администратора на рабочих станциях

Вещи типа Local Administrator Password Solution использовать в наших широтах не очень принято, поэтому приходится изобретать свой велосипед. Работа идёт через ADSI, так как Powershell v5, где есть удобные команды типа Get-LocalUser, установлен далеко не везде (почему — это отдельная тема, слабо связанная с технической стороной).

Скрипт берёт имена рабочих станций из AD, потом для каждой проверяет соединение. Если связь есть, лезет туда и получает список членов группы локальных администраторов. Если у учётки «Администратор» пароль старше 60 дней (он в секундах, надо его делить на 86400), генерит новый и задаёт его, затем снимает флаги «пароль не требуется», «пароль не может быть изменён», и «учётная запись отключена», ставит флаг «срок действия пароля неограничен» — ведь неизвестно, когда в следующий раз удастся поменять пароль. Если среди членов группы администраторов обнаружились пользователи с определёнными названиями (техподдержка при заливке машин давала такие имена) — удаляет эти учётные записи.

Результаты пишутся в файл CSV — имя компьютера, имя локального администратора, пароль, дата последней успешной смены пароля, дата последней попытки смены пароля. Отчёт о работе скрипта высылается на почту.

Логон-скрипт, собирающий статистику о локально подключенных почтовых архивах в формате .pst

При входе пользователя в систему идёт подключение к COM-объекту Outlook.Application и выгружается список локальных объектов хранения, где встречается «.pst», также вычисляется размер этих файлов.

Результат пишется в общий каталог на сервере в формате CSV — версия Outlook, пути к файлам .pst, размеры в мегабайтах, пользователь, компьютер. Имя файла CSV также состоит из имён и пользователя, и компьютера, т. к. пользователь может заходить на несколько машин и везде иметь подключенные архивы.

Потом этот сценарий наверняка будет дорабатываться, так как изначальная идея заключается в том, чтобы хранить пользовательские архивы на сервере в их личных папках и делать оттуда резервные копии. Архивы эти можно отключить из Outlook скриптом прямо наживую, переместить их на сервер, а потом снова подключить. Это сэкономит много человеко-часов команде техподдержки — впрочем, как и любая автоматизация подобного рода.

Автоматизация создания файловой структуры, генерации групп и раздачи прав

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


Рис. 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

3 месяца на новой работе

Что сделал, из основного:

  • Включил корзину 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.