CentOS 8: sftp chroot для пользователя

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

В файле /etc/ssh/sshd_config прописываем нужные настройки для группы, в которую включен нужный пользователь:
Match Group rock
        ChrootDirectory /data/%u
        ForceCommand internal-sftp


Мне кажется, вместо конструкции "/data/%u" можно указать просто "~", но я решил использовать более явную.

А также включаем внутренний sftp:
Subsystem       sftp    internal-sftp


Однако, тут есть подводный камень. Чтобы sshd мог сделать chroot папка пользователя должна принадлежать root-у и права на запись ни у кого другого быть не должно, т.е. установить на папку право на запись для группы не получится. Это приводит к тому, что пользователь не может ничего записать в свою папку и остаётся писать во вложенную папку, которую, к тому же, он не может создать. Для данной моей задачи всё это не критично, так что пойдёт.

Ну и попутно можно настроить вход по публичному ключу. А если с какой машинки публичный ключ типа dss (вроде бы устаревший алгоритм), а демон ругается на него примерно вот так:
sshd[8456]: userauth_pubkey: key type ssh-dss not in PubkeyAcceptedKeyTypes [preauth]


то надо добавить в конфиг sshd вот такой параметр:
PubkeyAcceptedKeyTypes=+ssh-dss

В CentOS 8 нет ntpdate?!

Пипец, в CentOS 8 теперь нельзя установить ntpdate, чтобы синхронизировать время с NTP-серверов. Теперь, блин, надо, видите ли, запускать новый демон чтобы просто синхронизировать время.
А как без ntpdate проверить работает ли какой-либо NTP-сервер вообще непонятно. Это я чтоли должен настроить полноценную синхронизацию и ждать сообщения в логах? А мне, блин, не надо синхронизироваться, мне надо просто посмотреть отвечает ли сервер и прям в данный момент интерактивно!
Кроме матов больше слов нет…

Настройка NTP-клиента на CentOS 8.

Посмотреть настройки времени:
timedatectl

Задать часовой пояс:
timedatectl set-timezone Asia/Bishkek

В конфиге нового демона убрать строку с ненужными серверами и указать нужные серверы — источники времени:
#pool 2.centos.pool.ntp.org iburst
server ntp1.domain.tld.
server ntp2.domain.tld.

Запустить новый демон:
systemctl start chronyd

Включить синхронизацию времени:
timedatectl set-ntp true

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

Время в BIOS

На одном из серверов была проблема: после ребута время устанавливалось на час вперёд. После синхронизации по NTP время исправлялось.
Временная зона правильная. Вероятно неправильное время указано в BIOS, но проверить всё не получалось — думал для этого надо перегружать сервер. Но оказалось, что можно проверить и исправить время в BIOS прямо из операционной системы.

Посмотрел время в BIOS и убедился, что время на час вперёд:
#hwclock
Wed 13 Nov 2019 07:49:18 PM +06 -0.250483 seconds

Поменял время:
#hwclock --set --date «Wed 13 Nov 2019 06:54 PM»

Проверил — всё нормально теперь:
#hwclock
Wed 13 Nov 2019 06:54:03 PM +06 -0.130003 seconds

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

Работа с разделом swap

Решил перенести раздел swap на другой диск, т.е. надо создать раздел на другом диске, подключить его и отключить старый.

Второй диск пустой. Создаю на нём новый раздел размером 6GB и меняю его тип:
fdisk -l /dev/sdc
Command (m for help): p
Select (default p): p
Partition number (1-4, default 1): [Enter]
First sector (2048-1953525167, default 2048): [Enter]
Last sector, +sectors or +size{K,M,G} (2048-1953525167, default 1953525167): +6G
Command (m for help): t
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'
Command (m for help): w


Если fdisk выводит сообщение о необходимости перечитать таблицу разделов диска.

Можно попробовать вот эту команду:
partprobe /dev/sdc

Если она нормально не завершилась, то придётся перезагрузить компьютер. Иначе раздел нормально не создаётся, например, у меня получался раздел примерно в 500МБ, вместо 6ГБ.

Форматируем раздел:
mkswap /dev/sdc1
mkswap: /dev/sdc1: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 511996 KiB
no label, UUID=4c96302a-37bd-49d2-b352-7b6d09e60123


Подключаем раздел:
swapon -U 4c96302a-37bd-49d2-b352-7b6d09e60123


Проверяем:
swapon -s
Filename                                Type            Size    Used    Priority
/dev/md126                              partition       6153212 9200    -2
/dev/sdc1                               partition       6291452  0       -2


Отключаем старый swap (UID есть в /etc/fstab):
swapoff -U 7de94a8a-9fe1-4112-b09c-ee79f1eea123


