Технические рекомендации и лучшие практики для учебных пособий DigitalOcean

Вступление

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

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

Источники и установка программного обеспечения

Предпочитаемые источники

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

  1. project recommended method, когда оценивается как лучший. Многие проекты меняются быстро и рекомендуют выходить за рамки официальных репозиториев, но некоторые установки (например, шаблоныcurl | bash) требуют принятия решения о том, использовать их или нет.

  2. official package repositories для текущего распределения и выпуска.

  3. Language-specific official packages (NPM, CPAN, PIP, RubyGems, Composer и т. д.)

  4. Project-specific package repositories (например, Nginx предоставляет собственные репозитории для последних версий) или, в Ubuntu, доверенный PPA. Убедитесь, что они получены из надежных источников, таких как разработчики проекта или разработчики пакетов Debian / Ubuntu.

  5. Binaries from the project’s GitHub releases page или аналогичный официальный веб-источник.

  6. wget or curl install scripts передан в оболочку с соответствующим предупреждением о проверке скриптов.

Предпочтительные места установки

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

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

В системах Linux помещайте автономные двоичные файлы или каталоги в/opt, а автономные скрипты в/usr/local/bin.

Программное обеспечение и обслуживание системы

В системах Ubuntu и Debian должен бытьunattended-upgrades с как минимум установленными и настроенными обновлениями безопасности. Мы не рекомендуем автоматически перезагружать или обновлять все, учитывая контекст.

Обычно мы рекомендуемsudo apt-get dist-upgrade вместоsudo apt-get upgrade, внимательно изучив предлагаемые изменения, чтобы убедиться, что ничего деструктивного не происходит. Эти две команды очень похожи, но использованиеupgrade может быть менее предсказуемым, поскольку некоторые изменения сдерживаются. Задержка определенных пакетов может привести к несоответствию версий, что может вызвать проблемы с производственными системами.
Мы продолжим использоватьapt-get в Ubuntu 16.04 из-за отсутствия документации дляapt и некоторых турбулентность по поводу предпочтительного менеджера пакетов дистрибутива.

Управление Сервисом

Обязательно используйте системные системные команды init, даже если доступны устаревшие команды совместимости. Например, используйтеsudo systemctl start [service_name], даже еслиsudo service [service_name] start будет работать.

Предоставьте информацию о том, как включить или отключить запуск службы при загрузке. Укажите, как проверять результат выполнения команд, связанных со службой, если интерфейс не указывает явно (journalctl -u,systemctl status и т. Д.).

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

Самозагрузочные системы

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

Ведение журнала и устранение неполадок

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

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

Для следующих файлов журналов с открытым текстом используйтеtail -F, а неtail -f, поскольку последний не будет отслеживать переименования файла и может вызвать путаницу, если журналы чередуются, когда пользователь просматривает их.

Управление пользователями и группами

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

В дистрибутивах на основе Debian добавляйте и удаляйте пользователей сadduser sammy иdeluser --remove-home sammy соответственно; в дистрибутивах на основе RHEL используйтеadduser sammy (при необходимости установите пароль с помощьюpasswd sammy) иuserdel -r sammy.

Предоставьтеsudo привилегииusermod -aG sudo sammy в Ubuntu. CentOS немного сложнее. Современные версии используютusermod -aG wheel sammy, но некоторые версии требуют, чтобыvisudo сначала раскомментировал разрешения группыwheel. В частности, в CentOS 5 необходимо установитьsudo и раскомментировать группуwheel с помощьюvisudo; в CentOS 6sudo уже установлен, ноwheel нужно раскомментировать; CentOS 7 имеетsudo, а группаwheel уже настроена.

При использовании команд с повышением привилегий обязательно проверяйте их как написано. Чтобы передать переменные среды черезsudo, используйтеsudo -E command_to_run (если доверено всей среде) илиsudo FOO=BAR command_to_run. Для экземпляров, которым требуется корневая оболочка, используйтеsudo -i. Для экземпляров, требующих перенаправления, используйтеtee -a для добавления, а не для замены файла назначения:[sudo] command_to_run | sudo tee [-a] file_to_change.

Предпочитаемые инструменты

Для интерактивных оболочек, предположим, Bash в системах GNU / Linux, упоминается явно, когда это уместно. Во FreeBSD используйте tcsh, так как он доступен из коробки и имеет полезные функции.

Для текстовых редакторов мы включаем копию «использовать [предпочтительный] или ваш любимый текстовый редактор» и включаем следующие удобные для начинающих редакторы в команды для этих копий и вставок. В Linux мы по умолчанию используемnano; во FreeBSD мы по умолчанию используемee. vi (m) допустимо, но избегайте его в вводных темах, где он может стать камнем преткновения для начинающих.

Для передачи файлов мы обычно рекомендуемsftp в большинстве случаев для его интерактивного и похожего на scp использования, хотя в нем отсутствует функция push, поэтомуscp также приемлем. rsync полезен для резервного копирования и передачи больших файлов (или множества небольших файлов). Не используйте FTP ни при каких обстоятельствах. Мы также стараемся стандартизироватьcurl по сравнению сwget из-за его надежности. Преимуществоwget в основном заключается в рекурсивной загрузке (т.е. особый случай использования, который не является распространенным для нашего вида контента).

