Безопасность

Что такое SELinux?

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

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

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

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

SELINUX=0

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

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

sudoedit /etc/selinux/config

Изменить значение директивы SELINUX на одно из допустимых значений:

  • enforcing — включён и блокирует всё, что явно не разрешено;

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

  • disabled — полностью отключён.

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

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

Получим текущий статус 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. Настоятельно не рекомендуется его отключать, хотя это и возможно. Для этого необходимо и достаточно передать параметр ядра:

nopti

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

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

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

nospectre_v1

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

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

nospectre_v2

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

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

nospec_store_bypass_disable

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

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

l1tf=off

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

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

mds=off

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

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

nx_huge_pages=off

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

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

tsx=on

Для полной деактивации должен использоваться совместно с TAA.

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

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

tsx_async_abort=off

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

Да. Начиная с версии ядра Linux 5.1.2, появился особый параметр ядра, отключающий все виды программных защит:

mitigations=off

Можно ли отключить защиту от уязвимостей в Intel GPU?

Да. Начиная с версии ядра Linux 5.12, появился особый параметр ядра, отключающий все виды программных защит интегрированных видеокарт Intel:

i915.mitigations=off

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

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

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

При загрузке получаю ошибку 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?

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

grep -Eq 'aes' /proc/cpuinfo && echo Yes || echo No

Что такое Firewalld?

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

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

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

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

Как усилить настройки безопасности Firewalld?

По умолчанию в Fedora Workstation применяется зона брандмауэра FedoraWorkstation, для которой разрешены входящие соединения на порты из диапазона 1025-65535, как по TCP, так и UDP.

Если необходимо запретить все входящие подключения, кроме явно разрешённых, переключим зону на public:

sudo firewall-cmd --set-default-zone=public

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

См. здесь.

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

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

sudo 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:

sudo foo-bar

Здесь вместо foo-bar следует указать команду, путь к исполняемому файлу, скрипту и т.д.

Какие пароли запрашивают 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 dnf install openssh-server
sudo systemctl enable --now sshd.service

Создадим собственный файл конфигурации, в который будем вносить изменения:

sudo touch /etc/ssh/sshd_config.d/00-foobar.conf
sudo chmod 0600 /etc/ssh/sshd_config.d/00-foobar.conf

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

Отредактируем созданный файл для внесения своих изменений:

sudoedit /etc/ssh/sshd_config.d/00-foobar.conf

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

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

Создадим собственный файл конфигурации, в который будем вносить изменения:

sudo touch /etc/ssh/sshd_config.d/01-sftp.conf
sudo chmod 0600 /etc/ssh/sshd_config.d/01-sftp.conf

Откроем конфиг /etc/ssh/sshd_config.d/01-sftp.conf в текстовом редакторе:

sudoedit /etc/ssh/sshd_config.d/01-sftp.conf

Добавим следующие строки:

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

Как полностью очистить SATA SSD без возможности восстановления?

Все модели SATA SSD поддерживают специальную ATA-команду Secure Erase, при получении которой контроллер обязан полностью очистить все ячейки диска и вернуть все параметры к настройкам по умолчанию.

Установим утилиту hdparm:

sudo dnf install hdparm

Далее /dev/sdb -- это устройство SSD накопителя, который мы планируем очистить. Очищать устройство, на котором установлена система, можно только после загрузки с Fedora LiveUSB.

Убедимся, что UEFI BIOS не блокирует функцию самоуничтожения диска:

sudo hdparm -I /dev/sdb

Если в выводе присутствует frozen, значит диск блокируется и сначала нужно её снять.

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

Если всё сделано верно, в выводе обнаружим not frozen и сможем продолжить процесс.

Установим специальный пароль блокировки накопителя, т.к. без передачи верного пароля команда ATA Secure Erase будет проигнорирована:

sudo hdparm --user-master u --security-set-pass FooBar /dev/sdb

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

Запустим процесс очистки:

sudo hdparm --user-master u --security-erase FooBar /dev/sdb

Через некоторое время (зависит от объёма и производительности контроллера устройства) диск будет полностью очищен, а все настройки, включая пароль блокировки, сброшены.

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

sudo hdparm --user-master u --security-disable FooBar /dev/sdb

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

