Исследование ровня безопасности операционной системы Linux
TOC o "1-3".............................................................................................
1. Основные понятия компьютерной безопасности
2. Локальная и сетевая безопасность Linux.................
2.1. Пользователи и пароли..............................................................
2.2. Особенности файловой системы Linux......................................
2.2.1. Права доступа......................................................................
2.2.2. Атрибуты файлов.................................................................
2.2.3. Механизм квот.....................................................................
2.3. Библиотека PAM.........................................................................
2.4. Брандмауэр.................................................................................
2.5. даленное правление................................................................
3. Средства силения безопасности в Linux.................
3.1. Linux ACLs..................................................................................
3.2. LIDS.............................................................................................
3.3. AIDE............................................................................................
4. Техника безопасности.........................................................
Заключение.....................................................................................
Список литературы.....................................................................
Приложение.....................................................................................
br clear="all"> Приложение
ПРИМЕР 1.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Назначение - маршрутизатор.
Задача: далить неиспользуемые регистрационные записи и добавить три записи. Необходимо добавить пользователей anna и pavel, также одного пользователя с именем systemuser для системных нужд.
Реализация.
Изначально файл пользовательских регистрационных записей может иметь следующий вид:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/bin/bash
В зависимости от становленных программ, содержание этого файла может отличаться от приведенного.
Из соображений безопасности следует далить следующие неиспользуемые в данной конфигурации сервера системные записи: adm, lp, shutdown, halt, news, operator, games, gopher, ftp. Системная запись lp используется только в том случае, если к компьютеру подключен принтер. Настраиваемый компьютер выполняет функции маршрутизатора, следовательно эта регистрационная запись является лишней. Записи shutdown и halt позволяют обычным программам выключать компьютер, что для сервера является только дополнительной брешью в безопасности. Записи news, gopher и ftp используется в том случае, если сервер выполняет функции службы новостей, сервера GOPHER или FTP-сервера. четная запись games используется программами графического интерфейса, поскольку последний отсутствует на маршрутизаторе, эта четная запись тоже является лишней.
Для даления пользователей необходимо для каждой четной записи выполнить команду
userdel <имя_пользователя>
В реализации это будет выглядеть так:
[root@gw /]# userdel adm
[root@gw /]# userdel lp
[root@gw /]# userdel shutdown
[root@gw /]# userdel halt
[root@gw /]# userdel news
[root@gw /]# userdel operator
[root@gw /]# userdel games
[root@gw /]# userdel gopher
[root@gw /]# userdel ftp
Первая часть поставленной задачи выполнена. Далее необходимо добавить казанных пользователей.
[root@gw /]# useradd Цm Цs /bin/bash Цc СNormal UserТ Цd /home/pavel Цg users pavel
[root@gw /]# useradd Цm Цs /bin/bash Цc СNormal UserТ Цd /home/pavel Цg users anna
[root@gw /]# useradd Цr Цs /sbin/nologin Цc СSystem UserТ Цd /var/empty systemuser
Приведенные команды создают в системе казанных пользователей, однако, для входа в систему обычным пользователям дополнительно ко всему следует задать еще и пароль. Это выполняют приведенные ниже команды.
[root@gw /]# passwd anna
Changing password for user anna.
New password: <ввод_пароля>
Retype new password: <повтор_ввода_пароля>
passwd: all authentication tokens updated successfully.
[root@gw /]# passwd pavel
Changing password for user pavel.
New password: <ввод_пароля>
Retype new password: <повтор_ввода_пароля>
passwd: all authentication tokens updated successfully.
В результате произведенных действий система будет содержать все необходимые для нормального функционирования системные регистрационные записи, также двух пользователей anna и pavel, которые смогут заходить и работать в системе.
ПРИМЕР 2.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Назначение - сервер приложений. Программное обеспечение - web-сервер Apache, FTP-сервер Proftpd. Web-сервер выполняется от имени системного пользователя nobody, FTP-сервер - от имени системного пользователя ftpuser. Оба пользователя входят в группу nogroup. На сервере работает web-портал, имеющий распределенную структуру. Весь портал делится на 2 части: администрируемую часть - динамические данные и неадминистрируемую часть - статические данные или оболочка. Администрирование динамической части может осуществляться как с помощью протокола FTP, так и с помощью специально разработанного web-интерфейса. Статические данные может изменять только привилегированный пользователь и только с помощью терминального доступа.
Задача: настройка защищенной конфигурации web-портала с использованием средств разграничения прав доступа.
Реализация.
Допустим, что все файлы объекта защиты, то есть web-портала, находятся в директории /. В свою очередь, директория / содержит каталоги ftp и html: первый - для хранения и доступа к файлам по FTP протоколу, второй - для доступа к файлам по протоколу HTTP. Для обеспечения эффективной защиты файлы, находящиеся в каталоге /, должны иметь доступ только на чтение для пользователей nobody и ftpuser. Файлы, находящиеся в каталоге //ftp, должны быть доступны на чтение и на запись как пользователю ftpuser, так и пользователю nobody. В свою очередь, файлы каталога //html должны быть доступны только пользователю nobody и с правами только на чтение. Привилегированный пользователь всегда имеет право на чтение и на запись, независимо от прав доступа, становленных для файла.
Учитывая, что оба пользователя nobody и ftpuser принадлежат одной группе nogroup, права на каталог / могут быть становлены следующим образом:
[root@app /]# chmod 050 /
[root@app /]# chown root:nogroup /
[root@app /]# ls Цl
Е
d---r-x--- 1а rootа nogroupа 4096а Фев 7 19:48
Е
Первая команда станавливает права только на чтение и вход в каталог для пользователей группы-владельца каталога. Вторая команда меняет группу-владельца каталога на группу nogroup. Третья команда позволяет просмотреть сделанные изменения. Как видно из результата выполнения третьейа команды, каталог теперь имеет права доступа для группы только на чтение и вход, для пользователя-владельца и всех остальных какие-либо права отсутствуют вообще.
Теперь, когда доступ в каталог имеют оба системных пользователя, необходимо разграничить права на внутренние каталоги.
[root@app ]# chown ЦR ftpuser:nogroup //ftp
[root@app ]# chmod ЦR o-rwx //ftp
[root@app ]# chmod ЦR ug+rw //ftp
[root@app ]# chown ЦR nobody:root //html
[root@app ]# chmod ЦR go-rwx //html
[root@app ]# chmod ЦR u+r //html
[root@app ]# ls Цl /
drwxrwx--- 1а ftpuser nogroup 4096а Фев 7 19:55а ftp
dr-x------ 1а nobodyа root 4096а Фев 7 20:01а html
Первая команда меняет группу-владельца и пользователя-владельца для каталога ftp, вторая - отменяет все права на операции с файлами для всех остальных, третья - добавляет права на чтение и запись для пользователя-владельца и группы-владельца. Ключ ЦR позволяет рекурсивно изменить параметры у текущего каталога и всех подкаталогов и файлов, хранящихся в нем. Следующая команда Уchown ЦR nobody:root //htmlФ позволяет изменить пользователя-владельца для каталога html и всех его подкаталогов и файлов на пользователя nobody. Команда Уchmod ЦR go-rwx //htmlФ отменяет все права для группы-владельца и всех остальных. Далее команда Уchmod ЦR u+r //htmlФ станавливает права только на чтение для пользователя-владельца. Последняя команда выводит результат выполненных операций на экран. Задача выполнена!
Следует сделать маленькое замечание: все вышеприведенное верно только в том случае, если маска создания файла по молчанию при создании каталогов и файлов была определена как 022 (umask 022). В противном случае действия, которые необходимо предпринять для становки необходимых прав доступа, зависят от конкретных настроек системы.
ПРИМЕР 3.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Программное обеспечение - пакет lcap. В данном случае функциональное назначение сервера существенной роли не играет.
Задача: произвести настройку комплексной защиты сервера с использованием расширенных атрибутов (в частности, с помощью атрибута immutable).
Реализация.
Для реализации поставленной задачи необходимо изначально определить, какие файлы в процессе работы могут быть изменены, какие могут быть изменены только в специальном режиме, например, только в режиме профилактики или обновлении программного обеспечения. В данном случае специальный режим предполагает перевод системы в однопользовательский режим работы.
В общем случае, в обычных словиях содержимое следующих каталогов изменяться не должно, или может изменяться, но достаточно редко:
/boot /etc - в окончательно настроенной системе содержимое этих каталогов изменяться не должно. За редким исключением содержимое каталога /etc может меняться при перенастройке каких-либо программ или сервисов.
/bin Ц каталог содержит исполняемые файлы, которые могут быть изменены, далены или добавлены только при обновлении программного обеспечения.
/sbin Ц в каталоге хранятся исполняемые файлы системных программ, большинство из которых доступно на выполнение только привилегированному пользователю и также не должно изменяться во время работы системы.
/lib - каталог системных библиотек, которые также могут быть изменены только при обновлении программных продуктов.
Следующие команды позволяют становить атрибут immutable для вышеперечисленных директорий и для всех файлов, находящихся в них.
[root@app /]# chattr ЦR +i /boot /etc /bin /sbin /lib
[root@app /]# lsattr
---i----------./boot
Е
---i----------./etc
--------------./root
---i----------./bin
--------------./initrd
---i----------./lib
Е
---i----------./sbin
Параметр ЦR как и в предыдущих примерах используется для рекурсивной становки атрибута для всех файлов и каталогов, расположенных ниже в иерархии.
Каталог /usr имеет свою собственную иерархию. В этой иерархии следующие каталоги должны иметь становленный флаг immutable:
/usr/bin /usr/sbin /usr/lib /usr/local/bin /usr/local/sbin /usr/local/lib - перечисленные каталоги имеют то же значение, что и одноименные каталоги корневой иерархии.
/usr/include /usr/local/include - оба каталога содержит заголовочные файлы для компилируемых программ. Заголовочные файлы не должны изменяться ни при каких условиях, ну разве только тогда, когда компьютер используется для разработки программного обеспечения и в заголовочные файлы вносятся изменения.
[root@app /]# chattr ЦR +i /usr/bin /usr/sbin /usr/lib /usr/include
[root@app /]# lsattr /usr
-------------- /usr/lost+found
---i---------- /usr/bin
---i---------- /usr/lib
-------------- /usr/libexec
---i---------- /usr/sbin
Е
---i---------- /usr/include
-------------- /usr/local
---i---------- /usr/src
Е
В завершение всех операций можно выполнить программу lcap с параметрами CAP_LINUX_IMMUTABLE и CAP_SYS_RAWIO:
[root@app /]# lcap CAP_LINUX_IMMUTABLE
[root@app /]# lcap CAP_SYS_RAWIO
Также необходимо становить запуск этой команды в стартовые сценарии, чтобы они выполнялись при каждой загрузке системы.
Приведенный пример, опять же, является не всегда применимым, все зависит от конкретной конфигурации системы и конкретных словий ее эксплуатации.
ПРИМЕР 4.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Назначениеа - сервер приложений. Программное обеспечение - ядро версии 2.4.20, собранное с поддержкой пользовательских квот, пакет quota-3.11. Для пользовательских каталогов выделен отдельный раздел /dev/hda3 объемом 25 Гбайт, смонтированный в директории /home.
Задача: организовать разделение дискового пространства между пользователями с использованием механизма квот. Каждому пользователю необходимо выделить по 10 Мбайт дискового пространства с максимальным количеством возможных файлов Ц 1.
Реализация.
Пользовательские квоты распространяются на отдельный раздел жесткого диска и активизируются при загрузке системы. Для включения поддержки квот необходимо в файле /etc/fstab для раздела /home добавить параметр usrquota или grpquota, или оба этих параметра, если нужна поддержка квоты для пользователей и групп одновременно. В данном случае для реализации поставленной задачи необходим только параметр usrquota.
Строка файла /etc/fstab, относящаяся к разделу /home, после изменения может иметь следующий вид:
/dev/hda3 /home ext2 default,usrquota 1а 2
Поскольку версии ядер начиная с ветки 2.4 поддерживают новый формат пользовательских квот, который обладает некоторыми преимуществами перед старой версией, использование новой версии будет намного целесообразнее. Вся последующая настройка производится с этим четом.
Для активации пользовательских квот необходимо перезагрузить систему. При загрузке необходимо выполнить проверку квотируемого раздела, что можно сделать запуском программы quotacheck, также включить механизм квот выполнением программы quotaon. Эти обе программы имеют множество параметров командной строки, о которых можно знать из man-руководств, входящих в пакет quota. Стандартная строка запуска этих программ, которая подходит для большинства систем, может иметь вид:
quotacheck Цaug
quotaon Цaug
Параметр командной строки Цa сообщает программе, что необходимо выполнить проверку всех файловых систем, перечисленных в файле fstab, на которых включена поддержка квот, и которые не являются файловыми системами NFS. Параметр Цu казывает выполнить проверку квот для пользователей на разделах, перечисленных в файле /etc/mtab. Файл /etc/mtab модифицируется при монтировании и размонтировании любой файловой системы и содержит все файловые системы, смонтированные на текущий момент. Параметр Цg выполняет ту же функцию, что и параметр Цu, но только для групп. Последний параметр не имеет значения, если квот включена только для пользователей, но, чтобы в дальнейшем при изменении конфигурации не возникало проблем, рекомендую добавлять этот параметр.
Желательно сделать так, чтобы механизм квот активировался сразу после монтирования файловых систем. Монтирование файловых систем при запуске Linux RedHat выполняется в файле /etc/rc.d/init.d/rc.sysinit. В том же файле сразу после монтирования следует код, который запускает программы quotacheck и quoaton с казанными параметрами, если они присутствуют в системе. Следовательно, для Linux RedHat добавлять код запуска программ не нужно, поскольку он же присутствует по молчанию. Для других версий ОС Linux этот код, возможно, придется добавлять вручную.
Во время загрузки системы программа quotacheck выполнит проверку файловых систем с включенными квотами на наличие файлов квот и, если файлы отсутствуют, quotacheck создаст их в корневом каталоге этой файловой системы. В данном случае в каталоге /home появится файл aquota.user, в котором будет храниться информация о пользовательских квотах.
Далее, используя программу setquota, необходимо выполнить настройку квот для каждого пользователя, имеющего домашний каталог в разделе /home. Это можно сделать командой:
[root@app /]# setquota Цu <имя_пользователя> 10240 0 1 0 /dev/hda3
Приведенная команда становит ограничение дискового пространства в 10 Мбайт с максимальным количеством возможных файлов - 1 для указанного пользователя. Для пользователя anna эта команда будет иметь вид:
[root@app /]# setquota Цu anna 10240а 0а 1а 0а /dev/hda3
Если квот остальных пользователей должна быть идентична приведенной, что как раз и требуется для реализации, квоту пользователя anna можно использовать как шаблон. Далее при создании квоты для пользователя igor параметры квотирования пользователя anna просто копируются:
[root@app /]# setquota Цu Цp anna igor /dev/hda3
В результате выполнения команды пользователь igor получает те же настройки квоты, что и пользователь anna, в данном случае ему выделяется 10 Мбайт на хранение 1 файлов. Вышеприведенную команду необходимо выполнить для всех пользователей системы.
Просмотр сделанных настроек позволяет выполнить программа repquota. Вызов этой программы с параметрами Цa выводит достаточно добочитаемый подробный отчет по всем файловым системам с включенной поддержкой квот.
[root@app /]# repquota -a
*** Report for user quotas on device /dev/hda3
Block grace time: 00:00; Inode grace time: 00:00
Block limits File limits
User used soft hardа grace usedа softа hardа grace
----------------------------------------------------------------
...
annaа -- 4 2097152 0 1 0 0
igorа -- 4 2097152 0 1 0 0
...
Для обеспечения надежности работы механизма квот, необходимо время от времени производить проверку целостности файла aquota.user на предмет наличия ошибок. Для этой цели можно использовать программу-планировщик cron, которая является стандартной практически для всех версий ОС Linux. На момент проверки файловой системы рекомендуется отключить поддержку механизма квот для этой файловой системы во избежание повреждений. Для этого перед запуском quotacheck необходимо выполнить программу quotaoff. Выполнение казанной последовательности можно реализовать, создав отдельный исполняемый файл, например /usr/sbin/chkquota, который может иметь следующее содержание:
#!/bin/bash
# Turn off quotas
quotaoff Цaug
# Check quotas
quotacheck Цaug
# Turn on quotas
quotaon Цaug
Тогда строка запуска проверки квот в конфигурационном файле /etc/crontab программы cron может выглядеть следующим образом:
0 3 * * 0 root /usr/sbin/chkquota
Эта конфигурация позволяет выполнять проверку квот каждое воскресенье в три часа ночи. Для более детального ознакомления с форматом файла /etc/crontab существуют man-руководства, включенные в пакет cron.
ПРИМЕР 5.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Назначениеа - сервер приложений. Программное обеспечение - библиотека pam-0.75-32.
Задача: настроить ограничения ресурсов, используемых в процессе работы, для пользователей группы users. Необходимо ограничить количество одновременно запущенных процессов до 20, количество одновременно открытых файлов до 30 и запретить создание каких-либо файлов ядра.
Реализация.
Ограничением ресурсов занимается модуль pam_limits. Этот модуль использует файл конфигурации /etc/security/limits.conf, в котором и задаются необходимые параметры ограничения. Файл состоит из строк, каждая из которых определяет ограничение на определенный вид ресурса. Формат строки следующий:
<субъект_ограничения> <тип> <объект_ограничения> <значение>
Субъектом ограничения может быть либо одиночный пользователь, либо группа, которая определяется добавлением знака @ перед ее именем, либо значок *, означающий, что ограничение должно распространяться на всех без исключения. Для реализации задачи субъектом ограничения будет служить слово @users.
Тип ресурса может быть либо soft, либо hard. Значение soft задает мягкое ограничение на использование казанного ресурса, значение hard определяет жесткое или абсолютное предельное значение использования ресурса. Для реализации задачи лучше всего будет казать жесткое ограничение на все виды ресурсов.
Объект ограничения казывает, на какой вид ресурса распространяется это ограничение. Для реализации задачи в качестве ограничиваемых объектов необходимо казать следующие параметры:
nproc Ц количество одновременно запущенных процессов. Должно иметь значение 20.
nofile Ц количество одновременно открытых файлов. Должно быть становлено в 30.
core Ц размер файла ядра. Для запрета на создание файлов ядра значение этого параметра должно быть становлено в 0.
В результате файл /etc/security/limits.conf будет иметь вид:
@users hard nproc 20
@users hard nofile 30
@users hard core 0
Для того, чтобы активизировать ограничение ресурсов для конкретного приложения, вызов модуля pam_limits необходимо добавить в соответствующий файл сценария библиотеки PAM. Для локального входа пользователей этим приложением является программа login, которая имеет одноименный файл сценария в каталоге /etc/pam.d. После модификации файл /etc/pam.d/login может выглядеть следующим образом:
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
accountа required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
sessionа required pam_stack.so service=system-auth
sessionа optional pam_console.so
sessionа required pam_limits.so
Последняя строка предписывает библиотеке PAM использовать модуль pam_limits, причем спешное прохождение через этот модуля является необходимым для спешного завершения процесса аутентификации в целом.
Для терминального доступа по протоколу ssh вызов модуля pam_limits необходимо также добавить в файл /etc/pam.d/sshd. В итоге этот файл может быть таким:
#%PAM-1.0
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
accountа required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
sessionа required pam_stack.so service=system-auth
sessionа optional pam_console.so
sessionа required pam_limits.so
При такой конфигурации как локальный, так и даленный доступ для пользователей группы users будет иметь ограничения на казанные ресурсы.
ПРИМЕР 6.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Назначениеа - маршрутизатор. Программное обеспечение - iptables-1.2.5, ядро версии 2.4.22, собранное с поддержкой netfilter и iptables. На сервере становлены три сетевые карты. С помощью двух сетевых карт под символическими именами eth0 и eth1 сервер связывает две локальные TCP/IP сети с различными диапазонами IP адресов. Первая сеть имеет адрес 192.168.0.0, вторая - 192.168.1.0, обе сети имеют маску 255.255.255.0. Сетевая карта eth0 имеет IP адрес 192.168.0.1, eth1 Ц 192.168.1.1. Третья сетевая карта с символическим именем eth2 имеет реальный сетевой адрес 144... обеспечивает выход в Интернет.
Задача: настроить межсетевой экран с повышенными требованиями к безопасности. Из сети Интернет необходимо открыть доступ к HTTP-серверу, почтовой службе, функционирующей по протоколу SMTP, серверу имен DNS, также терминальный доступ по протоколу SSH. Компьютеры обеих локальных сетей помимо перечисленных сервисов должны иметь возможность получать почту с локального сервера посредством протокола POP3. Также необходимо обеспечить обмен информацией между компьютерами двух локальных сетей, обеспечить выход компьютеров сети 192.168.0.0 в Интернет, из сети 192.168.1.0 Ц только компьютерам с IP адресами 192.168.1.30 и 192.168.1.45.
Реализация.
Чтобы маршрутизатор функционировал в качестве шлюза, в ядре необходимо поменять значение переменной ip_forward. Это можно сделать командой приведенной далее, чтобы эта переменная устанавливалась в 1 при загрузке, необходимо в файле /etc/sysctl.conf найти и раскомментировать, если она закомментирована, строку вида Уnet.ipv4.ip_forward = Ф и изменить значение 0 в этой строке на 1. Если же такой строки нет, ее необходимо добавить. Таким образом, маршрутизатор получает казание работать в качестве шлюза, то есть обрабатывать пакеты, пришедшие из сети и не адресованные локальным процессам, в соответствии с заранее заданной таблицей маршрутизации. Включение этой функции необходимо для обеспечения доступа в сеть Интернет из двух локальных сетей.
[root@app /]# echo 1 > /proc/sys/net/ipv4/ip_forward
Далее приводится последовательность действий, которые необходимо выполнить, чтобы построить требуемую конфигурацию брандмауэра.
[root@app /]# /sbin/iptables Цt filter -P INPUT DROP
[root@app /]# /sbin/iptables Цt filter -P OUTPUT DROP
[root@app /]# /sbin/iptables Цt filter -P FORWARD DROP
Параметр командной строки ЦР позволяет становить политику действия по молчанию для всех пакетов, которые не попали ни под один критерий в правилах INPUT, OUTPUT и FORWARD. Действие DROP означает, что пакет должен быть уничтожен, если ни одно правило цепочки ему не соответствует. Параметр Цt казывает, над какой таблицей производится действие. Если этот параметр не казан, используется таблица filter, поэтому использование этого параметра в данном случае не обязательно.
Для распределения нагрузки и простоты в правлении можно создать в таблице filter дополнительные цепочки с разным функциональным назначением.
[root@app /]# /sbin/iptables -N bad_tcp_packets
[root@app /]# /sbin/iptables -N allowed
[root@app /]# /sbin/iptables -N tcp_packets
[root@app /]# /sbin/iptables -N udp_packets
[root@app /]# /sbin/iptables -N icmp_packets
Цепочка bad_tcp_packets предназначена для отфильтровывания пакетов с "неправильными" заголовками. Здесь отфильтровываются все пакеты, которые распознаются как NEW, то есть пакеты, открывающие новое соединение, но не являются SYN пакетами, то есть часть пакета, ответственная за синхронизацию, отсутствует, так же обрабатываются SYN/ACK-пакеты, имеющие статус NEW. Эта цепочка может быть использована для защиты от вторжения и сканирования портов.
[root@app /]# /sbin/iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
[root@app /]# /sbin/iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
[root@app /]# /sbin/iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
Цепочка tcp_packets является фильтром сетевых сервисов. Именно в этой цепочке будет осуществляться фильтрация tcp-соединений по критерию запрашиваемого сервиса. В качестве такого критерия используется порт, на который приходят запросы на обслуживание. Для того, чтобы только пользователи локальной сети смогли получать почту, в последних двух правилах в качестве дополнительного критерия фильтрации используются символические имена сетевых интерфейсов локальных сетей. В качестве действия пакет посылается в цепочку allowed для последующей проверки более низкого ровня.
[root@app /]# /sbin/iptables -A tcp_packets -p TCP --dport 22 -j allowed
[root@app /]# /sbin/iptables -A tcp_packets -p TCP --dport 25 -j allowed
[root@app /]# /sbin/iptables -A tcp_packets -p TCP --dport 80 -j allowed
[root@app /]# /sbin/iptables -A tcp_packets -p TCP Цi eth0 --dport 110 -j allowed
[root@app /]# /sbin/iptables -A tcp_packets -p TCP Цi eth1--dport 110 -j allowed
Цепочка allowed используется для дополнительной фильтрации tcp пакетов, прошедшиха цепочку tcp_packets и разрешенных в ней. Первое правило проверяет, становлен ли в заголовке пакета бит SYN, то есть, является ли пакет первым пакетом становления соединения. Такие пакеты считаются разрешенными и пропускаются. Второе правило проверяет состояние пакета, и если оно либо ESTABLISHED, либо RELATED, то пакет разрешается. Эти состояния присваиваются пакетам, когда соединение же установлено и ведется обмен данными. Последнее правило просто сбрасывает все остальные пакеты, не попавшие под первые два правила.
[root@app /]# /sbin/iptables -A allowed -p TCP --syn -j ACCEPT
[root@app /]# /sbin/iptables -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@app /]# /sbin/iptables -A allowed -p TCP -j DROP
Цепочка udp_packets имеет ту же функцию, что и цепочка tcp_packets, с единственным отличием - в этой цепочке производится фильтрация udp-соединений. Сервис DNS использует как раз протокол UDP для обмена информацией, поэтому правило, которое будет разрешать пакеты DNS, необходимо добавить именно в эту цепочку.
[root@app /]# /sbin/iptables -A udp_packets -p UDP --dport 53 -j ACCEPT
Цепочка icmp_packets предназначена для фильтрации icmp-пакетов. Для нормального функционирования сервера Linux в сети достаточно разрешение только двух типов сообщений: ICMP Echo Request и Time Exceeded.
[root@app /]# /sbin/iptables -A icmp_packets -p ICMP --icmp-type 8 -j ACCEPT
[root@app /]# /sbin/iptables -A icmp_packets -p ICMP --icmp-type 11 -j ACCEPT
Еще раз хочу заметить, что по молчанию без использования параметра Цt все действия производятся в таблице filter.
Теперь перейдем к заполнению основных системных таблиц. Начнем с входящей цепочки INPUT таблицы filter.
[root@app /]# /sbin/iptables -A INPUT -p tcp -j bad_tcp_packets
[root@app /]# /sbin/iptables -A INPUT -i lo Цs 127.0.0.0/8 -j ACCEPT
[root@app /]# /sbin/iptables -A INPUT -i lo -s 192.168.0.1 -j ACCEPT
[root@app /]# /sbin/iptables -A INPUT -i lo -s 192.168.1.1 -j ACCEPT
[root@app /]# /sbin/iptables -A INPUT -i lo -s 144... -j ACCEPT
[root@app /]# /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@app /]# /sbin/iptables -A INPUT Цp TCPа -j tcp_packets
[root@app /]# /sbin/iptables -A INPUT -p UDP -j udp_packets
[root@app /]# /sbin/iptables -A INPUT -p ICMP -j icmp_packets
[root@app /]# /sbin/iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
Сначала все пакеты должны пройти через цепочку bad_tcp_packets на предмет неправильного заголовка. Далее необходимо принять все пакеты, пришедшие со всех адресов сетевых карт через локальный интерфейс. Такие пакеты могут посылать только локальные приложения, поэтому для их нормального функционирования необходимо пропускать эти пакеты беспрепятственно. Затем следует правило определяющее состояние пакета. Если пакет находится в одном из двух состояний (RELATED или ESTABLISHED), то он тоже беспрепятственно разрешается. Дело в том, что настройка брандмауэра подразумевает 99-процентную достоверность фильтрации приходящих запросов, поэтому, если соединение было разрешено на этапе становления, то при последующем обмене информацией критерии сервиса не проверяются, что позволяет немного величить скорость обработки и меньшить нагрузку на сервер.
Если пакет не довлетворяет ни одному из перечисленных условий, далее следуют правила, в которых пакет классифицируется по типу используемого протокола. Пакеты протоколов TCP, UDP и ICMP попадают в одноименные цепочки для их фильтрации по типу запрашиваемого сервиса. Если пакет проходит одну из этих цепочек, и к нему не было применено действие ACCEPT, то есть пакет не является запросом к разрешенному сервису, сначала происходит запись параметров запроса в журнальный файл (действие LOG), затем применяется политика по молчанию цепочки INPUT, то есть пакет просто уничтожается.
[root@app /]# /sbin/iptables -A FORWARD -p tcp -j bad_tcp_packets
[root@app /]# /sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@app /]# /sbin/iptables -A FORWARD -i eth0 Цs 192.168.0.0/24 -j ACCEPT
[root@app /]# /sbin/iptables -A FORWARD -i eth1 Цs 192.168.1.30 -j ACCEPT
[root@app /]# /sbin/iptables -A FORWARD -i eth1 Цs 192.168.1.45 -j ACCEPT
[root@app /]# /sbin/iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
налогично цепочке INPUT, пакеты, проходящие транзитом, сначала фильтруются на предмет неправильного заголовка с помощью таблицы bad_tcp_packets. Пакеты же становленного соединения разрешаются без дополнительных проверок. Далее все пакеты, пришедшие с интерфейса eth0, через который к серверу подключена сеть 192.168.0.0, разрешаются, что позволяет всем пользователям сети 192.168.0.0 работать в Интернет. Однако, перед этим необходимо настроить NAT, что и будет сделано дальше.
[root@app /]# /sbin/iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 144...
Приведенная команда добавляет в цепочку POSTROUTING таблицы nat правило, которое меняет адрес-источник у пакета, покидающего сервер через интерфейс eth2, то есть пакета, который должен быть отправлен в сеть Интернет, на адрес интерфейса сервера. В результате компьютер, у которого нет реального адреса в сети Интернет, получает возможность посредством локального сервера обмениваться информацией с любым сервером в Интернете.
[root@app /]# /sbin/iptables -A OUTPUT -p tcp -j bad_tcp_packets
[root@app /]# /sbin/iptables -A OUTPUTа -s 127.0.0.0/8 -j ACCEPT
[root@app /]# /sbin/iptables -A OUTPUT -s 192.168.0.1 -j ACCEPT
[root@app /]# /sbin/iptables -A OUTPUT -s 192.168.1.1 -j ACCEPT
[root@app /]# /sbin/iptables -A OUTPUT -s 144... -j ACCEPT
[root@app /]# /sbin/iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
Для цепочки OUTPUT необходимо казать, с каких IP адресов разрешать пакеты. Здесь должны быть перечислены все адреса, которые присвоены сетевым картам сервера.
В конце созданные правила необходимо сохранить командой
[root@app /]# /sbin/iptables-save > /etc/sysconfig/iptables
В дальнейшем при загрузке сервера эти правила автоматически будут загружены в ядро.
На этом настройку брандмауэра можно считать оконченной.
ПРИМЕР 7.
Исходные данные: ОС Linux RedHat 7.3 без графической оболочки. Назначение - маршрутизатор. Программное обеспечение - пакет OpenSSH-3.6.1p2.
Задача: выполнить безопасную настройку сервиса SSH с четом язвимостей в версии SSH 1.0.
Реализация.
Версия 1.0 протокола SSH имеет язвимость, которая позволяет при определенных словиях получить доступ с правами привилегированного пользователя. Версия 2.0 от этой недоработки в системе безопасности избавлена, поэтому ее использование будет самым оптимальным решением. Настройка сервиса SSH по молчанию позволяет использовать обе версии протокола, выбор осуществляется в зависимости от того, какой протокол поддерживает клиентская программа. Чтобы явно запретить использование протокола версии 1.0, необходимо в файл конфигурации sshd_config внести следующую строку
Protocol 2
Эта строка казывает демону sshd использовать только протокол версии 2.0. В противном случае, если клиент запросит разрешение на открытие сеанса с использованием протокола 1.0, запрос будет отвергнут.
OpenSSH версии 3.6 и некоторых более ранних версий имеет специальный параметр UsePrivilegeSeparation, который позволяет запускать процесс sshd от имени аутентифицированного пользователя. После того, как пользователь спешно прошел аутентификацию, основной процесс sshd, запущенный от имени привилегированного пользователя, передает правление дополнительному процессу sshd, который выполняется же от имени аутентифицированного пользователя. Такая технология позволяет добиться более высокого ровня безопасности по сравнению с предыдущими версиями пакета OpenSSH, в которых доступ пользователей контролировался процессом, запущенным с правами пользователя root. Конфигурация демона по умолчанию же использует этот параметр, однако в некоторых более ранних версиях этот параметр выключен. Для активации разделения пользовательских привилегий в файл sshd_config необходимо добавить строку
UsePrivilegeSeparation yes
Если сборка пакет производилась из исходных файлов, для настройки разделения привилегий необходимо совершить несколько дополнительных операций. Эти операции хорошо документированы и последовательность их выполнения в документации по становке пакета OpenSSH расписана практически по шагам.
Чтобы ограничить доступ привилегированному пользователю, можно использовать параметр PermitRootLogin. Установка этого параметра в значение
PermitRootLogin no
не позволит пользователю root получить доступ к удаленному терминалу. Получение привилегий пользователя root в таком случае можно будет осуществить только запуском команды su.
Для настройки ограничения доступа существуют также параметры AllowGroups, DenyGroups и AllowUsers, DenyUsers для разрешения и запрета на доступ определенным группам и пользователям соответственно. Например, для запрета доступа всем группам пользователей кроме пользователей группы wheel, конфигурационный файл должен содержать такие строки
DenyGroups *
AllowGroups wheel
Для силения ровня безопасности можно поменять еще два параметра. Значения этих параметров по молчанию являются приемлемыми для большинства систем и их изменение в данном случае большой роли не играет. Параметр MaxStartups позволяет задать максимальное количество одновременно запущенных процессов демона sshd, другими словами, этот параметр определяет максимальное количество одновременно подключенных пользователей. По молчанию ограничение на количество пользователей равно 10. Если в систему должен иметь доступ только администратор и еще пара человек обслуживающего персонала, этот параметр можно выставить в значение 5. Параметр LoginGraceTime определяет период времени, в течение которого, начиная с момента становления соединения, должна быть осуществлена аутентификация пользователя. По молчанию это значение равно 2 минутам. Если в течение этого времени пользователь не пройдет аутентификацию, серверная сторона просто закроет соединение. Если администрирование производится из локальной сети, для аутентификации может быть достаточно 30 секунд, если же существует хотя бы вероятность, что доступ будет осуществляться через низкоскоростное соединение, например, посредством телефонного соединения, имеет смысл выставить это значение в 60 секунд минимум.
Далее приводится часть конфигурационного файла, сформированная с четом всего вышеуказанного
Е
Protocol 2
UsePrivilegeSeparation yes
PermitRootLogin no
MaxStartups 5
LoginGraceTime 30
Е
Сервис SSH изначально настроен с максимальными требованиями к безопасности, поэтому изменение каких-либо дополнительных настроек для стандартной конфигурации не требуется. Изменения могут потребоваться лишь в том случае, если к работе сервиса предъявляются особые требования.