Перейти к содержанию

Простая система документирования

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

Для обеспечения указанных возможностей были выбраны следующие инструменты и технологии: - установка на виртуальный сервер; - операционная система FreeBSD (на момент написания данной заметки, версия 14.0); - sshd для доступа к файлам документации; - формат Markdown для оформления документации; - редактор vscodium с расширением SSH Client в качестве примера редактора для пользователей.

Установка операционной системы

Так как объем документации предполагается небольшой (1-2ГБ), описывается установка виртуальной машины. Среда виртуализации специально не указывается, но предполагается, что виртуальная машина может быть перенесена из одной среды в другую. В качестве операционной системы выбрана FreeBSD, т.к. ее можно установить на весьма компактный виртуальный диск. Ниже приводятся основные требования к виртуальной машине: - CPU: 1 - RAM: 1024МБ - HDD: 6ГБ Иные требования (видео, число сетевых адаптеров и т.п.) не рассматривается. Предполагается, что дополнительные требования могут быть учтены при конкретной реализации.

Установка операционной системы выполняется тривиально. В данном случае, из-за небольшого объема диска установка всей системы выполняется на один раздел. Предполагается, что в ходе установки будет создан пользователь administrator, включенный в группу wheel.

Обновление операционной системы

Если сервер подключен к Интернет через прокси, установите переменные среды:

export http_proxy="http://username:password@proxy_ip:proxy_port"
export https_proxy="http://username:password@proxy_ip:proxy_port"

Если прокси не требует аутентификации, не вводите username и password.

Также отредактируйте файл /etc/pkg/FreeBSD.conf, удалив pkg+ из строки с URL:

url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",

Выполните установку пакетного менеджера pkg и обновление пакетов:

pkg update
pkg upgrade

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

export HTTP_PROXY=proxy_ip:proxy_port
export HTTP_PROXY_AUTH="basic:*:username:password"

Выполните обновление операционной системы:

freebsd-update fetch
freebsd-update install

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

Настройка операционной системы

В целях обеспечения базовых мер защиты информации, выполните настройку сервера sshd, прав доступа к некоторым системным объектам, параметров ядра и некоторых дополнительных свойств.

Настройка sshd

Скопируйте файл конфигурации sshd на случай восстановления:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Замените содержимое файла конфигурации на следующее:

AddressFamily inet
AllowAgentForwarding no
AllowStreamLocalForwarding no
AllowTcpForwarding no
# AllowUsers user@127.0.0.*
AuthenticationMethods publickey
AuthorizedKeysFile /etc/ssh/authorized-keys/%u
Banner none
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
ClientAliveCountMax 1
ClientAliveInterval 300
DisableForwarding yes
KbdInteractiveAuthentication no
KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256
# ListenAddress 192.168.0.3
LoginGraceTime 20
LogLevel VERBOSE
MACs hmac-sha2-256,hmac-sha2-512,hmac-sha1
# MaxAuthTries 3
PermitEmptyPasswords no
PermitRootLogin no
PubkeyAuthentication yes
SyslogFacility AUTHPRIV
Subsystem sftp /usr/libexec/sftp-server
X11Forwarding no
X11UseLocalhost no
Compression no
MaxSessions 2
Port 2414
TCPKeepAlive no
UseDNS no
PubkeyAcceptedAlgorithms ssh-rsa,ssh-ed25519
Match User administrator
  AuthenticationMethods password publickey
  PasswordAuthentication yes

Создайте директорию для хранения открытого ключа пользователя administrator:

mkdir /etc/ssh/authorized-keys

Если нужен новый ключ, сгенерируйте его:

ssh-keygen -t ed25519 -C "Local Administrator" -f "administrator"

Ключ, созданный с помощью алгоритма ed25519 рекомендуется использовать для доступа к терминалу сервера. Если же нужно сгенерировать ключ для работы только с документами, используйте алгоритм по-умолчанию - RSA, т.к. с ed25519 могут работать не все клиенты (например, расширение SSH Client для редактора vscodium). В таком случае, чтобы сгенерировать ключ используйте:

ssh-keygen -t rsa -C "Local Administrator" -f "administrator"

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

Скопируйте файл открытого ключа пользователя administrator в созданную ранее директорию и установите права на него:

cp administrator.pub /etc/ssh/authorized-keys/
chown administrator:administrator /etc/ssh/authorized-keys/administrator
chmod 400 /etc/ssh/authorized-keys/administrator

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

service sshd restart
ssh administrator@server_ip -p 2414 -i administrator.key

Если вы подключаетесь при помощи утилиты putty, преобразуйте файл закрытого ключа в формат ppk.

Настройка синхронизации времени

Добавьте автозагрузку сервиса синхронизации:

sysrc ntpd_enable="yes"
sysrc ntpdate_enable="yes"
sysrc ntpdate_flags="-b time_server_ip"

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

cp /etc/ntp.conf /etc/ntp.conf.bak

Приведите содержимое файла конфигурации сервиса ntpd к следующему виду:

server time_server_ip iburst maxpoll 9 prefer
logfile /var/log/ntp.log
restrict default ignore
restrict localhost
restrict time_server_ip

Запустите службу синхронизации:

service ntpd start

Проверить синхронизацию можно примерно через 5 минут командами:

ntpq -p
ntpdate -q 127.0.0.1

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

Ограничение доступа к системным объектам

Выполните следующие команды для ограничения доступа:

chmod 600 /etc/crontab
chmod 644 /etc/group
chmod 644 /etc/hosts.allow
chmod 655 /var/run/motd
chmod 644 /etc/passwd
chmod 600 /etc/ssh/sshd_config
chmod 644 /etc/hosts.equiv
chmod 700 /etc/cron.d

Параметры работы ядра

Скопируйте файл конфигурации ядра для возможности восстановления:

cp /etc/sysctl.conf /etc/sysctl.conf.bak

Приведите содержимое файла /etc/sysctl.conf к следующему виду:

net.inet.tcp.rfc1323=0
net.inet.icmp.drop_redirect=1
net.inet.tcp.icmp_may_rst=0
net.inet.icmp.tstamprepl=0
net.inet.icmp.bmcastecho=0
hw.kbd.keymap_restrict_change=4
net.inet.ip.process_options=0
net.inet.ip.random_id=1
net.inet.ip.redirect=0
net.inet.tcp.always_keepalive=0
net.inet.tcp.blackhole=2
net.inet.tcp.drop_synfin=1
net.inet.tcp.path_mtu_discovery=0
net.inet.udp.blackhole=1
net.inet6.icmp6.rediraccept=0
net.inet6.ip6.redirect=0
security.bsd.hardlink_check_gid=1
security.bsd.hardlink_check_uid=1

Отключение учетной записи суперпользователя

Полезным приемом защиты сервера является отключение пароля суперпользователя root и делегирование его полномочий доверенному пользователю.

Если на данный момент вы перезагружали сервер или перезапускали сеанс пользователя, то теперь необходимо восстановить переменные среды http_proxy и https_proxy, как было показано выше.

Установите пакет sudo:

pkg install sudo

Добавьте в файл конфигурации /usr/local/etc/sudoers строку:

administrator ALL=(ALL) NOPASSWD: ALL

Выполните редактирование файла /etc/master.passwd при помощи команды:

vipw

Очень краткая шпоргалка для тех, кто не знаком с редактором vi. Для удаления символа используйте клавишу Del. Чтобы начать вводить символы, сначала нажмите дважды Esc, а затем клавишу i. Чтобы выйти из редактора без сохранения изменений, нажмите дважды Esc, а затем введите !q и нажмите Enter. Чтобы сохранить изменения и выйти, нажмите дважды Esc, введите wq и нажмите Enter.