Права доступа (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

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

Для того, чтобы получить доступ к COM порту (RS-232) без наличия прав суперпользователя, необходимо добавить свой аккаунт в группу dialout:

sudo usermod -a -G dialout $(whoami)

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

Можно ли сохранить пароль GnuPG ключа в связке ключей KWallet?

Да. Установим пакет kwalletcli:

sudo dnf install kwalletcli

Откроем файл ~/.gnupg/gpg-agent.conf в текстовом редакторе и добавим строку:

pinentry-program /usr/bin/pinentry-kwallet

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

Безопасно ли использовать менеджеры связки ключей GnuPG с графическим интерфейсом?

Да.

Можно ли одновременно использовать Kleopatra и KGpg?

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

Пользователям KDE мы рекомендуем Kleopatra, как наиболее современную и функциональную оболочку.

Какой токен для безопасного хранения GnuPG ключей вы можете порекомендовать?

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

Как работать с токеном или смарт-картой из консоли?

Для работы с аппаратным токеном будем использовать утилиту GnuPG2.

Вставим устройство в USB порт компьютера или ноутбука, либо смарт-карту в считыватель, затем выведем его статус:

gpg2 --card-status

Установим PIN-код:

gpg2 --change-pin

Перейдём в режим работы с токеном:

gpg2 --card-edit

Переключимся в режим администратора:

admin

Сгенерируем новую связку ключей GnuPG на токене:

generate

GnuPG2 запросит стандартные данные: имя и адрес электронной почты владельца ключевой пары, срок действия, а также указать стойкость шифра. Следует помнить, что размер памяти токена сильно ограничен, поэтому если генерировать исключительно 4096 битные ключи, место быстро закончится (например Nitrokey Pro 2 вмещает лишь 3 ключевых пары со стойкостью шифра 4096 бит).

Также будет предложено сохранить копию секретного ключа на диск. Для максимальной безопасности лучше отказаться от этого.

Проверим сгенерировались ли ключи:

list

Если всё сделано верно, то новая ключевая пара появится в списке немедленно.

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

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

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

gpg2 --list-secret-keys

Откроем наш основной ключ в режиме редактирования:

gpg2 --edit-key XXXXXXXXX

Здесь XXXXXXXXX -- ID нашего ключа.

Добавим новый подключ:

addkey

В списке атрибутов оставим только Authentication и обязательно отключим Encrypt и Sign.

Выберем созданный подключ и переместим его на токен:

key 2
keytocard

Экспортируем публичный ключ SSH из созданного подключа для аутентификации:

gpg2 --export-ssh-key XXXXXXXXX --output ~/.ssh/id_rsa.pub

Здесь XXXXXXXXX -- ID нашего ключа.

Активируем поддержку SSH агента в GnuPG агенте, добавив в конец файла ~/.gnupg/gpg-agent.conf следующую строку:

enable-ssh-support

Настроим автоматический запуск GnuPG агента вместе с системой, создав скрипт ~/bin/gpg-agent.sh:

#!/usr/bin/sh
export GPG_TTY="$(tty)"
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent

Выдадим ему права на выполнение:

chmod +x ~/bin/gpg-agent.sh

Добавим этот скрипт а автозагрузку используемой DE, либо в ~/.bashrc и выполним новый вход в систему.

Можно ли переместить на токен уже имеющуюся ключевую пару GnuPG?

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

gpg2 --list-secret-keys

Откроем наш основной ключ в режиме редактирования:

gpg2 --edit-key XXXXXXXXX

Здесь XXXXXXXXX -- ID нашего ключа.

Выберем каждый подключ и переместим его на токен:

key 1
keytocard

Повторим для всех оставшихся подключей.

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

gpg2 --delete-secret-key XXXXXXXXX

Здесь XXXXXXXXX -- ID нашего ключа.

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

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

nmap -A -T4 -Pn 127.0.0.1

Стандартное сканирование портов в указанном диапазоне (параметр -p 1-100):

nmap -A -T4 -Pn -p 1-100 127.0.0.1

Стандартное сканирование всего диапазона портов (параметр -p-):

nmap -A -T4 -Pn -p- 127.0.0.1

Стандартное сканирование всего диапазона портов, включая UDP (параметр -sU):

sudo nmap -sU -A -T4 -Pn -p- 127.0.0.1

Сканирование UDP требует прав суперпользователя.

Как добавить ключевой файл для разблокировки зашифрованного LUKS раздела?

Создадим каталог для хранения ключей /etc/keys (может быть любым):

sudo mkdir -p /etc/keys

Сгенерируем ключевой файл foo-bar.key размером 4 КБ на основе системного генератора псевдослучайных чисел:

sudo dd if=/dev/urandom of=/etc/keys/foo-bar.key bs=1024 count=4

Установим корректные права доступа:

sudo chown root:root /etc/keys/foo-bar.key
sudo chmod 0400 /etc/keys/foo-bar.key

Добавим ключ в свободный слот LUKS заголовка зашифрованного раздела:

sudo cryptsetup luksAddKey /dev/sda2 /etc/keys/foo-bar.key

Утилита cryptsetup запросит ввод мастер-пароля.

Здесь /dev/sda2 -- устройство зашифрованного LUKS тома, для которого требуется добавить ключевой файл.

Как удалить ключевой файл разблокировки зашифрованного LUKS раздела?

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

Удалим слот с ключом foo-bar.key из LUKS заголовка зашифрованного раздела:

sudo cryptsetup luksRemoveKey /dev/sda2 /etc/keys/foo-bar.key

Надёжно уничтожим ключевой файл:

sudo shred -u -v /etc/keys/foo-bar.key

Здесь /dev/sda2 -- устройство зашифрованного LUKS тома, у которого требуется удалить слот с ключевым файлом.

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

Откроем файл /etc/crypttab в редакторе по умолчанию:

sudoedit /etc/crypttab

Добавим в конец файла строку вида:

foo-bar UUID=XXXXXX /etc/keys/foo-bar.key luks

Здесь foo-bar -- внутреннее имя, которое будет использоваться dev-mapper, XXXXXX -- UUID диска, /etc/keys/foo-bar.key -- полный путь к ключевому файлу. При шифровании SSD накопителя вместо параметра luks следует использовать discard.

Откроем файл /etc/fstab:

sudoedit /etc/fstab

Добавим в конец строку вида:

/dev/mapper/foo-bar /media/data ext4 defaults 1 2

Здесь foo-bar -- внутреннее имя, указанное ранее в crypttab, /media/data -- точка монтирования, а ext4 -- используемая файловая система.

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

Я забыл пароль суперпользователя. Как мне его сбросить?

При наличии доступа к sudo, пароль суперпользователя можно изменить в штатном режиме.

Если текущий пользователь не может использовать sudo, но есть физический доступ к устройству, см. здесь.

Можно ли отключить автоматическое монтирование устройств LUKS при загрузке?

Да. Для этого добавим параметр noauto для соответствующей записи в файле /etc/crypttab:

foo-bar UUID=XXXXXX /etc/keys/foo-bar.key noauto

Здесь foo-bar -- внутреннее имя, которое будет использоваться dev-mapper, XXXXXX -- UUID диска, /etc/keys/foo-bar.key -- полный путь к ключевому файлу. Параметр noauto должен применяться только совместно с ключом.

Данное зашифрованное устройство будет смонтировано и автоматически расшифровано при первой попытке доступа к нему.

Как работать с TrueCrypt контейнерами в Fedora?

Из-за несвободной лицензии TrueCrypt и все его форки (в т.ч. VeraCrypt) не могут быть добавлены в репозитории Fedora, однако в настоящее время утилита cryptsetup полностью поддерживает работу с созданными ими контейнерами.

Cryptsetup поддерживает монтирование как TrueCrypt, так и VeraCrypt томов (файлы и устройства), а также умеет их администрировать (управлять ключами, паролями). Ограничение лишь одно -- нельзя создавать новые зашифрованные данными механизмами контейнеры.

Как смонтировать TrueCrypt контейнер в Fedora?

Откроем файл контейнера средствами cryptsetup:

sudo cryptsetup --type tcrypt open /path/to/container.tc foo-bar

Смонтируем файловую систему:

sudo mkdir /media/data
sudo mount -t auto /dev/mapper/foo-bar /media/data

По окончании работы произведём размонтирование:

sudo umount /media/data
sudo rmdir /media/data

Закроем файл контейнера:

sudo cryptsetup --type tcrypt close /dev/mapper/foo-bar

Здесь /path/to/container.tc полный путь к файлу контейнера на диске (либо зашифрованному устройству), а foo-bar -- внутреннее имя для dev-mapper.

Как смонтировать VeraCrypt контейнер в Fedora?

Откроем файл контейнера средствами cryptsetup:

sudo cryptsetup --veracrypt --type tcrypt open /path/to/container.hc foo-bar

Смонтируем файловую систему:

sudo mkdir /media/data
sudo mount -t auto /dev/mapper/foo-bar /media/data

По окончании работы произведём размонтирование:

sudo umount /media/data
sudo rmdir /media/data

Закроем файл контейнера:

sudo cryptsetup --veracrypt --type tcrypt close /dev/mapper/foo-bar

Здесь /path/to/container.hc полный путь к файлу контейнера на диске (либо зашифрованному устройству), а foo-bar -- внутреннее имя для dev-mapper.

Как настроить автоматическое монтирование VeraCrypt томов при загрузке?

Откроем файл /etc/crypttab в редакторе по умолчанию:

sudoedit /etc/crypttab

Добавим в конец файла строку вида:

foo-bar UUID=XXXXXX /etc/keys/foo-bar.key tcrypt-veracrypt

Здесь foo-bar -- внутреннее имя, которое будет использоваться dev-mapper, XXXXXX -- UUID диска, либо полный путь к файлу контейнера, /etc/keys/foo-bar.key -- полный путь к ключевому файлу, либо файлу с паролем (разрыв строки в конце файла не ставится).

Откроем файл /etc/fstab:

sudoedit /etc/fstab

Добавим в конец строку вида:

/dev/mapper/foo-bar /media/data auto defaults,x-systemd.automount 0 0

Здесь foo-bar -- внутреннее имя, указанное ранее в crypttab, а /media/data -- точка монтирования.

Если всё сделано верно, то при следующей загрузке зашифрованный VeraCrypt том будет смонтирован автоматически.

Как работать с BitLocker контейнерами в Fedora?

Начиная с версии 2.3.0 утилита cryptsetup поддерживает работу с зашифрованными BitLocker томами.

Допускается монтирование, базовые операции с ними, но не создание новых.

Как смонтировать BitLocker контейнер в Fedora?

Откроем устройство, зашифрованное BitLocker, средствами cryptsetup:

sudo cryptsetup --type bitlk open /dev/sdX1 foo-bar

Смонтируем файловую систему:

sudo mkdir /media/data
sudo mount -t auto /dev/mapper/foo-bar /media/data

По окончании работы произведём размонтирование:

sudo umount /media/data
sudo rmdir /media/data

Закроем файл контейнера:

sudo cryptsetup --type bitlk close /dev/mapper/foo-bar

Здесь /dev/sdX1 -- зашифрованное BitLocker устройство, а foo-bar -- внутреннее имя для dev-mapper.

Как настроить автоматическое монтирование BitLocker томов при загрузке?

Откроем файл /etc/crypttab в редакторе по умолчанию:

sudoedit /etc/crypttab

Добавим в конец файла строку вида:

foo-bar UUID=XXXXXX /etc/keys/foo-bar.key bitlk

Здесь foo-bar -- внутреннее имя, которое будет использоваться dev-mapper, XXXXXX -- UUID диска, /etc/keys/foo-bar.key -- полный путь к ключевому файлу, либо файлу с паролем (разрыв строки в конце файла не ставится).

Откроем файл /etc/fstab:

sudoedit /etc/fstab

Добавим в конец строку вида:

/dev/mapper/foo-bar /media/data auto defaults,x-systemd.automount 0 0

Здесь foo-bar -- внутреннее имя, указанное ранее в crypttab, а /media/data -- точка монтирования.

Если всё сделано верно, то при следующей загрузке зашифрованный BitLocker том будет смонтирован автоматически.

Где хранятся установленные пользователем контексты SELinux?

Заданные пользователем нестандартные контексты, а также переопределения хранятся внутри каталога /etc/selinux/targeted/contexts/files в следующих файлах:

  • file_contexts.local -- текстовый формат;

  • file_contexts.local.bin -- скомпилированный бинарный формат.

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

Как получить список установленных пользователем контекстов SELinux?

Выведем полный список нестандартных контекстов, а также переопределений политик SELinux:

sudo semanage fcontext --list -C

Как удалить пользовательские контексты SELinux?

Удалим конкретный нестандартный контекст, либо переопределение политик SELinux:

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

Удалим все нестандартный контексты, а также переопределения политик SELinux:

sudo semanage fcontext -D

Для полного вступления изменений в силу рекомендуется сбросить контекст SELinux.

Как создать зашифрованный контейнер на диске?

При помощи утилиты dd создадим пустой файл для хранения криптоконтейнера размером в 1 ГБ:

sudo dd if=/dev/zero bs=1M count=1024 of=/media/data/foo-bar.dat

Минимальный размер создаваемого образа должен быть не меньше 32 МБ, т.к. противном случае возникнет ошибка Requested offset is beyond real size of device.

Здесь /media/data/foo-bar.dat -- полный путь к файлу на диске.

Создадим зашифрованный LUKS контейнер:

sudo cryptsetup --verify-passphrase luksFormat /media/data/foo-bar.dat -c aes-xts-plain64 -s 256 -h sha512

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

Загрузим контейнер и расшифруем содержимое:

sudo cryptsetup luksOpen /media/data/foo-bar.dat foo-bar

Создадим файловую систему ext4:

sudo mkfs -t ext4 -m 1 -L foo-bar /dev/mapper/foo-bar

Завершим сеанс работы с контейнером:

sudo cryptsetup luksClose /dev/mapper/foo-bar

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

Загрузим криптоконтейнер и расшифруем содержимое:

sudo cryptsetup luksOpen /media/data/foo-bar.dat foo-bar

Создадим каталог для точки монтирования:

sudo mkdir /media/foo-bar

Смонтируем файловую систему:

sudo mount -t auto /dev/mapper/foo-bar /media/foo-bar

По окончании работы произведём размонтирование:

sudo umount /media/foo-bar

Удалим каталог точки монтирования:

sudo rmdir /media/foo-bar

Завершим сеанс работы с контейнером:

sudo cryptsetup luksClose /dev/mapper/foo-bar

Как быстро уничтожить содержимое LUKS контейнера?

Быстро и безопасно уничтожим ключи шифрования заголовка LUKS-контейнера:

sudo cryptsetup luksErase /dev/sdX1

Здесь /dev/sdX1 -- зашифрованный раздел диска, данные с которого требуется уничтожить. Он не должен быть смонтирован. Ввод пароля не требуется.

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

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

Можно ли использовать TPM для разблокировки LUKS контейнера?

См. здесь.

Как настроить работу Samba с SELinux?

См. здесь.

Как защитить SSH от возможных MITM-атак?

Для защиты от MITM-атак в протоколе SSH применяется проверка отпечатков публичного ключа сервера в момент установки рукопожатия с эталоном, сохранённым на клиенте.

Во время первого подключения пользователю предлагается проверить отпечаток сервера и либо разрешить, либо отклонить соединение.

После одобрения, они вместе с IP-адресом сохраняются в файле ~/.ssh/known_hosts и при следующих подключениях проверяется их действительность. В случае изменения, например из-за проведения злоумышленником атаки "человек посередине", соединение не устанавливается, а пользователю выводится соответствующее сообщение об ошибке.

К сожалению, ручная проверка отпечатка мало кем производится, поэтому был придуман новый, более надёжный способ -- размещение публичных ключей в виде особых SSHFP записей DNS.

При использовании данного метода, при подключении будет проверяться соответствие ключей, полученных от сервера, записям из SSHFP для конкретного домена. При этом конечно же необходимо использовать надёжные DNS-резолверы с поддержкой шифрования DNS-over-TLS, а также рекомендуется подписать DNS-зону DNSSEC.

С помощью утилиты ssh-keygen, на сервере сгенерируем DNS-записи для домена example.org:

ssh-keygen -r example.org

Добавим их в настройки DNS через панель управления регистратора домена или хостера и подождём несколько часов до полной синхронизации между серверами.

Проверим корректность SSHFP-записей:

dig +nocmd +noquestion +nostats +noheader SSHFP example.org

Если всё верно, активируем работу функции на каждом SSH-клиенте, добавив в файл ~/.ssh/config следующие строки:

Host example
    HostName example.org
    Port 22
    User user
    VerifyHostKeyDNS yes

Подключимся к серверу по доменному имени (в случае использования прямого IP-адреса, будет выполняться классическая проверка по файлу known_hosts):

ssh example

Как определить версию LUKS конкретного криптоконтейнера?

Версия LUKS всегда указана в разделе Version информации о шифровании.

Как создать резервную копию заголовка LUKS?

Загрузим систему с LiveUSB и создадим резервную копию заголовка тома /dev/sda2 на внешнем накопителе данных:

sudo cryptsetup luksHeaderBackup /dev/sda2 --header-backup-file /media/foo-bar/luks-header.img

Как восстановить резервную копию заголовка LUKS?

Загрузим систему с LiveUSB и восстановим резервную копию заголовка тома /dev/sda2 с внешнего накопителя данных:

sudo cryptsetup luksHeaderRestore /dev/sda2 --header-backup-file /media/foo-bar/luks-header.img

Как осуществить апгрейд версии LUKS?

Загрузим систему с LiveUSB и создадим резервную копию заголовка на внешнем накопителе данных.

Выведем текущую версию и убедимся, что она равна 1:

sudo cryptsetup luksDump /dev/sda2 | grep 'Version'

Произведём апгрейд LUKS до версии 2:

sudo cryptsetup convert /dev/sda2 --type luks2

Как усилить защиту ключа LUKS?

Загрузим систему с LiveUSB и создадим резервную копию заголовка на внешнем накопителе данных.

Выведем текущую версию LUKS и убедимся, что значение не ниже 2 (если это не так, сначала осуществим преобразование):

sudo cryptsetup luksDump /dev/sda2 | grep 'Version'

Выведем текущий PBKDF:

sudo cryptsetup luksDump /dev/sda2 | grep 'PBKDF'

Осуществим преобразование в Argon2:

sudo cryptsetup luksConvertKey /dev/sda2 --pbkdf argon2id

Как усилить надёжность шифрования LUKS?

Загрузим систему с LiveUSB и создадим полную посекторную копию раздела на внешнем накопителе данных.

Выведем информацию о шифровании выбранного тома:

sudo cryptsetup luksDump /dev/sda2 | egrep 'Version|Cipher|MK bits'

Перешифруем весь том в формате LUKS2 с использованием алгоритма AES-256-XTS-PLAIN64:

sudo cryptsetup-reencrypt /dev/sda2 --type luks2 --pbkdf argon2id --cipher aes-xts-plain64 --key-size 512 --hash sha512

Как активировать TRIM для открытых вручную LUKS-контейнеров?

Зашифрованные LUKS-контейнеры, открытые вручную при помощи cryptsetup open, по умолчанию не будут поддерживать процедуру TRIM, поэтому рассмотрим несколько способов исправить это.

Способ 1. Передадим параметр ядра Linux rd.luks.options=discard.

Теперь все контейнеры, открытые утилитой, будут поддерживать TRIM. Однако действие не распространяется на указанные в файле /etc/crypttab, т.к. он имеет более высокий приоритет.

Способ 2. Воспользуемся параметром командной строки --allow-discards.

LUKS версии 2 поддерживает возможность принудительно задать использование процедуры TRIM внутри контейнера при любых операциях монтирования. В LUKS1 это не реализовано и поэтому работать не будет.

Для LUKS1 (вводится при каждом открытии тома):

sudo cryptsetup --allow-discards open /path/to/container foo-bar

Для LUKS2 (вводится только один раз):

sudo cryptsetup --allow-discards --persistent open /path/to/container foo-bar

Убедимся, что в информации о шифровании, в разделе Flags, появился allow-discards.

Как выполнить TRIM для открытых вручную LUKS-контейнеров?

Функция автоматической очистки неиспользуемые данных TRIM выполняется либо в реальном времени, либо по таймеру, но только для автоматически смонтированных и указанных в файле /etc/crypttab разделов.

Для зашифрованных LUKS-контейнеров, открытых вручную при помощи cryptsetup open, её необходимо сначала активировать, а затем периодически запускать утилиту fstrim:

sudo fstrim -v /media/foo-bar

Здесь /media/foo-bar -- это точка монтирования.

Как запретить приложению доступ к сети?

Иногда возникает необходимость ограничить какому-либо приложению доступ к сети Интернет.

Установим ограничение пространствами имён ядра (более подробную информацию о них можно получить в man namespaces) при помощи утилиты unshare:

unshare -r -n foo-bar

Здесь вместо foo-bar укажем приложение, которое требуется запустить.

Как настроить хранение SSH ключей в TPM?

См. здесь.