Сайт FSA
10.04.2021

Я установил себе Fedora

Первое знакомство

Опыт установки Fedora привнёс много нового опыта. До этого я использовал FreeBSD, Ubuntu, Gentoo, ставил Archlinux.

В первую очередь, конечно, это система управления пакетами dnf, бывший yum, с которым я знакомился при установке CentOS, а точнее GosLinux, но чтобы его использовать в реальных задачах, пришлось подключать репозитории CentOS, тогда.

Во-вторых, непривычно, что в операционной систем изначально включен брандмауэр. Я привык не запускать ненужных сервисов, если они мне не нужны. А если и нужны, то я мог их запускать на 127.0.0.1. Тут брандмауэр изначально включен.

В-третьих, система изначально использует систему безопасности SELinux. Как говорят источники в интернете, эта система была разработана Агентством национальной безопасности США (АНБ). Данная подсистема доступна к ядре Linux начиная с 2.6 и её можно использовать. В Fedora она включена в довольно лёгком режиме: всё, что не описано правилами безопасности можно, всё что описано можно или нельзя, в зависимости от правила. Как я выяснил на практике, большинство того, что вам необходимо, работает из коробки. При этом работа стандартных служб довольно ограничена и если они потребуют доступ туда, куда обычно не требуется, то им будет отказано. У меня при использовании на ноутбуке в качестве рабочего компьютера и на Raspberry Pi в качестве веб-сервера с php и postgresql особых проблем не возникло. Кроме того, когда возникали проблемы со своим самописным софтом скорее означало, что я делаю что-то неправильно и нужно изменить архитектуру приложения и не лезть куда попало.

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

С чего начать настройку?

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

dnf repolist

Например, репозиторий fedora-cisco-openh264 представляет специальную бинарную сборку библиотеки openh264. Если вы не живёте в США или Австралии, где действуют патенты на алгоритмы, то вместо этого кодека ранее могли использовать открытые реализации из репозитория RPM Fusion. fedora-ciso-openh264 можно отключить, как указано в неофициальным FAQ по Fedora. В обновлениях ffmpeg после 6.0-6 (май 2023 года) указанный репозиторий стал необходим. Но если вы желаете, можете его отключить:

sudo dnf config-manager --set-disabled fedora-cisco-openh264

Удалить установленные из репозитория пакеты:

sudo dnf remove openh264 mozilla-openh264 gstreamer1-plugin-openh264

Включить ранее отключенный репозиторий можно так:

sudo dnf config-manager --set-disabled fedora-cisco-openh264

Подключение RPM Fusion со свободным и не свободным софтом согласно неофициальному FAQ по Fedora:

sudo dnf install --nogpgcheck https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

При установке пакетов из RPMFusion нужно быть готовым, что некоторые пакеты могут вызывать конфликты. В основном это касается nonfree репозитория. Например, часто можно столкнуться с конфликтом при установке пакетов qt. Иногда это может вызывать крах при запуске других программ, которым нужна обновлённая версия пакета. Одним из таких проблемных пакетов — Telegram.

Группы пакетов

Fedora может использовать множество графических оболочек, а также различных наборов пакетов. Узнать каике группы пактов доступны можно с помощью:

dnf grouplist --ids

Ключ --ids выведет название группы, которое в дальнейшем можно использовать для установки или удаления группы. Пример удаления группы rpm-development-tools:

dnf groupremove rpm-development-tools

Установка необходимой группы пакетов, например, kde-desktop:

dnf groupinstall kde-desktop

Поиск по пакетам

Самый простой поиск по ключевым словам можно выполнить с помощью

dnf search КЛЮЧ_ПОИСКА

Если вы знаете имя команды, но в вашей системе её нет, то можно поискать так

dnf provides /usr/sbin/semanage

Или даже так

dnf provides semanage

Встроенный брандмауэр Firewalld