В поле хэшированного пароля (поля разделены символами :; поле пароля - сразу после имени пользователя) удалите хэш и замените его значение на любую последовательность символов.

Пользователь administrator, созданный на этапе установки операционной системы мог быть уже включен в группу wheel, но если это не так, выполните:

pw groupmod wheel -m administrator

Прочие параметры безопасности

Загрузите базу данных об уязвимостях:

pkg audit -F

Рекомендуется делать это после установки или обновления любых пакетов.

Ограничте доступ к домашней директории пользователя:

chmod 0700 /home/administrator

Если в вашей системе нет файла /usr/local/libexec/uucp/uucico, но есть пользователь uucp, закомментируйте строку с данными этого пользователя в файле /etc/master.passwd, выполнив команду для редактирования этого файла:

vipw

Измените маску для файлов по-умолчанию, отредактировав в файле /etc/login.conf строку :umask=022, заменив значение маски на 027.

Настройка пакетного фильтра

Активируйте пакетный фильтр (более тонко его можно будет настроить позже):

sysrc firewall_enable="yes"
sysrc firewall_script="/usr/local/etc/ipfw.rules"

Создайте файл /usr/local/etc/ipfw.rules, установите для него право на исполнение:

touch /usr/local/etc/ipfw.rules
chmod +x /usr/local/etc/ipfw.rules

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

#!/bin/sh
/sbin/ipfw -f flush
/sbin/ipfw add check-state
/sbin/ipfw add allow ip from any to any via lo0
/sbin/ipfw add deny ip from any to 127.0.0.0/8
/sbin/ipfw add deny ip from 127.0.0.0/8 to any
/sbin/ipfw add deny icmp from any to any frag
/sbin/ipfw add allow icmp from me to any
/sbin/ipfw add allow icmp from any to me
/sbin/ipfw add allow ip from me to any
/sbin/ipfw add allow ip from any to me

Внимание! Данная конфигурация разрешает любой входящий и исходящий трафик. Не забудьте настроить правила так, как вам требуется.

Установка пакетов

Установите интерпретатор python, менеджер пакетов и MkDocs:

pkg install python py39-pip

На момент написания статьи, актуальной версией python была 3.9, поэтому устанавливается соответствующий пакетный менеджер.

Установите MkDocs:

pip install mkdocs-material

Если сервер подключен к Интернет через прокси, выполняйте установку с указанием соответствующих данных:

pip install --proxy http://username:password@proxy_ip:proxy_port mkdocs-material

Настройка сайта

Создайте директорию, в которой будет сформировано содержимое сайта с документацией (таких директорий можно создать несколько для нескольких сайтов):

mkdir /mkdocs

Перейдите в созданную директорию и сформируйте пустой сайт:

cd /mkdocs
mkdocs new .

В результате будет создана директория docs, для данных сайта, и файл конфигурации сайта mkdocs.yml.

Можно сразу включить для сайта тему material. Для этого добавьте в файл конфигурации строки:

theme:
  name: material

Предполагается, что пользователь administrator будет иметь полные права к сайту, в том числе к его конфигурации. Для этого установите группе wheel права на запись в директории /mkdocs:

chmod -R g+w /mkdocs

Подключение к сайту

Запустите сайт из директории /mkdocs:

mkdocs serve -a 0.0.0.0:80

Запустить сайт получится только из директории, в которой есть файл конфигурации и директория docs.

Эта команда запустит генерацию сайта на основе документов из директории docs. Перегенерация будет выполняться автоматически при любых изменениях в директории docs.

При помощи браузера перейдите по адресу сервера. Вы должны увидеть стартовую страницу сайта.

Теперь настроим подключение для редактирования документов сайта. Для этого установите редактор vscodium и расширение SSH Client.

Установка редактора выполняется обычным способом. Вы можете скачать переносимую версию, которая не требует инсталляции.

