Сборка rpm пакетов и настройка своего репозитория

В данной статье будет подробно описан процесс создание rpm пакетов и организация репозитория. Прошу всех, кому интересна данная тема, пройти под кат.

Я взялся писать крайне подробно, так что Вы можете пролистать очевидные для Вас вещи.


  • Установка системы
  • Преднастройка
  • Подготовка площадки сборки
  • Собираем Tmux
  • Собираем fbida
  • Настройка доступа по http/https
  • Настройка доступа по ftp
  • Заключение


Театр начинается с вешалки

Наш сервис начинается с момента установки на него операционной системы. Естественно, что для сборки rpm пакетов мы выбираем rhel дистрибутив. В данном случае, был выбран CentOS 7.


Скачать CentOS

Создадим директорию, где будет лежать образ и перейдем в нее:

mkdir ~/centos && cd $_

Далее можно непосредственно скачать образ и необходимые для проверки файлы:

wget https://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1708.iso
wget https://mirror.yandex.ru/centos/7/isos/x86_64/sha256sum.txt.asc

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

sudo yum install -y epel-release
sudo yum install -y aria2 

aria2c https://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1708.torrent
cd ~/centos/CentOS-7-x86_64-Everything-1708


Проверить образ

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

Скачаем ключ для CentOS 7:

wget http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7

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

gpg --quiet --with-fingerprint RPM-GPG-KEY-CentOS-7
    pub  4096R/F4A80EB5 2014-06-23 CentOS-7 Key (CentOS 7 Official Signing Key) 
          Key fingerprint = 6341 AB27 53D7 8A78 A7C2  7BB1 24C6 A8A7 F4A8 0EB5
gpg --import RPM-GPG-KEY-CentOS-7
    gpg: key F4A80EB5: public key "CentOS-7 Key (CentOS 7 Official Signing Key) " imported
    gpg: Total number processed: 1
    gpg:               imported: 1  (RSA: 1)

Проверим подпись файла, с контрольной суммой образа:

gpg --verify sha256sum.txt.asc 2>&1 | grep "Good signature" 
    gpg: Good signature from "CentOS-7 Key (CentOS 7 Official Signing Key) "

Как мы видим — все отлично и теперь можем проверить сам образ на целостность:

sha256sum -c sha256sum.txt.asc 2>&1 | grep OK
    CentOS-7-x86_64-Everything-1708.iso: OK


Запись образа на носитель

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


Запись образа на диск

Для записи данного образа, нам понадобится двухсторонний DVD. Допустим мы его нашли и записываем, установив предварительно wodim:

sudo yum install -y wodim
sudo wodim dev=/dev/cdrom -eject -v CentOS-7-x86_64-Everything-1708.iso


Запись образа на флешку

Двухсторонний DVD это как то архаично, так что возьмем флешку на 16 гб и запишем образ на нее, но прежде /dev/sda тут — это флешка, а у Вас она может быть другой. Смотри команду fdisk:

sudo dd if=CentOS-7-x86_64-Everything-1708.iso of=/dev/sda bs=1M status=progress; sync
eject /dev/sda

Если status=progress не поддерживается, то по старинке:

watch -n 10 "sudo kill -USR1 $(pgrep ^dd)"

или вот так:

watch -n 10 "sudo pkill -usr1 dd"

а можно воспользоваться pv:

sudo yum install -y epel-release
sudo yum install -y pv
sudo su
dd if=CentOS-7-x86_64-Everything-1708.iso | pv | dd of=/dev/sda


Установка

Как поставить Centos 7, решать Вам, тут и за RAID подумать можно и за LVM и много чего еще,
я ставил минимальный пакет.

Процесс установки можно посмотреть в этом ролике.

После установки системы, нам необходимо настроить наш сервер.


Обновление и установка пакетов

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

sudo yum update -y
sudo yum install -y epel-release

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

sudo yum groupinstall -y "Development Tools"
sudo yum install -y glibc-static tree wget vim createrepo
sudo yum install -y httpd httpd-devel mod_ssl python2-certbot-apache vsftpd


SSH

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

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

ssh-keygen

и добавим ключ на сервер:

ssh-copy-id chelaxe@rpmbuild

или ручками:

mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
    ssh-rsa AAAA...tzU= ChelAxe (D.F.H.) 
chmod 600 ~/.ssh/authorized_keys

Необходимо еще закрутить гайки в самой службе. Создадим копию файла конфигурации и приступим к редактированию:

sudo cp /etc/ssh/sshd_config{,.bak}
sudo vim /etc/ssh/sshd_config

В файле стоит добавить/изменить/раскомментировать следующие строки:

# Слушать будем на интерфейсе с адресом 192.168.0.2
ListenAddress 192.168.0.2
# Для авторизации хватит и 30 секунд
LoginGraceTime 30
# Запретим подключение root пользователю
PermitRootLogin no
# Три неудачных попытки хватит
MaxAuthTries 3
# Запретить авторизацию по паролю
PasswordAuthentication no
# Через 10 минут простоя разорвем сессию
ClientAliveInterval 600
ClientAliveCountMax 0
# Разрешим вход только пользователю chelaxe
AllowUsers chelaxe
# Разрешим вход только пользователям из группы chelaxe
AllowGroups chelaxe
# Заставить sshd работать только с протоколом SSH2
Protocol 2

