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

Здесь описывается пример развертывания простой системы ведения технических заметок для реализации следующих возможностей: - перенос документации из локальных хранилищ на сервер; - работа с документацией при помощи любого редактора, имеющего возможность подключения к серверу; - ведение документации разными авторами.
Для обеспечения указанных возможностей были выбраны следующие инструменты и технологии:
- установка на виртуальный сервер;
- операционная система 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:
Выполните установку пакетного менеджера pkg и обновление пакетов:
Если сервер подключен к Интернет через прокси, установите переменные среды для обновления системы:
Выполните обновление операционной системы:
Если актуальный релиз операционной системы значительно отличается от 14.0, выполните соответствующее обновление, руководствуясь официальной документацией.
Настройка операционной системы
В целях обеспечения базовых мер защиты информации, выполните настройку сервера sshd, прав доступа к некоторым системным объектам, параметров ядра и некоторых дополнительных свойств.
Настройка sshd
Скопируйте файл конфигурации sshd на случай восстановления:
Замените содержимое файла конфигурации на следующее:
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:
Если нужен новый ключ, сгенерируйте его:
Ключ, созданный с помощью алгоритма ed25519 рекомендуется использовать для доступа к терминалу сервера. Если же нужно сгенерировать ключ для работы только с документами, используйте алгоритм по-умолчанию - RSA, т.к. с ed25519 могут работать не все клиенты (например, расширение SSH Client для редактора vscodium). В таком случае, чтобы сгенерировать ключ используйте:
Во время генерации ключа будет запрошена парольная фраза. Рекомендуется не игнорировать эту возможность и установить некоторое значение. Это усилит защищенность ключа.
Скопируйте файл открытого ключа пользователя administrator в созданную ранее директорию и установите права на него:
cp administrator.pub /etc/ssh/authorized-keys/
chown administrator:administrator /etc/ssh/authorized-keys/administrator
chmod 400 /etc/ssh/authorized-keys/administrator
Перезапустите sshd для применения изменений и подключитесь к серверу с использование ключа:
Если вы подключаетесь при помощи утилиты
putty, преобразуйте файл закрытого ключа в форматppk.
Настройка синхронизации времени
Добавьте автозагрузку сервиса синхронизации:
Скопируйте файл конфигурации службы синхронизации времени для возможности восстановления:
Приведите содержимое файла конфигурации сервиса ntpd к следующему виду:
server time_server_ip iburst maxpoll 9 prefer
logfile /var/log/ntp.log
restrict default ignore
restrict localhost
restrict time_server_ip
Запустите службу синхронизации:
Проверить синхронизацию можно примерно через 5 минут командами:
Вы должны увидеть значения смещения времени относительно сервера времени с момента последней синхронизации.
Ограничение доступа к системным объектам
Выполните следующие команды для ограничения доступа:
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
Параметры работы ядра
Скопируйте файл конфигурации ядра для возможности восстановления:
Приведите содержимое файла /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:
Добавьте в файл конфигурации /usr/local/etc/sudoers строку:
Выполните редактирование файла /etc/master.passwd при помощи команды:
Очень краткая шпоргалка для тех, кто не знаком с редактором
vi. Для удаления символа используйте клавишуDel. Чтобы начать вводить символы, сначала нажмите дваждыEsc, а затем клавишуi. Чтобы выйти из редактора без сохранения изменений, нажмите дваждыEsc, а затем введите!qи нажмитеEnter. Чтобы сохранить изменения и выйти, нажмите дваждыEsc, введитеwqи нажмитеEnter.
В поле хэшированного пароля (поля разделены символами :; поле пароля - сразу после имени пользователя) удалите хэш и замените его значение на любую последовательность символов.
Пользователь administrator, созданный на этапе установки операционной системы мог быть уже включен в группу wheel, но если это не так, выполните:
Прочие параметры безопасности
Загрузите базу данных об уязвимостях:
Рекомендуется делать это после установки или обновления любых пакетов.
Ограничте доступ к домашней директории пользователя:
Если в вашей системе нет файла /usr/local/libexec/uucp/uucico, но есть пользователь uucp, закомментируйте строку с данными этого пользователя в файле /etc/master.passwd, выполнив команду для редактирования этого файла:
Измените маску для файлов по-умолчанию, отредактировав в файле /etc/login.conf строку :umask=022, заменив значение маски на 027.
Настройка пакетного фильтра
Активируйте пакетный фильтр (более тонко его можно будет настроить позже):
Создайте файл /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:
На момент написания статьи, актуальной версией
pythonбыла3.9, поэтому устанавливается соответствующий пакетный менеджер.
Установите MkDocs:
Если сервер подключен к Интернет через прокси, выполняйте установку с указанием соответствующих данных:
Настройка сайта
Создайте директорию, в которой будет сформировано содержимое сайта с документацией (таких директорий можно создать несколько для нескольких сайтов):
Перейдите в созданную директорию и сформируйте пустой сайт:
В результате будет создана директория docs, для данных сайта, и файл конфигурации сайта mkdocs.yml.
Можно сразу включить для сайта тему material. Для этого добавьте в файл конфигурации строки:
Предполагается, что пользователь administrator будет иметь полные права к сайту, в том числе к его конфигурации. Для этого установите группе wheel права на запись в директории /mkdocs:
Подключение к сайту
Запустите сайт из директории /mkdocs:
Запустить сайт получится только из директории, в которой есть файл конфигурации и директория
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:
Заполните предлагаемые поля для имени пользователя, полного имени и пароля. Остальные поля можно не заполнять.
Созданному пользователю при подключении должна быть доступна только директория с его документами, которые будут отображаться на сайте. При этом, подключение к терминалу сервера для пользователя не должно быть доступно, т.к. сервером будет управлять только administrator.
Если пользователей будет несколько, то их наборы документов будут являться разделами сайта.
Создайте директорию для хранения пользовательских документов, а внутри ее директорию для документов пользователя user:
Установите необходимые права на директорию сайта:
Установите права владения для директории user, а также для директории документов пользователя:
Создайте в директории docs сайта символическую ссылку на директорию документов пользователя user:
Обратите внимание, что имя файла ссылки (
User_Docs) можно сформировать из нескольких слов, разделенных символом подчеркивания. При этом сайт, будет отображать имя раздела без подчеркиваний.
Добавьте в файл конфигурации sshd настройку доступа для пользователя user:
Match User user
AuthenticationMethods password publickey
PasswordAuthentication yes
ChrootDirectory /mkdocs/users/user
ForceCommand internal-sftp
Перезапустите sshd:
После этого пользователь user при подключении сможет видеть (и иметь полный доступ) только к директории docs в его пользовательской директории сайта.
Указанная выше конфигурация параметров позволяет пользователю подключаться к серверу при помощи пароля. Если необходимо настроить подключение при помощи ключа, сгенерируйте ключи пользователя:
Скопируйте файл закрытого ключа на ПК пользователя, после чего перенесите файл открытого ключа в /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
Автозагрузка сайта
Чтобы сайт автоматически запускался при перезагрузке операционной системы, нужно создать скрипт запуска и добавить его в системный планировщик.
Создайте файл скрипта запуска и установите соответствующие права:
Приведите содержимое скрипта к следующему виду:
Добавьте файл скрипта в системный планировщик:
В редакторе планировщика введите строку:
Обратите внимание, что редактором планировщика по-умолчанию является
vi. Особенности работы с этим редактором кратко описаны выше.
Заключение
В этой статье рассмотрена процедура установки простой системы документирования, рассчитанной на возможность использования несколькими пользователями. Сервер системы спроектирован таким образом, чтобы обеспечивались базовые принципы защиты информации, а также простая процедура резервирования как целой системы, так и только документации, создаваемой пользователями.