Введение
25 декабря 2022 года Федеральная служба по техническому и экспортному контролю Российской Федерации (ФСТЭК России) выпустила руководство под названием «Рекомендации по безопасной настройке операционных систем Linux».
Сейчас эти рекомендации являются обязательными для государственных информационных систем и критической информационной инфраструктуры (КИИ), работающих на Linux.
Цель упомянутого документа — обеспечить надежную защиту информационных систем, работающих на Linux, от киберугроз. В рекомендациях представлены советы, которые помогут минимизировать риски и уязвимости, присущие операционной системе.
Основные моменты следующие:
Создание пользователей с ограниченными правами и использование надёжных паролей для защиты от несанкционированного доступа.
Настройка брандмауэра и сетевой конфигурации для защиты системы от внешних угроз.
Установка защиты на уровне ядра, что позволит предотвратить атаки на ядро операционной системы.
Внедрение дополнительных уровней защиты для приложений и процессов.
Настройка систем под рекомендации регулирующего органа может быть непростой задачей, учитывая быстрое развитие технологий и постоянно меняющиеся угрозы.
Вручную ввод конфигураций может быть утомительным и чреват ошибками, особенно если требуется настроить ОС на 50, 100 или даже 1000 серверах и рабочих станциях.
Для решения этой проблемы мы используем Ansible, популярное и удобное решение для управления конфигурациями. С помощью Ansible можно массово развертывать и применять конфигурации, упрощая соблюдение требований ФСТЭК России и обеспечивая надежность и эффективность инфраструктуры.
Ansible работает по принципу «напиши, что должно быть, и забудь». В специальных YAML-файлах описываете, как должна выглядеть система, а все остальное Ansible сделает сам.
С Ansible можно легко и быстро развернуть приложения на серверах Linux, настроить их под свои нужды и масштабировать инфраструктуру. А ещё Ansible поддержив��ет разные платформы и сервисы, так что можно автоматизировать задачи как в локальной, так и в облачной среде.
Готовые плейбуки
В этой статье я расскажу о некоторых плеях, разработанных мной. Мои плейбук предназначен для RHEL подобных систем. Для других систем его необходимо адаптировать.
Автоматизация настройки авторизации в операционных системах Linux
Автоматизация настройки прав доступа к объектам файловой системы
Если будете что-то менять, попробуйте сначала на тестовой машине или в виртуальной среде, особенно если речь идёт о плейбуках с изменением конфигураций ядра. Это просто напоминание, даже если вы и так это знаете.
Создание пользователя
Плей «1 Create user fstec with root-level privileges» предназначен для инициализации работы плейбука и создания пользователя, от имени которого будут выполняться остальные задачи.
Работать от имени root — не всегда безопасно и удобно. Поэтому создадим нового пользователя с правами root. От его имени и будут работать остальные плейбуки.
Перед началом работы не забудьте заменить «your_user» на имя пользователя, которого хотите создать. Можно использовать уже существующего пользователя.
Листинг плея 1
- name: 1 Create user fstec with root-level privileges hosts: all become: true tasks: - name: Add user fstec user: name: your_user shell: /bin/bash groups: wheel append: yes - name: Prompt for password for your user pause: prompt: "Enter password for your user:" register: passwd_input - name: Set password for your user user: name: your_user password: "{{ passwd_input.user_input | password_hash('sha512') }}" update_password: always - name: Copy root's SSH key for your user authorized_key: user: your_user key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" - name: Add fstec to sudoers lineinfile: dest: /etc/sudoers line: " your_user ALL=(ALL:ALL) ALL" validate: 'visudo -cf %s'
Описание:
Создание пользователя «your_user» с оболочкой «/bin/bash» и добавление его в группу «wheel».
Запрос пароля для пользователя «your_user».
Установка пароля для пользователя «your_user» с использованием введенного пароля и хэшированием его в формате SHA-512.
Копирование открытого ключа SSH root пользователя для пользователя «your_user».
Добавление пользователя «your_user» к списку пользователей, имеющих права sudo в файле /etc/sudoers.
Далее каждый плейбук будет отвечать за настройку определенного пункта рекомендаций по безопасной настройке ОС Linux ФСТЭК России, что будет отражено в его названии. Например, плейбук с именем «2.1 Configuring authorization in Linux operating systems» выполняет настройки для рекомендации ФСТЭК России по пункту «2.1. Настройка авторизации в операционных системах Linux»
Автоматизация настройки авторизации в операционных системах Linux
Плей «2.1 Configuring authorization in Linux operating systems» автоматизирует пункт «2.1. Настройка авторизации в операционных системах Linux» (утв. ФСТЭК России 25.12.2022).
Листинг плея 2.1
- name: 2.1 Configuring authorization in Linux operating systems hosts: all become: true remote_user: «your_user» gather_facts: false tasks: - name: 2.1.1. Do not allow the use of user accounts with empty passwords. Configure accounts so that each user of the system either has a password or is blocked by a password. On Linux systems, this feature is provided by the /etc/shadow file. lineinfile: path: /etc/shadow regexp: ^([^:]+):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*) line: \1:*:\3:\4:\5:\6:\7 backrefs: yes register: shadow_file - name: Check the result of changes debug: var: shadow_file - name: 2.1.2. Ensure that superuser login to the system via SSH is disabled by setting the PermitRootLogin parameter to no in the /etc/ssh/sshd_config file. lineinfile: dest: /etc/ssh/sshd_config regexp: ^PermitRootLogin line: PermitRootLogin no state: present backup: yes notify: - restart sshd handlers: - name: restart sshd service: name: sshd state: restarted
Описание:
Запрет на использование учетных записей пользователей с пустыми паролями осуществляется путем изменения файла /etc/shadow – пользователи без пароля будут заблокированы. Результат изменений сохраняется в переменной shadowfile.
Запрет подключения по SSH под суперпользователем осуществляется добавлением параметра «PermitRootLogin no» в файл /etc/ssh/sshdconfig. После внесения изменений в файл /etc/ssh/sshdconfig, происходит перезапуск службы sshd с помощью обработчика (handler) restart sshd.
Автоматизация ограничений механизмов получения привилегий
Плей «2.2 Limitation of privilege mechanisms» автоматизирует пункт «2.2. Ограничение механизмов получения привилегий» (утв. ФСТЭК России 25.12.2022).
Листинг плея 2.2
- name: 2.2 Limitation of privilege mechanisms hosts: all become: true remote_user: «your_user» vars_prompt: - name: "allowed_sudo_users" prompt: "Specify a list of users who should be allowed to use the sudo command (separated by commas)" private: no tasks: - name: 2.2.1 Add pam_wheel.so to /etc/pam.d/su lineinfile: path: /etc/pam.d/su line: "auth required pam_wheel.so use_uid" insertafter: EOF - name: 2.2.1 Get list of users to add to wheel group pause: prompt: "Please provide the list of users to add to the wheel group" register: admin_input - name: Add users to wheel group lineinfile: path: /etc/group regexp: '^wheel:' line: "wheel:x:10:root,{{ admin_input.wheel_group }}" when: wheel_group.stdout is defined - name: 2.2.2 Limit the list of users who are allowed to use the sudo command and commands allowed to be executed via sudo by revising the /etc/sudoers file lineinfile: path: /etc/sudoers line: "{{ item }} ALL=(ALL:ALL) ALL" state: present regexp: "^{{ item }}" with_items: "{{ allowed_sudo_users.split(',') }}" when: allowed_sudo_users is defined changed_when: false - name: Prohibit the use of sudo for other users lineinfile: path: /etc/sudoers line: "{{ item }}" state: absent with_lines: "grep -vE '^{{ allowed_sudo_users }}' /etc/passwd | cut -d: -f1 | sed 's/^/%/g' | sed 's/$/ ALL=(ALL:ALL) ALL/'" when: allowed_sudo_users is defined
Описание:
Перед выполнением плей запрашивает список пользователей, которым разрешено использовать команду sudo.
Добавление pam_wheel.so в файл /etc/pam.d/su для ограничения использования команды su только членам группы wheel.
Получение списка пользователей для добавления в группу wheel.
Добавление указанных пользователей в группу wheel.
Ограничение списка пользователей, которым разрешено использовать команду sudo, и команд, разрешенных для выполнения через sudo, путем изменения файла /etc/sudoers.
Запрет использования команды sudo для других пользователей.
Автоматизация настройки прав доступа к объектам файловой системы
Плей «2.3 Setting up access rights to file system objects» закрывает настройки пункта «2.3. Настройка прав доступа к объектам файловой системы» (утв. ФСТЭК России 25.12.2022).
Листинг плея 2.3
- name: 2.3. Setting up access rights to file system objects hosts: all become: yes remote_user: fstec gather_facts: true vars: whitelist_apps: - /usr/sbin/haproxy tasks: - name: 2.3.1 Set the rights to /etc/passwd ansible.builtin.file: path: /etc/passwd owner: root group: root mode: '0644' become: yes - name: 2.3.1 Set the rights to /etc/group ansible.builtin.file: path: /etc/group owner: root group: root mode: '0644' become: yes - name: 2.3.1 Set the rights to /etc/shadow ansible.builtin.file: path: /etc/shadow owner: root group: root mode: '0600' become: yes - name: 2.3.2. Set the correct access rights to the files of running processes by executing a command like chmod go-w /path/to/file for all executable files currently running and the corresponding libraries. After that, it is necessary to check that the directory containing this file, as well as all parent directories, are not writable by unprivileged users. shell: > find /proc -maxdepth 2 -type f -executable -execdir chmod -R go-w {} \; register: procoutput changed_when: false - name: 2.3.3 Set file access rights for cron files find: paths: /etc/cron* patterns: "*" file_type: file recurse: yes register: cronfiles - name: Set correct permissions for cron files file: path: "{{ item.path }}" mode: "0640" with_items: "{{ cronfiles.files }}" - name: 2.3.4 Find files and links based on $PATH shell: echo $PATH register: pathvar - name: Find regular files find: paths: '{{ pathvar.stdout.split(":") }}' file_type: file patterns: '*' get_checksum: yes hidden: yes register: regular_files - name: Find symlinks find: paths: '{{ pathvar.stdout.split(":") }}' file_type: link patterns: '*' get_checksum: yes hidden: yes register: symlinks - name: Output list of regular files to admin debug: msg: "Found regular applications: {{ regular_files.files | map(attribute='path') | list }}" - name: Output list of symlinks to admin debug: msg: "Found symlinks: {{ symlinks.files | map(attribute='path') | list }}" - pause: prompt: "Do you want to change the permissions of these files to go-w? (yes/no)" register: permissionapprovalfiles - name: 2.3.4 Change permissions of files if admin approves file: path: "{{ item.path }}" mode: go-w state: file owner: root loop: "{{ regular_files.files }}" when: permissionapprovalfiles.user_input == "yes" become: true - pause: prompt: "Do you want to change the permissions of these links to go-w? (yes/no)" register: permissionapprovallinks - name: 2.3.4 Change permissions of links if admin approves file: path: "{{ item.path }}" mode: go-w state: link owner: root loop: "{{ symlinks.files }}" when: permissionapprovallinks.user_input == "yes" become: true - name: 2.3.5. Set the correct access rights to the startup scripts file: path: "{{ item }}" owner: root group: root mode: '0755' with_fileglob: - /etc/rc*.d/* - name: Set access rights to .service files find: paths: / patterns: "*.service" register: service_files_result - name: Set access rights for .service files file: path: "{{ item.path }}" owner: root group: root mode: '0755' loop: "{{ service_files_result.files }}" - name: 2.3.6 Set access rights to /etc/crontab /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly find: paths: /etc/cron* file_type: any register: found_files - name: Print found files debug: var: found_files - name: Set access rights to found cron files file: path: "{{ item.path }}" mode: 'go-w' loop: "{{ cron_files.files }}" - name: 2.3.7 Setting access rights to user files of cron tasks shell: chmod go-w "{{ item }}" with_fileglob: - /var/spool/cron/crontabs/* register: cron_files_result - name: Check the result of changes debug: var: cron_files_result - name: 2.3.8 Setting access rights to executable files and operating system libraries shell: echo $PATH register: path_result changed_when: false - name: Set access rights to executable files in paths command: find "{{ item }}" -type f -exec chmod go-w {} + with_items: "{{ path_result.stdout_lines[0].split(':') }}" changed_when: false - name: Set access rights to libraries in paths command: find "{{ item }}" -type f -exec chmod go-w {} + with_items: - /lib - /lib64 - /bin - /usr/bin changed_when: false - name: Set access rights to kernel modules command: find /lib/modules/{{ ansible_kernel }} -type f -exec chmod go-w {} + changed_when: false - name: 2.3.9 Find files with setuid permissions command: find / -perm -4000 -type f register: found_files_4000 ignore_errors: yes - name: 2.3.9 Find files with setgid permissions command: find / -perm -2000 -type f register: found_files_2000 ignore_errors: yes - name: Display found files with setuid permissions debug: msg: "{{ found_files_4000.stdout_lines }}" - name: Display found files with setgid permissions debug: msg: "{{ found_files_2000.stdout_lines }}" - name: 2.3.9 Remove write permissions from group and others for files with setuid permissions file: path: "{{ item }}" mode: '4755' loop: "{{ found_files_4000.stdout_lines | default([]) }}" - name: 2.3.9 Remove write permissions from group and others for files with setgid permissions file: path: "{{ item }}" mode: '2755' loop: "{{ found_files_2000.stdout_lines | default([]) }}" - name: 2.3.10 Get home directories shell: ls -d /home/*/ register: home_directories_output ignore_errors: true - name: 2.3.10 Convert home directories output to list set_fact: home_directories: "{{ home_directories_output.stdout_lines }}" when: home_directories_output is defined - name: 2.3.10 Find dot files in home directories find: paths: "{{ item }}" patterns: ".*" file_type: file register: dot_files with_items: "{{ home_directories }}" loop_control: loop_var: item - name: 2.3.10 Set the correct access rights to the contents of users' home directories file: path: "{{ item.path }}" mode: go-rwx with_items: "{{ dot_files.files }}" when: dot_files.files | default([]) become: true - name: 2.3.11. Set correct access rights to users' home directories find: paths: /home patterns: "*" depth: 1 file_type: directory register: home_directories_result - name: Set correct access rights to users' home directories file: path: "{{ item.path }}" state: directory mode: "0700" loop: "{{ home_directories_result.files }}"
Описание:
Переме��ная whitelist_apps содержит список приложений, для которых права доступа не требуется изменять.
Плеи 2.3.1 устанавливают права доступа к системным файлам /etc/passwd, /etc/group и /etc/shadow.
Плеи 2.3.2 проверяют и устанавливают права доступа к файлам, используемым запущенными процессами.
Плей 2.3.3 устанавливает права доступа для файлов cron.
Плеи 2.3.4 находят обычные файлы и символьные ссылки в /usr/bin, выводят их и запрашивают разрешение на изменение владельца. Затем устанавливают права доступа для найденных файлов и ссылок.
Плей 2.3.5 запускает команду оболочки для установки прав доступа к скриптам автозагрузки. Он также находит и устанавливает права доступа к «.service» файлам.
Плей 2.3.6 проводит установку прав доступа к файлам, находящимся в указанных директориях, выводит найденные файлы и проверяет результат изменений.
Плей 2.3.7 устанавливает права доступа к файлам пользовательских задач cron и проверяет результат изменений.
Плей 2.3.8 выполняет установку прав доступа к исполняемым файлам, библиотекам операционной системы и модулям ядра.
Плеи 2.3.9 находят SUID/SGID приложения, устанавливают права доступа к ним и удаляют SUID/SGID биты из ненужных приложений.
Плеи 2.3.10 находят домашние каталоги пользователей, затем точечные файлы в этих каталогах и устанавливают правильные права доступа к содержимому домашних каталогов.
2.3.11 устанавливает правильные права доступа к домашним каталогам пользователей.
Настройка прав доступа к объектам файловой системы
Плей «2.4 Configuring Linux Kernel protection mechanisms» закрывает настройки пункта «2.4. Настройка механизмов защиты ядра Linux» (утв. ФСТЭК России 25.12.2022).
Листинг плея 2.4
- name: 2.4 Configuring Linux Kernel protection mechanisms hosts: all become: true remote_user: fstec tasks: - name: 2.4.1 Restrict access to kernel logs sysctl: name: kernel.dmesg_restrict value: 1 state: present sysctl_set: yes - name: Check for CAP_SYSLOG capability command: "sysctl -p" changed_when: false register: sysctl_result - name: Print sysctl result debug: var: sysctl_result - name: 2.4.2 Check and update kernel.kptr_restrict value and interface address shell: cat /proc/sys/kernel/kptr_restrict register: kptr_restrict_value - name: Check if kptr_restrict value is 2 debug: msg: "The kernel.kptr_restrict value is already set to 2" when: kptr_restrict_value.stdout == "2\n" - name: Set kernel.kptr_restrict value to 2 sysctl: name: kernel.kptr_restrict value: 2 state: present register: kernel_kptr_restrict when: kptr_restrict_value.stdout != "2\n" - name: Get network interfaces information shell: ip addr show register: network_interface_info - name: Check if any interface has address 0.0.0.0 debug: msg: "Interface has address 0.0.0.0" when: "'0.0.0.0' in network_interface_info.stdout" - name: Set interface address to 0.0.0.0 shell: ip addr add 0.0.0.0 dev {{ item }} with_items: "{{ ansible_interfaces }}" register: interface_address_change when: "'0.0.0.0' not in network_interface_info.stdout" - name: Check if interface address was changed debug: msg: "Interface address changed" when: interface_address_change.changed or interface_address_change.results | selectattr('changed', 'defined') | list | length > 0 - name: Persist interface address changes shell: ip addr save when: interface_address_change.changed or interface_address_change.results | selectattr('changed', 'defined') | list | length > 0 - name: Check if kernel.kptr_restrict value is set to 2 debug: msg: "The kernel.kptr_restrict value is set to 2" when: kernel_kptr_restrict.changed or interface_address_change.changed or interface_address_change.results | selectattr('changed', 'defined') | list | length > 0 - name: 2.4.3. Checking the value of the initonalloc kernel boot option become: true shell: cat /proc/cmdline register: cmdlineoutput - name: Checking the value of the initonalloc kernel boot option become: true debug: msg: The initonalloc option is already set to 1! when: "'initonalloc=1' in cmdlineoutput.stdout" - name: Setting the value of the initonalloc kernel boot option become: true lineinfile: dest: /etc/default/grub regexp: ^GRUB_CMDLINE_LINUX= line: GRUB_CMDLINE_LINUX="initonalloc=1" - name: 2.4.4 Checking the value of the slab_nomerge option blockinfile: path: /etc/default/grub block: | # Added by Ansible to enable slab_nomerge GRUB_CMDLINE_LINUX="slab_nomerge" insertafter: EOF changed_when: false - name: 2.4.5. Initialize the IOMMU mechanism blockinfile: path: /etc/default/grub block: | # Added by Ansible: Initialize the IOMMU mechanism GRUB_CMDLINE_LINUX="iommu=force iommu.strict=1 iommu.passthrough=0" insertafter: EOF changed_when: false - name: 2.4.6. Randomize the location of the kernel stack blockinfile: path: /etc/default/grub block: | # Added by Ansible: Randomize the location of the kernel stack GRUB_CMDLINE_LINUX="randomizekstackoffset=1" insertafter: EOF changed_when: false - name: 2.4.7 Enable protection against CPU hardware vulnerabilities blockinfile: path: /etc/default/grub block: | # Added by Ansible: Enable protection against CPU hardware vulnerabilities GRUB_CMDLINE_LINUX="mitigations=auto,nosmt" insertafter: EOF changed_when: false - name: Update Grub command: sudo grub2-mkconfig -o /boot/grub2/grub.cfg - name: 2.4.8. Enable protection of the eBPF JIT subsystem of the Linux kernel sysctl: name: net.core.bpf_jit_harden value: "2" state: present
Описание:
2.4.1 Restrict access to kernel logs:
Устанавливает параметр kernel.dmesg_restrict в значение 1, ограничивая доступ к журналу ядра.
Check for CAPSYSLOG capability:
Выполняет команду
sysctl -pдля проверки наличия возможности CAPSYSLOG.Результаты сохраняются в переменную sysctl_result.
2.4.2 Check and update kernel.kptrrestrict value and interface address:
Выводит текущее значение
kernel.kptrrestrict из /proc/sys/kernel/kptrrestrict.Проверяет, установлено ли значение 2. Если нет, устанавливает его.
Получает информацию об интерфейсах с помощью
ip addr show, проверяет адрес каждого интерфейса, и при необходимости устанавливает адрес0.0.0.0.
2.4.3 Checking the value of the initonalloc kernel boot option:
Читает содержимое файла
/proc/cmdlineдля проверки наличия опции ядраinitonalloc=1.Если опция уже установлена, выводит сообщение об этом. В противном случае добавляет опцию в файл
/etc/default/grub.
2.4.4 Checking the value of the slabnomerge option:
Добавляет опцию slab_nomerge в файл настроек загрузчика GRUB (/etc/default/grub).
Плейбук реализует набор действий по настройке безопасности ядра Linux, устанавливая необходимые параметры и опции для улучшения общей защиты системы.
2.4.5. Инициализация механизма IOMMU
В блоке blockinfile добавляется информация в файл настроек grub (/etc/default/grub) для инициализации механизма IOMMU.
Устанавливаются параметры GRUBCMDLINELINUX="iommu=force iommu.strict=1 iommu.passthrough=0", что позволяет активировать и жестко настроить механизм IOMMU.
2.4.6. Рандомизация расположения ядра стека
В блоке blockinfile добавляется информация в файл настроек grub (/etc/default/grub) для рандомизации расположения ядра стека.
Устанавливается параметр GRUBCMDLINELINUX="randomizekstackoffset=1", что поможет увеличить безопасность системы за счет рандомизации расположения стека ядра.
2.4.7. Включение защиты от уязвимостей оборудования процессора
В блоке blockinfile добавляется информация в файл настроек grub (/etc/default/grub) для включения защиты от уязвимостей оборудования процессора.
Устанавливаются параметры GRUBCMDLINELINUX="mitigations=auto,nosmt", что активирует автоматическое управление мерами безопасности и отключение поддержки SMT (Simultaneous Multithreading).
2.4.8. Включение защиты подсистемы eBPF JIT в ядре Linux
Модулем sysctl устанавливается параметр net.core.bpfjitharden на значение "2", что позволяет активировать защиту подсистемы eBPF JIT в ядре Linux.
Реализация мер по уменьшению периметра атаки ядра Linux
Плей «2.5 Reducing the attack perimeter of the Linux kernel». Он закрывает настройки из пункта «2.5. Уменьшение периметра атаки ядра Linux» (утв. ФСТЭК России 25.12.2022).
Листинг плея 2.5
- name: 2.5 Reducing the attack perimeter of the Linux kernel hosts: all become: true remote_user: fstec tasks: - name: 2.5.1 Disabling the outdated vsyscall interface blockinfile: path: /etc/default/grub marker: "# {mark} ANSIBLE MANAGED BLOCK - vsyscall settings" block: | GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vsyscall=none" - name: 2.5.2. Restrict access to performance events sysctl: name: kernel.perf_event_paranoid value: "3" state: present - name: 2.5.3. Disable mounting of the debugfs virtual file system blockinfile: path: /etc/default/grub marker: "# {mark} ANSIBLE MANAGED BLOCK - debugfs settings" block: | GRUB_CMDLINE_LINUX_DEFAULT="quiet splash debugfs=no-mount" - name: 2.5.4. Disable the kexec_load system call sysctl: name: kernel.kexec_load_disabled value: "1" state: present - name: 2.5.5. Restrict the use of user namespaces sysctl: name: user.max_user_namespaces value: "0" state: present - name: 2.5.6. Prohibit the bpf system call for unprivileged users sysctl: name: kernel.unprivileged_bpf_disabled value: "1" state: present - name: 2.5.7. Prohibit the userfaultfd system call for unprivileged users sysctl: name: vm.unprivileged_userfaultfd value: "0" state: present - name: 2.5.8. Prohibition of automatic loading of kernel modules for terminal line discipline sysctl: name: dev.tty.ldisc_autoload value: "0" state: present - name: 2.5.9. Disable Transactional Synchronization Extensions (TSX) technology blockinfile: path: /etc/default/grub marker: "# {mark} ANSIBLE MANAGED BLOCK - TSX settings" block: | GRUB_CMDLINE_LINUX_DEFAULT="quiet splash tsx=off" - name: 2.5.10 Configuring the vm.mmap_min_addr kernel parameter sysctl: name: vm.mmap_min_addr value: "4096" state: present - name: 2.5.11. Implement address space randomization sysctl: name: kernel.randomize_va_space value: "2" state: present - name: Applying sysctl change command: sysctl -p
Описание:
2.5.1 Отключение устаревшего интерфейса vsyscall: в блоке blockinfile добавляется информация в файл настроек grub (/etc/default/grub) для отключения устаревшего интерфейса vsyscall. Устанавливается параметр GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vsyscall=none".
2.5.2 Ограничение доступа к событиям производительности: с помощью модуля sysctl настраивается параметр kernel.perf_event_paranoid на значение "3", что ограничивает доступ к событиям производительности.
2.5.3 Отключение монтирования виртуальной файловой системы debugfs: в блоке blockinfile добавляется информация в файл настроек grub (/etc/default/grub) для отключения монтирования виртуальной файловой системы debugfs. Устанавливается параметр GRUB_CMDLINE_LINUX_DEFAULT="quiet splash debugfs=no-mount".
2.5.4 Отключение системного вызова kexec_load: с помощью модуля sysctl настраивается параметр kernel.kexec_load_disabled на значение "1", что отключает использование системного вызова kexec_load.
2.5.5 Ограничение использования пространств имен пользователей: с помощью модуля sysctl настраивается параметр user.max_user_namespaces на значение "0", что ограничивает использование пространств имен пользователей.
2.5.6 Запрет системного вызова bpf для непривилегированных пользователей: с помощью модуля sysctl настраивается параметр kernel.unprivileged_bpf_disabled на значение "1", что запрещает использование системного вызова bpf для непривилегированных пользователей.
2.5.7 Запрет системного вызова userfaultfd для непривилегированных пользователей: с помощью модуля sysctl настраивается параметр vm.unprivileged_userfaultfd на значение "0", что запрещает использование системного вызова userfaultfd для непривилегированных пользователей.
2.5.8 Запрет автоматической загрузки модулей ядра для терминальной линейной дисциплины: с помощью модуля sysctl настраивается параметр dev.tty.ldisc_autoload на значение "0", что запрещает автоматическую загрузку модулей ядра для терминальной линейной дисциплины.
2.5.9 Отключение технологии Transactional Synchronization Extensions (TSX): в блоке blockinfile добавляется информация в файл настроек grub (/etc/default/grub) для отключения технологии Transactional Synchronization Extensions (TSX). Устанавливается параметр GRUB_CMDLINE_LINUX_DEFAULT="quiet splash tsx=off".
2.5.10 Настройка параметра ядра vm.mmap_min_addr: с помощью модуля sysctl настраивается параметр vm.mmap_min_addr на значение "4096".
2.5.11 Реализация случайной адресации пространства адресов: с помощью модуля sysctl настраивается параметр kernel.randomize_va_space на значение "2", что реализует случайную адресацию пространства адресов.
Применение изменений sysctl: командой выполняется перезагрузка параметров sysctl для применения всех изменений.
Реализация автоматизации настройки средств защиты пользовательского пространства со стороны ядра Linux
Плей «2.6 Configuring user space protection tools from the Linux kernel» закрывает настройки по пункту «2.6. Настройка средств защиты пользовательского пространства со стороны ядра Linux» (утв. ФСТЭК России 25.12.2022).
Листинг плея 2.6
- name: 2.6 Configuring user space protection tools from the Linux kernel hosts: all become: true remote_user: fstec tasks: - name: 2.6.1. Prohibit connection to other processes using ptrace sysctl: name: kernel.yama.ptrace_scope value: "3" state: present - name: 2.6.2. Limit unsafe options for passing through symbolic links sysctl: name: fs.protected_symlinks value: "1" state: present - name: 2.6.3. Limit unsafe options for working with hard links sysctl: name: fs.protected_hardlinks value: "1" state: present - name: 2.6.4. Enable protection against unintentional writing to a FIFO object sysctl: name: fs.protected_fifos value: "2" state: present - name: 2.6.5. Enable protection against unintentional writing to a file become: yes sysctl: name: fs.protected_regular value: 2 register: sysctl_result - name: Check the result of changing the sysctl option debug: var: sysctl_result - name: 2.6.6. Prohibit the creation of core dump sysctl: name: fs.suid_dumpable value: 0 register: sysctl_result - name: Check the result of changing the sysctl option debug: var: sysctl_result - name: Applying sysctl change command: sysctl -p - name: Update Grub hosts: all become: true remote_user: fstec tasks: - name: Update Grub configuration command: sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Описание:
2.6.1 Запрещение подключения к другим процессам с использованием ptrace: с помощью модуля sysctl настраивается параметр kernel.yama.ptracescope на значение "3", что запрещает подключение к другим процессам с использованием ptrace.
2.6.2 Ограничение небезопасных опций для передачи символических ссылок: с помощью модуля sysctl настраивается параметр fs.protectedsymlinks на значение "1", что ограничивает небезопасные опции для передачи символических ссылок.
2.6.3 Ограничение небезопасных опций для работы с жесткими ссылками: с помощью модуля sysctl настраивается параметр fs.protectedhardlinks на значение "1", что ограничивает небезопасные опции для работы с жесткими ссылками.
2.6.4 Включение защиты от ненамеренной записи в объект FIFO: с помощью модуля sysctl настраивается параметр fs.protectedfifos на значение "2", что включает защиту от ненамеренной записи в объект FIFO.
2.6.5 Включение защиты от ненамеренной записи в файл: с помощью модуля sysctl настраивается параметр fs.protectedregular на значение "2" с правами суперпользователя. Результат изменения параметра регистрируется и выводится для проверки.
2.6.6 Запрет создания дампа ядра: с помощью модуля sysctl настраивается параметр fs.suiddumpable на значение "0". Результат изменения параметра регистрируется и выводится для проверки.
2.6.7 Применение изменений sysctl: командой выполняется перезагрузка параметров sysctl для применения всех изменений.
Обновление Grub: после настройки инструментов защиты пространства пользователя, плейбук также выполняет обновление Grub для применения изменений в конфигурационных файлах.
Заключение
Выполнение рекомендаций ФСТЭК России по безопасной настройке операционных систем Linux не только важно для обеспечения информационной безопасности, но и является обязательным для объектов, относящихся к критической информационной инфраструктуре (КИИ) и государственным информационным системам.
Использование Ansible для автоматизации процессов значительно упрощает соблюдение этих требований и снижает риск ошибок.
Плейбуки, о которых шла речь в статье, представляют собой удобные и эффективные инструменты для управления инфраструктурой. Это особенно актуально в условиях стремительного развития технологий и постоянно меняющихся угроз. Они открывают новые горизонты для оптимизации работы систем, позволяя легко масштабировать и адаптировать их под нужды организаций.
Однако следует помнить, что любые изменения, особенно в конфигурации ядра, необходимо сначала тестировать в безопасной среде, чтобы избежать проблем в производственной системе.
Автор: Вероника Воронцова, инженер направления автоматизации ИБ УЦСБ