Ну и понятно, что надо внести изменения в /etc/fstab — старый комментируем, новый добавляем:
#UUID=7de94a8a-9fe1-4112-b09c-ee79f1eea123 swap    swap    defaults                            0 0
# swap on sdc (sdc1):
UUID=4c96302a-37bd-49d2-b352-7b6d09e60123 swap    swap    defaults                            0 0

Policy-routing на CentOS

Довольно распространённая ситуация — на моёй рабочей станции есть два интерфейса и два айпишника, скажем из подсети А и подсети Б. При обращении клиента с хоста из сети Б к моему айпишнику из подсети А ответ к нему уходит через другой интерфейс с моего айпишника из подсети Б, т.к. он из той же подсети, что и адрес клиента. Мне надо сделать, чтобы эти ответы уходили с того же адреса на который пришли.

Тут нужен policy-routing — маршрутизация на основе определённых правил. Логика получается такая: ответы на запросы из подсети Б к моему адресу из подсети А отправлять с адреса из подсети А (т.е. на шлюз подсети А).

Маркируем соединения из сети Б к нашему адресу из сети А при помощи iptables и таблицу mangle (используется для изменения пакетов):
iptables -t mangle -I INPUT -i eth0 -s 10.1.100.0/24 -d 10.2.96.3 -j CONNMARK --set-mark 1
А на выходе копируем маркировку соединения в маркировку пакетов, насколько я понимаю, это означает, что мы маркируем пакеты промаркированных ранее соединений:
iptables -t mangle -I OUTPUT -s 10.2.96.3 -d 10.1.100.0/24 -j CONNMARK --restore-mark
Вероятно, в этом правиле можно обойтись и без указания адресов источника и адресата, но мне кажется так будет правильнее, более точно чтоли )

В таблицу маршрутизации 111 добавляем маршрут для сети Б, но на шлюз из подсети А:
ip route add to 10.1.100.0/24 via 10.2.96.1 dev eth0 table 111
И, наконец, добавляем правило для перенаправления пакетов с нашей маркировкой в отдельную таблицу маршрутизации:
ip rule add fwmark 1 lookup 111

Для удобства можно назначить название для таблицы в файле /etc/iproute2/rt_tables, которое можно будет использовать вместо номера.

Так же нужно проверить не включена ли проверка обратного пути (reverse path checking):
sysctl net.ipv4.conf.eth0.rp_filter
Если включена, то система будет проверять пакеты на соответствие источника интерфейсу, с которого пакет получен. Например, если пакет пришёл с адреса, который виден через другой интерфейс (а не тот, с которого пакет пришёл), то значит этот пакет надо отбросить.

Если всё заработало как надо, то сохраняем правила iptables в файл "/etc/sysconfig/iptables", а правила для маршрутизации в файл "/etc/sysconfig/network-scripts/route-eth0".

Далее несколько вспомогательных команд, которые могут пригодиться.

Посмотреть определённую таблицу маршрутизации:
ip route show table 111
Удалить маршрут из указанной таблицы
ip route del table 111 to 10.1.100.0/24
Посмотреть правила маршрутизации:
ip rule show
Удалить правило маршрутизации:
ip rule del fwmark 1

Как посмотреть правила iptables писать не буду )

Подключение репозитория HP с системными утилитами

Management Component Pack

hp-health HPE System Health Application and Command line Utilities
hponcfg HPE RILOE II/iLO online configuration utility
hp-ams HPE Agentless Management Service
hp-snmp-agents Insight Management SNMP Agents for HPE ProLiant Systems
hpsmh HPE System Management Homepage
hp-smh-templates HPE System Management Homepage Templates
hpssacli HPE Command Line Smart Storage Administration Utility
hpssaducli HPE Command Line Smart Storage Administration Diagnostics
hpssa HPE Array Smart Storage Administration Service

Создаём файл с описанием репозитория /etc/yum.repos.d/mcp.repo:
[mcp]
name=Management Component Pack
baseurl=http://downloads.linux.hpe.com/repo/mcp/dist/dist_ver/arch/project_ver
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-mcp

Где:
dist          centos, feodra, opensuse, oracle, asianux
   dist_ver      Browse repo to identify supported distribution versions
   arch          i386, x86_64,  amd64(debian/ubuntu)
   project_ver   current, 10.50, 10.40, 10.20, 10.00, 9.30, 9.25, 9.10 (Browse repo to identify supported project versions)

В моём случае (CentOS 6.8) получился вот такой файл:
[mcp]
name=Management Component Pack
baseurl=http://downloads.linux.hpe.com/repo/mcp/centos/6.8/x86_64/current
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-mcp


Посмотреть список пакетов из этого репозитория:
# yum --disablerepo="*" --enablerepo="mcp" list available


Установить пакет:
# yum install packagename
Например:
# yum install hp-health