Чтобы установить расширение, запустите редактор и выберите: Extensions (или сочетание клавиш: Ctrl + Shift + x), нажмите в верхней части списка кнопку ... ("Views and More Actions...") и в меню выберите Install from VSIX.... После этого в окне диалога выберите загруженный файл расширения.

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

Нажмите значок расширения. Панель Exnetsions заменится на SSH, в правой верхней части которой нажмите кнопку + для добавления новой конфигурации подключения.

В правой части окна редактора откроется окно конфигурации. Заполните поля:

  • name: - название соединения;
  • host: - ip-адрес сервера;
  • port: - порт sshd сервера (согласно указанной выше конфигурации - это 2414);
  • username: - имя пользователя (пока есть только пользователь administrator);
  • cipher: - укажите aes256-ctr;
  • type: - укажите privateKey;
  • privateKey: - укажите полный путь к файлу закрытого ключа;
  • passphrase: - укажите парольную фразу, если она была установлена при генерации ключа (если при генерации ключа парольная фраза не была установлена, соединение работать не будет).

Если в поле type: указать password, то вместо полей privateKey: и passphrase: появится поле password: в котором нужно указать пароль пользователя (в данном случае пароль пользователя administrator).

После нажатия на кнопку connect будет установлено соединение с сервером и в панели SSH появится список директорий и файлов. Обратите внимание, что при подключении от имени пользователя administrator доступна вся файловая система. Это дает доступ к множеству объектов в файловой системе сервера, что не является безопасным и для постоянной работы не рекомендуется. Вместо этого, следует создавать пользователей с ограниченным доступом и правами только для редактирования документов. Как это сделать, будет показано ниже.

Добавление пользователей

Подключитесь к терминалу сервера по SSH и перейдите в сеанс суперпользователя.

Создайте нового пользователя user:

adduser

Заполните предлагаемые поля для имени пользователя, полного имени и пароля. Остальные поля можно не заполнять.

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

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

Создайте директорию для хранения пользовательских документов, а внутри ее директорию для документов пользователя user:

mkdir -p /mkdocs/users/user/docs

Установите необходимые права на директорию сайта:

chmod 755 /mkdocs
chmod 755 /mkdocs/users

Установите права владения для директории user, а также для директории документов пользователя:

chown root:user /mkdocs/users/user
chown user:user /mkdocs/users/user/docs

Создайте в директории docs сайта символическую ссылку на директорию документов пользователя user:

ln -s /mkdocs/users/user/docs /mkdocs/docs/User_Docs

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

Добавьте в файл конфигурации sshd настройку доступа для пользователя user:

Match User user
  AuthenticationMethods password publickey
  PasswordAuthentication yes
  ChrootDirectory /mkdocs/users/user
  ForceCommand internal-sftp

Перезапустите sshd:

service sshd restart

После этого пользователь user при подключении сможет видеть (и иметь полный доступ) только к директории docs в его пользовательской директории сайта.

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

ssh-keygen -t rsa -C "User" -f "user"

Скопируйте файл закрытого ключа на ПК пользователя, после чего перенесите файл открытого ключа в /etc/ssh/authorized-keys/ и установите необходимые права:

mv user.pub /etc/ssh/authorized-keys/user
chown user:user /etc/ssh/authorized-keys/user
chmod 400 /etc/ssh/authorized-keys/user

Автозагрузка сайта

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

Создайте файл скрипта запуска и установите соответствующие права:

touch /root/mkdocs_start.sh
chmod +x /root/mkdocs_start.sh

Приведите содержимое скрипта к следующему виду:

#!/bin/sh
cd /mkdocs
mkdocs serve -a 0.0.0.0:80

Добавьте файл скрипта в системный планировщик:

crontab -e

В редакторе планировщика введите строку:

@reboot /root/mkdocs_start.sh

Обратите внимание, что редактором планировщика по-умолчанию является vi. Особенности работы с этим редактором кратко описаны выше.

Заключение

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