Category: Uncategorized

  • Запуск современных программ на устаревшем дистрибутиве Linux

    Запуск современных программ на устаревшем дистрибутиве Linux

    На примере не поддерживаемого дистрибутива Linux и современного веб-браузера приводятся сведения, необходимые для создания среды выполнения приложений, требующих альтернативных версий системных библиотек.

    Быстрое развитие информационных технологий приводит к тому, что одно за другим сменяются поколения аппаратных платформ, а программные продукты стараются не отставать в этой гонке. Однако реальность такова, что устаревшие версии операционных систем продолжают эксплуатироваться. Причины этого могут лежать в нескольких плоскостях:

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

    В этой статье на примере популярного в свое время дистрибутива Mandriva Linux 2008 рассматриваются действия, необходимые для запуска современного веб-браузера Pale Moon.

    Исследование проблемы

    Получить современный веб-браузер на устаревшем Linux можно как минимум двумя способами:

    1. Адаптировать исходные тексты веб-браузера для работы с пакетами тех версий, которые имеются в дистрибутиве.
    2. Создать в установленной системе среду, которая требуется для выполнения веб-браузера.

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

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

    1. Обновить пакеты дистрибутива, которые не удовлетворяют требованиям современных веб-браузеров.
    2. Установить требуемые пакеты в качестве дополнительных и сконфигурировать веб-браузер на их использование.

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

    При использовании второго подхода устанавливаемое программное обеспечение будет взаимодействовать только с веб-браузером, и стабильность системы не пострадает. В статье предпочтение отдано именно этому, более безопасному, подходу.

    Динамически компонуемые программы

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

    За загрузку динамически компонуемых программ (см. рис. 1) в операционной системе отвечает загрузчик, ссылка на который находится в файле /liMd-linux.so.2. Сам загрузчик скомпонован статически, в чем можно убедиться с помощью команды:

    Для динамически компонуемых программ вывод команды file содержит текст dynamically linked (uses shared libs), например:

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

    Перед выполнением динамически компонуемой программы загрузчик должен:

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

    По умолчанию поиск динамических библиотек, необходимых для работы программы, производится в следующем порядке (man 8 Id.so):

    1. в местах, указанных при компиляции программ;
    2. в каталогах, перечисленных в конфигурационном файле /etc/ld.so.conf, сведения из которого обрабатываются системной утилитой Idconfig и вносятся в файл двоичного формата /etc/ld.so.cache,
    3. 3) в стандартных системных каталогах /usr/lib и /lib.

    Временно описанный порядок поиска можно изменить, указав приоритетные пути в переменной окружения LD_ LIBRARY_PATH:

    Заметим, что пути, которые указаны в п. 3, записаны в файл загрузчика при его компиляции. В этом можно легко убедиться:

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

    Веб-браузер Pale Moon

    Загрузим с официального веб-сайта 32-битную версию веб-браузера Pale Moon, распакуем дистрибутивный архив и попробуем его выполнить:

    Браузер не запустился, а из полученного сообщения становится понятно, что ошибка произошла при инициализации системы ХРСОМ. Сообщение ELF file OS ABI invalid характерно для подсистемы glibc, когда загрузчик динамических библиотек (/lib/ld-linux.so.2) не может идентифицировать интерфейс динамической библиотеки (в данном случае libxul.so).

    Причиной подобной проблемы зачастую является:

    • несоответствие версии динамической библиотеки архитектуре операционной системы (в том числе попытка использования 64-битных динамических библиотек на 32-битных операционных системах);
    • несоответствие версии подсистемы glibc, установленной в операционной системе, той, которая необходима для выполнения программы.

    Посмотрим сведения о динамических библиотеках пакета palemoon:

    Обнаружено различие в параметре OS ABI библиотеки palemoon/libxul.so (GNU/Linux) и остальных динамических библиотек (SYSV).

    Спецификация SYSV традиционна для формата ELF и операционных систем семейства UNIX, тогда как соглашение OS ABI GNU/Linux было введено позже. К сожалению, загрузчик динамических библиотек, являющийся компонентом установленной в операционной системе подсистемы glibc, не смог распознать этот формат и сообщил об ошибке.

    Решить возникшую проблему можно двумя способами:

    1. Обновить подсистему glibc используемого дистрибутива.
    2. Отыскать подходящую версию проблемной динамической библиотеки в поддерживаемом формате.

    Второй способ проще в случае удачного поиска, но в долгосрочной перспективе может вызвать проблемы. Ведь выполняться будет уже не исходный, а модифицированный пакет веб-браузера, и после планового обновления его до новой версии может потребоваться повторная замена динамической библиотеки. Поэтому соберем подсистему glibc из исходных текстов.

    Подготовка сред выполнения и сборки

    Для решения поставленной в статье задачи решено задействовать три области размещения бинарных файлов:

    1. Штатные библиотеки дистрибутива /lib, /usr/lib и его исполняемые файлы /bin, /sbin, /usr/Ып, /usr/sbin.
    2. Дополнительные библиотеки $HOME/usr/lib и исполняемые файлы $HOME/usr/bin, $HOME/usr/sbin, зависимости которых не выходят за рамки этих дополнительных библиотек и стандартных библиотек из п. 1.
    3. Новая версия библиотеки glibc и зависящие от нее библиотеки $HOME/glibc-2.16/lib, а также связанные с этими библиотеками исполняемые файлы $НОМЕ/ glibc-2.16/Ып и $HOME/glibc-2.16/sbin.

    Необходимость выделения библиотеки glibc 2.16 и зависимых от нее программ в отдельный каталог по отношению к $HOME/usr связана с существенными трудностями при конфигурировании среды сборки пакетов, зависящих от штатных библиотек дистрибутива и некоторых дополнительных библиотек (см. приложение 1). Спрятать новую версию glibc от средств разработки проще всего таким организационным методом, нежели задавать массу ключей для компилятора и компоновщика.

    Файлы с исходными текстами для сборки пакетов программного обеспечения размещаются в каталоге $НОМЕ/ work. В нем создан подкаталог $HOME/work/obj для промежуточного хранения результатов сборки GCC и glibc.

    Дело в том, что если большинство пакетов могут быть собраны с помощью классической последовательности команд:

    ./configure –prefix=$SPREFIX; make; make install

    выполненных из каталога с исходными текстами, то аналогичные команды для GCC и glibc должны выполняться из пустых подкаталогов.

    Для подготовки среды сборки пакетов удобно использовать файл build.env с таким содержимым:

    Перед выполнением команд сборки этот файл нужно задействовать (однократно!) в сеансе терминала следующей командой:

    Подготовка инструментария

    Основными инструментами разработки приложений в мире Linux являются компилятор GNU GCC и утилиты GNUBlnutils, GNU Маке и GNU Autoconf . В дальнейшем изложении для сокращения текста префикс GNU будет опускаться.

    Для решения задачи, поставленной в статье, нет необходимости в использовании утилит Autoconf, потому что исходные тексты всех задействованных пакетов доступны в виде версионированных tar-архивов. Версия установленной в дистрибутиве утилиты Маке не вызвала никаких нареканий со стороны конфигурационных сценариев, поэтому

    тоже останется без изменений. Потребуется обновить лишь GCC и Binutils.

    В первую очередь устанавливаются средства разработки, поставляемые дистрибутивом. Они объединены мета-пакетом kemel-desktop-devel-2.6.22- 1mdv.

    Отдельно устанавливается компилятор Си++, который представлен пакетом gcc-с++ 422-0.RC.1 mdv2008.0. Если о нем забыть, то при сборке GCC будет выдано сообщение об ошибке:

    configure: error: C++ compiler missing or inoperational

    конфигуратор почему-то не обнаруживает этой проблемы, а для исправления ошибки надо удалить каталог с результатами частичной сборки, создать новый и после установки gcc-с++ заново выполнить конфигурирование.

    Для сборки GCC в каталог с исходными текстами нужно распаковать вспомогательные пакеты точной и комплексной арифметики (ISL, GMP, MPFR и МРС) и создать в нем символические ссылки на версионированные папки:

    Зачем нужно выделять glibc?

    Возникает вопрос: «А нельзя ли для единообразия установить новую версию glibc в каталог SHOME/usr вместе со всеми дополнительными программами и библиотеками?- Давайте рассмотрим, с какими проблемами придется столкнуться при таком варианте и как их можно решать.

    При сборке программы из исходных текстов компилятор записывает в исполняемый файл путь к каталогу, в котором загрузчик будет искать файлы библиотек времени выполнения (runtime libraries) в первую очередь. Как правило, это каталог $PREFIX/lib Если при конфигурировании не указывать параметр –prefix, то в качестве $PREFIX будет использовано значение по умолчанию: /usr/local

    Во вновь установленном дистрибутиве каталог /usr/local/lib пуст, поэтому при запуске собранной из исходных текстов программы будет задействована библиотека /lib/libc.so.6 в соответствии с правилом поиска динамических библиотек.

    Но в описываемой ситуации, когда программное обеспечение конфигурируется с параметром -prefix=$HOME/usr, при запуске исполняемых файлов будут подключаться динамические библиотеки из каталога $HOME/usr/ lib, который содержит новую версию библиотеки glibc.

    Это не всегда желательно. Если, например, в такой конфигурации собрать пакет хг-52.4, который необходим для распаковки xz-архивов, то при запуске утилиты xz будет выдаваться уже знакомая ошибка:

    Привязки динамических библиотек можно увидеть с помощью команды:

    Причину произошедшего демонстрирует команда:

    Чтобы такой ситуации избежать, нужно в команде конфигурирования указать приоритетные пути для поиска библиотек компоновщиком (man Id).

    После сборки утилита запускается и работает нормально благодаря компоновке с заданными версиями динамических библиотек:

    Убедиться в результативности произведенной настройки можно с помощью команды:

    При сборке из исходных текстов динамических библиотек (например. libffi-3.2.1. которая необходима пакету GTX+) можно столкнуться с проблемой иного рода. Новый компилятор GCC, установленный в каталог $HOME/usr/bm, обнаруживает новую версию библиотеки glibc и собирает целевую динамическую библиотеку с присвоением ей зависимости от версии новой библиотеки:

    Из сообщения видно, что для libffi.so задействуется штатная версия glibc: /lib/i686/libc.so.6. но ожидается версия не ниже дНЬс_2.7 Справиться с этой проблемой помогает указание приоритетных путей для поиска библиотек системой сборки:

    Суммируя сказанное, если собираемому пакету не требуется новая версия библиотеки glibc, при конфигурировании исходных текстов перед сборкой можно создать переменную LDFLAGS со значением ‘-Wl,-rpath/ lib, -L/lib -L/usr/lib’

    Это позволяет обойти многие проблемы, но, к сожалению, не все. Некоторые программы требуют дополнительные библиотеки при старой версии glibc. Сложность конфигурирования инструментов сборки для таких случаев существенно превышает эстетические неудобства от вынесения новой версии glibc в отдельный каталог.

    Если не установить вспомогательные пакеты, то конфигурирование завершится с ошибкой:

    configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and МРС 0.8.0+.

    Сборку GCC нельзя производить в том же каталоге, где находятся исходные тексты пакета. Поэтому в каталоге obj создается подкаталог gcc-4.82, делается текущим, и уже из него дается команда на конфигурирование:

    Ограничение списка поддерживаемых языков программирования способствует уменьшению времени сборки и занимаемого дискового пространства. После конфигурирования сборка и установка GCC производятся с помощью команд:

    Сборка пакета binutils-2.24 производится по стандартной схеме, с указанием на этапе конфигурирования пути к целевому каталогу.

    Сборка glibc

    Основная роль библиотеки glibc – реализация интерфейса между функциями стандарта POSIX и системными вызовами ядра операционной системы. Поэтому она находится в сильной зависимости от ядра.

    Если, например, в среде дистрибутива Maridriva 2008 можно без особенных проблем собрать самую современную версию компилятора GCC 82, то к выбору совместимой версии glibc нужно подходить с большой осмотрительностью, ориентируясь на период расцвета ядра версии 2.6. В результате ряда экспериментов была найдена подходящая версия для модернизации – glibc-2.16.0.

    Сборку glibc рекомендуется осуществлять с указанием на заголовочные файлы самой современной версии ядра операционной системы из доступных.

    В ретроспективе «современность» означает доступность на момент выпуска glibc, в рассматриваемом примере это версия 2.6.38.8 (попытка сборки антикварной версии glibc со ссылкой на заголовочные файлы ядра четвертой или даже третьей версии GNU/Linux ни к чему хорошему не приведет).

    Для установки заголовочных файлов нужно распаковать архив с исходными текстами Iinux-2.6.38.8.tar.bz2, сделать создавшийся при этом каталог текущим и выполнить команды:

    где значение переменной HEADERS задает целевой каталог для заголовочных файлов.

    Для сборки пакета glibc. как и для GCC, нужно создать отдельный подкаталог obj/glibc-2.16.0 и сделать его текущим. После этого можно выполнять конфигурирование:

    Параметр enable-kernel задает минимальную версию ядра, которая будет поддерживаться библиотекой glibc, а параметры, содержащие i686, позволяют произвести на современном компьютере сборку пакета для устаревшей архитектуры. Если в параметре with-headers указать неправильный путь, то конфигурирование может пройти успешно, но при сборке будет выведена серия сообщений об ошибках вида:

    Если же в перечне флагов компилятора CFLAGS не указать опцию -02, то сборка будет прервана ошибкой:

    Процесс сборки запускается командой:

    Установка производится с помощью команды:

    Свежесобранный загрузчик динамически компонуемых программ в качестве стандартного пути поиска динамических библиотек будет использовать единственный каталог $HOME/glibc-2.16/lib, в чем легко убедиться:

    Поэтому теперь нужно создать файл $HOME/usr/etc/ld.so.conf с перечнем дополнительных путей поиска динамических библиотек:

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

    Запуск программы с новой версией glibc

    На данном этапе в системе установлены две версии glibc:

    • поставлявшаяся вместе с дистрибутивом 2.6.1 и находящаяся в каталоге /lib (с загрузчиком динамических библиотек /lib/ld-linux.so.2 -> /lib/ld-2.6.1 .so):
    • новая 2.16.0, находящаяся в каталоге $HOME/glibc-2.16/ lib (с загрузчиком динамических библиотек $НОМЕ/ glibc-2.16/lib/ld-linux.so2 -> Id-2.16.0.so).

    Если сейчас попытаться запустить веб-браузер командой:

    то будет выдано сообщение об ошибке:

    Дело в том, что при запуске программы palemoon/ palemoon был задействован загрузчик динамических библиотек /lib/ld-2.6.1 .so. которому не знаком новый формат динамической библиотеки libm.so.6. Система не применила новую версию загрузчика из $HOME/glib-2.16/lib/ld-2.16.0.SO. потому что путь к загрузчику прописывается в исполняемом файле при компиляции и, как правило, представлен ссылкой /lib/ld-linux.so2.

    Для запуска программы с помощью конкретной версии загрузчика можно воспользоваться такой командой:

    В параметре –library-path прописаны приоритетные пути поиска динамических библиотек. Теперь ошибка выглядит так:

    Полученное сообщение говорит о том, что системе не удалось обнаружить файл динамической библиотеки libХ11-xcb.so.1. который нужен модулю libxul.so. Это небольшая интерфейсная библиотека, которую проще всего взять в готовом двоичном виде для архитектуры i386 из дистрибутива Debian и записать файлы libХ11 -xcb.so. 1 и libХ11 -xcb.so. 1.0.0 в каталог $HOME/usr/lib. После этого попытка запуска веб-браузера palemoon прервется сообщением:

    Ссылка на отсутствующий символ gdk_x11_set_sm_ clientjd говорит о том, что установленная в дистрибутиве версия библиотеки GTK+ 2.12 не соответствует минимальным требованиям веб-браузера относительно GTK+ >=2.24. Выполним установку требуемой версии GTK+.

    Сборка GTK+

    С учетом изложенных выше сведений сборка пакета GTK+ 2.24 из исходных текстов превращается в рутинную процедуру. Желающие могут ее повторить, предварительно установив из дистрибутива следующие пакеты:

    • zlibl-devel 1.2.3-8mdv2008.0:
    • libpng-devel 1.2.19-2mdv2008.0:
    • Iibfreetype6-devel 2.3.5-2mdv2008.0:
    • libxl 1_6-devel 1.1.3-2mdv2008.0.
    • Iibxrandr2-devel 1.2.2-1 mdv2008.0.

    Без последнего пакета конфигуратор GTK+ будет завершаться с сообщением об ошибке:

    Перед сборкой остальных пакетов нужно сконфигурировать среду (если она еще не была сконфигурирована) с помощью файла build.env, как было описано выше. Сборка выполняется посредством классической последовательности команд:

    в соответствии с деревом зависимостей:

    Если у платформы, на которой выполняется сборка, нет доступа к интернету, то при конфигурировании пакета glib-2.0 нужно отключить генерацию файлов документации, указав параметр -disable-man. во избежание ошибок:

    После установки GTK+ веб-браузер palemoon-28.1 успешно запускается командой:

    Цель, поставленная в начале статьи, достигнута.

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

    Приведем список тезисов, которыми предлагается руководствоваться при решении проблем, связанных с работой динамически компонуемых программ:

    • Для выполнения динамически компонуемых программ операционная система задействует загрузчик динамических библиотек.
    • Загрузчик динамических библиотек является частью пакета glibc и представляет собой статически скомпонованную программу.
    • Путь к загрузчику на этапе компиляции программы записывается в файл с е-двоичным кодом: Лib/id-iinux.so2.
    • Для запуска программы альтернативным загрузчиком нужно выполнить сам загрузчик, передав ему в качестве параметров имя запускаемой программы и приоритетные пути поиска динамических библиотек.
    • Основные пути поиска динамических библиотек задаются в конфигурационном файле /etc/ld.so.conf, на основе которого с помощью команды:
      строится индексный файл /etc/id.so.cache, используемый загрузчиком.
    • Приоритетные пути поиска динамических библиотек могут быть заданы через переменную окружения PKG_ CONFIG_PATH
    • Приоритетный путь поиска runtime-библиотек, с которыми компилятор связывает код программы, может быть изменен с помощью опции компоновщика -rpath, которая может быть передана через переменную параметров компилятора в виде:
    • Порядок обхода путей системой сборки в поисках динамических библиотек может быть изменен и дополнен посредством указания:

    Описанные в статье приемы и методы могут быть использованы для решения задачи запуска произвольных программ под различными операционными системами семейства Linux FOX.

    Источник: журнал “Системный администратор”

  • Defense in Depth: военные принципы корпоративной безопасности

    Defense in Depth: военные принципы корпоративной безопасности

    За то короткое время пока вы читаете эту статью, по самым приблизительным оценкам, в мире будет совершено свыше 22 тысяч кибератак, а за день эта цифра превысит 6,5 миллиона случаев.

    В 2017 году «Лаборатория Касперского» фиксировала более 360 тысяч новых образцов вредоносных файлов в день, что на 11,5% больше, чем годом ранее. Независимые исследователи из AV-Test сообщают, что в 2018-м уже зафиксировано 836,23 миллиона новых вредоносов (см. рис. 1).

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

    Основным драйвером для злоумышленников по ту сторону баррикад по-прежнему остается получение финансовой прибыли, поэтому большинство атак направлено на организации малого, среднего и крупного бизнеса. Однако в последние годы участились атаки на учреждения здравоохранения, и это становится действительно опасным явлением.

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

    К большому сожалению, на сегодняшний день не существует универсальной «серебряной пули», которая могла бы защитить компании от вредоносной активности и хакерских атак. Старый военный принцип «лучшая защита – это нападение», пока только в частных случаях используется правоохранительными органами после выявления причастных к атакам лиц. Поэтому остальным организациям остается только вооружаться и защищаться на всех имеющихся рубежах.

    Однако кое-какие из военных принципов все-таки полезно взять на вооружение, когда дело касается защиты информационной инфраструктуры. Это концепция «глубокой защиты» (Defense in Depth), которая предполагает организацию независимой защиты каждого уровня информационной системы. Идея такого подхода заключается в защите системы от конкретного типа атаки с использованием нескольких независимых методов (см. рис. 2).

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

    Концепция Defense in Depth делит организацию защиты инфраструктуры на три контролируемые части:

    • Физическая: сюда относятся все меры по ограничению физического доступа к ИТ-инфраструктуре не авторизованных лиц. Например, охранник вашего офиса, системы СКУД, камеры видео-наблюдения, сигнализация, телекоммуникационные шкафы с замками и так далее.
    • Техническая: сюда относятся все хардверные и софтовые средства защиты информации, призванные контролировать сетевой доступ к объектам информационной системы, межсетевой экран, средства антивирусной защиты рабочих станций, прокси-серверы, системы аутентификации и авторизации.
    • Административная: сюда относятся все политики и процедуры информационной безопасности, принятые в организации. Данные документы призваны регулировать управление защитой, распределение и обработку критичной информации, использование программных и технических средств в компании, а также взаимодействие сотрудников с информационной системой, сторонними организациями и другими внешними субъектами.

    Итак, давайте же углубимся в уровни «глубокой защиты» и посмотрим, как можно применить данный подход на практике.

    Уровень физической защиты

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

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

    Такие векторы атак, как нелегально пронесенное на территорию офиса оборудование (Wi-Fi-шлюзы, USB-накопители и так далее), хоть и встречаются достаточно редко, все же не являются исключением. А злоумышленнику, который может находиться на территории объекта абсолютно легально, не обязательно даже иметь доступ к оборудованию, достаточно обладать хорошими навыками социальной инженерии и психологической манипуляции. Такие методы, как shoulder surfing и dumpster diving, тоже имеют место быть, так что…

    Но хватит околошпионских сценариев, давайте рассмотрим методы защиты уровней, применимых к каждой без исключения организации, будь то SMB или Enterprise. По порядку продолжим техническим уровнем.

    Уровень технической защиты

    Согласно концепции Defense in Depth на данном уровне необходимо реализовать целый комплекс защитных мер.

    Firewall

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

    Тут учитывается несколько факторов:

    • Во-первых, такие решения стоят недешево, поэтому нужно определить, какие задачи решит приобретение такого оборудования – защита сети, организация VPN, детектирование атак, анализ сетевого трафика и так далее. Помимо этого каким-то организациям разрешено приобретать только сертифицированные решения или только отечественного производства, поэтому стоит обратить внимание на наличие таких сертификатов или перспективу их получения.
    • Во-вторых, важно не попасться в маркетинговую ловушку. Дело в том, что существует несколько схожих решений UTM, NGFW, NGIPS, которые обладают приблизительно одинаковым функционалом, и производители не стесняются позиционировать свое решение как «швейцарский нож», хотя на самом деле оно может таковым и не является. Лучше абстрагироваться от маркетинга и руководствоваться фактами. Подходит ли решение под мою задачу? Соответствует ли оно нашим требованиям? Сможем ли мы с ним работать? Есть ли поддержка? Если есть возможность – возьмите «тест-драйв».

    UTM, NGFW – это продукты, сочетающие в себе все необходимые модули сетевой безопасности, такие как межсетевое экранирование, IPS/1DS. VPN, фильтрация приложений, защита почты, антивирус, – в одном флаконе. Как правило, они имеют виртуальное, аппаратное или программное исполнение, легко масштабируются, пополняются новыми модулями и поддерживают кластеризацию.

    Межсетевой экран – не такое решение, чтобы на нем стоило экономить, ведь именно это устройство будет защищать ваши передовые рубежи. С тех пор как появились первые UTM, а за ними и NGFW, прошло уже достаточно много времени. решения стали более производительными и способными обрабатывать большие объемы трафика.

    Сейчас на рынке представлено достаточно большое количество производителей, выпускающих решения этого класса как для малого и среднего, так и для крупного бизнеса. Среди них можно выделить такие решения, как Sophos UTM, Cisco Firepower, Fortinet FortiGate, Checkpoint, Palo Alto.

    Защита почты

    По данным Symantec за последний год, 71% таргетированных атак совершалось методом spear phishing. Это такой вид атаки, который направлен на конкретных владельцев почтового ящика с использованием методов социальной инженерии и психологического воздействия.

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

    Письмо может быть сформировано так, что его нельзя будет отличить от письма из доверенного источника. Банки, ведомства, государственные учреждения, ваши партнеры, клиенты – хакеры могут притвориться кем угодно. Доверчивый сотрудник откроет ссылку или вложение из такого письма, и вашу сеть вмиг поразит очередной шифровальщик или агент ботнета. Конечно, нужно максимально ограничивать возможность получения таких писем вашими сотрудниками.

    В этом нам помогут антиспам-решения, которые проверяют входящие письма по множеству критериев, таких как данные отправителя, адрес почты, IP, домен, наличие/ содержание вложений и ссылок, и принимают решение об их дальнейшей обработке.

    Такой популярный вектор атаки, как почта, должен быть защищен максимально надежно. Для этих целей могут подойти NGFW, UTM с модулями защиты почты, а также отдельные решения, из которых можно отменить Cisco IronPort ESA, Kaspersky Security для почтового сервера, Eset Email Security.

    Системы управления доступом

    Неограниченный доступ ко всем элементам информационной системы может быть не только бесполезным, но и опасным. Например, операторам ни к чему иметь доступ к API веб-приложения или консоли управления почтового сервера. Согласно лучшим практикам нужно выдавать доступ только к тем компонентам, с которыми пользователь будет работать. Для эффективного управления доступом нужно иметь систему авторизации и аутентификации, которая будет однозначно идентифицировать пользователя и определять, какие права на доступ у него есть.

    Наиболее подходящим решением в данном случае является создание контроллера домена (domain controller) и установки службы Active Directory. Как правило, этот же сервер можно задействовать под роли DNS и DHCP. А чтобы все было -по канону» рекомендуется не ограничиваться одним контроллером и установить резервный, что повысит безопасность и отказоустойчивость решения.

    При настройке системы управления доступом, особое внимание следует уделить требованиям к паролям. Настроить частоту их смены и содержания, блокировку системы в случае неправильного ввода и другое.

    Регулярные обновления

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

    Но бездумно это делать не рекомендуется. Согласно лучшим практикам обновление лучше сначала хорошенько обкатать в лаборатории и, лишь убедившись в отсутствии других «сюрпризов», накатывать в продакшн. Это долгий путь, зато правильный.

    Контролировать наличие активов с устаревшими и уязвимыми версиями ПО поможет сканер уязвимостей.

    Технические улучшения

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

    Резервное копирование

    Делайте резервные копии всего, что только можно, особенно критичных систем и их конфигурации. Кто-то может спросить, а как это относится к безопасности, напрямую. Установили свежий апдейт на продакшн-решение. и оно «прилегло отдохнуть»? Это инцидент информационной безопасности и непрерывности ведения бизнеса. Вирус-шифровальщик уничтожил базу данных с критичной информацией? Очень жаль. Вот бы остался бэкап, правда?

    Делайте регулярные бэкапы!

    Мониторинг и анализ

    В идеале нужно понимать, что происходит с вашими информационными активами и сетью. Каким атакам они подвергаются, опасны ли они, есть ли среди них успешные?

    Для этих задач существуют системы управления событиями информационной безопасности (SIEM). Они собирают журналы со всех критичных узлов инфраструктуры (межсетевых экранов, маршрутизаторов, коммутаторов, серверов, рабочих станций и так далее) и по заданным правилам ищут коррелирующие признаки, на основании которых сообщают об инциденте. Например, сервер сообщает, что на него были 34 неспешные попытки аутентификации, а на 35-й пользователю удалось войти. Налицо успешная попытка брутфорса – инцидент, разбираемся.

    Нужно сказать, что в сегменте SMB такие системы пока не распространены и коммерческие решения могут себе позволить далеко не все. Они требуют достаточно точной настройки и долгой отладки для устранения ложных срабатываний.

    Тем не менее Open Source-решения такого класса существуют, и никто не запрещает попробовать адаптировать их под свои задачи . Ну и напоследок о ноу-хау в списке решений информационной безопасности, которые имеют хороший потенциал, но пока массово не применяются.

    Песочницы (Sandboxes)

    Это такие изолированные, как правило, виртуальные системы, в которых можно проверить, является ли файл вредоносным. Ну, допустим, вы получили письмо с вложением от недоверенного источника и пока что его не открыли. Вы можете направить файл из вложения в песочницу. Вирус подумает, что он добрался до оконечной станции, и начнет свое разрушительное действие, а вы сможете изучить работу вируса и, например, поделиться результатами исследования с разработчиками антивирусного ПО.

    Сейчас технология Sandboxing применяется в основном в антивирусах для проверки поведения вредоносных файлов.

    UEBA

    Модные в последнее время тренды машинного обучения нашли применение в сравнительно недавних решениях в области информационной безопасности – системах поведенческого анализа (User and Entity Behavior Analytics). С помощью различных технологий данные системы могут находить аномалии в работе множества сущностей, от сетевого оборудования и трафика до пользователей, и уведомлять об этом ответственных лиц. Такие системы могут стать дополнением к решениям мониторинга информационной безопасности.

    Ловушки для хакеров (Honeypots)

    На рынке пока еще представлено не так много коммерческих решений данного класса. Суть проста: создается заведомо уязвимое устройство или целый парк таких устройств, они могут быть как аппаратными, так и виртуальными. Эти устройства должны имитировать актив, работающий в нарушение всех политик безопасности, чтобы привлечь внимание злоумышленников. Главное – не слишком перестараться, а то подвох окажется очевидным.

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

    Благодаря таким решениям, в том числе собираются многочисленные индикаторы компрометации злоумышленников (IP-адрес, домен, URL, хеш-сумма вредоносных файлов и так далее), которые потом применяются в Threat Intelligence.

    Уровень административной защиты

    Последний по счету, но не по значимости, уровень в концепции Defense in Depth.

    Усиливать безопасность своей компании можно (и нужно), в том числе с помощью административного ресурса. Защитные меры, которые применяются на данном этапе, направлены на самый уязвимый в мире вектор атаки – человека.

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

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

    В идеале – проводить для сотрудников регулярные тренинги, где рассказывать об актуальных угрозах и способах защиты от них.
    Сложно представить себе, что когда-нибудь для защиты информационной инфраструктуры понадобится всего одно решение, поэтому пока что концепция Defense in Depth остается актуальной. Она подходит для бизнеса любого размера вне зависимости от имеющихся ресурсов.

    Конечно, кто-то может позволить себе более качественные коммерческие продукты с поддержкой от производителя, а кто-то только Open Source с поддержкой от комьюнити, но при правильном подходе даже на открытых решениях можно выстроить полноценную многоуровневую систему для защиты информационных активов.

    Источник: журнал “Системный администратор”

    Профессиональный коллектив ITFB с 10-и летним опытом поможет повысить безопасность сервера и сайта. Обращайтесь за помощью и консультацией.

  • Скрипт аудита безопасности Linux

    LBSA – Linux Basic Security Audit скрипт

    Это базовый сценарий аудита безопасности Linux для непрерывного применения политик (CPE). Сценарий может быть запущен из командной строки от имени пользователя root или, в идеале, на регулярной основе с использованием cron или другого планировщика для проверки изменений конфигурации.

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

    Если рекомендаций нет, сценарий просто выводит одну строку, в которой говорится, что системные проверки завершены. Это позволяет легко использовать его в автоматизированной системе для регулярного отслеживания безопасности. Например, вы можете вызывать этот сценарий каждые n минут как часть более крупного сценария, который имеет больше правил для вашей конкретной среды, и, если выходные данные не соответствуют строке «Проверка системы завершена», отправить выходные данные на свой адрес электронной почты.

    Этот скрипт работает «из коробки» и рекомендует только несколько небольших важных изменений в вашей системе, которые легко применить. После этого его можно использовать как часть вашего мониторинга безопасности сервера.

    Скрипт сканирует:

    • распространенные уязвимости в настройках учетной записи Linux
    • распространенные уязвимости в настройках SSH
    • общие уязвимости в файловой системе временной и разделяемой памяти (например, /tmp, /var/tmp, /dev/shm)
    • рекомендации по разрешению файловой системы, которые могут защитить большинство систем без ущерба для нормальной работы
    • heartbeat и разрешения файла конфигурации DRBD

    Текущая версия указана в верхней части скрипта:

    [sociallocker]

    #!/bin/bash
    
    #------------------------------------------------------------------------------------------------------------------------------
    # LBSA - Linux Basic Security Audit script
    #------------------------------------------------------------------------------------------------------------------------------
    # (c) Neale Rudd, All rights reserved
    # Version 1.0.49
    #
    # License: GPL v3
    # Language: Shell script (bash)
    # Required permissions: root or equivalent
    # Script type: Check and report (no modifications are made to your system)
    # Expected output: System Checks Completed
    #
    #
    #------------------------------------------------------------------------------------------------------------------------------
    # GUIDE
    #------------------------------------------------------------------------------------------------------------------------------
    # This script runs a series of basic linux security checks for Continuous
    # Policy Enforcement (CPE).  It is, and will always be, a work in progress.
    # The script was originally designed for use on Ubuntu, but will most likely
    # work with other distros.
    #
    # The checks are far from exhaustive, but can highlight some basic setup 
    # issues from default linux installs and continuously enforce policies that
    # you require in your specific environment.
    #
    # These checks include a subset of setup policies which I use for hardening
    # server configurations.  As such, not all checks may be suitable for your
    # environment.  For example, I don't allow root to login over SSH.  This may
    # cause issues in your environment, or may be too restrictive for home use in
    # some cases.
    #
    # If your own settings are more restrictive than these, or you have your own
    # opinions on the settings, then modify this script to suit your own purposes.
    # The main idea is to have a script that can enforce your own policies, and to
    # run it regularly.  It is not necessary to follow my policies line-by-line.
    # 
    # That said, this script should be suitable for most servers and home users
    # "as-is", and for other admins it should give you some ideas for your own
    # script, or at very least should make for a good read :-)
    #
    # Usage notes
    # Ideally, this script would be called by a wrapper script of your own, which
    # implements other checks more specific to your environment.  For example,
    # if you run Apache, you may want to also check various folder permissions
    # for Apache, then call this script as the final step of your own script.
    # The script should be called regularly by cron or another scheduler and mail
    # results to the administrator for review if the output changes.
    #
    # Criticisms and Counter Arguments (Feb 2013)
    # In a comment on reddit, someones mentioned I ought to be dunked in honey
    # and given to a colony of ants for writing lines that are longer than 80
    # characters.  I agree and I now have a new fear on ants, thank you.
    # Many lines are still longer than 80 characters.  Sorry, they just are.
    # They also commented that passwd -l root will lock the root account from
    # accessing the console.  This may be correct but I still recommend it.
    # They also commented that if there is proper configuration management, then
    # checking folder and file permissions is unnecessary.  I respectully disagree.
    # If a system is breached, folder and file permissions may be changed and
    # continuous policy checking is one way to be alerted to such a change quickly.
    # Finally, they commented that "moving the SSH port from 22, which is asinine
    # and provides no actual protection, simply makes it more difficult for people
    # to manage those systems."  I also respectfully disagree with that - Port
    # scanning bots hit port 22 and changing the default port helps to reduce
    # automated threats.  Using a different port than 22 does not make it more
    # difficult to manage systems if you are using a configuration management
    # system or only have a single server to worry about.
    # Ref: http://wiki.centos.org/HowTos/Network/SecuringSSH
    #
    # Disclaimer
    # This is a free script provided to the community.  I am not responsible
    # for any changes you make to your own system.  All opinions expressed are my
    # own and are not necessarily the opinion of my employer, any company or
    # organisation, or anyone else.
    #
    # Recent changes:
    # 1.0.49 - Modified the hashing time suggestion for password-based logins
    # 1.0.48 - Added test to find SSH-key based logins in non-home folders
    # 1.0.47 - Switched to octal permissions
    # 1.0.47 - Added warnings for BlowFish and SHA256 (SHA512 is available)
    # 1.0.47 - Added recommendations for multiple hashing rounds in /etc/shadow
    # 1.0.47 - Fixed bug which caused script to wait when outputing MD5 warning
    # 1.0.46 - Added GPL v3 License
    # 1.0.46 - Switched to use of check_path function instead of all the loops
    # 1.0.45 - Changed use of ls to stat for 25% speed improvement
    # 1.0.45 - Removed UUOC (useless use of cat)
    # 1.0.45 - Commenting changes, reduced header comments width to <80 chars
    #
    # Other useful tools:
    # * Bastille - hardening toolkit which covers lots of things not covered here
    # * AIDE - monitor for file changes
    # * fail2ban - scan logs, ban IP addresses
    #
    #
    #------------------------------------------------------------------------------------------------------------------------------
    # HOW TO USE
    #------------------------------------------------------------------------------------------------------------------------------
    # First, change parameters in the SETTINGS section to suit your environment,
    # or call this script from a wrapper script that sets these variables.
    #
    # The script should be executed as root with bash.
    # eg:
    #   export LBSA_PERMITTED_LOGIN_ACCOUNTS="nrudd|sjackson"
    #   bash sec_lbsa.sh
    #
    # A series of checks are executed
    # No modifications are performed
    #
    # Running this script should produce no result except the phrase
    # "System Checks Completed", at position 0 of the output.
    # If there is any other output, then one or more warnings have been issued
    #
    # This can be used in cron or another scheduler to send a mail using a command
    # like the following:
    #   export LBSA_PERMITTED_LOGIN_ACCOUNTS="nrudd|sjackson";
    #   LBSA_RESULTS=`bash sec_lbsa.sh`;
    #   if [ "$LBSA_RESULTS" != "System Checks Completed" ]; then {your sendmail command here}; fi
    #
    #
    #------------------------------------------------------------------------------------------------------------------------------
    # SETTINGS
    #------------------------------------------------------------------------------------------------------------------------------
    # Settings are in if-blocks in case you want to call this script from a
    # wrapper-script to avoid modifying it.  This allows for easier upgrades.
    
    # Permitted Login Accounts
    #    Specify the list of permitted logins in quotes, separated by |
    #    If there are none, just leave it blank.  root should not be listed here, as we don't want root logging in via SSH either.
    #    Valid examples:
    #    LBSA_PERMITTED_LOGIN_ACCOUNTS=""
    #    LBSA_PERMITTED_LOGIN_ACCOUNTS="user1"
    #    LBSA_PERMITTED_LOGIN_ACCOUNTS="user1|user2|user3"
    if [ ! -n "$LBSA_PERMITTED_LOGIN_ACCOUNTS" ]; then
        LBSA_PERMITTED_LOGIN_ACCOUNTS=""
    fi
    
    # If you aren't worried about allowing any/all SSH port forwarding, change this to yes
    if [ ! -n "$LBSA_ALLOW_ALL_SSH_PORT_FORWARDING" ]; then
        LBSA_ALLOW_ALL_SSH_PORT_FORWARDING=no
    fi
    
    # Set this to yes to provide additional SSH recommendations
    if [ ! -n "$LBSA_INCLUDE_EXTRA_SSH_RECOMMENDATIONS" ]; then
        LBSA_INCLUDE_EXTRA_SSH_RECOMMENDATIONS=no
    fi
    
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # FUNCTIONS
    #------------------------------------------------------------------------------------------------------------------------------
    
    # Check permissions, owner and group, output warnings if they do not match
    check_path() {
    
    	PERMS=$1			# recommended perms, eg: 755 (rwxr-xr-x)
    	OWNER=$2			# recommended owner
    	GROUP=$3			# recommended group
    	CHECKPATH=$4		# path to check
    	
    	if [ -e $CHECKPATH ]; then
    	
    		# Run commands
    		CPERMS=`stat -L -c %a $CHECKPATH`
    		COWNER=`stat -L -c %U $CHECKPATH`
    		CGROUP=`stat -L -c %G $CHECKPATH`
    
    		# Compare
    	    if [ "$CPERMS" != "$PERMS" ]; then
    	    	echo "Permission recommendation for [$CHECKPATH] is [$PERMS].  Current setting is [$CPERMS]"
        	fi
    	    if [ "$COWNER" != "$OWNER" ]; then
    	    	echo "Owner recommendation for [$CHECKPATH] is [$OWNER].  Current setting is [$COWNER]"
        	fi
    	    if [ "$CGROUP" != "$GROUP" ]; then
    	    	echo "Group recommendation for [$CHECKPATH] is [$GROUP].  Current setting is [$CGROUP]"
    		fi
    	fi
    }
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # PASSWORD-BASED LOGIN HASH CHECK
    #------------------------------------------------------------------------------------------------------------------------------
    
    # ACCT_HASHING
    # Make sure no account is using MD5, they should be upgraded to use SHA-512
    # On older installs, when accounts were set up MD5 was the default, and this cannot be auto-upgraded during Linux updates
    # man crypt for details
    # 1 MD5, 2a BlowFish, 5 SHA-256, 6 SHA-512
    # Ref: http://linux.die.net/man/3/crypt
    # This is only really important if the /etc/shadow file is compromised after a breakin
    
    if [ "`chpasswd --help | grep -e " \-s, "`" = "" -o "`chpasswd --help | grep -e " \-c, "`" = "" ]; then
    	echo "WARNING: Your version of chpasswd does not support crypt-method or sha-round. You cannot use the latest hashing algorithms."
    	HASH=":\$1\$"
    	if [ "`fgrep "$HASH" /etc/shadow`" != "" ]; then
    		echo "WARNING: Your passwords are stored as MD5 hashes.  Upgrade your kernel and your chpasswd command to enable SHA-256/SHA-512 hashes.  See: http://en.wikipedia.org/wiki/MD5, http://en.wikipedia.org/wiki/Rainbow_table"
    	fi
    else
    	# MD5 is trivial to dehash within seconds using a rainbow table website so your plaintext passwords will be immediately readable
    	HASH=":\$1\$"
    	if [ "`fgrep "$HASH" /etc/shadow`" != "" ]; then
    		echo "Warning: 1 or more account passwords use MD5 hashing.  When these accounts were set up, MD5 may have been the default but it is now easily decodable.  See: http://en.wikipedia.org/wiki/MD5, http://en.wikipedia.org/wiki/Rainbow_table";
    		echo "Update these accounts to SHA512*200000 or stronger with chpasswd or passwd: " `fgrep "$HASH" /etc/shadow | cut -d ":" -f 1`
    		echo "eg: chpasswd -c SHA512 -s 200000 <<<'user:newPassword'"
    	fi
    	HASH=":\$2a\$"
    	if [ "`fgrep "$HASH" /etc/shadow`" != "" ]; then
    		echo "Warning: 1 or more account passwords use BlowFish hashing.  This is a hashing algorithm designed in 1993 which the creator now recommends against using.  See: http://en.wikipedia.org/wiki/Blowfish_(cipher)";
    		echo "Update these accounts to SHA512*200000 or stronger with chpasswd or passwd: " `fgrep "$HASH" /etc/shadow | cut -d ":" -f 1`
    		echo "eg: chpasswd -c SHA512 -s 200000 <<<'user:newPassword'"
    	fi
    	HASH=":\$5\$"
    	if [ "`grep "$HASH" /etc/shadow`" != "" ]; then
    		echo "Warning: 1 or more account passwords use SHA-256 hashing.  SHA-512 is now available and uses more rounds to encrypt.  See: http://en.wikipedia.org/wiki/SHA-2";
    		echo "Update these accounts to SHA512*200000 or stronger with chpasswd or passwd: " `fgrep "$HASH" /etc/shadow | cut -d ":" -f 1`
    		echo "eg: chpasswd -c SHA512 -s 200000 <<<'user:newPassword'"
    	fi
    	HASH=":\$[0-9]"
    	if [ "`grep "$HASH" /etc/shadow | grep -v "\$rounds="`" != "" ]; then
    		echo "Warning: 1 or more account passwords are using a single round of hashing.  By increasing the number of hashing rounds, the computational time to verify a login password will increase and so will the computational time to reverse your hashes in case of a break-in.  See: http://en.wikipedia.org/wiki/Key_stretching";
    		echo "Update these accounts to SHA512*200000 or stronger with chpasswd or passwd: " `grep "$HASH" /etc/shadow | cut -d ":" -f 1`
    		echo "eg: chpasswd -c SHA512 -s 200000 <<<'user:newPassword'"
    		echo "To see the time overhead for 200000 rounds, use this command ..."
    		echo "time chpasswd -S -c SHA512 -s 200000 <<<'testuser:testpass'"
    		echo "... change the -s parameter until the time is acceptable (eg: 0.2-0.5s) then use the new value to change your password."
    	fi
    fi
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # LOGINS
    #------------------------------------------------------------------------------------------------------------------------------
    
    # ROOT_NOT_LOCKED
    # Make sure root account is locked (no SSH login, no console logins)
    if [ "$LBSA_ALLOW_ROOT_LOGIN" != "true" ]; then passwd -S root | grep -v " L " | xargs -r -iLINE echo -e "Warning: root account is not locked and may allow login over SSH or other services.  Warning: When locked, root will not be able to log in at the console - make sure you have another user configured with sudo access.  Use [passwd -dl root] and [chage -E-1 root] to ensure the root account is locked but can still run cron jobs. [LINE]\n"; fi
    # Fix: passwd -dl root; chage -E-1 root;
    
    # ROOT_PASS_TIMING
    # Make sure root password is set to 0 min 99999 max 7 warning -1 inactivity
    # This may occur with ROOT_PASS_EXPIRES
    passwd -S root | grep -v "0 99999 7 -1" | xargs -r -iLINE echo -e "Warning: root account has non-standard min/max/wait/expiry times set.  If the root password expires, cron jobs and other services may stop working until the password is changed. [LINE]\n"
    # Fix: chage -m 0 -M 99999 -W 7 -I -1 root
    
    # ROOT_PASS_EXPIRES
    # Make sure root password is set to never expire
    # This will normally occur with ROOT_PASS_TIMING
    chage -l root | grep "Password expires" | grep -v never | xargs -r -iLINE echo -e "Warning: root password has an expiry date.  If the root password expires, cron jobs and other services may stop working until the password is changed. [LINE]\n"
    # Fix: chage -m 0 -M 99999 -W 7 -I -1 root
    
    # ROOT_ACCT_EXPIRES
    # Make sure root account is set to never expire
    chage -l root | grep "Account expires" | grep -v never | xargs -r -iLINE echo -e "Warning: root account has an expiry date -- though Linux surely protects against it expiring automatically [recommend setting it to never expire]. [LINE]\n"
    # Fix: chage -E-1 root
    
    # UNEXPECTED_USER_LOGINS_PRESENT
    # Make sure the users that can log in, are ones we know about
    # First, get user list, excluding any we already have stated should be able to log in
    if [ "$LBSA_PERMITTED_LOGIN_ACCOUNTS" = "" ]; then
        USERLIST=`cat /etc/passwd | cut -f 1 -d ":"`
    else
        USERLIST=`grep -v -w -E "$LBSA_PERMITTED_LOGIN_ACCOUNTS" /etc/passwd | cut -f 1 -d ":"`
    fi
    # Find out which ones have valid passwords
    LOGINLIST=""
    for USERNAME in $USERLIST
    do
        if [ "`passwd -S $USERNAME | grep \" P \"`" != "" ]; then
            if [ "$LOGINLIST" = "" ]; then
                LOGINLIST="$USERNAME"
            else
                LOGINLIST="$LOGINLIST $USERNAME"
            fi
        fi
    done
    # Report
    if [ "$LOGINLIST" != "" ]; then
        echo "Warning: the following user(s) are currently granted login rights to this machine: [$LOGINLIST]."
        echo "If users in this list should be allowed to log in, please add their usernames to the LBSA_PERMITTED_LOGIN_ACCOUNTS setting in this script, or set the environment variable prior to calling this script."
        echo "If an account is only used to run services, or used in cron, the account should not be permitted login rights, so lock the account with [passwd -dl <username>] to help prevent it being abused."
        echo "Note: after locking the account, the account will also be marked as expired, so use [chage -E-1 <username>] to set the account to non-expired/never-expire, otherwise services or cron tasks that rely on the user account being active will fail."
        echo ""
    fi
    # Fix: lock the specified accounts then set them non-expired, or specify the users that are listed are ok to log in by
    # adding them to LBSA_PERMITTED_LOGIN_ACCOUNTS
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # Key-based logins that are not in the /home folder
    # - Comment this section out if you have a valid need for these
    #------------------------------------------------------------------------------------------------------------------------------
    
    # List anything that's not in the home folder (protected above)
    RESULT1=`grep -v ':/home/' /etc/passwd | cut -d : -f 6 | xargs -r -IFOLDER ls -al FOLDER/.ssh/authorized_keys 2>/dev/null`
    RESULT2=`grep -v ':/home/' /etc/passwd | cut -d : -f 6 | xargs -r -IFOLDER ls -al FOLDER/.ssh/authorized_keys2 2>/dev/null`
    if [ "$RESULT1" != "" -o "$RESULT2" != "" ]; then
    	echo "Warning: the following files allow key-based login to your system and are not inside your /home folder"
    	echo "Unless you created these logins intentionally, this could indicate a back-door into your system"
    	if [ "$RESULT1" != "" ]; then echo "$RESULT1"; fi
    	if [ "$RESULT2" != "" ]; then echo "$RESULT2"; fi
    fi
    
    
    #--------------------------------------------------------------------------------------------------------------
    # General
    #--------------------------------------------------------------------------------------------------------------
    
    # Ensure /etc/hosts contains an entry for this server name
    export LBSA_HOSTNAME=`hostname`
    if [ "`grep -w "$LBSA_HOSTNAME$" /etc/hosts | grep -v "^#"`" = "" ]; then
    	echo "There is no entry for the server's name [`hostname`] in /etc/hosts.  This may cause unexpected performance problems for local connections and NFS issues.  Add the IP and name in /etc/hosts, eg: 192.168.0.1 `hostname`";
    	echo;
    fi
    
    
    #--------------------------------------------------------------------------------------------------------------
    # SSH Setup
    #--------------------------------------------------------------------------------------------------------------
    
    # Ensure SSHD config is set securely (we do use TcpForwarding, so allow TcpForwarding)
    if [ "`grep -E ^Port /etc/ssh/sshd_config`"                     = "Port 22"                    ]; then echo "SSHD Config: Port is set to default (22).  Recommend change to a non-standard port to make your SSH server more difficult to find/notice.  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^ListenAddress /etc/ssh/sshd_config`"            = ""                           -a "$LBSA_ALLOW_SSH_ALL_ADDRESSES" != "true" ]; then echo "SSHD Config: ListenAddress is set to default (all addresses).  SSH will listen on ALL available IP addresses.  Recommend change to a single IP to reduce the number of access points.  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^PermitRootLogin /etc/ssh/sshd_config`"         != "PermitRootLogin no"         -a "$LBSA_ALLOW_ROOT_LOGIN" != "true" -a "$LBSA_ALLOW_ROOT_LOGIN_SSHCERT" != "true" ]; then echo "SSHD Config: PermitRootLogin should be set to no (prefer log in as a non-root user, then sudo/su to root).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^PermitEmptyPasswords /etc/ssh/sshd_config`"    != "PermitEmptyPasswords no"    ]; then echo "SSHD Config: PermitEmptyPasswords should be set to no (all users must use passwords/keys).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^UsePrivilegeSeparation /etc/ssh/sshd_config`"  != "UsePrivilegeSeparation yes" ]; then echo "SSHD Config: UsePrivilegeSeparation should be set to yes (to chroot most of the SSH code, unless on older RHEL).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^Protocol /etc/ssh/sshd_config`"                != "Protocol 2"                 ]; then echo "SSHD Config: Protocol should be set to 2 (unless older Protocol 1 is really needed).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^X11Forwarding /etc/ssh/sshd_config`"           != "X11Forwarding no"           ]; then echo "SSHD Config: X11Forwarding should be set to no (unless needed).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^StrictModes /etc/ssh/sshd_config`"             != "StrictModes yes"            ]; then echo "SSHD Config: StrictModes should be set to yes (to check file permissions of files such as ~/.ssh, ~/.ssh/authorized_keys etc).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^IgnoreRhosts /etc/ssh/sshd_config`"            != "IgnoreRhosts yes"           ]; then echo "SSHD Config: IgnoreRhosts should be set to yes (this method of Authentication should be avoided).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^HostbasedAuthentication /etc/ssh/sshd_config`" != "HostbasedAuthentication no" ]; then echo "SSHD Config: HostbasedAuthentication should be set to no (this method of Authentication should be avoided).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^RhostsRSAAuthentication /etc/ssh/sshd_config`" != "RhostsRSAAuthentication no" ]; then echo "SSHD Config: RhostsRSAAuthentication should be set to no (this method of Authentication should be avoided).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^GatewayPorts /etc/ssh/sshd_config`"            != ""                           ]; then echo "SSHD Config: GatewayPorts is configured.  These allow listening on non-localhost addresses on the server.  This is disabled by default, but has been added to the config file.  Recommend remove this setting unless needed.  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    if [ "`grep -E ^PermitTunnel /etc/ssh/sshd_config`"            != ""                           ]; then echo "SSHD Config: PermitTunnel is configured.  This allows point-to-point device forwarding and Virtual Tunnel software such as VTun to be used.  This is disabled by default, but has been added to the config file.  Recommend remove this setting unless needed.  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    
    # Commenting out Subsystem sftp is fairly pointless, SCP can still be used and most tools fall back to SCP automatically.  Additionally, it's possible to copy files using just SSH and redirection.
    # if [ "`grep -E "^Subsystem sftp" /etc/ssh/sshd_config`"      != ""                           ]; then echo "SSHD Config: Comment out Subsystem SFTP (unless needed).  While enabled, any user with SSH shell access can browse the filesystem and transfer files using SFTP/SCP.  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    
    if [ "$LBSA_ALLOW_ALL_SSH_PORT_FORWARDING" != "yes" ]; then
        if [ "`grep -E ^AllowTcpForwarding /etc/ssh/sshd_config`" != "" ]; then 
            if [ "`grep -E ^AllowTcpForwarding /etc/ssh/sshd_config`" != "AllowTcpForwarding no" ]; then
                if [ "`grep -E ^PermitOpen /etc/ssh/sshd_config`" = "" ]; then
                    echo "SSHD Config: AllowTcpForwarding has been explicitly set to something other than no, but no PermitOpen setting has been specified.  This means any user that can connect to a shell or a forced-command based session that allows open port-forwarding, can port forward to any other accessible host on the network (authorized users can probe or launch attacks on remote servers via SSH port-forwarding and make it appear that connections are coming from this server).  Recommend disabling this feature by adding [AllowTcpForwarding no], or if port forwarding is required, providing a list of allowed host:ports entries with PermitOpen.  For example [PermitOpen sql.myhost.com:1433 mysql.myhost.com:3306].  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."
                    echo "* Note: If this is ok for this machine, set LBSA_ALLOW_ALL_SSH_PORT_FORWARDING=yes in this script, or set the environment variable prior to calling this script."
                    echo
                fi
            fi
        fi
        if [ "`grep -E ^AllowTcpForwarding /etc/ssh/sshd_config`" = "" ]; then 
            if [ "`grep -E ^PermitOpen /etc/ssh/sshd_config`" = "" ]; then
                echo "SSHD Config: AllowTcpForwarding is not specified, so is currently set to the default (yes), but no PermitOpen setting has been specified.  This means any user that can connect to a shell or a forced-command based session that allows open port-forwarding, can port forward to any other accessible host on the network (authorized users can probe or launch attacks on remote servers via SSH port-forwarding and make it appear that connections are coming from this server).  Recommend disabling this feature by adding [AllowTcpForwarding no], or if port forwarding is required, providing a list of allowed host:ports entries with PermitOpen.  For example [PermitOpen sql.myhost.com:1433 mysql.myhost.com:3306].  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."
                echo "* Note: If this is ok for this machine, set LBSA_ALLOW_ALL_SSH_PORT_FORWARDING=yes in this script, or set the environment variable prior to calling this script."
                echo
            fi
        fi
    fi
    
    # Additional recommendations (These are not critical, but helpful.  These are typically not specified so strictly by default
    # so will almost definitely require the user to change some of the settings manually.  They are in an additional section
    # because they are not as critical as the settings above.
    if [ "$LBSA_INCLUDE_EXTRA_SSH_RECOMMENDATIONS" = "yes" ]; then
    
        # Specify DenyUsers/DenyGroups for extra protection against root login over SSH
        if [ "$LBSA_ALLOW_ROOT_LOGIN" != "true" ]; then
            if [ "`grep -E ^DenyUsers /etc/ssh/sshd_config | grep root`"  = "" ]; then echo "SSHD Config: (Extra Recommendation) DenyUsers is not configured, or is configured but has not listed the root user.  Recommend adding [DenyUsers root] as an extra protection against root login (allow only su/sudo to obtain root access).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
            if [ "`grep -E ^DenyGroups /etc/ssh/sshd_config | grep root`" = "" ]; then echo "SSHD Config: (Extra Recommendation) DenyGroup is not configured, or is configured but has not listed the root group.  This means that if a user is added to the root group and are able to log in over SSH, then that login is effectively the same as a root login anyway.  Recommend adding [DenyUsers root] as an extra protection against root login (allow only su/sudo to obtain root access).  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
        fi
    
        # Get rid of annoying RDNS lookups which can cause timeouts if RDNS fails
        if [ "`grep -E "^UseDNS no" /etc/ssh/sshd_config`" = "" ]; then echo "SSHD Config: (Extra Recommendation) Set UseDNS no.  This will stop RDNS lookups during authentication.  Advantage 1: RDNS can be spoofed, which will place an incorrect entry in auth.log causing problems with automated log-based blocking of brute-force attack sources.  This change will eliminate the problem of RDNS spoofing.  Advantage 2: If RDNS fails, timeouts can occur during SSH login, preventing access to the server in worst cases.  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    
    	# Reduce timeouts, max attempts and max number of concurrent logins
    	LoginGraceTime=`grep ^LoginGraceTime /etc/ssh/sshd_config | tr -s " " | cut -d " " -f 2`
    	if [ "$LoginGraceTime" = "" ]; then LoginGraceTime=120; fi
    	MaxAuthTries=`grep ^MaxAuthTries /etc/ssh/sshd_config | tr -s " " | cut -d " " -f 2`
    	if [ "$MaxAuthTries" = "" ]; then MaxAuthTries=6; fi
    	MaxStartups=`grep ^MaxStartups /etc/ssh/sshd_config | tr -s " " | cut -d " " -f 2`
    	if [ "$MaxStartups" = "" ]; then MaxStartups=10; fi
    	MaxConcurrent=`expr "$MaxStartups" "*" "$MaxAuthTries"`
    	if [ "$LoginGraceTime" -gt 30 ]; then echo "SSHD Config: (Extra Recommendation) LoginGraceTime is set to [$LoginGraceTime].  This setting can be used to reduce the amount of time a user is allowed to spend logging in.  A malicious user can use a large time window to more easily launch DoS attacks or consume your resources.  Recommend reducing this to 30 seconds (or lower) with the setting [LoginGraceTime 30].  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    	if [ "$MaxAuthTries" -gt 4 ]; then echo "SSHD Config: (Extra Recommendation) MaxAuthTries is set to [$MaxAuthTries].  This allows the user $MaxAuthTries attempts to log in per connection.  The total number of concurrent login attempts your machine provides are ($MaxAuthTries MaxAuthTries) * ($MaxStartups MaxStartups) = $MaxConcurrent.  Note that only half of these will be logged.  Recommend reducing this to 4 (or lower) with the setting [MaxAuthTries 4].  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    	if [ "$MaxStartups" -gt 3 ]; then echo "SSHD Config: (Extra Recommendation) MaxStartups is set to [$MaxStartups].  This allows the user to connect with $MaxStartups connections at the same time, before authenticating.  The total number of concurrent login attempts your machine provides are ($MaxAuthTries MaxAuthTries) * ($MaxStartups MaxStartups) = $MaxConcurrent.  Note that only half of these will be logged.  Recommend reducing this to 3 (or lower) with the setting [MaxStartups 3].  (Remember to restart SSHD with /etc/init.d/ssh restart after making changes)."; echo; fi
    fi
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # PERMISSIONS / OWNERS / GROUPS  -  LINUX TOP LEVEL FOLDER
    #------------------------------------------------------------------------------------------------------------------------------
    
    check_path 755 root root /bin
    check_path 755 root root /boot
    check_path 755 root root /dev
    check_path 755 root root /etc
    check_path 755 root root /home
    check_path 755 root root /lib
    check_path 755 root root /lib64
    check_path 755 root root /media
    check_path 755 root root /mnt
    check_path 755 root root /opt
    check_path 555 root root /proc
    check_path 700 root root /root
    check_path 755 root root /run
    check_path 755 root root /sbin
    check_path 755 root root /srv
    if [ "`stat -L -c %a /sys | grep -v "555"`" = "" ]; then
    	# Allow sys to be 555 on newer distros like 12.10 onwards
    	check_path 555 root root /sys
    else
    	check_path 755 root root /sys
    fi
    check_path 1777 root root /tmp
    check_path 755 root root /usr
    check_path 755 root root /var
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # PERMISSIONS / OWNERS / GROUPS  -  /ETC/SSH FOLDER
    # Auto-fix all warnings in this area with: chmod 600 -R /etc/ssh; chown root:root -R /etc/ssh
    #------------------------------------------------------------------------------------------------------------------------------
    
    # 600 seems ok for the entire /etc/ssh folder.  I can connect to SSH OK, and make outgoing SSH connections OK as various users.
    # This prevents non-root users from viewing or modifying SSH config details which could be used for attacks on other user
    # accounts or potential privelege elevation.
    check_path 600 root root /etc/ssh/moduli
    check_path 600 root root /etc/ssh/sshd_config
    check_path 600 root root /etc/ssh/sshd_host_dsa_key
    check_path 600 root root /etc/ssh/sshd_host_rsa_key
    check_path 600 root root /etc/ssh/sshd_host_ecdsa_key
    check_path 600 root root /etc/ssh/sshd_host_key
    check_path 600 root root /etc/ssh/blacklist.DSA-1024
    check_path 600 root root /etc/ssh/blacklist.RSA-2048
    
    # Ubuntu defaults private keys to 600 all other files to 644
    # CentOS defaults public keys to 644 all other files to 600
    check_path 600 root root /etc/ssh/ssh_config
    check_path 600 root root /etc/ssh/ssh_host_dsa_key.pub
    check_path 600 root root /etc/ssh/ssh_host_rsa_key.pub
    check_path 600 root root /etc/ssh/ssh_host_ecdsa_key.pub
    check_path 600 root root /etc/ssh/ssh_host_key.pub
    
    # Ubuntu defaults folder to 755
    # CentOS defaults folder to 755
    check_path 600 root root /etc/ssh
    
    
    #------------------------------------------------------------------------------------------------------------------------------
    # PERMISSIONS / OWNERS / GROUPS  -  /ETC FOLDER SPECIAL FILES
    #------------------------------------------------------------------------------------------------------------------------------
    
    # These are just the Ubuntu defaults as per 12.04, ensure they haven't changed
    check_path 440 root root /etc/sudoers
    check_path 600 root root /etc/.pwd.lock
    check_path 600 root root /etc/gshadow-
    check_path 600 root root /etc/group-
    check_path 600 root root /etc/shadow-
    check_path 600 root root /etc/passwd-
    check_path 640 root daemon /etc/at.deny
    check_path 640 root fuse /etc/fuse.conf
    check_path 640 root shadow /etc/shadow
    check_path 640 root shadow /etc/gshadow
    check_path 755 root root /etc/rmt
    check_path 755 root root /etc/rc.local
    
    
    #--------------------------------------------------------------------------------------------------------------
    # CHECK FOR WORLD WRITABLE FOLDERS
    #--------------------------------------------------------------------------------------------------------------
    
    # Search for world writables in /etc or other folders
    FOLDERS="/etc /bin /sbin /usr/bin"
    for FOLDER in $FOLDERS
    do
        # Find any files/folders in /etc which are world-writable
        # Future: also need to ensure files are owned by root.  If not, they may be able to be written to anyway.
        if [ "`find $FOLDER -type f -perm -002`" != "" ]; then
            echo "Warning: There are files under [$FOLDER] which are world writable.  It is a security risk to have world-writables in this folder, as they may be modified by other users and executed as root."
            echo "A complete list of these files follows:"
            find $FOLDER -type f -perm -002 | xargs -r ls -al
            echo ""
        fi
        if [ "`find $FOLDER -type d -perm -002`" != "" ]; then
            echo "Warning: There are folders in [$FOLDER] which are world writable.  It is a security risk to have world-writables in this folder, as they may be modified by other users and executed as root."
            echo "A complete list of these folders follows:"
            find $FOLDER -type d -perm -002
            echo ""
        fi
    done
    
    
    #--------------------------------------------------------------------------------------------------------------
    # CHECK FOR INSECURE TMP AND SHM FOLDERS /tmp, /usr/tmp, /var/tmp, /dev/shm
    #--------------------------------------------------------------------------------------------------------------
    
    # TODO: this doesn't check /usr/tmp or /var/tmp yet
    
    # /tmp
    
    # First ensure that /tmp is a separate partition in mtab, otherwise the following tests are useless
    if [ "$LBSA_ALLOW_NON_SEPARATE_TMP_PARTITION" != "true" ]; then
        if [ "`cat /etc/mtab | grep /tmp`" = "" ]; then
    	    echo "Warning: /tmp is not a separate partition, so cannot be marked nodev/nosuid/noexec.  Override this warning with LBSA_ALLOW_NON_SEPARATE_TMP_PARTITION=true";
        else
    
        # Ensure noexec
        # Note: Even though most admins recommend /tmp is noexec, the aptitude (apt-get) tool in do-release-upgrade mode
        # require exec permissions in /tmp and will stop with an error before installing the upgrade because /tmp has no exec permissions.
        # Workaround: Either edit /etc/apt/apt.conf and change the TempDir for apt to something else (such as /var/cache/apt/tmp), or before using the do-release-upgrade command, use this command to temporarily assign exec rights on /tmp: [mount -oremount,exec /tmp]
        if [ "`cat /etc/mtab | grep /tmp | grep noexec`" = "" ]; then
            echo "Warning: /tmp has EXECUTE permissions.  Recommend adding noexec attribute to mount options for /tmp, in /etc/fstab."
            echo "This change will help in preventing malicious users from installing and executing binary files from the folder."
            echo "To test, run these commands.  The output should say Permission denied if your system is already protected: cp /bin/ls /tmp; /tmp/ls; rm /tmp/ls;"
            echo "Tip: after adding the attribute, you can remount the partition with [mount -oremount /tmp] to avoid having to reboot."
            echo "Note: Even though most admins recommend /tmp is noexec, Ubuntu release upgrades require exec permissions in /tmp for some reason and will stop with an error before installing the upgrade because /tmp has no exec permissions."
            echo "Workaround: Either edit /etc/apt/apt.conf and change the TempDir for apt to something else (such as /var/cache/apt/tmp), or before using the do-release-upgrade command, use this command to temporarily assign exec rights on /tmp: [mount -oremount,exec /tmp]"
            echo ""
        fi
        
        # Ensure nosuid
        if [ "`cat /etc/mtab | grep /tmp | grep nosuid`" = "" ]; then
            echo "Warning: /tmp has SUID permissions.  Recommend adding nosuid attribute to mount options for /tmp, in /etc/fstab."
            echo "This change will help in preventing malicious users from setting SUID on files on this folder.  SUID files will run as root if they are owned by root."
            echo "Tip: after adding the attribute, you can remount the partition with [mount -oremount /tmp] to avoid having to reboot."
            echo ""
        fi
        
        # Ensure nodev
        if [ "`cat /etc/mtab | grep /tmp | grep nodev`" = "" ]; then
            echo "Warning: /tmp has DEVICE permissions.  Recommend adding nodev attribute to mount options for /tmp, in /etc/fstab."
            echo "This change will help in preventing malicious users from creating device files in the folder.  Device files should be creatable in temporary folders."
            echo "Tip: after adding the attribute, you can remount the partition with [mount -oremount /tmp] to avoid having to reboot."
            echo ""
            fi
        fi
    fi
    
    # /dev/shm
    
    if [ "`cat /etc/mtab | grep /dev/shm`" != "" ]; then
    
        # Ensure noexec
        if [ "`cat /etc/mtab | grep /dev/shm | grep noexec`" = "" ]; then
            echo "Warning: /dev/shm has EXECUTE permissions.  Recommend adding noexec attribute to mount options for /dev/shm, in /etc/fstab."
            echo "This change will help in preventing malicious users from installing and executing malicious files from the folder."
            echo "To test, run these commands.  The output should say Permission denied if your system is already protected: cp /bin/ls /dev/shm; /dev/shm/ls; rm /dev/shm/ls;"
            if [ "`cat /etc/fstab | grep /dev/shm`" = "" ]; then
                echo "Note: you do not currently have /dev/shm listed in /etc/fstab, so it is being mounted with default options by Linux."
                echo "To fix, add this line to /etc/fstab, then remount it with [mount -oremount /dev/shm] to avoid having to reboot."
                echo "none /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0"
                echo ""
            else
                echo "Tip: after adding the attribute, you can remount the partition with [mount -oremount /dev/shm] to avoid having to reboot."
            fi
            echo ""
        fi
        
        # Ensure nosuid
        if [ "`cat /etc/mtab | grep /dev/shm | grep nosuid`" = "" ]; then
            echo "Warning: /dev/shm has SUID permissions.  Recommend adding nosuid attribute to mount options for /dev/shm, in /etc/fstab."
            echo "This change will help in preventing malicious users from setting SUID on files on this folder.  SUID files will run as root if they are owned by root."
            if [ "`cat /etc/fstab | grep /dev/shm`" = "" ]; then
                echo "Note: you do not currently have /dev/shm listed in /etc/fstab, so it is being mounted with default options by Linux."
                echo "To fix, add this line to /etc/fstab, then remount it with [mount -oremount /dev/shm] to avoid having to reboot."
                echo "none /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0"
                echo ""
            else
                echo "Tip: after adding the attribute, you can remount the partition with [mount -oremount /dev/shm] to avoid having to reboot."
            fi
            echo ""
        fi
        
        # Ensure nodev
        if [ "`cat /etc/mtab | grep /dev/shm | grep nodev`" = "" ]; then
            echo "Warning: /dev/shm has DEVICE permissions.  Recommend adding nodev attribute to mount options for /dev/shm, in /etc/fstab."
            echo "This change will help in preventing malicious users from creating device files in the folder.  Device files should be creatable in temporary folders."
            if [ "`cat /etc/fstab | grep /dev/shm`" = "" ]; then
                echo "Note: you do not currently have /dev/shm listed in /etc/fstab, so it is being mounted with default options by Linux."
                echo "To fix, add this line to /etc/fstab, then remount it with [mount -oremount /dev/shm] to avoid having to reboot."
                echo "none /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0"
                echo ""
            else
                echo "Tip: after adding the attribute, you can remount the partition with [mount -oremount /dev/shm] to avoid having to reboot."
            fi
            echo ""
        fi
    fi
    
    
    #--------------------------------------------------------------------------------------------------------------
    # CHECK HEARTBEAT CONFIG (if present)
    #--------------------------------------------------------------------------------------------------------------
    
    if [ -e /etc/ha.d ]; then
    
        # Default is 755, but no reason for non-root users to have access to these details
    	check_path 755 root root /etc/ha.d
    
        # Default is 600, but make sure it doesn't change
        # If details are known by user accounts, they can potentially send malicious heartbeat messages over UDP and cause havoc
        # If heartbeat is not installed, this file will not be present
    	check_path 600 root root /etc/ha.d/authkeys
    fi
    
    
    #--------------------------------------------------------------------------------------------------------------
    # CHECK DRBD CONFIG (if present)
    #--------------------------------------------------------------------------------------------------------------
    
    if [ -e /etc/drbd.conf ]; then
    
        # Default is 755, but if users have access to this file they can find out the shared-secret encryption key
    	check_path 600 root root /etc/drbd.conf
    
        # Check that drbd.conf contains shared-secret keys, otherwise there is no protection against malicious external DRBD packets
        if [ "`grep shared-secret /etc/drbd.conf`" = "" ]; then
            echo "Warning: No shared-secret configured in /etc/drbd.conf.  There is no protection against malicious external DRBD packets which may cause data corruption on your DRBD disks.  Ensure that every disk is configured with a shared-secret attribute."; echo;
        fi
    fi
    
    
    #--------------------------------------------------------------------------------------------------------------
    # DONE
    #--------------------------------------------------------------------------------------------------------------
    
    echo "System Checks Completed"
    
    
    #--------------------------------------------------------------------------------------------------------------
    # Notes
    #--------------------------------------------------------------------------------------------------------------
    
    # Show account expiry/change info for all logins
    #  cat /etc/passwd | cut -f 1 -d ":" | xargs -r -I USERNAME sh -c "(echo "USERNAME:"; chage -l USERNAME;)"
    # Future: check sysctl network settings
    # Done: implement more functions instead of repetitive code-blocks
    # Future: since changing to sh, echo -e causes the text "-e" to be printed if using sh instead of bash.  Fix it.

    [/sociallocker]

  • 11 лучших навыков DevOps – Как стать инженером DevOps

    В 2018 году растет спрос (и он будет только расти в 2019 году) на уникальных людей, которые могут писать код, автоматизировать службы и перемещаться по облачным стекам Amazon, Azure и Google Cloud.

    Миграция в облако является тенденцией, которая растет, и она будет становиться все более интенсивной, поскольку все больше компаний переводят свои внутренние сервисы на ресурсы IaaS и PaaS.

    Традиционная роль SysAdmin изменилась, и если вы планируете продвинуть свой бизнес или карьеру за пределы типичной модели IaaS (инфраструктура как услуга), то необходим другой тип ИТ-талантов.

    11 лучших навыков, которыми должен обладать DevOps инженер

    № 1 – Безупречный системный администратор

    Должен быть администратором Windows / Linux высшего уровня (либо / или / и то и другое в зависимости от вашего магазина) с опытом работы от 5 до 10 лет. Зачем? Потому что они должны иметь возможность создавать и администрировать серверы даже если их разбудить ночью))). Но это не единственная причина, иногда приходится много автоматизировать развертывание серверов, и это может стать проблемой для не опытного сотрудника.

    № 2 – Опыт виртуализации

    Должен иметь опыт работы в области виртуализации от 3 до 5 лет с VMware, KVM, Xen, Hyper-V или любым другим гипервизором, который вы используете в своем частном облаке. Они могут никогда не участвовать в повседневной поддержке работы виртуально инфраструктуры, но они чертовски хорошо понимают это, потому что большинство публичных облаков используют несколько разновидностей виртуализации.

    № 3 – Широкий технический опыт

    Наряду с опытом виртуализации, они должны понимать хранение и работу в сети. Зачем? Потому что прошли те времена, когда сеть и хранилище были разрозненными. Вам нужны люди, которые могут разработать решение, которое масштабируется и работает с высокой доступностью и временем безотказной работы. Кандидаты также должны понимать как организовать отказоустойчивость, чтобы не класть все яйца в одну корзину.

    № 4 – Сценарист

    Я уже говорил, что им нужно уметь писать сценарии? Terraform , Bash, Powershell, Perl, Ruby, JavaScript, Python – не должено бять для них пустым звуком. Они должны быть в состоянии написать код для автоматизации повторяемых процессов. Но мы не останавливаемся на достигнутом, потому что они также должны иметь возможность кодировать в API RESTFUL . Правильно, если вы собираетесь заменить ручные процессы, такие как назначение IP-адресов и резервирование DNS, кто-то должен написать некоторый код.

    №5 – Borderline Developer (чем больше, тем лучше)

    Я уже говорил, что им нужно кодировать на Java, Php, C +, C ++, .NET, ASP? Нет, я не повторяюсь. Я говорю о написании сценариев, которые будут запускать и организовывать полное развертывание сред DEV, QA и Production с помощью таких инструментов, как Chef, Puppet, CFEngine или других подобных инструментов. Зачем? Потому что прошли те времена, когда кто-то устанавливает Windows или Linux с компакт-диска. В настоящее время вы запускаете команду, которая запускает сборку сервера, затем запускает другой сценарий, который устанавливает приложения, затем запускает другие сценарии, которые выполняют настройки и проверки правильности. Как вы думаете, кто собирается написать весь этот код? Не сисадмин, а инженерDevOps на такое способен.

    Некоторые утверждают, что он / она не существует, но я не согласен. DevOps Engineer – это новая развивающаяся роль, без которой вы скоро не сможете обойтись. В нашу команду мы собрали специалистов различных направлений, для обмена опыта и профессионального роста, нам удалось усовершенствовать сисадминов до уровня девопс инженеров.

    № 6 – Chef, Puppet или другой инструмент автоматизации

    Я думаю, что я уже упоминал инструменты автоматизации, такие как Chef, но есть и другие, такие как Ansible, Fabric и GIT, которые также имеют свое место в цепочке автоматизации. Найти инженера DevOps со всем этим талантом будет непросто или дешево. А у нас они уже есть ))

    № 7 – Человеческие качества

    Раньше были люди которые могли сделать все благодаря своему таланту, при этом с ними тяжело было общаться, они не терпимы к другим и зачастую одиночки. Не тот случай в современном мире. Отказоустойчивость и масштабируемость обеспечиваются и на уровне людей. И вам нужны люди, к которым другие могут обратиться за помощью, и вам нужна командная работа, а не одиночки. Сделайте все возможное, чтобы найти людей, которые могут общаться с эмоциональным интеллектом (в основном, они сохраняют спокойствие в стрессовых ситуациях). Это также относится к следующему навыку DevOps, связанному с тем, чтобы быть отзывчивым человеком …

    № 8 – Обслуживание клиентов

    Если вы смотрели видео Джина Кима на YouTube, то вы слышали, насколько важна петля обратной связи. Найти людей со всеми техническими навыками, которые я перечислил, будет достаточно сложно, но теперь я добавляю обслуживание клиентов в  этот список. Поиск людей, которые ищут компромиссы и могут углубиться в разговор с разработчиком или заказчиком, является ключом к решению проблем. Это действительно требует уникального человека качества, уметь слушать и слышать и адекватно реагировать. Хотелось бы, получать доллар за каждый раз, когда разработчик обвинял мою инфраструктуру в том, что они опоздали с разработкой проекта или их приложение медленно работает.

    № 9 – Real Cloud Experience

    Мы почти там. Девятое умение DevOps, которое вам нужно, – это опытное развертывание приложений в Amazon AWS, Google или Azure. Зачем? Потому что не хватает людей, которые понимают IaaS по сравнению с PaaS, и работу приложения. Теперь речь идет не о том, чтобы перенести существующие серверы и приложения в облако, а о разработке и развертывании приложений с использованием «лучших из лучших практик», которые могут предложить Amazon, Azure и Google. Мы говорим о том, что делают люди, создающие облака, – это использование программно-определяемых центров обработки данных для кодирования сред PaaS. Мы говорим о вычислительных ресурсах, сетях и ресурсах хранения в руках разработчика.

    № 10 – Не безразличие

    Итак, мы подошли к последнему навыку, который дорог мне. Зачем он нужен? Большинство ИТ-специалистов – обособлены, их волнует выполнение задачи и не более. Найти кого-то со всеми этим навыками сложно и он стоит каждый доллар. Но сейчас я говорю о ком-то, у кого есть энтузиазм и он может наставлять других. Кто-то, кто готов поделиться своими идеями и сценариями с командой. Кто-то, кто может руководить людьми и заставлять людей думать вместе о решении проблем. Слишком часто настоящие проблемы с ИТ заключаются в том, что ИТ-специалисты не разговаривают или, надо сказать, не слушают!

    № 11 – Покладистость

    Добавление навыка покладистый в качестве DevOps давно назрело, и оно наконец здесь. Позвольте мне поделиться, что Покладистый значит для меня, и тогда я объясню этот пункт. Покладистый человек поделится своими мыслями и идеями, но когда дело доходит до удовлетворения запроса клиента, даже если он считает, что нужно сделать по другому – он выполнит эту работу так как хочет клиент. Вот почему этот навык необходим. Иногда вам просто нужен кто-то, кто будет следовать плану, а не ставить свои амбиции превыше всего. Имейте в виду большинство людей DevOps чрезвычайно умны, что, вероятно, играет на их упрямстве, когда дело доходит до следования плану.

    Где же получить не достающие знания?

    Образовательный портал GeekBrains, предлагает курс по DevOps с гарантированным трудоустройством. Переходи по ссылке проходи обучение и получи высокооплачиваемую профессию уже в этом году.

  • Управляем паролями через LAPS (Часть 2)

    Управляем паролями через LAPS (Часть 2)

    Настройка LAPS RODC

    Так как мы остановились на использовании платформы Windows Server 2008, в нашем распоряжении окажется RODC, который сможет обеспечить безопасность сервера за счет хранения копий отдельных директорий Active Directory.

    Тем не менее, он никак не будет изменять их. Особенностью RODC является то, что он не хранит в себе целостную информацию. Тот, кто сможет до неё добраться, не получит полной картины, так как остальная часть будет находиться в другом месте. Что же входит в RODC? Хранилище наполняется данными всех записей, PKI и Bitlocker, не считая остальные вещи.

    Итак, для начала настройки откройте ADSI, указам конкретный раздел:

    Выделите атрибут ms-Mcs-AdmPwd:

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

    Мы получили параметр 0x388, который указывает на сумму флагов PRESERVE_ON_DELETE, CONFIDENTIAL, NEVER_AUDIT_VALUE, RODC_FILTERED. Заметьте, что второй и четвертый атрибуты установлены корректно, так как доступ к ним ограничен, а данные не будут реплицироваться на RODC.

    Аналогично настраиваются другие атрибуты.

    Защита хранения паролей в Active Directory

    Microsoft рекомендует запретить доступ к информации об атрибутах абсолютно всем, кроме администраторов. Но такой подход сужает поле зрения пользователей, которые могут просто не понять, с чем они имеют дело. Попробуем найти оптимальное решение для управления паролями: реализуем ограничение доступа для определенных групп пользователей на чтение и изменение конкретных атрибутов.

    Итак, создадим новую группу, по названию которой вы поймете их уровень доступа. Вы сможете изменить его на любой другой:

    Добавляем в неё всех пользователей, которым не нужно явно демонстрировать хранимые пароли. Можно сделать это, выделяя целые группы, отделы и т.д. Затем, конкретизируем права доступа для созданной группы. Указываем все запреты с помощью редактора.

    Если он отсутствует на вашей системе в mmc / Add Snap-Ins, то выполните команду regsvr32 schmmgmt.dll с правами администратора. Выделяем Default ACL для computer:

    Вы можете быстро убрать все разрешения на первых двух вкладках с помощью Clear All.
    Осуществлять управление паролями нужно и на имеющихся учетных записях. Выставьте правила с помощью любого удобного для вас метода.

    Можете просто унаследовать их из другой группы, если ваша схема хорошо структурирована в Active Directory. Главное – это ограничить права на чтение обычным пользователям.

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

    Для реализации, запустите редактор и отыщите параметры ACE и SELF, добавив права на их использование:

    Повторимся, что для повышения безопасности ИТ вам нужно продублировать эти действия для каждой учетной записи LAPS. Вы можете частично автоматизировать этот процесс с помощью команды Set-AdmPwdComputerSelfPermission -OrgUnit имя_контейнера. Она поможет осуществить наследование прав на указанные объекты.
    Далее, определим права для самих администраторов. Шаги практически идентичны:

    • Создайте новую группу для админов
    • Перенесите туда необходимых пользователей
    • Выставьте нужные атрибуты для администрирования паролей

    С целью повышения безопасности ИТ, второй атрибут ms-Mcs-AdmPwdExpirationTime присваиваем лишь тем админам, которые будут менять пароли. Команда следующая: Set-AdmPwdResetPasswordPermission с аналогичными параметрами.

    Настройка политик LAPS

    Всего нам нужно 4 политики:

    Объясним их значение:

    Политики LAPS для ИТ безопасности паролей

    Развертывание LAPS на клиентах

    Этот шаг является самым простым. Для него достаточно лишь создать ещё одну политику для группы, а затем присоединить к ней MSI-модуль. Все это направляется на требуемые хосты. Как это выглядит:

    Чтобы ускорить работу, можно отключить бесполезную в нашем случае раздел для пользователей:

    Далее, размещаем на общедоступном сетевом ресурсе файлы. Таким образом, каждый клиент сможет добраться до них. Мы реализуем этот шаг путем размещения файлов в SYSVOL. Вы можете ограничить доступ к ним, если не хотите, чтобы доступ к данным имели все сотрудники.

    Вы можете немного автоматизировать процесс, добавив фильтр WMI в используемую политику. Он ограничит применение для 64-х разрядных ОС:

    Стоит отметить, что в случае установки на Windows XP, вы можете использовать атрибут AddressWidth класса Win32_Processor. Это удобно, если вам нужно развернуть LAPS на нескольких платформах Windows Server:

    Конечно, параметр в данном случае менее точен, потому что не предусматривает тот факт, что для 64-х разрядного процессора может быть использована 32-х разрядная ОС.
    В конечном итоге, получим следующее:

    Итог

    С помощью LAPS вы сможете увеличить безопасность ИТ инфраструктуры, не усложняя при этом жизнь самим администраторам!

    Вы также можете обратиться к нам за профессиональной консультацией или помощью в повышении безопасности учетных записей. office@itfb.com.ua

  • Управление паролями с помощью LAPS

    Управление паролями с помощью LAPS

    LAPS (Local Administrator Password Solution) – это специальный инструмент, который позволяет быстро и эффективно проводить администрирование локальных паролей. Он необходим для обеспечения безопасности серверов и упрощения проводимых процедур. И именно с ним мы будем работать в данном материале.

    Управление паролями крайне необходимо, если вы хотите защитить свой домен от несанкционированного доступа. Грамотно распорядившись имеющимися инструментами, можно не только автоматизировать процесс смены шифра, но и отследить любую подозрительную активность. Некоторые администраторы прибегают к распространенным методам для упрощения процесса обеспечения безопасности ИТ.

    Но все они не решают проблему. Вот несколько из них:

    • Централизованное переименование учетных записей
    • Их отключение
    • Установка logon script, который будет оповещать админа о входе, автоматически внося ограничения
    • Установка очень сложного пароля
    • Замена гостевой учетной записи на администраторскую, чтобы запутать потенциального злоумышленника.

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

    Для повышения ИТ безопасности стоит обратить внимание на NT 6.0, которая за счет Group Policy Preferences может облегчить работу администратору:

    Утилита NT 6.0 для повышения ИТ безопасности

    Но нужно учесть, что данном случае пароль можно легко восстановить с помощью директории SYSVOL, где он содержится. Это нам не подходит.
    Поэтому, перейдем к использованию LAPS.

    Цель LAPS

    Данный инструмент сочетает в себе несколько важных элементов:

    • Локальная установка на отдельные рабочие станции, включая сервера, открывая доступ к новым компонентам Group Policy Client Side Extension;
    • Класс computer получает дополнительные атрибуты, а сама Active Directory – расширенные схемы;
    • Добавление новых шаблонов для управления и настройки политик отдельных групп;
    • Автоматизация управления с помощью модуля PowerShell;
    • Управление с помощью GUI;

    Эти элементы открывают возможности для:

    • Безопасного хранения паролей отдельных рабочих станций в Active Directory
    • Установки новых правил для создания паролей
    • Смены администраторских паролей, подключив защищенный канал и минуя непосредственное подключение к системе с помощью Active Directory
    • Регулирования “времени жизни” паролей, а также автоматизация процесса их автоматических замен

    Данная система работает на платформе Windows Server 2003, а также на базе Windows Vista, а не XP. Последнее обусловлено наличием обрабатывающего модуля GPP, который устанавливается отдельно в качестве обновления.

    Установка LAPS

    Демонстрировать установку LAPS мы будем с помощью версии 6.1, которая была выпущена в 2015 году. Также, разворачивание системы произойдет на Windows Server 2008 R2. Это никак не скажется на функционале нашего ПО. Но не забудьте перед началом установки загрузить версию 4.0 для Windows Management Framework
    Также стоит отметить, что работа LAPS никак не будет отличаться от развернутой платформы Windows Server.

    Что ещё нужно для установки?

    В первую очередь, сама система LAPS. На всякий случай, загрузите все имеющиеся дистрибутивы, как для 32-х, так и для 64-х разрядных ОС.
    Затем, скачайте WMF 4.0. В идеале, она уже должна быть развернута на вашем сервере, если вы создавали базовую систему управления паролями. Вот, что у вас будет:

    Устанавливаем LAPS для администратора

    Полный пакет LAPS нужно развернуть на рабочей станции админа. Все основные компоненты устанавливаются сразу, поэтому вам не придется возвращаться к этом позднее. Но GUI-клиент может потребовать от вас дополнительных усилий.

    Мы будем ставить LAPS непосредственно на DC, игнорируя AdmPwd GPO Extension. Этот компонент нам не понадобится. Но для остальных инженеров, которые будут работать с системой, он необходим.

    Мы установим несколько важных компонентов:

    • Fat Client UI: осуществляет быстрый поиск нужной станции с помощью сортировки по именам, просмотру или смене пароля
    • PowerShell Module: обеспечивает администрирование LAPS с помощью PowerShell-модуля
    • GPO Editor templates: позволяет использовать новые шаблоны для настройки LAPS

    Остальное должно быть понятно интуитивно. По завершению установки, разверните WMF 4.0.

    Расширение схемы LAPS

    Основная работа LAPS базируется на двух атрибутах:

    • ms-Mcs-AdmPwd: отвечает за хранение паролей
    • ms-Mcs-AdmPwdExpirationTime: хранит данные о сроке их действия.

    Данные атрибуты являются дополнительными для схемы, а их установка очень проста. Для начала, запустите PowerShell с правами на изменение Active Directory. Затем выполните два шага:

    1. Используйте команду Import-Module AdmPwd.PS, чтобы подгрузить модуль LAPS
    2. Используйте команду Update-AdmPwdADSchema

    Результат – два функционирующих атрибута. Первый:

    И второй:

    Не включайте GC, так как это позволит осуществлять поиск по тексту установленных паролей. Все остальные атрибуты достаточно просты и ясны с точки зрения использования:

    Настройка домена для LAPS GPO

    Схема LAPS использует собственные шаблоны GPT. Мы может сделать их доступными, перенеся их в Central Storage. Это позволит всем администраторам ознакомиться с действующими политиками. Не нужно оставлять эти шаблоны в той директории, куда они были сложены по умолчанию, тем самым ограничивая своей команде административные возможности.

    Итак, поищем шаблоны групповой политики (GPT):

    Не забудьте про языковый файл AdmPwd.adml, который находится в директории en-us. Мы перенесем все это в Central Storage:

    Проведем проверку на корректную работу:

    Мы поможем улучшить и облегчить контроль учетных записей и повысить внутреннюю безопасность ИТ среды предприятия. Обращайтесь office@itfb.com.ua

  • Как установить и настроить modsecurity в nginx

    ModSecurity , иногда называемый Modsec , является брандмауэром с открытым исходным кодом веб-приложений (WAF). Первоначально разработанный как модуль для HTTP-сервера Apache, он эволюционировал, чтобы предоставить массу возможностей фильтрации запросов и фильтров Hypertext Transfer Protocol наряду с другими функциями безопасности на нескольких разных платформах, включая Apache HTTP Server , Microsoft IIS и NGINX .  Это бесплатное программное обеспечение,выпущенное под лицензией Apache 2.0.

    Платформа предоставляет язык конфигурации правил, известный как «SecRules» для мониторинга в реальном времени, регистрации и фильтрации сообщений протокола Hypertext Transfer Protocol на основе пользовательских правил.

    Хотя это не единственная конфигурация, ModSecurity чаще всего развертывается для обеспечения защиты от общих классов уязвимостей с использованием набора правил OWASP ModSecurity Core Rule Set (CRS).  Это набор правил с открытым исходным кодом, написанный на языке SecRules ModSecurity. Проект является частью OWASP , проекта Open Web Application Security.

    Для обнаружения угроз механизм ModSecurity развертывается встроенным в веб-сервер или в качестве прокси-сервера перед веб-приложением. Это позволяет движку сканировать входящий и исходящий HTTP- поток данных. В зависимости от конфигурации правила движок будет решать, как следует обрабатывать связь, которая включает в себя возможность передавать, удалять, перенаправлять, возвращать определенны код состояния, выполнять пользовательский скрипт и многое другое.

    В целом ModSecurity помогает блокировать возможность использования существующих уязвимостей сайта и предотвратить его взлом.

    Устраняем уязвимость веб приложения

    Скачаем исходные коды nginx и modsecurity, которые понадобятся для сборки

    cd /tmp
    wget https://nginx.org/download/nginx-1.9.15.tar.gz
    wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
    gunzip -c nginx-1.9.15.tar.gz | tar xvf nginx-1.9.15.tar.gz
    gunzip -c modsecurity-2.9.1.tar.gz | tar xvf modsecurity-2.9.1.tar.gz
    yum -y install gcc make automake autoconf libtool pcre pcre-devel libxml2 libxml2-devel curl curl-devel httpd-devel

    Сборка и установка

    Конфигурируем режим работы modsecurity и затем собираем nginx с этим модулем

    cd modsecurity-2.9.1/
    ./configure --enable-standalone-module
    make
    cd ../nginx-1.9.15/
    ./configure --add-module=../modsecurity-2.9.1/nginx/modsecurity
    make && make install

    Первоначальная настройка

    Применяем реккомендуемые конфигурации по умолчанию

    cp /tmp/modsecurity-2.9.1/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
    cp /tmp/modsecurity-2.9.1/unicode.mapping /usr/local/nginx/conf/

    Далее для включения возможностей использования модуля необходимо добавить в /usr/local/nginx/conf/nginx.conf в раздел “location /” строки

    ModSecurityEnabled on;
    ModSecurityConfig modsecurity.conf;

    В файле конфигурации это выглядит так:

    location / {
    ModSecurityEnabled on;
    ModSecurityConfig modsecurity.conf;
    }

    Запуск

    Запуск модно произвести двумя способами

    servise nginx start

    или

    /usr/local/nginx/sbin/nginx

    Локальная проверка

    wget localhost
    
    cat index.html

    Настройка фаервола

    iptables-save > iptab

    Редактируем правила

    vi  iptab

    Добавляем после правила разрешения ssh

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

    Применяем изменения

    iptables -F;  iptables-restore < iptab

    Проверяем

    Браузером или с помощью curl

    Получение рабочей копии owasp

    Скачиваем правила OWASP и копируем в конфигурацию веб сервера nginx

    git clone  https://github.com/SpiderLabs/owasp-modsecurity-crs.git
    cd owasp-modsecurity-crs/
    cp rules /usr/local/nginx/conf/
    cp crs-setup.conf.example /usr/local/nginx/conf/crs-setup.conf

    Подготовка файла правил:

    За основу берем подготовленный пример правил:

    cd /usr/local/nginx/conf
    cd rules
    mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example  REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
    mv  RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example  RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
    cd ..
    
    > modsecurity.conf
    
    cat crs-setup.conf > modsecurity.conf
    
    cat rules/*.conf >> modsecurity.conf

    Редактируем файл конфигурации:

    vi modsecurity.conf

    добавляем строки в начале

    SecAuditLog /usr/local/nginx/logs/modsec_audit.log - файл аудита
    SecRuleEngine On - включение фильтра
    SecDefaultAction "phase:1,deny,log" - что делаем с нарушителями - в лог и блокируем
    SecServerSignature GeekFlare - подпись сервера в заголовках
    SecDataDir /tmp

    Далее выполняем

    Перезапуск nginx

    service nginx restart

    или

    killall nginx
    /usr/local/nginx/sbin/nginx

    При работе правил записи вносятся в фалы журналов

     

    /usr/local/nginx/logs/modsec_audit.log - записи аудита
    /usr/local/nginx/logs/error.log - тут отчет фильтра с пометкой “ModSecurity”

    Проверки:

    при нелегальном запросе должно выдавать 403 ошибку!

    /aphpfilethatdonotexist.php?something=../../etc

    при обращении по ИП сайта

    Так же вы можете запустить бесплатное сканирование на уязвимости

    https://pentest-tools.com до и после и сравнить результат

    Хотите защитить свой сайт от уязвимости, тогда обращайтесь к нам office@itfb.com.ua

  • Защита веб приложений

    Защита веб приложений

    В данной статье речь пойдет о повышении уровня защиты веб приложений и сайтов HTTP. Именно на них сфокусировано наибольшее количество атак.

    Основной проблемой HTTP-протокола является низкий уровень защищенности во время ввода-вывода какой-либо информации. Все меры предосторожности обходятся злоумышленниками за счет коммуникационных средств. Наносимый урон компаниям из-за низкого уровня безопасности особенно заметен сегодня, так как количество передаваемой информации растет равно, как и её значимость.

    Ущерб ИТ компаний из-за плохой защиты сайта

    Безусловно, проблема состоит не только в самой защите сайта или ПО. Множество уязвимостей появляется из-за неправильного распределения прав среди пользователей, а также из-за первоначального построения сети. Даже обычная SQL-инъекция способна раскрыть персональные данные миллионов пользователей, о чем узнали на своем печальном опыте многие правительственные и частные учреждения.

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

    Поэтому, их целью становятся востребованные веб-приложения, которые могут предоставить им доступ к БД напрямую. Вся хранящаяся на сервере информация может быть не только украдена, но и изменена, удалена, либо продана заинтересованным лицам. Вот какую угрозу несут за собой HTTP-запросы с встроенным вредоносным кодом.

    Типы угроз от HTTP запросов с вредоносным кодом

    Еще одним популярным инструментом хакеров является фишинг. Данный метод используется с применением e-mail сотрудников компании. Но в нашем случае, речь идет о встроенном коде, который перенаправляет пользователя определенный ресурс или страницу.

    Еще одним способом обхода защиты веб-приложений является взлом учетных записей. Помимо этого, все еще распространен брутфорс, он же грубый подбор пароля, а также вредоносные исполняемые файлы. Всего этого можно избежать, если правильно распределить доступ среди пользователей и контролировать активность.

    Что же использовать для эффективной защиты веб приложений? На самом деле, инструментов множество: повышение квалификации персонала и обучение правильному использованию приложений, контроль прав доступа, мониторинг состояния учетных записей и анализ активности. Все они эффективны в комплексе.

    Но для обеспечения бесперебойной защиты, нужно обращаться к более специализированным инструментам, таким как сетевые фильтры, контроль портов или методы IDS/IPS. Также существует система WAF (Web Application Firewall) – она может проинспектировать входящие HTTP-запросы.

    Например, система IDS/IPS проанализирует трафик, а WAF поможет фильтровать входящие IP-адреса. Критично важным элементом любой защиты является ее производительность. Она должна быть простой в использовании и отказоустойчивой.

    Вредоносные HTTP-запросы можно блокировать с помощью сигнатур. Все это анализируется системой WAF. Тем не менее, такой метод требует высококвалифицированный штат, большого запаса времени, а предотвращение атак с ранее неизвестных адресов попросту невозможно.

    К счастью, на сегодняшний день был создан специальный инструмент, осуществляющий логический анализ трафика без необходимости загрузки тысяч сигнатур. Все что нужно, это создание и контроль необходимых групп правил. Это не только обеспечивает защиту сайтов, но и ускоряет работу фильтра. С помощью такой диагностики, можно предотвращать атаки даже с ранее неизвестных адресов.

    Стоит отметить, что система WAF может анализировать поступающие SQL-запросы, вычисляя вредоносную активность и блокируя их работу. А с помощью выделенного набора правил можно защититься от фишинга и сопутствующего перенаправления.

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

    Профессионалы ITFB проведут аудит сетевой инфраструктуры, закроют уязвимости и организуют мощную защиту сайта и сервера. Обращайтесь!

  • Принцип работы онлайн-консультантов на сайте

    На сегодняшний день практически каждая компания устанавливает на сайт онлайн консультанта. Но так ли это эффективно и действительно ли обычный чат способен повысить заинтересованность клиента в предлагаемом товаре или услуге?

    Online-консультанты: что это и зачем они нужны?

    Онлайн консультант для сайта – это обычное ПО, позволяющее наладить обратную связь между потребителем и компанией. Это решение реализуется в нескольких видах:

    • Специальная форма на сайте;
    • Кнопка для заказа обратного звонка;
    • Связь с помощью электронной почты;
    • Окошко чата с онлайн-помощником.

    На рынке можно найти различные готовые решения данных сервисов. Одними из самых популярных являются JivoSite и ZOHO SalesIQ. Конечно, помимо этого существуют и другие, но общая цель данного ПО одна – организация обратной связи.

    1. Обеспечить быструю обратную связь для клиента, повышая количество реальных потребителей услуг или товаров;
    2. Собирать контактные данные лидов, то есть телефоны и электронные ящики потенциальных клиентов для дальнейшей работы с ними. В коммерции это называется лидогеренацией.
    3. Демонстрировать большее количество рекламы в формах для обратной связи. Зачастую материал подается в виде баннера. Компании также имеют возможность организовать в форме мини-опрос для сбора полезной информации.

    Первая задача является основной для любого вида онлайн-консультанта. Все остальное – это дополнительные возможности, которые можно реализовать более эффективно с помощью сторонних сервисов.

    Работа онлайн-помощника

    Для начала разберемся с принципом установки на сайте онлайн-консультанта:

    1. Сначала необходимо установить специальный скрипт для определённого чата.
    2. Далее производится настройка чата: будет ли он всплывать на определенных страницах, какие данные будет вписывать клиент в форму и общее оформление окна.
    3. После заполнения формы или написания сообщения, консультант сможет ответить на любой интересующий клиента вопрос.

    Сама программа онлайн-консультанта не займет много места, так как представляется в идет набора скриптов. Конечно, можно обратиться и к более масштабным системам SAAS, которые потребуют установки отдельного сервера.

    По какому алгоритму работают онлайн-консультанты?

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

    1. Запуск спустя некоторое время прибывания клиента на сайте. Это самый известный и востребованный вариант, который пришелся по вкусу интернет-магазинам.
    2. Запуск после посещения определенного количества страниц сайта. Это наиболее ненавязчивый и практичный способ для клиента.
    3. Запуск после отслеживания источника перехода. Данный вид чата будет появляться только тогда, когда клиент перешел на страницу сайта с определенного источника. Например, с продающего «лендинга». Идеальное решение для многопрофильных компаний.
    4. Запуск с определением авторизованного клиента. Безусловно, для незарегистрированных пользователей тоже будет появляться чат. Но таргетирование рекламных материалов и подбор более подходящего консультанта будет происходить лучше, исходя из истории авторизованного клиента.
    5. Запуск после перехода по прямой ссылке из e-mail. Данный метод не так распространен на наших просторах. Он хорош для больших сайтов, где существуют различные категории товаров и для каждой из них необходим свой консультант. Также подходит для сообщения о текущих акциях и особых предложениях.

    CRM и онлайн-консультант

    Форма онлайн консультанта на сайте может быть дополнена другими решениями, как сбор лидов. Поэтому, онлайн-помощник часто интегрируется вместе с CRM-системой. Это главный источник информации сайта для отдела продаж, работающих с клиентами. Он позволяет собрать следующие данные:

    1. Адрес эл. почты, номер телефона, а также имя клиента;
    2. Статистику даты и времени посещений;
    3. Местоположение клиента;
    4. Длительность серфинга на сайте с указанием конкретных страниц.
    5. Количество посещений и их периодичность;
    6. Когда и на какой странице был вызван онлайн-чат;
    7. Содержимое обращения.

    CRM позволяет полностью автоматизировать процесс сбора клиентской базы.

    Часто встречаемые ошибки во время настройки чата

    Очень часто можно встретить некорректно работающую форму онлайн консультанта для сайта, что приводит к потере клиентов из-за своей навязчивости и прочих негативных факторов. Перечислим самые распространенные ошибки:

    1. Большой размер окна и неудачное расположение. Пожалуй, наиболее частая ошибка, из-за которой ограничивается важный функционал самого сайта. Причиной этого может стать и встроенная реклама, которая неправильно интегрирована в форму.
    2. Некорректная форма для мобильной версии. Из-за неправильной настройки, форма мобильной версии может занимать чуть ли не весь экран на телефоне, не давая возможность нормально пользоваться сайтом.
    3. Слишком явные логотипы поставщиков онлайн-чатов. Никто не запрещает рекламировать собственный продукт. Но если кликабельные логотипы от разработчиков ПО занимают слишком много места и привлекают к себе больше внимания, нежели сам товар, то стоит задуматься. Тем более, клиент может случайно переходить по ссылке на сайт поставщика данного сервиса.

    Какое решение лучше выбрать?

    Вы можете найти огромное количество готовых решений на рынке или установить на сайт онлайн консультанта самостоятельно. При выборе нужно руководствоваться несколькими критериями:

    1. Совместимость с имеющейся платформой сайта. Гораздо дешевле и быстрее будет внедрить систему, которая будет идеально совмещаться с вашей CMS.
    2. Оформление ПО. Не стоит недооценивать внешний вид онлайн-консультанта. Учитывайте все, начиная кнопками и заканчивая цветом и размером шрифта.
    3. Логотип разработчиков. Не лишней будет возможность отключать логотип-ссылку поставщиков ПО, чтобы не терять клиентов из-за случайных кликов.
    4. Интеграции с CRM. Функции данной системы мы описали выше, а потому будет не лишним учесть её преимущества и интегрировать в чат.

    Итог: «За» и «Против»

    Ни один инструмент не идеален. А потому, вы должны оценить все преимущества и недостатки данного ПО, прежде чем внедрять ее на сайт.

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

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

    Онлайн-чат прост в использовании, а также не занимает много места. Но зачастую клиенты оставляют в чате некорректные данные для сохранения анонимности. Форма обратной связи через e-mail такого недостатка лишена.

    Мы можем помочь запустить онлайн консультант на вашем сайте, быстро и недорого. Любые ошибки и баги в его дальнейшей работе исключены. Обращайтесь office@itfb.com.ua

  • Как реализовать базовые правила OWASP ModSecurity в Nginx

    Как реализовать базовые правила OWASP ModSecurity в Nginx

    Если вы защищаете Nginx с помощью Mod Security, вам необходимо активировать основной набор правил OWASP (CRS) для защиты от следующих угроз.

    • Защита протокола HTTP
    • Общие сетевые атаки
    • Боты, сканеры, защита от вредоносных действий
    • Троянская защита
    • Защита от утечки информации
    • Атаки с использованием Cross Site Scripting
    • Атаки SQL-инъекций

    Вы согласны ?

    Предварительно нужно установить Nginx и Mod Security, и далее, вы можете настроить OWASP CRS для лучшей безопасности.

    ModSecurity – это брандмауэр веб-приложений с открытым исходным кодом ( WAF ), и по умолчанию он настроен только на обнаружение. Это означает, что вам необходимо включить необходимую конфигурацию ( как указано ниже ), чтобы начать защиту ваших веб-сайтов.

    Установка ModSecurity CRS

    • Загрузите последний файл архива CRS по следующей ссылке и переместите на сервер

    https://github.com/SpiderLabs/owasp-modsecurity-crs/zipball/master

    • разархивируйте файл
      unzip SpiderLabs-owasp-modsecurity-crs-2.2.9-26-gf16e0b1.zip
    • Скопируйте следующий код в папку nginx conf
     modsecurity_crs_10_setup.conf.example
     base_rules

    Настройка Nginx для интеграции OWASP ModSecurity CRS

    Поскольку вы решили использовать OWASP CRS, вам нужно объединить файл conf, включенный в SpiderLabs OWASP CRS, который вы только что скопировали (modsecurity_crs_10_setup.conf.example) в папке nginx.

    Nginx не поддерживает несколько директив ModSecurityConfig, как Apache , поэтому вам нужно собрать все правила в одном файле.

    Давай сделаем это…

    • Добавьте base_rules & modsecurity_crs_10_setup.conf.example в файл modsecurity.conf
    cat modsecurity_crs_10_setup.conf.example base_rules/*.conf >>/usr/local/nginx/conf/modsecurity.conf

    Вам также нужно скопировать весь файл * .data в папку nginx conf

    cp base_rules/*.data /usr/local/nginx/conf/

    Быстрая проверка:

    Убедитесь, что вы добавили директиву ModSecurityEnabled и ModSecurityConfig в файл nginx.conf location. Если нет, добавьте их, как показано ниже.

    location / {
    ModSecurityEnabled on;
    ModSecurityConfig modsecurity.conf;
    }
    • Перезапустить Nginx

    Делая все вышеперечисленные действия, вы успешно интегрировали OWASP CRS в Mod Security на Nginx. Пришло время сделать небольшую необходимую настройку.

    Настройка основного правила OWASP для начала защиты

    В этом разделе все модификации будут в файле modsecurity.conf, поэтому помните, нужно сделать резервную копию.

    Первое делом

    Включить ведение журнала аудита

    Очень важно создавать журналы, что бы знать, что блокируется. Добавьте директиву SecAuditLog, если она не существует.

      SecAuditLog /usr/local/nginx/logs/modsec_audit.log

    Перезапустите Nginx, и вы увидите файл журнала,

    -rw-r----- 1 root root 0 Dec 22 07:54 /usr/local/nginx/logs/modsec_audit.log

    Включить механизм правил безопасности

    Для начала защиты с Mod Security, включите механизм правил, как показано ниже.

      SecRuleEngine On

    Включить действие по умолчанию Deny

    Настройте действие по умолчанию «блок» для любого запроса, соответствующего правилам.

    SecDefaultAction "phase:1,deny,log"

    Эти три конфигурации выше очень важны, и теперь ModSecurity готово выполнить действие и защитить.

    Вот еще одна конфигурация, которая вам может понадобиться.

    Изменить заголовок сервера

    Конфигурация по умолчанию Nginx будет отображать информацию о сервере с ее версией, которую настоятельно рекомендуется прятать, если вы работаете в среде PCI-DSS.

    Заголовок по умолчанию:

    OWASP

    Вносим следующие изменения, добавив строку.

      SecServerSignature GeekFlare

    И теперь это выглядит так:

    настрока безопасности сайта

    Надеюсь, что более подробная инструкция поможет вам интегрировать базовый набор правил OWASP с веб-сервером Nginx для лучшей защиты.

    Если нужна помощь, всегда можно обратиться к нашим специалистам, которые помогут защитить Ваш сайт от уязвимостей, office@itfb.com.ua