Перезапускаем службу:

sudo systemctl restart sshd


Межсетевой экран

Важно ограничить доступ к нашему серверу. По этой причине настроим межсетевой экран:

sudo firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/28" service name="ssh" accept'
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-service=ftp
sudo firewall-cmd --permanent --list-all
    public
        target: default
        icmp-block-inversion: no
        interfaces:
        sources:
        services: http https ftp
        ports:
        protocols:
        masquerade: no
        forward-ports:
        source-ports:
        icmp-blocks:
        rich rules:
              rule family="ipv4" source address="192.168.0.0/28" service name="ssh" accept
sudo firewall-cmd --reload

Тут мы добавили наши службы http https ftp для доступности извне и ssh, но только для сети 192.168.0.0/28.

Подготовим саму площадку для сборки. Стоит отметить, что вернее всего сборку производить на отдельном виртуальном хосте, активно используя технологию snapshot’ов, но тут я опишу все в едином целом. Так же для сборки нужно выделить отдельного пользователя, не являющемся администратором (т.е. sudo ему недоступно).


Создание директорий

Создаем необходимые директории:

mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
sudo mkdir /var/www/repo
sudo chown -R chelaxe:chelaxe /var/www/repo
ln -s /var/www/repo ~/rpmbuild/REPO
tree ~/rpmbuild/
    /home/chelaxe/rpmbuild/
    ├── BUILD
    ├── BUILDROOT
    ├── REPO -> /var/www/repo
    ├── RPMS
    ├── SOURCES
    ├── SPECS
    └── SRPMS

    7 directories, 0 files


Настройка PGP подписи

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

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

Создадим ключ, если его у нас нет:

gpg --gen-key

Нас попросят ответить на ряд вопросов:
тип ключа, выбираем (1) RSA and RSA (default), размер ключа: 4096, срок действия: 6m, наше имя: Alexander F. Mikhaylov, Email: chelaxe@gmail.com, комментарий, тут можно указать для чего нам ключ: repo и ждем…

Если вдруг после ответов на все вопросы получим это gpg: cancelled by user, то запускаем команду:

script /dev/null

и повторяем.

Посмотреть ключ:

gpg --fingerprint chelaxe@gmail.com
    pub   2048R/E6D53D4D 2014-05-07
          Key fingerprint = EE2A FF9A 2BE3 318E 9346  A675 8440 3961 E6D5 3D4D
    uid                  ChelAxe (D.F.H.) 

Сохраняем наш приватный ключ:

gpg --export-secret-keys --armor chelaxe@gmail.com > chelaxe-privkey.asc

Создадим ключ для отзыва:

gpg --output chelaxe-revoke.asc --gen-revoke chelaxe@gmail.com

Экспорт открытого ключа на keyserver:

gpg --keyserver pgp.mit.edu --send-keys E6D53D4D

Теперь ключ можно и импортировать на наш сервер:

gpg --import ~/chelaxe-privkey.asc
rm -rf ~/chelaxe-privkey.asc

Смотрим где находится gpg утилита:

which gpg
    /usr/bin/gpg

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

vim ~/.rpmmacros
    %_signature gpg
    %_gpg_path /home/chelaxe/.gnupg
    %_gpg_name ChelAxe
    %_gpgbin /usr/bin/gpg


Создаем репозиторий

Теперь организуем сам репозиторий.

Создадим директорию, где будем хранить пакеты:

mkdir ~/rpmbuild/REPO/Packages

Экспортируем ключ в репозиторий:

gpg --export -a 'ChelAxe' > ~/rpmbuild/REPO/RPM-GPG-KEY-chelaxe

Создаем сам репозиторий:

createrepo ~/rpmbuild/REPO


Пакет для репозитория

Собираем пакет для автоматической установки репозитория в систему.

cd ~/rpmbuild/SOURCES
mkdir chelaxe-release && cd $_

Файл репозитория для yum:

vim ~/rpmbuild/SOURCES/chelaxe-release/chelaxe.repo
    [chelaxe]
    name=ChelAxe Official Repository - $basearch
    baseurl=https://repo.chelaxe.ru/
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-chelaxe

Экспортируем ключ для пакета:

gpg --export -a 'ChelAxe' > ~/rpmbuild/SOURCES/chelaxe-release/RPM-GPG-KEY-chelaxe

Собираем все в архив:

cd ~/rpmbuild/SOURCES
tar -czf chelaxe-release.tar.gz chelaxe-release/

Создаем SPECS файл для пакета:

cd ~/rpmbuild/SPECS
vim ~/rpmbuild/SPECS/chelaxe-release.spec
    Name:           chelaxe-release
    Version:        1.0
    Release:        1%{?dist}
    Summary:        ChelAxe repository configuration

    Vendor:         D.F.H.
    Packager:       ChelAxe

    Group:          System Environment/Base
    License:        GPL
    URL:            https://repo.chelaxe.ru
    Source0:        https://repo.chelaxe.ru/%{name}.tar.gz
    BuildArch:      noarch

    %description
    This package contains the ChelAxe official repository
    GPG key as well as configuration for yum.

    %prep
    %setup -q -n %{name}

    %install
    %__rm -rf %{buildroot}
    install -d -m 755 %{buildroot}%{_sysconfdir}/yum.repos.d
    install -p -m 644 chelaxe.repo %{buildroot}%{_sysconfdir}/yum.repos.d/chelaxe.repo
    install -d -m 755 %{buildroot}%{_sysconfdir}/pki/rpm-gpg
    install -p -m 644 RPM-GPG-KEY-chelaxe %{buildroot}%{_sysconfdir}/pki/rpm-gpg/RPM-GPG-KEY-chelaxe

    %post
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-chelaxe

    %clean
    %__rm -rf %{buildroot}

    %files
    %defattr(-,root,root,-)
    %{_sysconfdir}/yum.repos.d/chelaxe.repo
    %{_sysconfdir}/pki/rpm-gpg/RPM-GPG-KEY-chelaxe

    %changelog
    * Tue May  1 2018 ChelAxe (D.F.H.)  - 1.0-1%{?dist}
    - Initial package.

Собираем пакет:

rpmbuild -ba --sign ~/rpmbuild/SPECS/chelaxe-release.spec

На этом этапе нас спросят пароль от нашего PGP ключа.

Копируем созданный пакет в репозиторий и обновляем его:

cp ~/rpmbuild/RPMS/noarch/chelaxe-release-1.0-1.el7.centos.noarch.rpm ~/rpmbuild/REPO/
createrepo --update ~/rpmbuild/REPO

Теперь установим наш репозиторий в систему:

sudo yum install -y ~/rpmbuild/REPO/chelaxe-release-1.0-1.el7.centos.noarch.rpm

В дальнейшем данный пакет будет доступен по адресу: https://repo.chelaxe.ru/chelaxe-release-1.0–1.el7.centos.noarch.rpm

После установки должен появиться репозиторий chelaxe и PGP ключ:

rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' | grep ChelAxe
    gpg-pubkey-e6d53d4d-5369c520 --> gpg(ChelAxe (D.F.H.) )

Самое важное тут это SPEC файлы, расписывать о них не стану, но предоставлю ряд ссылок:


  1. https://www.altlinux.org/Spec
  2. https://docs.fedoraproject.org/quick-docs/en-US/creating-rpm-packages.html
  3. https://www.opennet.ru/docs/HOWTO-RU/RPM-HOWTO-48.html

и одна полезная команда:

rpm --showrc

она отобразит готовые макросы для сборки.

Теперь соберем, для примера, что нибудь полезное. Собирать будем tmux — терминальный мультиплексор, без которого работать мне не комфортно. Стоит отметить tmux есть в base репозитории CentOS 7, но версия там 1.8, а мы соберем 2.6. Так же у пакета из base репозитория есть зависимость libevent, мы же соберем tmux со статическими библиотеками последних версий.


Готовим исходники

Скачиваем исходники tmux и необходимых библиотек:

cd ~/rpmbuild/SOURCES
wget https://github.com/tmux/tmux/releases/download/2.6/tmux-2.6.tar.gz
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz.asc
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz.sig

Экспортируем GPG ключи для проверки исходников:

gpg --recv-keys 8EF8686D
gpg --recv-keys F7E48EDB

Проверяем файлы:

gpg --verify libevent-2.1.8-stable.tar.gz.asc libevent-2.1.8-stable.tar.gz 2>&1 | grep "Good signature"
    gpg: Good signature from "Azat Khuzhin "

gpg --verify ncurses-6.1.tar.gz.sig ncurses-6.1.tar.gz 2>&1 | grep "Good signature"
    gpg: Good signature from "Thomas Dickey "

Подготовим файл конфигурации tmux:

vim ~/rpmbuild/SOURCES/tmux.conf
    # Доступные параметры сервера:

    # Количество буферов
    set-option -g buffer-limit 50
    # Массив пользовательских псевдонимов для команд
    set-option -g command-alias[100] zoom="resize-pane -Z"
    # Терминал по умолчанию
    set-option -g default-terminal "screen-256color"
    # Ожидание после ввода escape
    set-option -g escape-time 500
    # Отключать сервер без клиентов
    set-option -g exit-unattached off
    # Запрос фокусировки у терминала
    set-option -g focus-events off
    # Файл в котором хранится история команд
    set-option -g history-file ~/.tmux_history
    # Количество сообщений в журнале для каждого клиента
    set-option -g message-limit 100
    # Устанавливать содержимое терминального буфера обмена с помощью escape
    set-option -g set-clipboard on
    # Массив описаний терминалов
    set-option -g terminal-overrides[100] "xterm:colors=256"
    set-option -g terminal-overrides[101] "xterm*:colors=256"
    set-option -g terminal-overrides[102] "screen:colors=256"
    set-option -g terminal-overrides[103] "screen*:colors=256"

    # Доступные параметры сеанса:

    # Мониторинг активности в окне
    set-option -g activity-action other
    # Период определяющий вставлен или набран аргумент
    set-option -g assume-paste-time 1
    # Начало нумерации окон
    set-option -g base-index 1
    # Мониторинг "звонка" в окне
    set-option -g bell-action other
    # Команда для новых окон (перекрывает default-shell)
    # set-option -g default-command "vim"
    # Shell по умолчанию
    set-option -g default-shell "/bin/bash"
    # Уничтожать сеанс без клиентов
    set-option -g destroy-unattached off
    # Отключаться от сервера при уничтожении сеанса
    set-option -g detach-on-destroy on
    # Цвет индикатора активной панели
    set-option -g display-panes-active-colour "red"
    # Цвет индикатора панели
    set-option -g display-panes-colour "green"
    # Время отображения индикаторов панели
    set-option -g display-panes-time 1000
    # Время отображения сообщений в строке состояния и др. задержки
    set-option -g display-time 750
    # Количество строк в истории окон
    set-option -g history-limit 2000
    # Таблица сочетаний клавиш по умолчанию
    set-option -g key-table "root"
    # Задержка блокировки сеанса по бездействию
    set-option -g lock-after-time 1800
    # Команда для блокировки сеанса
    set-option -g lock-command "vlock"
    # Стиль команд строки состояния
    # Заменяет параметры: message-command-attr message-command-bg message-command-fg
    set-option -g message-command-style "bg=black,fg=yellow"
    # Стиль сообщения строки состояния
    # Заменяет параметры: message-attr message-bg message-fg
    set-option -g message-style "bg=yellow,fg=black"
    # Поддержка мыши
    # С версии 2.1 заменяет параметры: mode-mouse mouse-resize-pane mouse-select-pane mouse-select-window
    set-option -g mouse off
    # Основной префикс
    set-option -g prefix C-b
    # Дополнительный префикс
    set-option -g prefix2 C-a
    # Автоматическая перенумерация окон
    set-option -g renumber-windows on
    # Время ожидание повторного нажатия клавиш без префикса
    set-option -g repeat-time 500
    # Изменять заголовок терминала
    set-option -g set-titles on
    # Формат заголовка терминала
    set-option -g set-titles-string "#{session_name}"
    # Мониторинг "тишины" в окне
    set-option -g silence-action other
    # Отображать строку состояния
    set-option -g status on
    # Время обновления строки состояния
    set-option -g status-interval 1
    # Выравнивание вкладок окон в строке состояния
    set-option -g status-justify left
    # Стиль сочетаний клавиш в строке состояния
    set-option -g status-keys vi
    # Формат левой части строки состояния
    set-option -g status-left " [#{session_name}]#{?session_many_attached,*,} #{version} #[reverse] #[default] "
    # Размер левой части строки состояния
    set-option -g status-left-length 20
    # Стиль левой части строки состояния
    # Заменяет параметры: status-left-attr status-left-bg status-left-fg
    set-option -g status-left-style "default"
    # Позиция строки состояния
    set-option -g status-position bottom
    # Формат правой части строки состояния
    set-option -g status-right " #[reverse] #[default] %a %d %b %Y %H:%M:%S [%V/%j] "
    # Размер правой части строки состояния
    set-option -g status-right-length 40
    # Стиль правой части строки состояния
    # Заменяет параметры: status-right-attr status-right-bg status-right-fg
    set-option -g status-right-style "default"
    # Стиль строки состояния
    # Заменяет параметры: status-attr status-bg status-fg
    set-option -g status-style "bg=green,fg=black"
    # Массив переменных окружения которые необходимо обновлять
    set-option -g update-environment[100] "TERMINFO"
    # Массив пользовательских клавиш
    # set-option -g user-keys[100] "\e[1~"
    # Отображать сообщение о активности в окне
    set-option -g visual-activity off
    # Отображать сообщение о "звонке" в окне
    set-option -g visual-bell off
    # Отображать сообщение о "тишине" в окне
    set-option -g visual-silence off
    # Символы разделителяющие слова в режиме копирования
    set-option -g word-separators " -_@"

    # Доступные параметры окна:

    # Агрессивное изменение размера выбранного окна
    set-option -gw aggressive-resize on
    # Разрешить программам изменять имя окна
    set-option -gw allow-rename on
    # Разрешить программам использовать альтернативный экрана терминала
    set-option -gw alternate-screen on
    # Автоматическое переименование окон
    set-option -gw automatic-rename on
    # Формат автоматическо переименования окон
    set-option -gw automatic-rename-format "#{?pane_in_mode,[tmux],#{pane_current_command}}#{?pane_dead,[dead],}"
    # Цвет отображения времени
    set-option -gw clock-mode-colour "green"
    # Формат отображения времени
    set-option -gw clock-mode-style 24
    # Предотвращение изменениея размера окна до высоты
    set-option -gw force-height 0
    # Предотвращение изменениея размера окна до ширины
    set-option -gw force-width 0
    # Высота основной панели
    set-option -gw main-pane-height 24
    # Ширина основной панели
    set-option -gw main-pane-width 80
    # Стиль сочетаний клавиш в режиме копирования
    set-option -gw mode-keys vi
    # Стиль окона в режиме копирования
    # Заменяет параметры: mode-attr mode-bg mode-fg
    set-option -gw mode-style "bg=yellow,fg=black"
    # Мониторинг активности в окне
    set-option -gw monitor-activity on
    # Мониторинг "звонка" в окне
    set-option -gw monitor-bell on
    # Мониторинг "тишины" в окне. Время срабатывания.
    set-option -gw monitor-silence 0
    # Высота других панелей
    set-option -gw other-pane-height 0
    # Ширина других панелей
    set-option -gw other-pane-width 0
    # Стиль рамки активной панели
    # Заменяет параметры: pane-active-border-attr pane-active-border-bg pane-active-border-fg
    set-option -gw pane-active-border-style "fg=green"
    # Начало нумерации панелей
    set-option -gw pane-base-index 1
    # Формат строк состояния панелей
    set-option -gw pane-border-format "#{?pane_active,#[reverse],}#{?window_zoomed_flag,#[fg=red],} #{pane_index}:#{=6:pane_current_command} #[default]"
    # Положение строк состояния панелей
    set-option -gw pane-border-status top
    # Стиль рамки панели
    # Заменяет параметры: pane-border-attr pane-border-bg pane-border-fg
    set-option -gw pane-border-style "fg=green"
    # Не уничтожать окно по завершению программы
    set-option -gw remain-on-exit off
    # Синхронизация панелей на ввод с клавиатуры
    set-option -gw synchronize-panes off
    # Стиль активной панели
    set-option -gw window-active-style "default"
    # Стиль вкладки окна с активностью в строке состояния
    # Заменяет параметры: window-status-activity-attr window-status-activity-bg window-status-activity-fg
    set-option -gw window-status-activity-style "fg=red"
    # Стиль вкладки окна с "звуком" в строке состояния
    # Заменяет параметры: window-status-bell-attr window-status-bell-bg window-status-bell-fg
    set-option -gw window-status-bell-style "fg=red"
    # Формат вкладки текущего окна в строке состояния
    set-option -gw window-status-current-format " #{window_index}:#{window_name} "
    # Стиль вкладки текущего окна в строке состояния
    # Заменяет параметры: window-status-current-attr window-status-current-bg window-status-current-fg
    set-option -gw window-status-current-style "reverse"
    # Формат вкладок окон в строке состояния
    set-option -gw window-status-format " #{window_index}:#{window_name}#{?window_activity_flag,#,}#{?window_bell_flag,!,}#{?window_silence_flag,~,} "
    # Стиль вкладки предыдущего окна в строке состояния
    # Заменяет параметры: window-status-last-attr window-status-last-bg window-status-last-fg
    set-option -gw window-status-last-style "default"
    # Строка разделяющая вкладки окон в строке состояния
    set-option -gw window-status-separator ""
    # Стиль вкладок окон в строке состояния
    set-option -gw window-status-style "default"
    # Стиль панелей
    set-option -gw window-style "default"
    # Поиск внутри панели
    set-option -gw wrap-search on
    # Генерировать сочетания клавиш
    set-option -gw xterm-keys on

    # Настройк сочетаний клавиш

    # Выбор панелей по Alt + стрелки
    bind-key -rT root M-Up    select-pane -U
    bind-key -rT root M-Down  select-pane -D
    bind-key -rT root M-Left  select-pane -L
    bind-key -rT root M-Right select-pane -R
    # Переход в режим копирования
    bind-key -T root M-PageUp copy-mode -eu
    # Включение синхронизации ввода с клавиатуры
    bind-key -T prefix M-s set-option -gw synchronize-panes\; display-message "Синхронизация ввода: #{?synchronize-panes,on,off}"
    # Блокировка сеанса
    bind-key -T prefix M-l lock-session
    # Обновление конфигурации
    bind-key -T prefix M-r source-file /etc/tmux.conf\; display-message "Обновление конфигурации"
    # Редактирование конфигурации
    # bind-key -T prefix M-e

    # Настройка сеанса

    # Создать сеанс
    new-session -s "work"


