Вопросы, связанные с безопасностью

Что такое SELinux?

SELinux - это мандатная система контроля доступа, ограничивающая доступ ряду сервисов к файлам и каталогам. Больше информации здесь.

Как мне временно отключить SELinux?

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

sudo setenforce 0

Для повторной активации:

sudo setenforce 1

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

SELINUX=0

Как мне навсегда отключить SELinux?

Достаточно открыть файл конфигурации /etc/selinux/config в любом текстовом редакторе и изменить значение директивы SELINUX. Допустимые значения:

  • enforcing — включён и блокирует всё, что явно не разрешено;
  • permissive — включён, но ничего не блокирует и лишь пишет события в системный журнал;
  • disabled — полностью отключён.

Изменения вступят в силу при следующей загрузке системы.

Как узнать текущий статус SELinux?

При помощи команды getenforce или sestatus.

Как разрешить заблокированные действия SELinux?

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

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

sudo bash -c "cat /dev/null > /var/log/audit/audit.log"

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

sudo bash -c "cat /var/log/audit/audit.log | audit2allow -M foo-bar"

В результате работы данной утилиты будет создан новый модуль foo-bar.te, в котором разрешаются действия, записи о запрещении которых были внесены в журнал auditd ранее.

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

В сгенерированном файле модуля foo-bar.te после комментария This avc can be allowed using one of the these booleans присутствует список переменных двоичного типа, установка которых поможет разрешить заблокированное действие. Справочную информацию можно получить из документации SELinux:

getsebool -a

Описание переменных SELinux, относящихся к работе веб-сервера, можно найти здесь.

Как настроить SELinux так, чтобы веб-сервер мог создавать файлы и каталоги?

Если при работе веб-сервера в журналах появляются сообщения вида:

Warning: chmod(): Permission denied in /var/www/html/foo-bar/foo.php on line XXX
Warning: Directory /var/www/html/foo-bar/foo not writable, please chmod to 755 in /var/www/html/foo-bar/foo.php on line XXX

Это значают, что процесс веб-сервера (или интерпретатора языка программирования) не может получить доступ на запись. Если права доступа (chmod и chown) при этом установлены верно, значит доступ блокирует SELinux.

Установим правильный контекст безопасности для всех каталогов внутри document_root/foo-bar:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/foo-bar(/.*)?"

Сбросим контекст безопасности для всех файлов внутри document_root рекурсивно:

sudo restorecon -Rv /var/www/html

Для отмены произведённых изменений контекста выполним:

sudo semanage fcontext -d "/var/www/html/foo-bar(/.*)?"

Получим список контекстов для httpd:

sudo semanage fcontext -l | grep httpd

Если предудущая команда выводит очень много информации, осуществим фильтрацию вывода:

sudo semanage fcontext -l | grep /var/www/html

Получим список файлов и каталогов с установленным контекстом SELinux:

ls -laZ /var/www/html/foo-bar

Более полную информацию о контекстах безопасности и работе с ними можно найти здесь.

Откроем текстовый редактор и создадим новый модуль httpd_wr.te:

module httpd_wr 1.0;

require {
    type httpd_t;
    type httpd_sys_rw_content_t;
    class file { create write setattr rename unlink };
    class dir { create write setattr add_name remove_name rmdir };
}

allow httpd_t httpd_sys_rw_content_t:file { create write setattr rename unlink };
allow httpd_t httpd_sys_rw_content_t:dir { create write setattr add_name remove_name rmdir };

Проверим, скомпилируем и установим его:

sudo checkmodule -M -m httpd_wr.te -o httpd_wr.mod
sudo semodule_package -o httpd_wr.pp -m httpd_wr.mod
sudo semodule -i httpd_wr.pp

Больше полезной информации о модулях:

Как настроить SELinux так, чтобы веб-сервер мог осуществлять исходящие сетевые соединения?

Первый вариант (самый правильный):

Откроем текствый редактор и создадим новый модуль httpd_network.te:

module httpd_connect 1.0;

require {
       type httpd_t;
       type ephemeral_port_t;
       class tcp_socket name_connect;
}

allow httpd_t ephemeral_port_t:tcp_socket name_connect;

Проверим, скомпилируем и установим его:

sudo checkmodule -M -m httpd_network.te -o httpd_network.mod
sudo semodule_package -o httpd_network.pp -m httpd_network.mod
sudo semodule -i httpd_network.pp

Получим названия диапазонов портов:

sudo semanage port -l

Добавим порт в диапазон:

semanage port -a -t ephemeral_port_t -p tcp 80-88

Удалим порт из диапазона:

semanage port -d -t ephemeral_port_t -p tcp 80-88

Здесь ephemeral_port_t - название диапазона, tcp - используемый протокол, а 80-88 - диапазон разрешаемых портов.

Второй вариант (быстрый, но менее безопасный)

Разрешим любые исходящие соединения для веб-сервера:

sudo setsebool -P httpd_can_network_connect on

OpenVPN не может получить доступ к сертификатам из-за SELinux. Что делать?

Это нормально ибо запущенные сервисы не могут получать доступ к каталогам пользователя, однако для OpenVPN сделано исключение в виде каталога ~/.cert.

По умолчанию он не существует, поэтому его нужно создать и задать для него контекст безопасности SELinux:

mkdir ~/.cert
restorecon -Rv ~/.cert

Теперь в нём можно размещать сертификаты и приватные ключи.

Можно ли отключить KPTI?

KPTI - это новый механизм ядра, направленный на защиту системы от уязвимости Meltdown в процессорах Intel. Настоятельно не рекомендуется его отключать, хотя это и возможно. Для этого необходимо и достаточно передать ядру Linux:

nopti

Параметр pti=off также поддерживается в полной мере.

Можно ли отключить защиту от Spectre v1?

Нет. Защита от уязвимости Spectre v1 выполняется напрямую микрокодом процессора.

Можно ли отключить защиту от Spectre v2?

Да, при помощи параметра ядра:

nospectre_v2

Можно ли отключить защиту от Spectre v4?

Да, при помощи параметра ядра:

nospec_store_bypass_disable

Можно ли отключить защиту от L1TF?

Да, при помощи параметров ядра:

l1tf=off

Как узнать защищено ли ядро от известных уязвимостей в процессорах?

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