Firewalld - это динамически управляемый брандмауэр с поддержкой зон для интерфейсов. Для управления им можно использовать консольную утилиту firewall-cmd или графическую firewall-config. Каждый из сетевых интерфейсов может относиться к определённой зоне. Для каждой зоны действуют свои правила брандмауэра. Существует также зона по умолчанию для всего того, для чего не задана зона. Установить это значение можно с помощью:

firewall-cmd --set-default-zone=internal

Узнать какие зоны уже имеются в настройках можно с помощью команды

firewall-cmd --get-zones

Каждая зона имеет свой набор правил. По умолчанию создано некоторое количество зон, которые можно использовать в типовых конфигурациях. При чём, для некоторых зон могут использоваться довольно сложные правила, например, для зоны external производиться трансляция IP-адресов (NAT). Подробнее о зонах можно узнать в документации.

Для создания постоянных правил необходимо указывать ключ --permanent. Имя зоны необходимо указывать в ключе --zone. Без явного указания зоны, правила будут изменены в зоне по умолчанию.

firewall-cmd --permanent --zone=internal --add-port=80/tcp

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

firewall-cmd --reload

Использование Firewalld мне на столько понравилось, что я даже установил его на сервер на Ubuntu 20.04 LTS для связи с которой я использовал VPN на базе Wireguard. Firewalld избавил меня от написания скриптов для выполнения действий при подключении/отключении клиентов. Даже NAT можно настроить… В принципе, его вообще не надо настраивать, т.к. есть готовые настройки зон для типовых конфигураций где уже всё настроено.

Настройка NGINX

В первую очередь вам нужно разрешить доступ к серверу. Для стандартных портов 80 и 443 необходимо разрешить сервисы http и https.

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Необходимости редактировать файл /etc/nginx/nginx.conf нет. Необходимые изменения в конфигурацию можно внести в виде файлов *.conf в /etc/nginx/conf.d/. Например, можно задать формат ведения лога в journald с помощью файла journald.conf:

log_format journal '$remote_addr "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

Теперь можно использовать подобные директивы в конфигурациях хостов для записи журнала в journald с тегом my_tag:

    access_log syslog:server=unix:/dev/log,nohostname,tag=my_tag journal;
    error_log syslog:server=unix:/dev/log,nohostname,tag=my_tag;

Настройка php

Устанавливаем php-cli (для командной строки) и php-fpm (демон для веб). Попутно, нужные модули:

dnf install php-cli php-fpm php-pgsql php-json php-mbstring

По умолчанию в свежих версиях Fedora логи с ошибками сервиса php-fpm пишутся по пути /var/log/php-fpm/$pool-errors.log. Чтобы лог писался туда, куда указывает nginx, то нужно закомментировать следующие строки в /etc/php-fpm.d/www.conf:

;php_admin_value[error_log] = /var/log/php-fpm/www-error.log
;php_admin_flag[log_errors] = on

Если нужны подключения по сети с сервера (в том числе proxy), то нужно включить:

SELinux

Чтобы разрешить вашему веб-серверу подключаться по сети, то стоит выполнить

setsebool -P httpd_can_network_connect 1

В том числе это нужно, чтобы иметь возможность подключиться к базам данных: MySQL, PostgreSQL, Redis и другим. Флаг -P позволит сохранить значение политики после перезагрузки машины.

Разрешить веб-серверу подключаться к определённым портам, например, чтобы разрешить php-fpm отправлять из скриптов пакеты UDP с использованием порта 9898 для управления шлюзом Xiaomi для умного дома, необходимо выполнить команду:

semanage port -a -t http_port_t -p udp 9898

Список уже разрешённых портов:

semanage port -l | grep -w http_port_t

