
Нейтрализация пользователя и процесс установки новой ОС
Привет, Хабр. Сегодня хотим поделиться опытом миграции одной организации (далее – Заказчик) на отечественную ОС в рамках выполнения требований по импортозамещению. Сразу нужно обозначить, что Заказчик выбрал и закупил эту ОС самостоятельно. Нам же досталось удовольствие развертывания, оптимизации этой ОС и выполнение требований по защите информации.
Задача
Имеется государственная информационная система 2 класса защищенности (далее – ГИС) с порядка 1000 условно однотипных пользователей, со строго определенным кругом служебных задач. Сама ГИС состоит из веб-сервисов, распределенных примерно на 30 объектах с локальными базами. Также есть удаленные рабочие места в поселениях. При этом есть общий домен (но далеко не везде), есть шары локальные/корпоративные. Парк компьютеров и оргтехники кое-где не первой свежести, каналы передачи между объектами не ахти. Есть системные администраторы на местах и главные в управлении. В общем, стандартная ситуация, характерная для средних госучреждений перед великой миграцией на отечественное ПО.
Проблемы, тесты, изучение
1. Шару мы подключали через астровский графический файловый менеджер (fly-fm). С отображением русских имён файлов на «оконных» шарах проблем нет. Но эти имена превращаются в набор нечитаемых человеком символов при копировании этих файлов на рабочий стол и в другие места на диске. По этому вопросу работали с разработчиками, вопрос сложный, хоть и фиксы есть.
Есть способ монтирования шары средствами Linux, независимо от особенностей астровского софта. Способ работает, но требует времени на тестирование в реальных условиях. Предварительные испытания показали, что файлы не коверкаются при отображении и копировании, но есть проблемы с совместимостью с некоторыми версиями Windows Server. Суть проблем с разграничением доступа к файлам на шаре при подключении Linux-клиента, тестируем подключение с различными опциями, рекомендуемыми разработчиками пакета cifs-tools, который отвечает за монтирование шар. Иногда используем autofs, в остальных случаях инструктируем как «не надо делать» из того что они привыкли.
2. Связано с первым. При монтировании шары из астровского fly-fm, пользователи не могут сохранять файлы из Firefox непосредственно на «шару». Им приходится делать две операции, из Firefox они сначала сохраняют на рабочий стол, а потом перекидывают документ на шару. Тоже самое для того, чтобы выложить файл на сайт, сначала берут его с шары на рабочий стол, а потом уже закидывают с него в свои базы данных.
Это происходит из-за того, что Firefox использует свой собственный диалог открытия и записи файлов, в котором нет возможности указать на ту символическую ссылку шары, которую мы создали в астровском fly-fm.
Данной проблемы бы не было, используй астра не своё графическое окружение, а какое-нибудь из популярных в Linux. Пока использование иногда atofs или инструкции использования папки загрузки.
3. Расшаривание USB-принтеров в сеть. Два варианта стандартных: через сервер печати cups и samba протокол не взлетели со стандартными настройками. Покрутили и cups заработал, только с оговоркой – у одного клиента может быть только 1 сервер печати и компьютер, настроенный в режим клиента, не может использовать свои локальные Принтеры, потому как свой сервер печати глушится.
4. В учреждениях часто используют макросы в документах предыдущего офисного пакета. Эти макросы несовместимы с макросами в Libre Office, потому что в последнем они пишутся не на Visual Basic, а на Java.
И более того, создатели Астры выкинули из дистрибутива всё связанное с Java, т. к. она принадлежит американской компании Oracle. Т. е. написать макросы в астровском офисе пока вообще невозможно. Единственный вариант — эмуляция или рядом стоящий компьютер с «Окнами».
Выводы и принятые решения
По анализу сложившейся ситуации с инфраструктурой было решено, что автоматизация процесса перехода на отечественную ОС может повлечь неожиданные неприятности. Такой подход можно было применять только в управлении (центральный офис) – в случае чего можно было оперативно отреагировать. На локальных объектах в районах хоть и были вполне типовые рабочие места и техпроцессы, это не дает полной стандартизации и возможности «тихой установки».
Что все-таки мешало запустить одновременную установку по сети:
- отсутствие общего домена;
- зоопарк железа и периферии;
- загрузка из сети не является приоритетной, все равно нужно доехать до удаленного рабочего места и сменить порядок загрузки (как следствие отсутствия централизованного домена – нет оперативной возможности устанавливать какие-либо агенты для предварительной настройки);
- плохие каналы связи с удаленными рабочими местами и между объектами;
- техпроцесс хоть по большей части и типовой, но по факту все равно переводились не все пользователи, т. к. у значительной части есть задачи, которые можно пока что выполнять только по Windows.
В итоге было принято решение сформировать максимально универсальный дистрибутив для развертывания руками на месте. Дополнительно пришлось организовать каналы технической поддержки системных администраторов на местах, для консультаций и транслирования опыта работы со служебными задачами.
В целом по теме перехода на отечественное программное обеспечение: на данный момент так и не решены вопросы с миграцией многих приложений. Как совершенно стандартных, так и экзотических (в том числе – самописных). Поэтому миграция на новую ОС сейчас это, в том числе, нахождение оптимальных решений выполнения служебных задач заново и, возможно, существенное изменение существующих технологических процессов организаций. Что в свою очередь может повлечь потребность в актуализации/пересмотре проектных и аттестационных документов, ну и прочие философские размышления на тему ИБ в масштабах страны.
Миграция в рассмотренной организации продолжается. Намечены этапы, выбраны следующие объекты и другие рабочие места для перехода на новую ОС. Также этот проект коррелируется со спущенным сверху планом перехода на отечественное ПО в других наших Заказчиках и новых клиентах. Пока процесс прогрессирует сложно, хоть и порой срочно, но разнообразные подходы тестируются и затем применяются. Информации для аналитики, выбора решений предостаточно, будем обязательно освещать по мере сил и возможности.
Далее технические детали, шаманства и костыли.
Подготовка флэшки и установка
1. Для установки понадобится флэшка или иной внешний USB-накопитель NTFS объёмом не
менее 16Гб. Образ Porteus весит 270Мб. Это по сути мобильный Линукс, который нужен только для запуска нашего скрипта-инсталятора. Образ устанавливаемого Астра Линукс весит 8Гб. При желании можно ужать образ на пол гига и тогда хватит и 8 гиговой флэшки.
2. Скопируйте на неё образ системы и дерево каталогов слегка изменённой нами портативной ОС Porteus.
3. Сделайте флэшку загрузочной, запустив скрипт:
/boot/Porteus-installer-for-Linux.com — из Linux /boot/Porteus-installer-for-Windows.exe — из Windows
4. Загрузитесь с подготовленного накопителя и следуйте инструкции:

Для Porteus нами был создан модуль, содержащий bash-скрипт развёртывания Astra Linux в диалоговом режиме.

Скрипт сканирует загрузочный накопитель на наличие образов системы, позволяет выбрать диск для установки системы, разворачивает на него образ, и позволяет сделать некоторые установки перед первой загрузкой системы.
#!/bin/sh # unmount swap disks for i in `cat /proc/swaps | grep dev | awk -F" " '{print $1}'`; do swapoff $i; done #variables DIALOG=${DIALOG=dialog} tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/temp$$ tempfile1=`mktemp 2>/dev/null` || tempfile1=/tmp/temp$$ tempfile2=`mktemp 2>/dev/null` || tempfile2=/tmp/temp$$ tempfile3=`mktemp 2>/dev/null` || tempfile3=/tmp/temp$$ tempfile4=`mktemp 2>/dev/null` || tempfile4=/tmp/temp$$ #image selection setimage () { mdevs=`mount | grep fuseblk | awk -F" " '{print $3}'` cd / $DIALOG --backtitle "Выберите образ установочного диска:" \ --menu " " 15 80 5 \ `find $mdevs -name *.di -type f | awk '{print $0,"image"}'` 2> $tempfile retval=$? case $retval in 0) image=`cat $tempfile | awk -F/ '{print $6}'` input=`cat $tempfile` echo "Выбран образ диска: $image" sleep 2;; 1) echo "Отказ от ввода." exit 0;; 255) echo "Нажата клавиша ESC." exit 0;; esac } #disk selection setdisk () { sdisk=`mount | grep fuseblk | awk -F" " '{print $1}' | awk -F/ '{print $3}' | tr -d [0-9]` $DIALOG --backtitle "Выберите диск для установки образа $image :" \ --menu "`parted -l | grep -E "Модель|Диск \/"`" 15 80 5 \ `fdisk -l | grep "Диск /"| grep "/dev/s" | awk -F" " '{print $2,$1}'| awk -F: '{print $1,$2}' | sed "/$sdisk/d"` 2> $tempfile1 retval=$? case $retval in 0) disk=`cat $tempfile1 | awk -F/ '{print $3}'` output=`cat $tempfile1` echo "Диск $disk выбран для клонирования на него образа $image" sleep 2;; 1) echo "Отказ от ввода." exit 0;; 255) echo "Нажата клавиша ESC." exit 0;; esac } #cloning (dd process) cloning () { bs=`hdparm -I $output | grep "cache/buffer size" | awk -F" " '{print $4}'` umount -l $output"*" dd if=/dev/zero of=$output bs=512 count=1 clear sleep 1 echo "Клонирование образа $image на диск $disk..." #dd if=$input of=$output bs=$bs 2>/tmp/error & pid=$! dd if=$input of=$output bs=8M 2>/tmp/error & pid=$! sleep 2 while [ -d /proc/$pid ]; do kill -USR1 $pid && tail -n 2 /tmp/error | grep GB && sleep 10 && clear; done clear tail -n 3 /tmp/error echo "Процесс клонирования завершён." rm /tmp/error sleep 2 } #resize second partition resizepart () { echo "Размер второго раздела диска до расширения:" fdisk -l $output"2" | head -n 1 echo "Расширяем второй раздел диска $disk..." parted $output rm 2 parted $output mkpart primary 2GB 100% resize2fs -f $output"2" e2fsck $output"2" echo "Текущий размер второго раздела:" fdisk -l $output"2" | head -n 1 sleep 2 } #hostname sethost () { $DIALOG --inputbox "Введите имя компьютера:" 10 80 2> $tempfile2 retval=$? case $retval in 0) hostn=`cat $tempfile2` mount $output"2" echo $hostn >/mnt/$disk"2"/etc/hostname hosts=/mnt/$disk"2"/etc/hosts /bin/cat << ENDFILE >$hosts 127.0.0.1 localhost 127.0.1.1 $hostn # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip-allnodes ff02::2 ip6-allrouters ENDFILE echo "Имя компьютера установлено как: `cat /mnt/$disk"2"/etc/hostname`" sleep 2;; 1) echo "Отказ от ввода." exit 0;; 255) echo "Нажата клавиша ESC." exit 0;; esac } #adduser adduser () { $DIALOG --inputbox "Введите имя пользователя:" 8 40 --inputbox "Введите пароль:" 8 40 2> $tempfile3 retval=$? case $retval in 0) name=`awk '{print $1}' $tempfile3` pass=`awk '{print $2}' $tempfile3` passf=/mnt/$disk"2"/tmp/pass /bin/cat << ENDFILE >$passf parsec_pam del useradd -m -N -s /bin/bash -G cdrom,audio,video,floppy,plugdev,dialout,users $name echo -e "$pass\n$pass\n" | passwd $name passwd -w 14 -x 90 $name parsec_pam add ENDFILE chmod 755 $passf chroot /mnt/$disk"2" /tmp/pass echo "Имя пользователя: $name" echo "Пароль пользователя: $pass" sleep 2;; 1) echo "Отказ от ввода." exit 0;; 255) echo "Нажата клавиша ESC." exit 0;; esac } #kasperftp kasper () { $DIALOG --inputbox "Введите ip адрес ftp сервера для обновлений антивируса:" 10 80 2> $tempfile4 retval=$? case $retval in 0) kftp=`cat $tempfile4` obnovftp=/mnt/$disk"2"/opt/kaspersky/kesl/bin/kesl-obnovftp /bin/cat << ENDFILE >$obnovftp SourceType=Custom ConnectionTimeout=10 [CustomSources.item_1] URL=ftp://ftpuser:1qwertyuiop_0@$kftp/Updates Enabled=Yes ENDFILE echo "ip адрес ftp сервера для обновлений антивируса: $kftp" sleep 2;; 1) echo "Отказ от ввода." exit 0;; 255) echo "Нажата клавиша ESC." exit 0;; esac } autofs () { mcedit /mnt/$disk"2"/etc/auto.share } #statement state () { echo "Образ $image установлен на диск $disk." echo "Информация о текущих разделах диска $disk:" fdisk -l /dev/$disk echo "ip адрес ftp сервера для обновлений антивируса: `cat /mnt/$disk"2"/opt/kaspersky/kesl/bin/kesl-obnovftp | grep URL | awk -F@ '{print $2}' | awk -F/ '{print $1}'`" echo "Имя компьютера: `cat /mnt/$disk"2"/etc/hostname`" echo "Имя пользователя: $name" echo "Пароль пользователя: $pass" echo "Пользователь принадлежит группам:" cat /mnt/$disk"2"/etc/group | grep $name | awk -F: '{print $1}' echo "Установка системы завершена. Введите reboot или нажмите Ctrl+Alt+Del для перезагрузки компьютера." } #program start: setimage setdisk cloning resizepart sethost adduser kasper autofs state exit 0
Изменения, внесённые нами в конфигурацию системы
1. Включили цифровую клавиатуру на экране приветствия системы, по умолчанию была выключена. Опция «NumLock=On» в конфигурационном файле:
/etc/X11/fly-dm/fly-dmrc
2. Устранили артефакты и медленную отрисовку окон для встроенных видеокарт на базе чипов Intel, включив режим отрисовки UXA в файле:
/etc/X11/xorg.conf.d/20-intel.conf
Section "Device" Identifier "Intel Graphics" Driver "intel" Option "AccelMethod" "uxa" Option "TearFree" "true" Option "Tiling" "true" EndSection Section "Extensions" Option "Composite" "Enable" Option "RENDER" "Enable" EndSection Section "ServerFlags" Option "AIGLX" "true" EndSection
3. Добавлена возможность сделать локальный сервер печати CUPS клиентом другого сервера. Это позволяет использовать принтеры, подключенные к другим Linux машинам по USB, когда возникают проблемы с их подключением по сети через веб интерфейс.
Создан файл:
/etc/cups/client.conf
#ServerName 10.12.x.x
Здесь необходимо убрать комментарий строки и дописать адрес удалённой машины с принтером. После этого принтер сразу же будет доступен для печати.
4. Переписаны файлы конфигурации отображения шрифтов. Добавлена возможность включения и отключения их сглаживания на общесистемном уровне, а не на уровне приложений.
Файлы:
/etc/fonts/conf.avail/11-fontsalias.conf
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <alias> <family>serif</family> <prefer><family>PT Sans</family></prefer> </alias> <alias> <family>sans-serif</family> <prefer><family>PT Sans</family></prefer> </alias> <alias> <family>sans</family> <prefer><family>PT Sans</family></prefer> </alias> <alias> <family>monospace</family> <prefer><family>PT Sans</family></prefer> </alias> <alias> <family>mono</family> <prefer><family>PT Sans</family></prefer> </alias> <match> <test name="family"><string>Arial</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Helvetica</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Verdana</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Tahoma</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <!-- Insert joke here --> <test name="family"><string>Comic Sans MS</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Times New Roman</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Serif</string> </edit> </match> <match> <test name="family"><string>Times</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Courier New</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Arimo</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Roboto</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>OpenSymbol</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Noto Sans</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Carlito</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Fixed</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> <match> <test name="family"><string>Lucida</string></test> <edit name="family" mode="assign" binding="strong"> <string>PT Sans</string> </edit> </match> </fontconfig>
/etc/fonts/conf.avail/12-noaa.conf
<?xml version = '1.0'?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <!-- /etc/fonts/local.conf file for local customizations --> <fontconfig> <match target="font" > <edit mode="assign" name="hinting" > <bool>true</bool> </edit> </match> <match target="font" > <edit mode="assign" name="antialias" > <bool>false</bool> </edit> </match> <match target="font" > <edit mode="assign" name="embeddedbitmap" > <bool>false</bool> </edit> </match> <match target="font" > <edit mode="assign" name="hintstyle" > <const>hintfull</const> </edit> </match> <match target="font" > <edit mode="assign" name="autohint" > <bool>false</bool> </edit> </match> <match target="font" > <edit mode="assign" name="lcdfilter" > <const>lcdlight</const> </edit> </match> <match target="font" > <edit mode="assign" name="rgba" > <const>rgb</const> </edit> </match> <match target="pattern" > <edit mode="assign" name="dpi" > <double>96</double> </edit> </match> </fontconfig>
/etc/fonts/conf.avail/13-aa.conf
<?xml version = '1.0'?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <!-- /etc/fonts/local.conf file for local customizations --> <fontconfig> <match target="font" > <edit mode="assign" name="hinting" > <bool>true</bool> </edit> </match> <match target="font" > <edit mode="assign" name="antialias" > <bool>true</bool> </edit> </match> <match target="font" > <edit mode="assign" name="embeddedbitmap" > <bool>false</bool> </edit> </match> <match target="font" > <edit mode="assign" name="hintstyle" > <const>hintslight</const> </edit> </match> <match target="font" > <edit mode="assign" name="autohint" > <bool>false</bool> </edit> </match> <match target="font" > <edit mode="assign" name="lcdfilter" > <const>lcdlight</const> </edit> </match> <match target="font" > <edit mode="assign" name="rgba" > <const>rgb</const> </edit> </match> <match target="pattern" > <edit mode="assign" name="dpi" > <double>96</double> </edit> </match> </fontconfig>
За включение и выключения сглаживания отвечают скрипты:
/usr/local/bin/aaon
/usr/local/bin/aaoff
5. Добавлена сетевая папка для сканирования с сетевых МФУ, позволяющих сохранять изображения по smb протоколу. В стандартный файл конфигурации Samba-сервера:
/etc/samba/smb.conf
внесена секция:
[scan] path = /var/scan comment = scan read only = no guest ok = no guest only = no valid users = scan create mask = 0666 directory mask = 0777
а так же комментированная секция для быстрого создания публичной папки обмена:
#[share] #path = /var/share #comment = share #read only = no #guest ok = yes #create mask = 0666 #directory mask = 0777
в системе зарегистрирован samba-пользователь scan с паролем scan
6. Создан скелет настроек для вновь регистрируемых локальных пользователей системы. Он содержит мелкие изменения внешнего вида рабочего стола, изменённые настройки пользовательских приложений, сертификаты для подключения браузера к необходимым сетевым ресурсам и т.д. Некоторые изменения будут описаны подробно далее по тексту.
7. Создан файл конфигурации сервиса rc-local для подсистемы инициализации Linux. Это даёт возможность по необходимости подгружать какие-либо скрипты на стадии инициализации системы.
Файлы:
/etc/rc.local
#!/bin/sh -e exit 0
/etc/systemd/system/rc-local.service
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
8. Добавлены фирменные драйвера Xerox для некоторых сетевых принтеров.
9. Установлен и настроен пакет autofs. Позволяет подключать сетевые папки через cifs-utils на системном уровне. В файл:
/etc/auto.master
добавлена строка:
/mnt /etc/auto.share --ghost --timeout=60
создан файл конфигурации с инструкцией внутри:
/etc/auto.share
10. Написан скрипт для инициализации сервера обновлений для антивируса Касперского и проверки обновления баз:
/usr/local/bin/kasperftp
#!/bin/sh echo "Останавливаем обновления, если задание уже запущено..." /opt/kaspersky/kesl/bin/kesl-control --stop-task 6 sleep 2 echo "Обновляем адрес сервера обновлений." /opt/kaspersky/kesl/bin/kesl-control --set-settings 6 --file /opt/kaspersky/kesl/bin/kesl-obnovftp echo "Проверка изменений..." /opt/kaspersky/kesl/bin/kesl-control --start-task 6 /opt/kaspersky/kesl/bin/kesl-control -W exit 0
11. Добавлены обои рабочего стола и собственная тема экрана приветствия системы.
Подключение принтеров.
Настройка принтеров производится через страницу конфигурации CUPS в браузере по адресу: 127.0.0.1:631 или localhost:631
Страница переведена на русский язык и интуитивно понятна. Для установки принтера нужны права администратора системы. Для публикации принтеров в сети нужно активировать два пункта в параметрах сервера.
При добавлении сетевого принтера обычно используется AppSocket/HP JetDirect или протокол интернет-печати (ipp) c указанием ip адреса.
Если же сетевой принтер не подключился данными способами, то можно сделать локальный сервер печати CUPS клиентом другого сервера, отредактировав файл /etc/cups/client.conf, указав в нём сетевой адрес машины с подключенными принтерами. В этом случае вам не понадобится установка каких-либо драйверов. Хотя в базе CUPS есть огромное количество драйверов, всё же иногда требуется установка фирменных.
Для некоторых сетевых принтеров Xerox нами уже установлены фирменные драйвера и конфигуратор, команда:
xeroxprtmgr
При обнаружении принтера нужно будет его выбрать и указать имя очереди, оно же название принтера в системе. Некоторые модели принтеров, по умолчанию, настроены на печать страницы с номером для каждого отдельного задания. Найдите эту опцию в настройках очереди и отключите её.
Если у вас принтер HP, то лучше воспользоваться фирменными драйверами, которые так же предустановлены в систему. Перейдите в панель управления > оборудование > установка дополнительного плагина HP, затем там же > установка принтеров, факсов, сканеров HP.
Сканеры
Для установки сканера нужно в терминале от администратора системы ввести команду scanimage -L. Если сканер найден, вы увидите вывод с его названием. Если вывод будет пустым, то вам следует поискать фирменные драйвера в сети Интернет.
На этом пока все. Делитесь в комментариях своим опытом внедрения отечественных ОС.
ссылка на оригинал статьи https://habr.com/ru/company/ic-dv/blog/463447/
Добавить комментарий