grep . /sys/devices/system/cpu/vulnerabilities/*

Можно ли отключить защиту от уязвимостей CPU в гостевых Windows внутри виртуальных машин?

Да, согласно MSDN, при помощи следующего REG файла:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"FeatureSettingsOverride"=dword:00000003
"FeatureSettingsOverrideMask"=dword:00000003

При загрузке получаю ошибку SELinux. Как исправить?

Такое бывает если по какой-то причине сбился контекст безопасности SELinux. Исправить это можно двумя различными способами.

Способ первый:

sudo touch /.autorelabel
sudo systemctl reboot

Внимание! Следующая загрузка системы займёт много времени из-за переустановки контекста для всех файлов и каталогов. Ни в коем случае не следует её прерывать. По окончании система автоматически перезагрузится ещё один раз.

Способ второй:

sudo restorecon -Rv /
sudo systemctl reboot

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

Как можно надёжно зашифровать файлы на USB устройстве?

См. здесь.

Можно ли зашифровать домашний раздел уже установленной системы?

См. здесь.

Как сменить пароль зашифрованного LUKS раздела?

Сменить пароль достаточно просто. Достаточно выполнить следующую команду:

sudo cryptsetup luksChangeKey /dev/sda1 -S 0

Здесь /dev/sda1 - зашифрованный раздел диска, а 0 - порядковый номер LUKS слота для пароля.

Для успешной смены пароля раздел не должен быть смонтирован, поэтому если это корневой или домашний, то придётся выполнять загрузку с LiveUSB.

Как получить информацию о зашифрованном LUKS устройстве?

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

sudo cryptsetup luksDump /dev/sda1

Здесь /dev/sda1 - зашифрованный раздел диска.

Насколько сильно шифрование LUKS снижает производительность дисковой подсистемы?

На современных процессорах с аппаратной поддержкой набора инструкций AES-NI снижение производительности практически незаметно даже на самых производительных NVMe SSD накопителях.

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

cryptsetup benchmark

Как узнать поддерживает ли процессор моего ПК набор инструкций AES-NI?

Если в выводе lscpu присутствует строка aes, значит поддерживает:

lscpu | grep aes

Что такое Firewalld?

Firewalld - это современный динамически управляемый брандмауэр с поддержкой зон для интерфейсов.

Как можно настраивать Firewalld?

Для настройки применяется либо графическая утилита system-config-firewall, либо консольная firewall-cmd.

Документацию можно найти в Wiki.

Как замаскировать сервис средствами Firewalld?

См. здесь.

Как запретить подключения с конкретных IP-адресов?

Достаточно добавить их в специально созданную зону drop файрвола:

firewall-cmd --permanent --zone=drop --add-source=1.2.3.4

Здесь вместо 1.2.3.4 нужно указать необходимый IP-адрес или подсеть (1.2.3.0/24).

Как работать с подписями GnuPG?

См. здесь.

Как зашифровать и расшифровать файлы с определённой маской в текущем каталоге?

Шифрование всех файлов с маской .7z. (многотомные архивы 7-Zip):

find . -maxdepth 1 -type f -name "*.7z.*" -exec gpg2 --out "{}.asc" --recipient "example@example.org" --encrypt "{}" \;

Расшифровка:

find . -maxdepth 1 -type f -name "*.asc" -exec gpg2 --out "$(basename {})" --decrypt "{}" \;

Чем отличается пользователь-администратор от обычного?

Администратор (в терминологии программы установки Anaconda) имеет доступ к sudo.

Какие пароли запрашивают sudo и su?

Утилита sudo запрашивает текущий пароль пользователя, а su - рутовый.

Как мне сменить пароль суперпользователя?

Для смены или установки пароля суперпользователя при наличии доступа к sudo, можно выполнить:

sudo passwd root

Как мне получить доступ к sudo?

Если при установке Fedora, при создании пользователя, не был установлен флажок в чекбокс Создать администратора, то необходимо самостоятельно добавить пользовательский аккаунт в группу wheel:

su -c "usermod -a -G wheel $(whoami)"

Что лучше: sudo или su?

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

Почему я не могу запустить файловый менеджер с правами суперпользователя?

Это сделано из соображений безопасности. Более подробная информация доступна здесь.

Как мне отредактировать конфиг, доступный только суперпользователю?

Необходимо использовать sudoedit:

sudoedit /путь/к/файлу/конфигурации.conf

Sudoedit безопаснее прямого запуска текстового редактора с правами суперпользователя?

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

Как включить и безопасно настроить сервер SSH?

Сначала необходимо активировать sshd:

sudo systemctl enable sshd.service

Теперь следует открыть конфиг /etc/ssh/sshd_config в любом текстовом редакторе и внести правки:

sudoedit /etc/ssh/sshd_config

Отключение входа суперпользователем:

PermitRootLogin no

Запрет входа по паролям (будет доступна лишь аутентификация по ключам):

PasswordAuthentication no
PermitEmptyPasswords no

Перезапуск sshd для применения изменений:

sudo systemctl restart sshd.service

Допустимо ли использовать парольную аутентификацию для SSH?

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

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

Следует ли сменить порт SSH на нестандартный?

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

Безопасна ли аутентификация по ключам в SSH?

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

Как сгенерировать ключи для SSH?

Для создания ключевой пары из открытого и закрытого ключей, необходимо воспользоваться утилитой ssh-keygen:

ssh-keygen -t rsa -C "user@example.org"

Здесь в качестве параметра -t указывается тип ключа: RSA, DSA, ecdsa или ed25519. Рекомендуется использовать либо RSA, либо ed25519.

Для RSA можно добавить параметр -b и указать длину в битах, например -b 4096.

Как безопасно передать публичный ключ SSH на удалённый сервер?

Для простой, быстрой и безопасной передачи можно использовать утилиту ssh-copy-id:

ssh-copy-id user@example.org

Здесь user@example.org - данные для подключения к серверу, т.е. имя пользователя на удалённом сервере и хост.

Как пробросить порт с удалённой машины на локальную через SSH?

Для примера пробросим с удалённого сервера на локальную машину порт MySQL/MariaDB:

ssh user@example.org -L 3306:127.0.0.1:3306 -N -f

Здесь user@example.org - данные для подключения к серверу, т.е. имя пользователя на удалённом сервере и хост, а 3306 - порт. Параметры -N -f заставляют SSH клиент сразу вернуть управление, уйти в фоновый режим и продолжать поддерживать соединение до своего завершения.

Как настроить виртуальный SOCKS туннель через SSH?

ssh user@example.org -D 127.0.0.1:8080 -N -f

Здесь user@example.org - данные для подключения к серверу, т.е. имя пользователя на удалённом сервере и хост, а 8080 - локальный порт, на котором будет запущен SSH клиент в режиме эмуляции SOCKS5 сервера. Параметры -N -f заставляют SSH клиент сразу вернуть управление, уйти в фоновый режим и продолжать поддерживать соединение до своего завершения.

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

Можно ли разрешить доступ посредством SSH только к файлам, без возможности выполнения команд?

Да. Для этого создадим специальную группу (например sftp):

sudo groupadd sftp

Откроем конфиг /etc/ssh/sshd_config в текстовом редакторе и в самом конце добавим:

Subsystem sftp internal-sftp
Match Group sftp
    ChrootDirectory %h
    AllowTCPForwarding no
    ForceCommand internal-sftp

Перезапустим sshd для применения изменений:

sudo systemctl restart sshd.service

Как безвозвратно уничтожить файл?

Для уничтожения данных можно использовать штатную утилиту shred из пакета GNU Coreutils:

shred -u -v /путь/к/файлу.txt

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

Можно лишь уничтожить содержимое всего диска?

Да, для этого можно использовать уже упомянутую выше утилиту shred:

sudo shred -v /dev/sdX

Здесь /dev/sdX — устройство, которое будет очищено. На больших HDD процесс займёт много времени.

Как уничтожить файл на SSD?

Для безвозвратного удаления файла на SSD накопителе достаточно просто удалить его штатным средством системы и дождаться выполнения процедуры TRIM, которая физически забьёт ячейки, которые им использовались, нулями.

Если не используется TRIM реального времени, принудительно запустить этот процесс на всех твердотельных накопителях можно так:

sudo systemctl start fstrim.service

Как рассчитываются права доступа для новых файлов и каталогов?

Права доступа (chmod) в GNU/Linux рассчитываются в по формуле $default-chmod - $current-umask. $default-chmod для файлов равен 0666, а для каталогов - 0777.

В Fedora umask по умолчанию для пользоватьских учётных записей равен 0002 (ведущий нуль в chmod означает использование восьмеричной системы счисления).

Таким образом, chmod для новых файлов 0666 - 0002 = 0664 (-rw-rw--r--), а для каталогов - 0777 - 0002 = 0775 (drwxrwxr-x).

Можно ли включить поддержку российской криптографии в Fedora?

См. здесь.

Как включить рандомизацию MAC адресов при подключении к Wi-Fi точкам в Fedora?

Network Manager поддерживает два сценария рандомизации MAC адресов:

  1. генерирование уникального псевдослучайного MAC адреса для каждого соединения при загрузке системы (параметр stable). Это избавит от проблем с переподключением к публичным хот-спотам и небходимости повторно проходить аутентификацию в captive-порталах;
  2. генерирование уникального псевдослучайного MAC адреса для каждого соединения при каждом переподключении (параметр random). Наиболее безопасно, но может вызывать описанные выше проблемы.

Профиль stable. Файл 00-macrandomize-stable.conf:

[device]
wifi.scan-rand-mac-address=yes

[connection]
wifi.cloned-mac-address=stable
ethernet.cloned-mac-address=stable
connection.stable-id=${CONNECTION}/${BOOT}

Профиль random. Файл 00-macrandomize-random.conf:

[device]
wifi.scan-rand-mac-address=yes

[connection]
wifi.cloned-mac-address=random
ethernet.cloned-mac-address=random

Для применения одной из конфигураций создадим в каталоге /etc/NetworkManager/conf.d файл с выбранным профилем, после чего перезапустим Network Manager:

sudo systemctl restart NetworkManager

Для отключения рандомизации и возвращения настроек по умолчанию достаточно просто удалить созданный файл и перезапустить Network Manager.

Как добавить собственный удостоверяющий центр в список доверенных?

Для добавления нового удостоверяющего центра необходимо скопировать файл его сертификата в формате PEM или DER в каталог /etc/pki/ca-trust/source/anchors, после чего выполнить:

sudo update-ca-trust

Следует помнить, что данное действие не будет распространяться на браузер Mozilla Firefox, имеющий собственную базу доверенных корневых УЦ.

Как внести удостоверяющий центр в список запрещённых?

Для добавления удостоверяющего центра в список заблокированных необходимо скопировать файл его сертификата в формате PEM или DER в каталог /etc/pki/ca-trust/source/blacklist, после чего выполнить:

sudo update-ca-trust

Следует помнить, что данное действие не будет распространяться на браузер Mozilla Firefox, имеющий собственную базу доверенных корневых УЦ.

Как убрать пароль шифрования закрытого RSA ключа средствами OpenSSL?

Воспользуемся утилитой openssl для расшифровки:

openssl rsa -in foo-bar.key -out foo-bar-nopass.key

Здесь foo-bar.key - имя файла с закрытым RSA ключом, который необходимо расшифровать. После ввода верного пароля, результат появится в файле foo-bar-nopass.key.

Как установить или изменить пароль шифрования закрытого RSA ключа средствами OpenSSL?

Воспользуемся утилитой openssl для установки или изменения пароля:

openssl rsa -aes256 -in foo-bar-nopass.key -out foo-bar.key

Здесь -aes256 - используемый алгоритм шифрования (AES-256), foo-bar-nokey.key - имя файла с закрытым RSA ключом, пароль которого нужно задать или изменить. Результат будет сохранён в файле foo-bar.key.

Как посредством sudo запустить сразу несколько команд?

Команда sudo предназначена для запуска исключительно одной команды от имени другого пользователя, поэтому если необходимо запустить сразу несколько команд, либо осуществлять перенаправление вывода, придётся использовать другой вариант:

sudo bash -c "first | seconds && third"

В данном примере все три приложения будут запущены с правами суперпользователя, причём стандартный вывод first перенаправляется в стандартный ввод second через канал (pipe) и при успешном завершении запустится процесс third.

Как запускать WireShark без предоставления ему прав суперпользователя?

WireShark поддерживает запуска как с правами суперпользователя, так и без них. Добавим свой аккаунт в группу wireshark:

sudo usermod -a -G wireshark $(whoami)

Изменения вступят в силу при следующем входе в систему.

Как сгенерировать криптостойкий пароль без использования стороннего ПО?

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

Воспользуемся штатными средствами, входящими в базовый пакет GNU Coreutils:

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 4

Данный пример сгенерирует 4 криптостойких пароля по 20 символов каждый.

Как получить список вошедших в систему пользователей?

Список вошедших в систему пользователей можно получить посредством утилиты who:

who

Как получить список вошедших в систему пользователей и информацию об их деятельности?

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

w

Как получить информацию обо всех входах в систему?

Информацию о любых попытках входа в систему можно получить посредством утилиты last:

last