Готовим SPEC файл

Этот файл будет интереснее предыдущего SPEC файла:

cd ~/rpmbuild/SPECS
vim ~/rpmbuild/SPECS/tmux.spec
    %define libevent 2.1.8
    %define ncurses 6.1

    Name:           tmux
    Version:        2.6
    Release:        1%{?dist}
    Summary:        A terminal multiplexer

    Vendor:         D.F.H.
    Packager:       ChelAxe

    Group:          Applications/System
    License:        ISC and BSD

    URL:            https://github.com/%{name}/%{name}
    Source0:        https://github.com/%{name}/%{name}/releases/download/%{version}/%{name}-%{version}.tar.gz
    Source1:        https://github.com/libevent/libevent/releases/download/release-%{libevent}-stable/libevent-%{libevent}-stable.tar.gz
    Source2:        ftp://ftp.gnu.org/gnu/ncurses/ncurses-%{ncurses}.tar.gz
    Source3:        tmux.conf

    BuildRequires:  gcc, gcc-c++, make, glibc-static

    %description
    tmux is a "terminal multiplexer", it enables a number of terminals (or windows)
    to be accessed and controlled from a single terminal. tmux is intended to be a
    simple, modern, BSD-licensed alternative to programs such as GNU screen.

    %prep
    %setup -q -a1 -a2

    %build
    %__mkdir "libs"
    pushd "libevent-%{libevent}-stable"
    %_configure \
      --prefix="$(pwd)/../libs" \
      --disable-shared
    %__make install
    popd
    pushd "ncurses-%{ncurses}"
    %_configure \
      --prefix="$(pwd)/../libs" \
      --with-default-terminfo-dir="/usr/share/terminfo" \
      --with-terminfo-dirs="/etc/terminfo:/lib/terminfo:/usr/share/terminfo:$HOME/.terminfo"
    %__make install
    popd
    %_configure \
      --enable-static \
      CFLAGS="-Ilibs/include -Ilibs/include/ncurses" \
      LDFLAGS="-Llibs/lib -Llibs/include -Llibs/include/ncurses" \
      LIBEVENT_CFLAGS="-Ilibs/include" \
      LIBEVENT_LIBS="-Llibs/lib -levent" \
      LIBNCURSES_CFLAGS="-Ilibs/include" \
      LIBNCURSES_LIBS="-Llibs/lib -lncurses"
    %__make

    %install
    %__rm -rf %{buildroot}
    %make_install
    install -d -m 755 %{buildroot}%{_sysconfdir}
    install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/tmux.conf

    %clean
    %__rm -rf %{buildroot}

    %files
    %defattr(-,root,root,-)
    %doc README TODO CHANGES example_tmux.conf
    %config(noreplace) %{_sysconfdir}/tmux.conf
    %{_prefix}/local/*

    %changelog
    * Tue May  1 2018 ChelAxe (D.F.H.)  - 2.6-1%{?dist}
    - Initial package.


Сборка

Собираем пакет и добавляем его в репозиторий:

rpmbuild -ba --sign ~/rpmbuild/SPECS/tmux.spec
cp ~/rpmbuild/RPMS/x86_64/tmux-2.6-1.el7.centos.x86_64.rpm ~/rpmbuild/REPO/Packages/
createrepo --update ~/rpmbuild/REPO

Смотри что и как получилось:

tree ~/rpmbuild/ -L 2
    /home/chelaxe/rpmbuild/
    ├── BUILD
    │   ├── chelaxe-release
    │   └── tmux-2.6
    ├── BUILDROOT
    ├── REPO -> /var/www/repo
    ├── RPMS
    │   ├── noarch
    │   └── x86_64
    ├── SOURCES
    │   ├── chelaxe-release
    │   ├── chelaxe-release.tar.gz
    │   ├── libevent-2.1.8-stable.tar.gz
    │   ├── libevent-2.1.8-stable.tar.gz.asc
    │   ├── ncurses-6.1.tar.gz
    │   ├── ncurses-6.1.tar.gz.sig
    │   ├── tmux-2.6.tar.gz
    │   └── tmux.conf
    ├── SPECS
    │   ├── chelaxe-release.spec
    │   └── tmux.spec
    └── SRPMS
        ├── chelaxe-release-1.0-1.el7.centos.src.rpm
        └── tmux-2.6-1.el7.centos.src.rpm


Установка и запуск

Устанавливаем наш пакет:

sudo yum clean all
sudo yum install -y tmux

Запускаем tmux и радуемся:

tmux attach-session

Собирать будем fbida — комплект приложений для просмотра изображений в консоли. Данный пакет не нашел под Centos 7.


Готовим исходники

Скачиваем исходники fbida:

cd ~/rpmbuild/SOURCES
wget https://www.kraxel.org/releases/fbida/fbida-2.14.tar.gz
wget https://www.kraxel.org/releases/fbida/fbida-2.14.tar.gz.asc

Экспортируем GPG ключи для проверки исходников:

gpg --recv-keys D3E87138

Проверяем файлы:

gpg --verify  fbida-2.14.tar.gz.asc fbida-2.14.tar.gz 2>&1 | grep "Good signature"
    gpg: Good signature from "Gerd Hoffmann (work) "


Готовим SPEC файл

В этом SPEC файле будет больше зависимостей:

cd ~/rpmbuild/SPECS
vim ~/rpmbuild/SPECS/fbida.spec
    Name:           fbida
    Version:        2.14
    Release:        1%{?dist}
    Summary:        FrameBuffer Imageviewer

    Vendor:         D.F.H.
    Packager:       ChelAxe

    Group:          Applications/Multimedia
    License:        GPLv2+

    URL:            https://www.kraxel.org/blog/linux/fbida/
    Source:         https://www.kraxel.org/releases/fbida/fbida-%{version}.tar.gz

    BuildRequires:  libexif-devel fontconfig-devel libjpeg-turbo-devel
    BuildRequires:  libpng-devel libtiff-devel pkgconfig
    BuildRequires:  giflib-devel libcurl-devel libXpm-devel
    BuildRequires:  pixman-devel libepoxy-devel libdrm-devel
    BuildRequires:  mesa-libEGL-devel poppler-devel poppler-glib-devel
    BuildRequires:  freetype-devel mesa-libgbm-devel  
    Requires:       libexif fontconfig libjpeg-turbo
    Requires:       libpng libtiff giflib
    Requires:       libcurl libXpm pixman
    Requires:       libepoxy libdrm mesa-libEGL
    Requires:       poppler poppler-glib freetype
    Requires:       mesa-libgbm ImageMagick dejavu-sans-mono-fonts

    %description
    fbi displays the specified file(s) on the linux console using the
    framebuffer device. PhotoCD, jpeg, ppm, gif, tiff, xwd, bmp and png
    are supported directly. For other formats fbi tries to use
    ImageMagick's convert.

    %prep
    %setup -q
    %{__sed} -i -e "s,/X11R6,,g" GNUmakefile

    %install
    %__rm -rf %{buildroot}
    %make_install

    %clean
    %__rm -rf %{buildroot}

    %files
    %defattr(-,root,root,-)
    %doc Changes COPYING INSTALL README TODO VERSION
    %{_prefix}/local/*

    %changelog
    * Tue May  1 2018 ChelAxe (D.F.H.)  - 2.14-1%{?dist}
    - Initial package.


Сборка

Собираем пакет и добавляем его в репозиторий:

sudo yum install -y libexif-devel fontconfig-devel libjpeg-turbo-devel libpng-devel libtiff-devel pkgconfig giflib-devel libcurl-devel libXpm-devel ImageMagick dejavu-sans-mono-fonts pixman-devel libepoxy-devel libdrm-devel mesa-libEGL-devel poppler-devel poppler-glib-devel mesa-libgbm-devel
rpmbuild -ba --sign ~/rpmbuild/SPECS/fbida.spec
cp ~/rpmbuild/RPMS/x86_64/fbida-2.14-1.el7.centos.x86_64.rpm ~/rpmbuild/REPO/Packages/
createrepo --update ~/rpmbuild/REPO


Установка и запуск

Устанавливаем наш пакет:

sudo yum clean all
sudo yum install -y fbida

Теперь обеспечим доступ к нашему репозиторию по http/https.


Настройка

Первым делом настроем наш Apache:

sudo mv /etc/httpd/conf.d/welcome{.conf,.bak}
sudo cp /etc/httpd/conf/httpd{.conf,.bak}

Далее необходимо добавить/изменить/раскомментировать следующие строки:

sudo vim /etc/httpd/conf/httpd.conf
    # Слушать на определенном интерфейсе и порте
    Listen 192.168.0.2:80
    # Email адрес и имя сервера
    ServerAdmin chelaxe@gmail.com
    ServerName repo.chelaxe.ru
    # Не светить версию Apache
    ServerSignature Off
    ServerTokens Prod
sudo cp /etc/httpd/conf.d/ssl{.conf,.bak}
sudo vim /etc/httpd/conf.d/ssl.conf
    # Слушать на определенном интерфейсе и порте
    Listen 192.168.0.2:443 https
    # OCSP (Online Certificate Status Protocol)
    SSLStaplingCache "shmcb:logs/stapling-cache(128000)"

Проверим конфигурацию:

sudo apachectl configtest
    Syntax OK

Запускаем службу и прописываем ее в автозапуск:

sudo systemctl start httpd
sudo systemctl enable httpd

Настраиваем наш репозиторий:

# Создадим свой файл с параметрами Диффи-Хеллмана
cd /etc/ssl/certs
sudo openssl dhparam -out dhparam.pem 4096
# Готовим публичный ключ для HKPK (HTTP Public Key Pinning)
sudo openssl x509 -noout -in /etc/pki/tls/certs/localhost.crt -pubkey | openssl asn1parse -noout -inform pem -out /tmp/public.key
# Получаем отпечаток публичного ключа для HKPK (HTTP Public Key Pinning)
openssl dgst -sha256 -binary /tmp/public.key | openssl enc -base64
    aQxRkBUlhfQjidLUovOlxdZe/4ygObbDG7l+RgwzSWA=
rm -rf /tmp/public.key

Настройка VirtualHost:

sudo vim /etc/httpd/conf.d/repo.conf
    
      ServerAdmin "chelaxe@gmail.com"
      ServerName "repo.chelaxe.ru"

      DocumentRoot "/var/www/repo"
      
        AllowOverride None
        Options Indexes
      
    

    
      ServerAdmin "chelaxe@gmail.com"
      ServerName "repo.chelaxe.ru"

      DocumentRoot "/var/www/repo"
      
        AllowOverride None
        Options Indexes
      

      SSLEngine on
      # HSTS (HTTP Strict Transport Security)
      Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
      # HKPK (HTTP Public Key Pinning)
      Header set Public-Key-Pins "pin-sha256=\"aQxRkBUlhfQjidLUovOlxdZe/4ygObbDG7l+RgwzSWA=\"; max-age=2592000; includeSubDomains"
      # Гнать поисковых роботов
      Header set X-Robots-Tag "none"
      # Защита от некоторых XSS-атак
      Header set X-XSS-Protection "1; mode=block"
      # Защита от кликджекинг-атак
      Header always append X-Frame-Options DENY
      # Защита от подмены MIME типов
      Header set X-Content-Type-Options nosniff
      # Защита от XSS-атак
      Header set Content-Security-Policy "default-src 'self';"
      # OCSP (Online Certificate Status Protocol)
      SSLUseStapling on
      # Отключаем сжатие SSL (защита от атаки CRIME)
      SSLCompression off
      # Отключаем SSLv2 и SSLv3
      SSLProtocol all -SSLv2 -SSLv3
      # Набор шифров
      SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
      # Предпочтения сервера при согласовании шифров
      SSLHonorCipherOrder on
      # Используем свой файл с параметрами Диффи-Хеллмана
      # cat /etc/ssl/certs/dhparam.pem >> /etc/pki/tls/certs/localhost.crt
      # для 2.4.8 и старше
      # SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
      SSLOptions +StrictRequire
      SSLCertificateFile "/etc/pki/tls/certs/localhost.crt"
      SSLCertificateKeyFile "/etc/pki/tls/private/localhost.key"
    

Т.к. в Centos 7 у нас Apache 2.4.6, а не 2.4.8, то параметры Диффи-Хеллмана необходимо вшить в сертификат:

sudo bash -c "cat /etc/ssl/certs/dhparam.pem >> /etc/pki/tls/certs/localhost.crt"

По этой же причине с HTTP/2 у нас ничего не получится, но теперь вы можете собрать сами свежий Apache и воспользоваться HTTP/2.

Проверим конфигурацию и перечитаем конфигурацию:

sudo apachectl configtest
    Syntax OK
sudo systemctl reload httpd


Сертификат от Let’s Encrypt

Пока у нас свой сертификат и это не красиво, так что получим сертификат от Let’s Encrypt:

sudo certbot --apache --agree-tos --email chelaxe@gmail.com -d repo.chelaxe.ru

При ответе на вопросы, выбираем использование rewrite для перенаправления всех на https. В результате в файле изменяться строки у VirtualHost для http:

RewriteEngine on
RewriteCond %{SERVER_NAME} =repo.chelaxe.ru
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

и у VirtualHost для https:

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/repo.chelaxe.ru/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/repo.chelaxe.ru/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/repo.chelaxe.ru/chain.pem

Строку Include /etc/letsencrypt/options-ssl-apache.conf закомментируем.

Тут стоит напомнить о необходимости добавить файл с параметрами Диффи-Хеллмана в конец сертификата:

sudo bash -c "cat /etc/ssl/certs/dhparam.pem >> /etc/letsencrypt/live/repo.chelaxe.ru/cert.pem"

И изменить заголовок HKPK (HTTP Public Key Pinning):

# Готовим публичный ключ для HKPK (HTTP Public Key Pinning)
sudo openssl x509 -noout -in /etc/letsencrypt/live/repo.chelaxe.ru/cert.pem -pubkey | openssl asn1parse -noout -inform pem -out /tmp/public.key
# Получаем отпечаток публичного ключа для HKPK (HTTP Public Key Pinning)
openssl dgst -sha256 -binary /tmp/public.key | openssl enc -base64
    aidlhfQjoxRkbvOlxdZLBUe/4ygOUDG7l+RgwzQbSWA=
rm -rf /tmp/public.key

И изменим соответственно строку в конфигурации:

      # HKPK (HTTP Public Key Pinning)
      Header set Public-Key-Pins "pin-sha256=\"aidlhfQjoxRkbvOlxdZLBUe/4ygOUDG7l+RgwzQbSWA=\"; max-age=2592000; includeSubDomains"

Проверим конфигурацию и перечитаем конфигурацию:

sudo apachectl configtest
    Syntax OK
sudo systemctl reload httpd

Есть еще одна проблема. Для обновления сертификата добавим запись в крон:

sudo crontab -e
    SHELL=/bin/bash
    MAILTO=chelaxe@gmail.com
    @daily certbot renew >> /var/log/certbot-renew.log

Но этого не достаточно, нужно еще дописать автоматическое добавление файла с параметрами Диффи-Хеллмана и параметры HKPK (HTTP Public Key Pinning).


Файлы .htaccess

Настройка через .htaccess лучше избежать в данном случае, если Вы все же решили его использовать, то сделайте следующее:

sudo chown apache:apache ~/rpmbuild/REPO/.htaccess
sudo chmod 600 ~/rpmbuild/REPO/.htaccess
sudo chcon -R -t httpd_sys_content_t ~/rpmbuild/REPO/.htaccess

и AllowOverride смените на All. Так же добавьте:

IndexIgnore .htaccess

для исключения в отображении на сайте.

Для vsftpd можно использовать опции:

hide_file={.htaccess}
deny_file={.htaccess}

А вообще смените стандартное имя .htaccess на другое с помощью параметра AccessFileName:

AccessFileName .acl

Тут можно используя модуль mod_autoindex Apache настроить внешний вид. Завернуть в noscript тег и используя html5, css3, javascript, jquery, bootstrap, backbone, awesome сделать конфетку, как это сделал я:

repo.chelaxe.ru

Вот что будет при использовании в браузере без поддержки javascript или с отключенным:

LINKS2

Сами файлы web интерфейса нужно будет скрыть как от vsftpd так и от демонстрации на сайте, делается аналогичными способами что и для сокрытия .htaccess файла.

Настроить внешний вид листинга через mod_autoindex или в nginx:


  1. http://www.oglib.ru/apman/mod/mod_autoindex.html
  2. https://habr.com/post/353478/

Запускаем службу и прописываем ее в автозапуск:

sudo systemctl start vsftpd
sudo systemctl enable vsftpd

Настройка службы:

sudo cp /etc/vsftpd/vsftpd{.conf,.bak}
sudo vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    local_enable=NO
    write_enable=NO
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    force_dot_files=NO
    anon_root=/var/www/repo
    no_anon_password=YES
    hide_ids=YES
sudo usermod -d /var/www/repo ftp

Настроем SeLinux:

sudo semanage fcontext -a -t public_content_t '/var/www/repo(/.*)?'
sudo restorecon -Rv '/var/www/repo'

Перезапустим службу:

sudo systemctl restart vsftpd

В случае использования .htaccess файла — продублируйте, чтобы файл был надежно защищен от доступа по ftp:

sudo chcon -R -t httpd_sys_content_t ~/rpmbuild/REPO/.htaccess

Собственно на этом все. Надеюсь данный мануал будет Вам полезен.

© Habrahabr.ru