Разрешить читать веб-серверу файлы из определённой папки (в примере /home/fsa/www/*)

semanage fcontext -a -t httpd_sys_content_t "/home/fsa/www(/.*)?"

Разрешить писать веб-серверу файлы в определённую папку (в примере /home/fsa/www/log/*)

semanage fcontext -a -t httpd_sys_rw_content_t "/home/fsa/www/log(/.*)?"

После добавления правил для папок нужно запустить обновление ACL в соответствии с новыми правилами (в примере папка /home/fsa/www):

restorecon -R -v /home/fsa/www

Просмотреть все добавленные вами правила можно с помощью команды

semanage fcontext -C -l

Создание собственного модуля SELinux

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

cat /var/log/audit/audit.log | audit2allow -m myapp > myapp.te

Далее, редактируем и компилируем и устанавливаем модуль SELinux:

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

Удаление модуля по его имени:

semodule -r myapp

Установка PostgreSQL

dnf install postgresql-server

Инициализация сервера базы данных:

postgresql-setup initdb

Если требуется установить другие параметры для LC_COLLATE и LC_CTYPE, то можно воспользоваться переменной окружения PGSETUP_INITDB_OPTIONS, которая задаёт параметры для команды initdb. Данный параметр, также, может понадобиться при обновлении Fedora с обновлением версии PostgreSQL. При запуске обновления базы может возникнуть проблема несоответствия текущих значений и тех, которые использовались при инициализации базы данных. Например:

export PGSETUP_INITDB_OPTIONS="--locale=C --encoding=UTF-8"; postgresql-setup --upgrade

Здесь указана локаль C, которая ведёт себя одинаково на всех версиях операционных системах и позволяет работать базе максимально быстро, но ценой не всегда правильной сортировки данных для различных языков. Кроме этого, задаётся кодировка UTF-8.

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

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

su postges
psql
create user fsa superuser createrole createdb;
create database fsa owner fsa;
\password fsa

Далее в файле /var/lib/pgsql/data/pg_hba.conf необходимо установить scram-sha-256 (как наиболее безопасный) или md5 (устаревший) способ хранения паролей для записей потенциально уязвимых хостов.

systemd-resolved

Это такой сервис, который отвечает в системе за DNS.

Изначально на Fedora был открыт порт 5355. который числится как LLMNR. Можете погуглить что это такое, и если вам оно не нужно, то можно просто отключить этот сервис через файл /etc/systemd/resolved.conf установив LLMNR=no.

Кроме этого, в этом файле можно разрешить протокол DNSOverTLS, который можно разрешить DNSOverTLS=yes. Он будет работать, если ваш сервер поддерживает этот протокол. Адреса крупных серверов, которые поддерживают этот протокол, указаны прямо в этом файле конфигурации, в том числе, как IPv4, так и IPv6.

Лайфхак для любителей KDE Plasma и светлой темы

К сожалению, из-за применяемых в Fedora патчей для plasma-workspace, светлая стандартная тема Breeze была сломана. Её можно включить, но в новых сборках тема работает некорректно. В старых версиях тема работала, но до первой перезагрузки или запуска настроек KDE, после чего тема изменялась, при чём, после перезагрузки вы можете получить искажённую тему. Проблема существует с версии Fedora 34 или даже раньше. В Fedora 37 воспроизвести баг не удалось.

Если есть такая проблема, то работу темы можно починить воспользовавшись тестовым редактором. Необходимо исправить файл ~/.config/plasmarc или создать его, если он не существует и добавить следующие настройки:

[Theme]
name=default

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

Возможность ввода типографических символов в KDE Plasma

По сути эти настройки не относятся к Fedora, а являются возможностями KDE Plasma. Чтобы включить возможность ввода дополнительных типографических символов запустите настройки KDE Plasma и там перейдите в раздел «Устройства ввода — Клавиатура — Дополнительно». Установите кнопку для переключения раскладки по вкусу, например, «Клавиша для выбора 3-го ряда — Правая клавиша Alt». Далее включите ввод символов «Разные параметры совместимости — Включить доп. типографские символы».

Полезные ссылки

  1. Неофициальный FAQ по Fedora

Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


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