Как перейти с secrets на credentials (Ruby on Rails)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Сredentials в версии Ruby on Rails 5.2.0 — новый золотой стандарт. Старые добрые, но небезопасные файлы .env уступают дорогу. В этой статье вы узнаете:

  • зачем и как перейти от secrets к credentials,
  • как использовать API-ключи в Ruby, YML и js.erb,
  • как раз и навсегда предоставить ключ каждому из команды.

Еще 3 года назад Давид Хейнемейер Ханссон, создатель фреймворка Ruby on Rails, написал в своем твиттере о появлении релиза Rails 5.2.0, но новым технологиям часто требуется время, чтобы разогнаться и получить известность.

Можно считать тревожным звоночком, если вам слишком часто приходится жонглировать API-ключами, меняясь ими с другими разработчиками из вашей команды. Тогда самое время еще раз взглянуть на то, как можно использовать credentials в приложении на Ruby on Rails.

Почему стоит использовать сredentials вместо .env?


В цикле разработки, по мере развития в проект интегрируется всё больше различных сервисов. Для каждого внешнего сервиса существует собственный API-ключ. Обычно проходит совсем немного времени до момента, когда коллеги начнут охоту за за последним API-ключом. Это очень раздражает!

Или, просто представьте, API-ключ обновляется. Каждый разработчик в команде отдельно должен обновить ключ в локальных файлах dotenv. Кажется, всё это не соответствует концепции автоматизации и идеям программирования, верно?

Забудьте об обмене API-ключами в чатах в Slack или по электронной почте. Больше не придется нарушать политику безопасности.

Credentials в Rails решают эту проблему просто и эффективно: загрузка ключей на Github.

Загрузка на Github? Да, загрузка на Github! Небольшое примечание: API-ключи полностью зашифрованы.

Большое преимущество такого подхода в том, что существует один единственный ключ, которым можно поделиться с командой. И он никогда не меняется!

Новые API-ключи, добавленные вашими коллегами как credentials, подтягиваются из Github каждый раз, когда вы вытаскиваете последнюю версию ветки main (ранее носила название «ветка master»).

Ключ можно найти в папке config/master.key.

Как это работает?


Запуск bin/rails credentials:edit в rails создает два файла, которые требуются в папке config:

  • credentials.yml.enc хранит все ваши API-ключи. Если вам вдруг любопытно, расширение .enc означает шифрование.
  • master.key — это ключ, который используется для расшифровки encrypted.file (1.) Убедитесь, что вы добавили master.key в файл .gitignore.yml.

Вместе с репозиторием отправляем наш файл Credentials.yml.enc на Github, теперь он в надежных руках. При этом master.key храним при себе и бережем так, как будто от этого зависит наша жизнь!

Переход на credentials


Откройте файл credentials, выполнив в терминале следующее:

EDITOR='code --wait' bin/rails credentials:edit

В зависимости от используемого вами редактора, замените code (VS Code). Например:

vim or vi = Vim
atom = Atom
subl or stt = Sublime

Файл credentials автоматически открывается в редакторе и ждет, когда вы его обновите и снова закроете. Перенесите ключи ENV, которые вы используете в файле .env, в файл credentials.yml.

Замените старый файл .ENV:

STRIPE_PUBLISHABLE_KEY=pk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00t
STRIPE_SECRET_KEY=sk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00tgAAYF
STRIPE_WEBHOOK_SECRET_KEY=whsec_cZpB0VG8cZpB0VG8cZpB0VG8UrgA2gcZpB0VG8cZpB
CLOUDINARY_URL=cloudinary://15031853100444:XOr3XQ-DcZ4dBoan80@DcZ4Boan800U
GOOGLE_API_KEY=S3cAOJVy0WyS3cAOJVy0WyIR9AOJVy0WyIR92e

на credentials.yml:

stripe:
  publishable_key: pk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00tgAAYF
  secret_key: sk_test_VG8LlUN82DcZS3cAOJVy0WyIR9Jwz0YZkq302MKc00tgAAYF
  web_hook_secret_key: whsec_cZpB0VG8cZpB0VG8cZpB0VG8UrgA2gcZpB0VG8cZpB

google_api_key: S3cAOJVy0WyS3cAOJVy0WyIR9AOJVy0WyIR92e

cloudinary:
  cloud_name: abcdefg
  api_key: 12345678910
  api_secret: abc315-VG8Ll8VG8Ll8L

Примечание: Ключ Cloudinary API разделен на несколько частей, согласно документации.

Все готово! Для вывода на экран, credentials можно запустить в терминале.

Запустите bin/rails credentials:show.

Пришло время прощаться с нашим старым другом — файлом .ENV. Удалим его.

Как использовать Credentials в различных форматах, таких как Ruby, YML и JavaScript

Ruby

# nested key
Rails.application.credentials.stripe[:publishable_key]

# single key
Rails.application.credentials.google_api_key

YML

cloudinary:
  service: Cloudinary
  api_key: <%= Rails.application.credentials.dig(:cloudinary, :api_key) %>
  api_secret: <%= Rails.application.credentials.dig(:cloudinary, :api_secret) %>

для Cloudinary необходим дополнительный файл config/cloudinary.yml

JavaScript

// ruby code only possible with js.erb format
const abc = "<%= Rails.application.credentials.google_api_key %>"

HTML

<!-- interpolate in script tag --> 
<script src="https://maps.googleapis.com/maps/api/js?key=<%= "#{Rails.application.credentials.google_api_key}"%>"</script

Как поделиться ключами с командой


Поделитесь ключом в master.key с другими разработчиками, чтобы разрешить дешифрование.

Каждый член команды создает файл master.key локально в папке config и передает его в общий ключ.

Вывод


Программирование становится всё более увлекательным занятием без суеты и необходимости искать правильные API-ключи. Благодаря credentials, мы можем обновить приложение с учетом рекомендаций по информационной безопасности. Поделитесь master key один раз и избавьтесь от утомительного копирования.

Спасибо за внимание!
Источник: https://habr.com/ru/company/timeweb/blog/543294/


Интересные статьи

Интересные статьи

Маркетплейс – это сервис от 1С-Битрикс, который позволяет разработчикам делиться своими решениями с широкой аудиторией, состоящей из клиентов и других разработчиков.
У некоторых бизнес-тренеров в области е-коммерса и консультантов по увеличению интернет-продаж на многие вопросы часто можно слышать универсальную отмазку — «надо тестировать» или другую (чтобы не...
Как-то у нас исторически сложилось, что Менеджеры сидят в Битрикс КП, а Разработчики в Jira. Менеджеры привыкли ставить и решать задачи через КП, Разработчики — через Джиру.
Здравствуйте. Я уже давно не пишу на php, но то и дело натыкаюсь на интернет-магазины на системе управления сайтами Битрикс. И я вспоминаю о своих исследованиях. Битрикс не любят примерно так,...
Реализация ORM в ядре D7 — очередная интересная, перспективная, но как обычно плохо документированная разработка от 1с-Битрикс :) Призвана она абстрагировать разработчика от механики работы с табл...