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

Что такое SELinux?

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

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

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

sudo setenforce 0

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

sudo setenforce 1

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

SELINUX=0

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

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

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

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

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

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

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/*

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

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

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

sudo touch /.autorelabel
sudo systemctl reboot

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

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

sudo restorecon -Rv /
sudo systemctl reboot

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

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

См. здесь.

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

См. здесь.

Что такое 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 в любом текстовом редакторе и внести правки.

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

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.