На машинах, которые поставляются с утилитамиiproute2, мы предпочитаем их наборуnet-tools, то естьconsidered obsolete. Как правило, утилитыiproute2, такие какss, будут лучше поддерживать несколько интерфейсов, IPv6, новые функции ядра и т. Д. Точно так же мы должны использоватьip route вместоroute,ip addr show вместоifconfig и т. Д. Иногда вывод старых утилит по умолчанию немного чище, но сам вывод менее надежен, поскольку они также не обрабатывают крайние случаи. По возможности мы будем контролировать более подробный вывод, используя доступные флаги.

Scripting

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

Сценарии, написанные автором (и, возможно, другие ресурсы), должны размещаться в репозитории отдельных статей в учетной записи GitHub сообщества Do-Community со ссылкой на опубликованное руководство. Следуйте хорошей практике сценариев в целом. Например, поместите любые переменные, которые пользователь должен будет заполнить, в верхней части скрипта, желательно в хорошо помеченном разделе. Также обязательно прокомментируйте усердно; тело сценария, встроенное в учебник DO, не должно функционировать как черный ящик. Пользователи должны быть в состоянии выяснить смысл, прочитав его до конца.

Предпочитайте/bin/shbash и избегайте специфичных для Bash функций, когда проблема переносимости или кроссплатформенного повторного использования. Используйте оболочки и coreutils / стандартные инструменты Unix для небольших задач; Избегайте введения новых зависимостей исключительно для задач на языке клея, если только преимущества не являются существенными. Предпочитайте#!/usr/bin/env interpreter до#!/path/to/interpreter.

Как правило, используйтеcron для планирования повторяющихся задач, но также можно использовать таймеры systemd.

Расположение файловой системы

При загрузке сценариев или данных убедитесь, что пользователь находится в доступном для записи каталоге или что пути явно указаны. Для файлов, которые должны быть доступны для ссылки или повторного использования, используйте домашний каталог пользователя, если они не принадлежат какому-либо стандартному четко определенному пути в другом месте файловой системы (например,/opt или/etc). Для одноразовых файлов используйте/tmp.

Веб-серверы

Мы рекомендуем каталоги конфигурации в стиле Debian для дистрибутивов, которые не структурируют его по умолчанию. Всегда проверяйте изменения конфигурации (Apache используетsudo apachectl configtest, а Nginx используетsudo nginx -t).
/var/www/html должен использоваться как корень документа для всех веб-серверов. Значение по умолчанию/usr/share/nginx/html для Nginx следует изменить, поскольку этот каталог принадлежит и потенциально может быть изменен обновлениями пакетов. Это больше не является проблемой в Ubuntu 16.04, но останется актуальным для предыдущих выпусков.

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

Безопасность

Шифровать и аутентифицировать все соединения между системами. Не поощряйте (явно или неявно) пользователей отправлять учетные данные или передавать непубличные данные в открытом виде.

В частности, пароли и материал ключа не должны передаваться по незащищенным соединениям. Соединения с базой данных, ведение журнала, управление кластером и другие службы в идеале должны быть всегда зашифрованы. Веб-панели управления должны иметь видserved over HTTPS connections, а TLS / SSL следует использовать для служб, где он поддерживается. Общедоступные сервисы, такие как простой HTTP, допустимы, поскольку пользователи могут по-прежнему хотеть или нуждаться в их предложении, но в общем случае их настоятельно не рекомендуется, особенно для динамического контента.

Избегайте практики, которые представляют собой низкую выгоду безопасности из-за неясности или театральности, например, изменение порта SSH по умолчанию. Настройте брандмауэр. Наши рекомендации для конкретных дистрибутивов:ufw для Ubuntu,iptables для Debian иfirewalld для CentOS. Однакоiptables наиболее согласован на разных платформах и имеет множество инструментов, которые к нему подключаются.

SSH

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

Отключите аутентификацию по паролю и используйте аутентификацию только по ключу для пользователя root или, наоборот, полностью отключите вход в систему. Убедитесь, что вы используете надежные ключи SSH, как минимум 2048-битный RSA, но рекомендуется 4096; ECDSA больше не рекомендуется по техническим причинам, а алгоритмы Ed25519 и эллиптические кривые недостаточно широко поддерживаются.

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

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

SSL/TLS

Мы настоятельно рекомендуем использовать Let's Encrypt для простоты использования и рекомендуем TLS. Используйте надежную безопасность SSL; посмотритеhttps://cipherli.st/ (как современные, так и устаревшие рекомендации).

Для хостов без доменного имени мы предлагаем самостоятельно подписанный сертификат достаточной силы. Опять же, посмотрите наhttps://cipherli.st/ плюс создание самозаверяющего сертификата, используемое в руководствах, таких какthis Self-Signed Certification on Nginx guide. Установите надежный ключ Диффи-Хеллмана при включении шифрования, как вSelf-Signed SSL Certifications on Apache иNginx.

VPN

Мы рекомендуем VPN как решение для общего шифрованного обмена данными между серверами. VPN становятся все более ценными, когда между серверами необходимо защитить несколько служб; вместо того, чтобы шифровать каждую услугу индивидуально, вся внутренняя связь может передаваться по VPN. Это особенно полезно, если данные службы не поддерживают встроенное шифрование.

Обычно мы рекомендуем Tinc over OpenVPN для межсерверного взаимодействия. Вы можете прочитатьthis article on Ansible and Tinc для получения более подробной информации и реализации.

Заключение

По сути, это самоуверенный, живой документ, который будет часто обновляться. Технологии быстро меняются, и мы в DigitalOcean делаем все возможное, чтобы не отставать, но если вы заметите какие-либо ошибки или у вас есть отзывы, мы будем следить за комментариями ниже.

Related